Skip to content

feat: msc 3 - #235

Open
echarles wants to merge 158 commits into
mainfrom
feat/msc-3
Open

feat: msc 3#235
echarles wants to merge 158 commits into
mainfrom
feat/msc-3

Conversation

@echarles

Copy link
Copy Markdown
Member

No description provided.

Copilot AI lite review requested due to automatic review settings August 14, 2026 06:58
@netlify

netlify Bot commented Aug 14, 2026

Copy link
Copy Markdown

Deploy Preview for datalayer-core failed.

Name Link
🔨 Latest commit 2c7cb22
🔍 Latest deploy log https://app.netlify.com/projects/datalayer-core/deploys/6a9e8cbbef764f0008205e16

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 StatusLabel pills, new AnimatedText, 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 / ISigninAPIKeyProps looks 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.

Comment thread examples/otel/app/main.py Outdated
Comment thread examples/otel/app/generator.py
Comment thread datalayer_core/otel/emitter.py
Comment thread datalayer_core/authn/server/http_server.py
Comment thread datalayer_core/cli/__main__.py Outdated
Comment thread src/config/Configuration.ts
Comment thread README.md Outdated
github-actions Bot and others added 25 commits September 2, 2026 18:20
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`;
echarles and others added 4 commits September 6, 2026 19:58
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants