From 0359912d063f5585a7059433ac3aae41ba5e06b9 Mon Sep 17 00:00:00 2001 From: core-devops Date: Thu, 28 May 2026 21:30:36 -0700 Subject: [PATCH 1/2] feat: register google-adk runtime (manifest + knownRuntimes + canvas) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Platform-side registration for the google-adk workspace runtime (RFC internal#730). Required so a workspace with runtime: google-adk provisions (Docker path) and is creatable from the canvas: - manifest.json: workspace_templates entry → handler allowlist (loadRuntimesFromManifest) - provisioner/registry.go: knownRuntimes += google-adk (else ErrUnresolvableRuntime); test count 4→5 - canvas CreateWorkspaceDialog: RUNTIME_OPTIONS + BASE_RUNTIME_TEMPLATE_IDS - canvas runtime-names.ts: display name Depends on molecule-ai-workspace-template-google-adk (image build/publish) + controlplane runtime_image_pins (SaaS path) — tracked in RFC #730. Verified: go build + provisioner/handlers tests green; manifest.json valid. Co-Authored-By: Claude Opus 4.8 (1M context) --- canvas/src/components/CreateWorkspaceDialog.tsx | 3 ++- canvas/src/lib/runtime-names.ts | 1 + manifest.json | 1 + workspace-server/internal/provisioner/registry.go | 1 + workspace-server/internal/provisioner/registry_test.go | 4 ++-- 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/canvas/src/components/CreateWorkspaceDialog.tsx b/canvas/src/components/CreateWorkspaceDialog.tsx index 5528d9750..c46c84160 100644 --- a/canvas/src/components/CreateWorkspaceDialog.tsx +++ b/canvas/src/components/CreateWorkspaceDialog.tsx @@ -38,10 +38,11 @@ const DEFAULT_RUNTIME = "claude-code"; const RUNTIME_OPTIONS = [ { value: "claude-code", label: "Claude Code" }, { value: "codex", label: "OpenAI Codex CLI" }, + { value: "google-adk", label: "Google ADK" }, { value: "hermes", label: "Hermes" }, { value: "openclaw", label: "OpenClaw" }, ]; -const BASE_RUNTIME_TEMPLATE_IDS = new Set(["claude-code-default", "codex", "hermes", "openclaw"]); +const BASE_RUNTIME_TEMPLATE_IDS = new Set(["claude-code-default", "codex", "google-adk", "hermes", "openclaw"]); const DEFAULT_HEADLESS_INSTANCE_TYPE = "t3.medium"; const DEFAULT_HEADLESS_ROOT_GB = 30; const DEFAULT_DISPLAY_INSTANCE_TYPE = "t3.xlarge"; diff --git a/canvas/src/lib/runtime-names.ts b/canvas/src/lib/runtime-names.ts index bf6ed9780..d6e9ec03d 100644 --- a/canvas/src/lib/runtime-names.ts +++ b/canvas/src/lib/runtime-names.ts @@ -5,6 +5,7 @@ const RUNTIME_NAMES: Record = { "claude-code": "Claude Code", codex: "Codex", + "google-adk": "Google ADK", hermes: "Hermes", openclaw: "OpenClaw", kimi: "Kimi", diff --git a/manifest.json b/manifest.json index 5ba8c48bc..e6e6f0740 100644 --- a/manifest.json +++ b/manifest.json @@ -29,6 +29,7 @@ {"name": "hermes", "repo": "molecule-ai/molecule-ai-workspace-template-hermes", "ref": "main"}, {"name": "openclaw", "repo": "molecule-ai/molecule-ai-workspace-template-openclaw", "ref": "main"}, {"name": "codex", "repo": "molecule-ai/molecule-ai-workspace-template-codex", "ref": "main"}, + {"name": "google-adk", "repo": "molecule-ai/molecule-ai-workspace-template-google-adk", "ref": "main"}, {"name": "seo-agent", "repo": "molecule-ai/molecule-ai-workspace-template-seo-agent", "ref": "main"} ], "org_templates": [ diff --git a/workspace-server/internal/provisioner/registry.go b/workspace-server/internal/provisioner/registry.go index 4f1eee256..245cbd2b4 100644 --- a/workspace-server/internal/provisioner/registry.go +++ b/workspace-server/internal/provisioner/registry.go @@ -20,6 +20,7 @@ const defaultRegistryPrefix = "ghcr.io/molecule-ai" var knownRuntimes = []string{ "claude-code", "codex", + "google-adk", "hermes", "openclaw", } diff --git a/workspace-server/internal/provisioner/registry_test.go b/workspace-server/internal/provisioner/registry_test.go index 39be4c455..e6e9b868f 100644 --- a/workspace-server/internal/provisioner/registry_test.go +++ b/workspace-server/internal/provisioner/registry_test.go @@ -53,8 +53,8 @@ func TestRuntimeImage_AllKnownRuntimes(t *testing.T) { } } // Pin the count so adding a runtime requires explicit test acknowledgement. - if len(knownRuntimes) != 4 { - t.Errorf("knownRuntimes length = %d, want 4 (claude-code, codex, hermes, openclaw)", len(knownRuntimes)) + if len(knownRuntimes) != 5 { + t.Errorf("knownRuntimes length = %d, want 5 (claude-code, codex, google-adk, hermes, openclaw)", len(knownRuntimes)) } } -- 2.52.0 From f82a980a794e914cd75c81422020c2a90f4104d7 Mon Sep 17 00:00:00 2001 From: core-devops Date: Fri, 29 May 2026 11:02:14 -0700 Subject: [PATCH 2/2] test(canvas): add Google ADK to CreateWorkspaceDialog runtime-options assertion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RUNTIME_OPTIONS gained 'Google ADK' but the test's hardcoded expected array (separate-selectors test) still listed 4 → Canvas (Next.js) CI red (5 vs 4). Add it in component order (after OpenAI Codex CLI). Caught by comprehensive pre-merge review — a real regression from this PR's own diff, not the staging-E2E infra flake. Co-Authored-By: Claude Opus 4.8 (1M context) --- canvas/src/components/__tests__/CreateWorkspaceDialog.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/canvas/src/components/__tests__/CreateWorkspaceDialog.test.tsx b/canvas/src/components/__tests__/CreateWorkspaceDialog.test.tsx index a32d8074d..3b397d513 100644 --- a/canvas/src/components/__tests__/CreateWorkspaceDialog.test.tsx +++ b/canvas/src/components/__tests__/CreateWorkspaceDialog.test.tsx @@ -213,6 +213,7 @@ describe("CreateWorkspaceDialog", () => { expect(runtimeTexts).toEqual([ "Claude Code", "OpenAI Codex CLI", + "Google ADK", "Hermes", "OpenClaw", ]); -- 2.52.0