You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Build one console "prompt-for-value at create time" picker that collects ${input} values when a new agent is created from a bundle/archetype, and writes the resolved config. It's the shared front-end for two already-designed backend seams (ADR 0083 D5):
Archetype/bundle seam: env + secrets seeding #2014 — bundle secrets:/env seeding (deferred pending this): archetypes want to ask the operator for API keys at create time instead of a post-install settings hunt. This is fundamentally a prompt-for-value flow — it has no useful backend-only form (pre-creating empty secret fields adds nothing; auto-resolving secrets from host env widens blast radius, against ADR 0080's inherit_env non-leak posture). So it waits on this picker.
Both use the same input contract already established by config/mcp-catalog.json:
and the same ${key} placeholder syntax (graph/mcp_config._PLACEHOLDER / the console's McpCatalogDialog.fillTemplate). Building it once, for both, is the right sequencing.
Prompt in the new-agent flow (NewAgentPanel / SetupWizard) — reuse McpCatalogDialog's inputs→fillTemplate→submit UI: SecretInput for secret: true, required-but-empty gate, etc.
Resolve + write at create:
mcp: fill the ${input} templates and union into the workspace mcp.servers (the #2011 seeder path — collected values replace the current env-only resolution / seeded-disabled fallback).
secrets: write collected values to the member's <ws>/config/secrets.yaml via graph/config_io.save_secrets (nested {section:{key:val}}, 0600, atomic, merge-not-clobber). This is the missing half of Archetype/bundle seam: env + secrets seeding #2014 — the backend secrets: field + _apply_bundle_secrets seeder land here alongside the picker (they're inert without it).
Security posture (secrets)
Values are collected from the operator, never auto-copied from the host os.environ (that would persist a host-scoped credential into a new instance's secrets.yaml, a larger blast radius than the fleet's env-inheritance — flagged against ADR 0080). Any host-env resolution stays explicit opt-in, off by default.
secret: true inputs never echo back (redacted from /api/config like model.api_key); the create request carrying them must not be logged.
Acceptance
A bundle whose mcp: templates carry required ${input}s prompts the operator at create; the resulting MCP servers are seeded enabled with the supplied values (no more seeded-disabled fallback when the picker is used).
A bundle secrets: field prompts the operator at create; values land in the member's secrets.yaml (0600), redacted from /api/config, never from host env.
Summary
Build one console "prompt-for-value at create time" picker that collects
${input}values when a new agent is created from a bundle/archetype, and writes the resolved config. It's the shared front-end for two already-designed backend seams (ADR 0083 D5):mcp:field (shipped backend, PR feat(bundles): seedable MCP servers via a bundlemcp:field (ADR 0083 D5, #2011) #2039): MCP server templates carry${key}placeholders + aninputslist. Today they resolve only from the seed-time environment; an unresolved required input seeds the serverenabled: false(visible-but-inert). The interactive prompt is deferred to this picker.secrets:/env seeding (deferred pending this): archetypes want to ask the operator for API keys at create time instead of a post-install settings hunt. This is fundamentally a prompt-for-value flow — it has no useful backend-only form (pre-creating empty secret fields adds nothing; auto-resolving secrets from host env widens blast radius, against ADR 0080'sinherit_envnon-leak posture). So it waits on this picker.Both use the same input contract already established by
config/mcp-catalog.json:and the same
${key}placeholder syntax (graph/mcp_config._PLACEHOLDER/ the console'sMcpCatalogDialog.fillTemplate). Building it once, for both, is the right sequencing.What to build
inputs(viamcp:templates and/or asecrets:field). The archetype-preview path (GET /api/archetypes/{id}/preview, ADR 0083 / feat(archetypes): archetype preview — see skills/plugins/SOUL before picking #2016) already peeks the bundle — surface its inputs there.NewAgentPanel/SetupWizard) — reuseMcpCatalogDialog's inputs→fillTemplate→submit UI:SecretInputforsecret: true, required-but-empty gate, etc.${input}templates and union into the workspacemcp.servers(the#2011seeder path — collected values replace the current env-only resolution / seeded-disabled fallback).<ws>/config/secrets.yamlviagraph/config_io.save_secrets(nested{section:{key:val}},0600, atomic, merge-not-clobber). This is the missing half of Archetype/bundle seam: env + secrets seeding #2014 — the backendsecrets:field +_apply_bundle_secretsseeder land here alongside the picker (they're inert without it).Security posture (secrets)
os.environ(that would persist a host-scoped credential into a new instance'ssecrets.yaml, a larger blast radius than the fleet's env-inheritance — flagged against ADR 0080). Any host-env resolution stays explicit opt-in, off by default.secret: trueinputs never echo back (redacted from/api/configlikemodel.api_key); the create request carrying them must not be logged.Acceptance
mcp:templates carry required${input}s prompts the operator at create; the resulting MCP servers are seeded enabled with the supplied values (no more seeded-disabled fallback when the picker is used).secrets:field prompts the operator at create; values land in the member'ssecrets.yaml(0600), redacted from/api/config, never from host env.secrets:field +_apply_bundle_secretsseeder implemented (the Archetype/bundle seam: env + secrets seeding #2014 backend, gated behind this picker).Refs: ADR 0083 D5, #2011 (PR #2039), #2014, #2016 (archetype preview), ADR 0080 (secrets posture),
config/mcp-catalog.json(input contract).