feat: msc 3 - #235
Open
echarles wants to merge 158 commits into
Open
Conversation
❌ Deploy Preview for datalayer-core failed.
|
There was a problem hiding this comment.
Pull request overview
This PR updates Datalayer Core to rely on per-service URLs (IAM, Runtimes, Scheduler, etc.) rather than a single base URL, while also refreshing sign-in UX, adding space selection persistence, and extending both the TS/React and Python client surfaces (including new spaces APIs and UI components).
Changes:
- Refactor configuration to use explicit service URLs (TS config, HTML templates, Python URLs, CLI flags/env resolution).
- UX/component updates (sign-in wording/styling, new
StatusLabelpills, newAnimatedText, JWT/user display tweaks). - New/updated client capabilities (space context cookie in layout state; Python client spaces/notebooks listing; CLI external command routing; test updates/removals).
Reviewed changes
Copilot reviewed 57 out of 58 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| vite.examples.config.ts | Updates Vite HTML placeholder replacement to IAM URL env vars. |
| src/views/profile/UserBadge.tsx | Improves popover header display + adds user name fields. |
| src/views/iam/SignInSimple.tsx | Adds autofill theming + doc-mode layout tweaks + icon/text updates. |
| src/utils/Jwt.ts | Uses shared asDisplayName for display name formatting. |
| src/state/substates/LayoutState.ts | Persists last selected space via cookie + restores on load. |
| src/state/substates/CoreState.ts | Updates default config fields (service URL split, launcher tweaks). |
| src/models/tests/Runtime.test.ts | Adjusts runtime model test for new environment shape. |
| src/config/Configuration.ts | Removes datalayerUrl, adds per-service URLs + default URL constant. |
| src/components/labels/StatusLabels.tsx | Adds reusable semantic “pill” labels (alpha/admin/default). |
| src/components/labels/index.ts | Exports new StatusLabels module. |
| src/components/index.ts | Exports new animation module. |
| src/components/iam/ExternalTokenSilentLogin.tsx | Ensures a React Query client/provider exists for this route. |
| src/components/display/JupyterDialog.tsx | Adds pending/inert behavior to prevent edits during accept flow. |
| src/components/billing/BillingEntitySelect.tsx | Replaces Flash with custom styled message container. |
| src/components/avatars/UserAvatar.tsx | Adds fallback color overrides; adjusts AlienIcon props. |
| src/components/auth/SignIn.tsx | Renames login component to SignIn; updates strings + API key flow. |
| src/components/auth/SignIn.stories.tsx | Updates Storybook to SignIn naming and copy. |
| src/components/auth/SigInAPIKey.tsx | Renames token login component for “Sign in with API Key” flow. |
| src/components/auth/index.ts | Updates auth barrel exports to new SignIn/API key components. |
| src/components/animation/index.ts | Adds barrel export for AnimatedText. |
| src/components/animation/AnimatedText.tsx | Adds animated cycling text component (multi-part, synced). |
| src/client/auth/AuthenticationManager.ts | Renames internal “service URL” derivation for storage keying. |
| src/api/tests/runtimes.integration.test.ts | Updates integration assertions for environment?.name. |
| src/api/tests/runtimes.healthz.integration.test.ts | Removes runtimes healthz integration tests. |
| src/api/tests/runtimes.environments.integration.test.ts | Removes runtimes environments integration tests. |
| README.md | Updates branding/links/sections; adds Architecture earlier. |
| package.json | Bumps package version; renames examples env var; updates rimraf. |
| index.html | Updates HTML-injected config keys/placeholders to IAM-based names. |
| examples/README.md | Removes older example catalog sections; keeps OTEL example reference. |
| examples/otel/ui/vite.config.ts | Switches OTEL UI env var naming to OTEL-specific vars. |
| examples/otel/app/main.py | Updates OTEL client base URL env var usage. |
| examples/otel/app/generator.py | Updates OTLP/OTEL URL env var naming and resolution. |
| docs/docusaurus.config.js | Updates docs navbar link from datalayer.app to datalayer.ai. |
| docs/docs/python/index.mdx | Updates platform link to datalayer.ai. |
| DEV.md | Adds a comprehensive frontend/dev architecture doc. |
| datalayer_core/web/webapp.py | Passes IAM URL to server extension instead of datalayer_url. |
| datalayer_core/utils/urls.py | Refactors defaults + removes datalayer_url from DatalayerURLs. |
| datalayer_core/tests/test_usage.py | Updates tests to use IAM URL override only. |
| datalayer_core/tests/test_cli_main.py | Adds tests for new CLI root/external command handling. |
| datalayer_core/templates/index.html | Expands injected template config to include all service URLs. |
| datalayer_core/otel/logfire.py | Updates OTLP endpoint resolution to OTEL env var naming. |
| datalayer_core/otel/emitter.py | Updates OTLP base resolution to OTEL env var naming. |
| datalayer_core/models/space.py | Adds Space/Item models for spaces and nested items. |
| datalayer_core/mixins/spaces.py | Adds mixin to list spaces (and nested items). |
| datalayer_core/mixins/authn.py | Stores keyring creds under IAM URL instead of datalayer_url. |
| datalayer_core/mixins/init.py | Exports new SpacesMixin. |
| datalayer_core/handlers/config/handler.py | Returns full service_urls instead of single datalayer_url. |
| datalayer_core/displays/me.py | Displays IAM URL instead of datalayer_url. |
| datalayer_core/client/client.py | Adds list_spaces + list_notebooks to Python client. |
| datalayer_core/cli/commands/web.py | Updates web command to accept --iam-url instead of base URL. |
| datalayer_core/cli/commands/otel.py | Updates OTEL CLI env fallback variable name. |
| datalayer_core/cli/commands/authn.py | Updates auth commands to use IAM URL for login/logout/output. |
| datalayer_core/cli/main.py | Removes --datalayer-url; adds external subcommand dispatch support. |
| datalayer_core/base/serverapplication.py | Adds per-service URL traitlets + templates/settings injection. |
| datalayer_core/authn/storage.py | Updates storage docstring to IAM URL as keyring service name. |
| datalayer_core/authn/server/http_server.py | Switches auth server to IAM URL; updates landing config JSON. |
| datalayer_core/authn/server/main.py | Uses default IAM URL constant. |
| datalayer_core/authn/authn.py | Uses IAM-derived service URL for keyring storage names. |
Suppressed comments (1)
src/components/auth/SigInAPIKey.tsx:16
SigInAPIKey/ISigninAPIKeyPropslooks like a typo (mixed “SigIn” vs “SignIn”). Since this is a public export (src/components/auth/index.ts), it’s worth correcting now to avoid locking in a misspelling.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
The spacer's notebook versions, from the client: the listing with each version's actor, a snapshot with a message, and a restore — the spacer keeps what a restore replaces, so it can itself be undone. A refusal is a RuntimeError in the spacer's words. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
`share_runtime`, `unshare_runtime`, `runtime_sharing` and `runtime_permissions` on the client, over Runtimes' sharing routes as the caller; `datalayer mcp sandboxes share|unshare|sharing|permissions` on top. A share adds to the level unless `--replace`; an unshare naming nobody revokes everybody at the level, and `all` walks every level. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The catalogue and the session, which is what a person needs to see and manage what their agents borrowed: which sources lend tools, which have a session open, and opening or revoking one. A source that answers no manifest, or answers one lending nothing, is left out — a listing of everything with an empty column beside most rows is a listing nobody reads. Enabling carries an idempotency key, so asking twice opens one session. Contents decides throughout; a refusal reaches the person in its words. Three mutations killed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The service declares them without one and does not redirect, so
/traces/{id}/ answered 404 for a trace the listing had just returned —
and datalayer mcp trace showed nothing for every run.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The CLI could share a sandbox and nothing else could. The bound-sandboxes panel gains a Share action beside Terminate, and the sandbox details dialog a Manage sharing button, both opening the ShareAccessDialog already used for content. No transport to write: Runtimes answers an access document in the shape the dialog reads, so it talks to Runtimes directly. Two things had to be right. Which name. A sandbox has two — the handle its session holds and the runtime's own — and Runtimes' routes take the second; sending the first is a 403 that reads as 'you are not the owner'. sandboxSharingUrl is where that is written down once, and it answers undefined for a sandbox with no runtime behind it, so a browser kernel is offered no button rather than a broken one. And whose sandbox it is. Runtimes names the owner inside the sharing document rather than beside it, and the dialog looked only beside it — drawing no owner at all, which reads as a resource nobody owns. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
| if (!base || !name) { | ||
| return undefined; | ||
| } | ||
| return `${base.replace(/\/+$/, '')}/api/runtimes/v1/runtimes/${encodeURIComponent(name)}/sharing`; |
…eleted The 3-way reconcile treated a deletion already agreed on both sides (a `buried` tombstone in the base) as a fresh deletion to propagate. So a path both sides had agreed to delete, then re-created on one side as a new file, was destroyed by a bidirectional --delete sync (delete_remote/delete_local) instead of being uploaded/downloaded — silent data loss. deleted_remotely/deleted_locally now exclude `buried`. accepted_after buries a path only once it is an entry on neither side, so `buried` means the deletion was fully applied and a copy present now is unambiguously a re-creation: it is propagated, never re-deleted. A genuinely fresh deletion (base still held the file) still propagates with --delete, and two sides re-creating the same path differently is a conflict. Only the Contents service calls reconcile (the CLI applies the plan), so this takes effect in the service; the added regression test pins re-creation, symmetric re-creation, competing re-creations, and that fresh deletion still propagates. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`datalayer mcp ...` is complete and unreleased — setup, agents, service-agents, tasks, audit, toolsets and policy, beside activity, trace, metrics, logs, bindings, alerts, jobs, forwarding and sandboxes. A minor bump because the surface is new rather than fixed, and because the plan's Agents milestone names this release as what makes the CLI reachable by anyone who has not cloned the repo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.