diff --git a/.github/workflows/publish-runtime.yml b/.github/workflows/publish-runtime.yml index f3a180f3..b3750a61 100644 --- a/.github/workflows/publish-runtime.yml +++ b/.github/workflows/publish-runtime.yml @@ -327,13 +327,19 @@ jobs: echo "::error::publish job did not expose a version output — cascade cannot fan out" exit 1 fi - # Source of truth: manifest.json workspace_templates (PR #2536 pruned - # to 4 actively-supported runtimes: claude-code, hermes, openclaw, codex). - # Removed langgraph/crewai/autogen/deepagents/gemini-cli (deprecated, no - # shipping images); added codex (had been missing since #2512). - # Long-term: derive this list from manifest.json so the cascade can't - # drift again — tracked in RFC #388 as a Phase-1 invariant. - TEMPLATES="claude-code hermes openclaw codex" + # All 9 active workspace template repos. The PR #2536 pruning + # ("deprecated, no shipping images") was empirically wrong: + # continuous-synth-e2e.yml defaults to langgraph as its primary + # canary (line 44), and every excluded template had successful + # publish-image runs as of 2026-05-03 — none were dormant. + # Symptom of the prune: today's a2a-sdk strict-mode fix + # (#2566 / commit e1628c4) cascaded to 4 templates but never + # reached langgraph, so the synth-E2E correctly canary'd a fix + # that had landed but not deployed. Re-added the 5 templates. + # Long-term: derive this list from manifest.json so cascade + # scope can't drift from E2E scope — tracked in RFC #388 as a + # Phase-1 invariant. + TEMPLATES="claude-code hermes openclaw codex langgraph crewai autogen deepagents gemini-cli" FAILED="" for tpl in $TEMPLATES; do REPO="Molecule-AI/molecule-ai-workspace-template-$tpl" diff --git a/canvas/src/components/Legend.tsx b/canvas/src/components/Legend.tsx index 647479ef..c6d67365 100644 --- a/canvas/src/components/Legend.tsx +++ b/canvas/src/components/Legend.tsx @@ -1,11 +1,23 @@ "use client"; import { useEffect, useState } from "react"; -import { STATUS_CONFIG } from "@/lib/design-tokens"; +import { STATUS_CONFIG, TIER_CONFIG } from "@/lib/design-tokens"; import { useCanvasStore } from "@/store/canvas"; const LEGEND_STATUSES = ["online", "provisioning", "degraded", "failed", "paused", "offline"] as const; +// Tier descriptions kept in sync with CreateWorkspaceDialog.tsx (the +// source of truth for what each tier means semantically). Colors come +// from TIER_CONFIG so the legend swatch matches the badge actually +// rendered on every WorkspaceNode — drift here misled users into +// thinking the legend documented a different tier than the one shown. +const LEGEND_TIERS: ReadonlyArray<{ tier: number; label: string }> = [ + { tier: 1, label: "Sandboxed" }, + { tier: 2, label: "Standard" }, + { tier: 3, label: "Privileged" }, + { tier: 4, label: "Full Access" }, +]; + // Persist the user's choice across sessions. Default is "open" so // first-time users still see the symbol key; once dismissed we // respect that until they explicitly reopen via the floating pill. @@ -102,9 +114,9 @@ export function Legend() {
Tier
- - - + {LEGEND_TIERS.map(({ tier, label }) => ( + + ))}
diff --git a/canvas/src/components/tabs/ConfigTab.tsx b/canvas/src/components/tabs/ConfigTab.tsx index da2eb206..8682073b 100644 --- a/canvas/src/components/tabs/ConfigTab.tsx +++ b/canvas/src/components/tabs/ConfigTab.tsx @@ -655,7 +655,8 @@ export function ConfigTab({ workspaceId }: Props) { > - + + diff --git a/canvas/src/lib/tenant.ts b/canvas/src/lib/tenant.ts index 13881037..095b1391 100644 --- a/canvas/src/lib/tenant.ts +++ b/canvas/src/lib/tenant.ts @@ -59,8 +59,8 @@ export function getTenantSlug(): string { * isSaaSTenant reports whether the canvas is running as the UI for a * SaaS tenant (served at .moleculesai.app). Use for client-side * UX branches that should behave differently on SaaS vs self-hosted — - * e.g. the workspace tier picker hides T1/T2 sandbox tiers because every - * SaaS workspace gets its own EC2 VM (inherently T3 Full Access). + * e.g. the workspace tier picker hides T1/T2/T3 sandbox tiers because + * every SaaS workspace gets its own EC2 VM (inherently T4 Full Access). * * SSR-safe: returns false on the server to avoid hydration drift; call * sites should tolerate a flip from false→true on first client render. diff --git a/manifest.json b/manifest.json index 7610bd80..96be673d 100644 --- a/manifest.json +++ b/manifest.json @@ -28,7 +28,12 @@ {"name": "claude-code-default", "repo": "Molecule-AI/molecule-ai-workspace-template-claude-code", "ref": "main"}, {"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": "codex", "repo": "Molecule-AI/molecule-ai-workspace-template-codex", "ref": "main"}, + {"name": "langgraph", "repo": "Molecule-AI/molecule-ai-workspace-template-langgraph", "ref": "main"}, + {"name": "crewai", "repo": "Molecule-AI/molecule-ai-workspace-template-crewai", "ref": "main"}, + {"name": "autogen", "repo": "Molecule-AI/molecule-ai-workspace-template-autogen", "ref": "main"}, + {"name": "deepagents", "repo": "Molecule-AI/molecule-ai-workspace-template-deepagents", "ref": "main"}, + {"name": "gemini-cli", "repo": "Molecule-AI/molecule-ai-workspace-template-gemini-cli", "ref": "main"} ], "org_templates": [ {"name": "molecule-dev", "repo": "Molecule-AI/molecule-ai-org-template-molecule-dev", "ref": "main"},