smol-symphony 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/AGENTS.md +105 -38
  2. package/PRODUCT.md +2 -1
  3. package/README.md +195 -98
  4. package/SPEC.md +543 -1915
  5. package/WORKFLOW.md +654 -179
  6. package/WORKFLOW.template.md +761 -121
  7. package/dist/acp-bridge.js +324 -0
  8. package/dist/acp-bridge.js.map +1 -0
  9. package/dist/actions/cache.js +191 -0
  10. package/dist/actions/cache.js.map +1 -0
  11. package/dist/actions/effects.js +41 -0
  12. package/dist/actions/effects.js.map +1 -0
  13. package/dist/actions/executor.js +570 -0
  14. package/dist/actions/executor.js.map +1 -0
  15. package/dist/actions/index.js +13 -0
  16. package/dist/actions/index.js.map +1 -0
  17. package/dist/actions/parsing.js +273 -0
  18. package/dist/actions/parsing.js.map +1 -0
  19. package/dist/actions/predicate-env.js +27 -0
  20. package/dist/actions/predicate-env.js.map +1 -0
  21. package/dist/actions/predicates.js +49 -0
  22. package/dist/actions/predicates.js.map +1 -0
  23. package/dist/actions/templating.js +66 -0
  24. package/dist/actions/templating.js.map +1 -0
  25. package/dist/actions/types.js +15 -0
  26. package/dist/actions/types.js.map +1 -0
  27. package/dist/agent/acp.js +232 -63
  28. package/dist/agent/acp.js.map +1 -1
  29. package/dist/agent/adapter-names.js +159 -0
  30. package/dist/agent/adapter-names.js.map +1 -0
  31. package/dist/agent/adapters.js +338 -102
  32. package/dist/agent/adapters.js.map +1 -1
  33. package/dist/agent/credential-extractors.js +342 -0
  34. package/dist/agent/credential-extractors.js.map +1 -0
  35. package/dist/agent/credential-secrets.js +628 -0
  36. package/dist/agent/credential-secrets.js.map +1 -0
  37. package/dist/agent/credential-ticker.js +57 -0
  38. package/dist/agent/credential-ticker.js.map +1 -0
  39. package/dist/agent/gondolin-creds-staging.js +356 -0
  40. package/dist/agent/gondolin-creds-staging.js.map +1 -0
  41. package/dist/agent/gondolin-dispatch.js +375 -0
  42. package/dist/agent/gondolin-dispatch.js.map +1 -0
  43. package/dist/agent/gondolin.js +124 -0
  44. package/dist/agent/gondolin.js.map +1 -0
  45. package/dist/agent/runner-decisions.js +134 -0
  46. package/dist/agent/runner-decisions.js.map +1 -0
  47. package/dist/agent/runner.js +1352 -290
  48. package/dist/agent/runner.js.map +1 -1
  49. package/dist/agent/tool-call-summary.js +102 -0
  50. package/dist/agent/tool-call-summary.js.map +1 -0
  51. package/dist/agent/vm-acp-mapping.js +73 -0
  52. package/dist/agent/vm-acp-mapping.js.map +1 -0
  53. package/dist/agent/vm-guards.js +262 -0
  54. package/dist/agent/vm-guards.js.map +1 -0
  55. package/dist/agent/vm-port.js +22 -0
  56. package/dist/agent/vm-port.js.map +1 -0
  57. package/dist/agent/vm-process-registry.js +79 -0
  58. package/dist/agent/vm-process-registry.js.map +1 -0
  59. package/dist/bin/cli-args.js +105 -0
  60. package/dist/bin/cli-args.js.map +1 -0
  61. package/dist/bin/symphony.js +719 -130
  62. package/dist/bin/symphony.js.map +1 -1
  63. package/dist/errors.js +15 -0
  64. package/dist/errors.js.map +1 -0
  65. package/dist/http-disk.js +135 -0
  66. package/dist/http-disk.js.map +1 -0
  67. package/dist/http-handlers.js +180 -0
  68. package/dist/http-handlers.js.map +1 -0
  69. package/dist/http.js +1476 -764
  70. package/dist/http.js.map +1 -1
  71. package/dist/issues.js +178 -0
  72. package/dist/issues.js.map +1 -0
  73. package/dist/logging.js +163 -5
  74. package/dist/logging.js.map +1 -1
  75. package/dist/mcp.js +391 -163
  76. package/dist/mcp.js.map +1 -1
  77. package/dist/memory.js +85 -0
  78. package/dist/memory.js.map +1 -0
  79. package/dist/orchestrator-decisions.js +331 -0
  80. package/dist/orchestrator-decisions.js.map +1 -0
  81. package/dist/orchestrator.js +1189 -303
  82. package/dist/orchestrator.js.map +1 -1
  83. package/dist/prompt.js +5 -5
  84. package/dist/prompt.js.map +1 -1
  85. package/dist/reconciler/cache.js +65 -0
  86. package/dist/reconciler/cache.js.map +1 -0
  87. package/dist/reconciler/index.js +448 -0
  88. package/dist/reconciler/index.js.map +1 -0
  89. package/dist/reconciler/ledger.js +131 -0
  90. package/dist/reconciler/ledger.js.map +1 -0
  91. package/dist/reconciler/pr-adapters.js +174 -0
  92. package/dist/reconciler/pr-adapters.js.map +1 -0
  93. package/dist/reconciler/pr-decide.js +167 -0
  94. package/dist/reconciler/pr-decide.js.map +1 -0
  95. package/dist/reconciler/pr.js +422 -0
  96. package/dist/reconciler/pr.js.map +1 -0
  97. package/dist/reconciler/types.js +12 -0
  98. package/dist/reconciler/types.js.map +1 -0
  99. package/dist/reconciler/vm.js +243 -0
  100. package/dist/reconciler/vm.js.map +1 -0
  101. package/dist/reconciler/workspace-defaults.js +83 -0
  102. package/dist/reconciler/workspace-defaults.js.map +1 -0
  103. package/dist/reconciler/workspace.js +272 -0
  104. package/dist/reconciler/workspace.js.map +1 -0
  105. package/dist/runlog.js +403 -0
  106. package/dist/runlog.js.map +1 -0
  107. package/dist/scaffold.js +165 -0
  108. package/dist/scaffold.js.map +1 -0
  109. package/dist/trackers/local.js +234 -133
  110. package/dist/trackers/local.js.map +1 -1
  111. package/dist/trackers/types.js +1 -1
  112. package/dist/trackers/types.js.map +1 -1
  113. package/dist/types.js +1 -1
  114. package/dist/util/clock.js +12 -0
  115. package/dist/util/clock.js.map +1 -0
  116. package/dist/util/crypto.js +25 -0
  117. package/dist/util/crypto.js.map +1 -0
  118. package/dist/util/frontmatter.js +70 -0
  119. package/dist/util/frontmatter.js.map +1 -0
  120. package/dist/util/fs-issues.js +22 -0
  121. package/dist/util/fs-issues.js.map +1 -0
  122. package/dist/util/process.js +152 -0
  123. package/dist/util/process.js.map +1 -0
  124. package/dist/util/workspace-key.js +10 -0
  125. package/dist/util/workspace-key.js.map +1 -0
  126. package/dist/workflow-loader.js +147 -0
  127. package/dist/workflow-loader.js.map +1 -0
  128. package/dist/workflow.js +656 -219
  129. package/dist/workflow.js.map +1 -1
  130. package/dist/workspace-types.js +8 -0
  131. package/dist/workspace-types.js.map +1 -0
  132. package/dist/workspace.js +367 -120
  133. package/dist/workspace.js.map +1 -1
  134. package/package.json +14 -6
  135. package/scripts/vm-agent.mjs +211 -0
  136. package/dist/agent/codex.js +0 -439
  137. package/dist/agent/codex.js.map +0 -1
  138. package/dist/agent/smolvm.js +0 -174
  139. package/dist/agent/smolvm.js.map +0 -1
  140. package/scripts/build-vm.sh +0 -67
@@ -1,111 +1,331 @@
1
1
  // Registry of ACP adapters symphony knows how to launch end-to-end.
2
2
  //
3
- // Each profile encodes everything symphony needs to ship a working adapter into the
4
- // per-issue smolvm without per-workflow bash boilerplate:
3
+ // Each profile encodes the executable inside the VM that speaks ACP, plus the
4
+ // optional model/effort injection channels (env vars, extra argv, staged files)
5
+ // the adapter natively understands. Credentials are NOT a per-adapter concern
6
+ // here: the guest holds only a token-shaped placeholder and the host substitutes
7
+ // the real upstream token (Anthropic OAuth for claude, an OpenAI API key or
8
+ // ChatGPT-OAuth access token for codex, a minted GitHub Copilot token for
9
+ // opencode) into the outbound request at Gondolin egress (TLS-MITM — see
10
+ // `src/agent/credential-secrets.ts`). The real refresh/durable token never
11
+ // enters the VM.
5
12
  //
6
- // - hostCredentialPath : the file on the host (relative to $HOME) that authenticates
7
- // the adapter. Symphony reads this and stages it into the
8
- // workspace before VM boot.
9
- // - guestCredentialPath: the absolute path inside the VM where the adapter expects
10
- // to find that file. Symphony's auto-generated acp launch
11
- // command copies the staged file here at startup.
12
- // - binary : the executable inside the VM that speaks ACP.
13
- //
14
- // To add a new adapter (e.g. opencode), populate the profile and add it to ADAPTERS.
15
- // Until an adapter has a verified profile, workflows can still target it by setting
16
- // `acp.command` explicitly — that opts out of symphony's auto-staging and the operator
17
- // becomes responsible for getting credentials to the adapter themselves.
18
- //
19
- // IMPORTANT: every host path here is treated as private. Symphony reads the file,
20
- // stages a copy into the workspace, and chmods the copy to 0600. The original host
21
- // file is never exposed via a bind mount.
22
- import { constants as fsConstants } from 'node:fs';
23
- import { access, copyFile, mkdir, chmod, lstat, rm, realpath } from 'node:fs/promises';
13
+ // To add a new adapter, populate the profile and add it to ADAPTERS. Unprofiled
14
+ // adapters are not supported at runtime.
15
+ import { lstat, mkdir, readFile, realpath, rm, writeFile } from 'node:fs/promises';
16
+ import { homedir } from 'node:os';
24
17
  import path from 'node:path';
25
- import os from 'node:os';
18
+ import { isKnownAdapter } from './adapter-names.js';
19
+ // Re-export the names registry so orchestrator-side callers can keep importing
20
+ // `isKnownAdapter` / `AcpAdapterId` from this module. The canonical home is
21
+ // adapter-names.ts; this is just a convenience re-export.
22
+ export { isKnownAdapter };
23
+ // VM-facing env var names the opencode custom provider reads (via `{env:VAR}`)
24
+ // for its base URL + bearer. The staged opencode.json (`buildOpencodeConfig`)
25
+ // references these exact names; the token var MUST equal `OPENCODE_SECRET_NAME`
26
+ // in `credential-secrets.ts` so the placeholder bearer Gondolin substitutes at
27
+ // egress is keyed under the name the in-VM provider reads — a drift would
28
+ // silently break the in-VM provider resolution.
29
+ const OPENCODE_PROXY_BASE_URL_VAR = 'OPENCODE_PROXY_BASE_URL';
30
+ const OPENCODE_PROXY_TOKEN_VAR = 'OPENCODE_PROXY_TOKEN';
26
31
  export const ADAPTERS = {
27
32
  claude: {
28
33
  id: 'claude',
29
- hostCredentialPath: '.claude/.credentials.json',
30
- guestCredentialPath: '/root/.claude/.credentials.json',
31
34
  binary: ['claude-agent-acp'],
35
+ // Anthropic subscription OAuth lives only on the host; the guest holds a
36
+ // token-shaped placeholder and Gondolin substitutes the real access token at
37
+ // egress on every upstream request (see `credential-secrets.ts`).
38
+ // claude-agent-acp reads ANTHROPIC_MODEL on startup (see acp-agent.js getAvailableModels:
39
+ // ANTHROPIC_MODEL > settings.model > default). The adapter resolves aliases like
40
+ // "opus" or "claude-sonnet-4-5" against the SDK's model list, so anything the user
41
+ // would type into Claude Code works here.
42
+ modelInjection: (model) => ({ env: { ANTHROPIC_MODEL: model } }),
43
+ // claude-agent-acp reads `effortLevel` out of merged settings (the SDK's
44
+ // `resolveSettings` walks `$CLAUDE_CONFIG_DIR/settings.json`, `<cwd>/.claude/settings.json`,
45
+ // etc.) and applies it via `query.applyFlagSettings`. There is no ANTHROPIC_EFFORT env var
46
+ // and the wrapper does not expose a CLI flag, so the only reachable channel from symphony
47
+ // is a settings.json staged next to the identity file and copied to /root/.claude/settings.json
48
+ // before the in-VM agent execs the adapter. Valid values are `low|medium|high|xhigh|max`, gated
49
+ // per-model by claude-agent-acp's `supportedEffortLevels`; symphony lets the adapter reject
50
+ // invalid choices rather than mirroring the gate.
51
+ effortInjection: (effort) => ({
52
+ stagedFiles: [
53
+ {
54
+ stagedName: 'claude-settings.json',
55
+ content: JSON.stringify({ effortLevel: effort }),
56
+ guestPath: '/root/.claude/settings.json',
57
+ },
58
+ ],
59
+ }),
32
60
  },
33
61
  codex: {
34
62
  id: 'codex',
35
- hostCredentialPath: '.codex/auth.json',
36
- guestCredentialPath: '/root/.codex/auth.json',
37
63
  binary: ['codex-acp'],
64
+ // codex (ChatGPT-OAuth) runs in its NATIVE mode: the guest holds a JWT-shaped
65
+ // placeholder as `~/.codex/auth.json:tokens.access_token` and Gondolin
66
+ // substitutes the real ChatGPT/OpenAI token at egress. The host stages a
67
+ // COMPLETE fake auth.json (placeholder tokens + the non-secret
68
+ // `account_id`/`auth_mode`/`last_refresh` codex 0.135's completeness check
69
+ // needs — see `gondolin-creds-staging.ts` `buildCodexFiles`); no real token,
70
+ // and no refresh token, ever enters the VM.
71
+ // codex-acp takes config overrides via `-c key=value` where value is parsed as TOML
72
+ // (raw-string fallback on parse failure). We always emit a quoted TOML string so
73
+ // model names containing dots or hyphens don't surprise the TOML parser.
74
+ modelInjection: (model) => ({ extraArgs: ['-c', `model=${JSON.stringify(model)}`] }),
75
+ // KNOWN GO-LIVE BLOCKER (codex over Gondolin, native ChatGPT-OAuth): codex-acp
76
+ // 0.15 streams `/backend-api/codex/responses` over a WebSocket. Through the
77
+ // Gondolin substrate that stream disconnects (`ResponseStreamDisconnected`,
78
+ // http_status_code: None) — codex then misreads the drop as an auth failure and
79
+ // attempts a token refresh, which is egress-blocked (auth.openai.com not
80
+ // allowlisted) → 403 → the turn is REFUSED. The placeholder-JWT account-id fix
81
+ // (credential-secrets.ts) is necessary (it stops the *pre-emptive* refresh so
82
+ // codex reaches `/responses` at all) but NOT sufficient. Neither
83
+ // `allowWebSockets:true` (the WS still drops) nor a config override resolves it:
84
+ // codex 0.135 forbids overriding the reserved built-in `openai` provider
85
+ // (`supports_websockets=false` → "Built-in providers cannot be overridden"),
86
+ // and codex-acp has no user-facing knob to force the HTTP transport
87
+ // (`force_http_fallback` is an internal Rust symbol, not a TOML config key).
88
+ // `codex exec` (the CLI, HTTP SSE) works fine through Gondolin — so this is
89
+ // specific to codex-acp's WebSocket Responses transport vs Gondolin's WS-MITM.
90
+ // Resolving it needs a substrate-level or codex-acp-version change (escalate);
91
+ // claude is fully green on the same path.
92
+ },
93
+ opencode: {
94
+ id: 'opencode',
95
+ binary: ['opencode', 'acp'],
96
+ // opencode reaches GitHub Copilot via a staged opencode.json custom
97
+ // `@ai-sdk/openai-compatible` provider whose baseURL/apiKey read the
98
+ // OPENCODE_PROXY_* env vars through opencode's `{env:VAR}` interpolation. The
99
+ // guest sends only a `gho_`-shaped placeholder bearer; the host mints a
100
+ // short-lived GitHub Copilot token (exchanged host-side from the operator's
101
+ // `opencode auth login` GitHub OAuth token at
102
+ // api.github.com/copilot_internal/v2/token) and Gondolin substitutes it into
103
+ // the outbound request at egress, injecting the Copilot editor headers,
104
+ // against api.githubcopilot.com. The durable GitHub OAuth token never enters
105
+ // the VM. See `credential-secrets.ts` and
106
+ // docs/research/opencode-copilot-accept-matrix.md.
107
+ // opencode picks its model from the staged opencode.json `model` key
108
+ // ("<providerID>/<modelID>"); the ACP `session/new` carries no model. The
109
+ // provider block must exist even when no model is pinned, so the whole
110
+ // config (provider + model) is staged together via stageOpencodeConfig
111
+ // (see runner.stageAdapterExtras), not through this env/argv channel.
112
+ // Returning an empty injection keeps this path inert.
113
+ modelInjection: () => ({}),
38
114
  },
39
115
  };
40
- export function isKnownAdapter(id) {
41
- return id === 'claude' || id === 'codex';
116
+ /** Provider id of the opencode custom (credential-substituted) provider. */
117
+ export const OPENCODE_PROXY_PROVIDER_ID = 'symphony-copilot';
118
+ /**
119
+ * Default GitHub Copilot model opencode uses when the workflow pins no
120
+ * `acp.model`. DOC-DERIVED: `gpt-4o` is broadly available across Copilot
121
+ * subscription tiers. Operators override per-state via `acp.model` (any id
122
+ * their Copilot subscription exposes — GPT-5, Claude Sonnet, Gemini, …).
123
+ */
124
+ export const OPENCODE_DEFAULT_COPILOT_MODEL = 'gpt-4o';
125
+ // A small pinned set of Copilot-backed model ids the custom provider advertises
126
+ // so opencode does not need to hit `<baseURL>/models` for discovery (the
127
+ // upstream serves /models too, but pinning avoids the round-trip and a discovery
128
+ // dependency). DOC-DERIVED — the exact id set a given Copilot subscription
129
+ // exposes is operator/tier-dependent; an operator's `acp.model` is always
130
+ // merged in (see buildOpencodeConfig) so a pinned model that isn't in this list
131
+ // still resolves.
132
+ const OPENCODE_PINNED_COPILOT_MODELS = [
133
+ 'gpt-4o',
134
+ 'gpt-4.1',
135
+ 'o4-mini',
136
+ 'claude-sonnet-4.5',
137
+ 'claude-sonnet-4',
138
+ 'gemini-2.5-pro',
139
+ ];
140
+ /**
141
+ * Build the opencode.json staged into the VM (pure; exported for tests). It
142
+ * declares the `symphony-copilot` custom provider whose baseURL/apiKey read the
143
+ * OPENCODE_PROXY_* env vars via `{env:…}` interpolation, advertises a pinned
144
+ * Copilot model set (plus the operator's selected model), and pins the default
145
+ * model to `<providerID>/<model>`. Two-space-indented so it reads cleanly if an
146
+ * operator inspects the staged file.
147
+ *
148
+ * The `{env:VAR}` names are the shared OPENCODE_PROXY_* constants, so the in-VM
149
+ * opencode resolves the same base URL + placeholder bearer the host stages (the
150
+ * token var matches `OPENCODE_SECRET_NAME` in `credential-secrets.ts`).
151
+ */
152
+ export function buildOpencodeConfig(model) {
153
+ const selected = model && model.length > 0 ? model : OPENCODE_DEFAULT_COPILOT_MODEL;
154
+ const ids = new Set([...OPENCODE_PINNED_COPILOT_MODELS, selected]);
155
+ const models = {};
156
+ for (const id of ids)
157
+ models[id] = {};
158
+ return JSON.stringify({
159
+ $schema: 'https://opencode.ai/config.json',
160
+ provider: {
161
+ [OPENCODE_PROXY_PROVIDER_ID]: {
162
+ npm: '@ai-sdk/openai-compatible',
163
+ name: 'Symphony Copilot proxy',
164
+ options: {
165
+ baseURL: `{env:${OPENCODE_PROXY_BASE_URL_VAR}}`,
166
+ apiKey: `{env:${OPENCODE_PROXY_TOKEN_VAR}}`,
167
+ },
168
+ models,
169
+ },
170
+ },
171
+ model: `${OPENCODE_PROXY_PROVIDER_ID}/${selected}`,
172
+ }, null, 2);
173
+ }
174
+ /**
175
+ * Absolute guest path the staged opencode.json is copied to inside the VM.
176
+ * opencode reads its global config from `$XDG_CONFIG_HOME/opencode/opencode.json`
177
+ * (defaulting to `~/.config/opencode/opencode.json`); the VM runs as root, so
178
+ * `/root/.config/opencode/opencode.json`. DOC-DERIVED: that `opencode acp`
179
+ * honours the global config + custom provider + `{env:VAR}` interpolation is
180
+ * recorded in docs/research/opencode-copilot-accept-matrix.md.
181
+ */
182
+ export const OPENCODE_CONFIG_GUEST_PATH = '/root/.config/opencode/opencode.json';
183
+ /**
184
+ * Stage the opencode.json (custom-provider + model) into the workspace runtime
185
+ * tree. Mirrors stageCodexPlaceholderAuth: synthetic content (no secret — the
186
+ * placeholder bearer arrives via env, never a real token), so it never fails on
187
+ * a missing host file.
188
+ */
189
+ export async function stageOpencodeConfig(workspacePath, model) {
190
+ return stageRuntimeFile(workspacePath, 'opencode.json', buildOpencodeConfig(model));
42
191
  }
43
192
  export function profileFor(id) {
44
193
  return ADAPTERS[id];
45
194
  }
46
- /** Absolute path on the host where the adapter's credential file lives. */
47
- export function hostCredentialAbsPath(profile) {
48
- return path.join(os.homedir(), profile.hostCredentialPath);
195
+ export async function stageRuntimeFile(workspacePath, stagedName, content) {
196
+ return stageNamedFileUnder(workspacePath, 'runtime', stagedName, content);
49
197
  }
50
- /** Verify the host credential file exists and is readable. Used at startup validation. */
51
- export async function assertHostCredentialReadable(profile) {
52
- const p = hostCredentialAbsPath(profile);
198
+ /**
199
+ * Stage the host's claude identity into the workspace runtime tree. Reads
200
+ * `~/.claude.json`, extracts only the operator's `oauthAccount.accountUuid`
201
+ * and `oauthAccount.organizationUuid`, and writes a minimal JSON file at
202
+ * `<workspace>/.git/symphony-runtime/identity/claude.json` (or the
203
+ * `.symphony-runtime/` fallback when the workspace has no `.git/`). The
204
+ * in-VM claude-agent-acp reads these fields to compose a well-formed
205
+ * `metadata.user_id` on every upstream call so a future re-activation of
206
+ * Anthropic's server-side fingerprint check doesn't break dispatch.
207
+ *
208
+ * Defensive shape: NO token strings, NO `device_id`/`session_id` (those are
209
+ * per-process — the in-VM client mints fresh ones on first run), NO local
210
+ * config (prompt-history pointers, theme, recent paths). Identity only. See
211
+ * the `stageClaudeIdentity` test in tests/adapters.test.ts which greps the
212
+ * staged file for `accessToken`/`refreshToken` substrings.
213
+ *
214
+ * When `~/.claude.json` is missing or contains no `oauthAccount` we skip the
215
+ * staging (returning null) rather than fail the dispatch — the egress-substitution
216
+ * seam is defense in depth, not a hard gate on running.
217
+ */
218
+ export async function stageClaudeIdentity(workspacePath) {
219
+ const src = path.join(homedir(), '.claude.json');
220
+ let raw;
53
221
  try {
54
- await access(p, fsConstants.R_OK);
222
+ raw = await readFile(src, 'utf8');
55
223
  }
56
224
  catch (err) {
57
- throw new Error(`adapter "${profile.id}" requires a host credential at ${p}, but it is missing or unreadable: ${err.message}`);
225
+ if (err.code === 'ENOENT')
226
+ return null;
227
+ throw err;
228
+ }
229
+ let parsed;
230
+ try {
231
+ parsed = JSON.parse(raw);
58
232
  }
233
+ catch {
234
+ return null;
235
+ }
236
+ const account = extractOauthAccountIdentity(parsed);
237
+ if (!account)
238
+ return null;
239
+ const content = JSON.stringify({ oauthAccount: account });
240
+ return stageNamedFileUnder(workspacePath, 'identity', 'claude.json', content);
59
241
  }
60
242
  /**
61
- * Copy the host's credential file into the workspace's runtime staging area, chmod 600.
62
- * Re-runs every attempt so a host-side token rotation is picked up automatically.
243
+ * Stage a FAKE placeholder `~/.codex/auth.json` into the workspace for the codex
244
+ * adapter. codex-acp's session-init credential check fails with "Authentication
245
+ * required" when no auth.json file exists, even though the placeholder bearer is
246
+ * supplied via the `OPENAI_API_KEY` env var (a live dispatch proved this — #116
247
+ * staged only the env). This file exists PURELY to satisfy that init check: it
248
+ * contains NO real credential — `OPENAI_API_KEY` is a token-shaped placeholder
249
+ * and there is no OAuth `tokens` block — so codex falls through to the env
250
+ * `OPENAI_API_KEY` (= the placeholder, which has precedence over the file) as its
251
+ * request bearer, and Gondolin substitutes the real OpenAI token at egress
252
+ * (TLS-MITM). No real token, and no refresh token, ever enters the VM.
63
253
  *
64
- * Defense layers, in order:
65
- * 1. `resolveStagingLocation` picks a path OUTSIDE the working tree when git is
66
- * present (`.git/symphony-runtime/...`) so `git add -A`, a tracked file at
67
- * `.symphony-runtime/`, or a `.gitignore` negation cannot expose the secret.
68
- * Linked worktrees are refused (operator must override acp.command).
69
- * 2. `ensureRealDir` walks each parent we materialize and refuses if any exists
70
- * as a symlink or non-directory.
71
- * 3. `rm + copyFile(COPYFILE_EXCL)` closes the local race on the leaf path:
72
- * after explicit cleanup, the create is strict and fails if anything raced
73
- * back in.
74
- * 4. Post-write `realpath` check confirms the file landed at the expected
75
- * absolute path. On mismatch (a parent was swapped for a symlink between
76
- * ensureRealDir and copyFile), we unlink the staging path itself which
77
- * removes a symlink without following it — and refuse. We deliberately do
78
- * NOT touch whatever the symlink resolved to, since that file is by
79
- * definition attacker-chosen.
254
+ * `auth_mode: 'apikey'` so codex takes the API-key path (the env placeholder),
255
+ * never an OAuth handshake. `last_refresh` is omitted (no OAuth tokens to age).
256
+ */
257
+ export async function stageCodexPlaceholderAuth(workspacePath) {
258
+ const placeholder = JSON.stringify({
259
+ OPENAI_API_KEY: 'sk-symphony-placeholder',
260
+ auth_mode: 'apikey',
261
+ });
262
+ return stageNamedFileUnder(workspacePath, 'credential', 'auth.json', placeholder);
263
+ }
264
+ /**
265
+ * Pull just the identity fields out of the parsed `~/.claude.json`. Anything
266
+ * outside `accountUuid`/`organizationUuid` is droppedsee
267
+ * `stageClaudeIdentity`'s contract.
80
268
  */
81
- export async function stageCredential(workspacePath, profile) {
82
- const src = hostCredentialAbsPath(profile);
269
+ function extractOauthAccountIdentity(parsed) {
270
+ const acct = pickObjectField(parsed, 'oauthAccount');
271
+ if (!acct)
272
+ return null;
273
+ const accountUuid = pickStringField(acct, 'accountUuid');
274
+ const organizationUuid = pickStringField(acct, 'organizationUuid');
275
+ if (accountUuid === null || organizationUuid === null)
276
+ return null;
277
+ return { accountUuid, organizationUuid };
278
+ }
279
+ function pickObjectField(value, key) {
280
+ if (!value || typeof value !== 'object' || Array.isArray(value))
281
+ return null;
282
+ const v = value[key];
283
+ if (!v || typeof v !== 'object' || Array.isArray(v))
284
+ return null;
285
+ return v;
286
+ }
287
+ function pickStringField(obj, key) {
288
+ const v = obj[key];
289
+ if (typeof v !== 'string' || v.length === 0)
290
+ return null;
291
+ return v;
292
+ }
293
+ /**
294
+ * Shared implementation for the runtime/identity staging paths. Writes
295
+ * `content` into `<staging-root>/<subdir>/<stagedName>` (0600) with the same
296
+ * symlink/race defenses we previously used for the credential file: explicit
297
+ * cleanup of the leaf, exclusive create via `flag: 'wx'`, and a post-write
298
+ * `realpath` check to detect a symlink that raced into a parent between
299
+ * `ensureRealDir` and the write.
300
+ */
301
+ async function stageNamedFileUnder(workspacePath, subdir, stagedName, content) {
302
+ if (!/^[A-Za-z0-9._-]+$/.test(stagedName)) {
303
+ throw new Error(`stageNamedFileUnder: stagedName ${JSON.stringify(stagedName)} contains characters outside ` +
304
+ `[A-Za-z0-9._-]; refuse to compose into the staging path.`);
305
+ }
83
306
  const { stagingRootAbs, stagingRootRel } = await resolveStagingLocation(workspacePath);
84
- const credsDir = path.join(stagingRootAbs, 'credentials');
307
+ const subDir = path.join(stagingRootAbs, subdir);
85
308
  await ensureRealDir(stagingRootAbs);
86
- await ensureRealDir(credsDir);
87
- const dst = path.join(credsDir, profile.id);
309
+ await ensureRealDir(subDir);
310
+ const dst = path.join(subDir, stagedName);
88
311
  await rm(dst, { force: true, recursive: false });
89
- await copyFile(src, dst, fsConstants.COPYFILE_EXCL);
90
- await chmod(dst, 0o600);
91
- const expectedReal = path.join(await realpath(workspacePath), stagingRootRel, 'credentials', profile.id);
312
+ await writeFile(dst, content, { mode: 0o600, flag: 'wx' });
313
+ const expectedReal = path.join(await realpath(workspacePath), stagingRootRel, subdir, stagedName);
92
314
  const actualReal = await realpath(dst);
93
315
  if (actualReal !== expectedReal) {
94
- // Unlinking dst removes the symlink itself (does not follow). Leaked
95
- // credential at actualReal is left in place because we cannot prove
96
- // ownership; operator must inspect.
97
316
  await rm(dst, { force: true }).catch(() => undefined);
98
317
  throw new Error(`staging path redirected: wrote to ${actualReal}, expected ${expectedReal}. ` +
99
318
  `A symlink raced in during staging; manually inspect and remove any leaked ` +
100
- `credential at the actual path before retrying.`);
319
+ `file at the actual path before retrying.`);
101
320
  }
102
- const relPath = path.posix.join(stagingRootRel, 'credentials', profile.id);
321
+ const relPath = path.posix.join(stagingRootRel, subdir, stagedName);
103
322
  return { absPath: dst, relPath };
104
323
  }
105
324
  /**
106
- * Decide where to stage credentials based on workspace shape. See StagedCredentialPaths
107
- * for the policy. Returns absolute + relative (POSIX, relative to workspacePath)
108
- * paths to the staging root directory; the caller composes `credentials/<id>` under it.
325
+ * Decide where to stage runtime files based on workspace shape. See
326
+ * StagedRuntimePaths for the policy. Returns absolute + relative (POSIX,
327
+ * relative to workspacePath) paths to the staging root directory; the caller
328
+ * composes `<subdir>/<name>` under it.
109
329
  */
110
330
  async function resolveStagingLocation(workspacePath) {
111
331
  const gitPath = path.join(workspacePath, '.git');
@@ -120,8 +340,8 @@ async function resolveStagingLocation(workspacePath) {
120
340
  // repository discovery walks up the directory tree, so a workspace at e.g.
121
341
  // `<parent>/.symphony/workspaces/X` with no own `.git` ends up inside
122
342
  // `<parent>/.git`. A `git add -A` (from a host-side hook, or from any
123
- // process with the host filesystem visible) would then stage the
124
- // credential in the parent's index. Detect that and refuse.
343
+ // process with the host filesystem visible) would then stage the file in
344
+ // the parent's index. Detect that and refuse.
125
345
  //
126
346
  // Resolve symlinks first: git's discovery follows the resolved path, so
127
347
  // walking the lexical `workspacePath` would miss an ancestor `.git` that
@@ -134,15 +354,15 @@ async function resolveStagingLocation(workspacePath) {
134
354
  resolvedWorkspace = await realpath(workspacePath);
135
355
  }
136
356
  catch (resolveErr) {
137
- throw new Error(`cannot auto-stage credentials: workspace ${workspacePath} could not be resolved ` +
357
+ throw new Error(`cannot auto-stage runtime files: workspace ${workspacePath} could not be resolved ` +
138
358
  `(realpath failed: ${resolveErr.message}). Refusing to stage without a ` +
139
- `canonical path; fix the workspace or set acp.command explicitly.`);
359
+ `canonical path; fix the workspace.`);
140
360
  }
141
361
  const ancestor = await findAncestorGit(resolvedWorkspace);
142
362
  if (ancestor !== null) {
143
- throw new Error(`cannot auto-stage credentials: workspace ${workspacePath} has no .git of its own ` +
144
- `but is inside an ancestor git repo at ${ancestor}. Either create a nested clone ` +
145
- `(e.g. via hooks.after_create) or set acp.command explicitly.`);
363
+ throw new Error(`cannot auto-stage runtime files: workspace ${workspacePath} has no .git of its own ` +
364
+ `but is inside an ancestor git repo at ${ancestor}. The canonical workspace setup ` +
365
+ `clones each issue into its own repo; ensure the workspace is a nested clone.`);
146
366
  }
147
367
  return {
148
368
  stagingRootAbs: path.join(workspacePath, '.symphony-runtime'),
@@ -153,9 +373,9 @@ async function resolveStagingLocation(workspacePath) {
153
373
  }
154
374
  if (gitSt.isDirectory()) {
155
375
  // Normal clone: stage inside `.git/`, which is outside the working tree.
156
- // Git never recurses into `.git/` for `add`/`status`, so the credential is
376
+ // Git never recurses into `.git/` for `add`/`status`, so the file is
157
377
  // structurally untrackable — no `info/exclude` games needed, and a tracked
158
- // `.symphony-runtime/credentials/<id>` at workspace root cannot interfere.
378
+ // `.symphony-runtime/...` at workspace root cannot interfere.
159
379
  return {
160
380
  stagingRootAbs: path.join(workspacePath, '.git', 'symphony-runtime'),
161
381
  stagingRootRel: path.posix.join('.git', 'symphony-runtime'),
@@ -164,16 +384,18 @@ async function resolveStagingLocation(workspacePath) {
164
384
  if (gitSt.isFile()) {
165
385
  // Linked worktree: .git is a pointer file at /<worktree>/.git -> per-worktree
166
386
  // gitdir (typically /<main>/.git/worktrees/<name>/). The per-worktree gitdir
167
- // lives outside the workspace mount, so symphony cannot place the credential
387
+ // lives outside the workspace mount, so symphony cannot place the file
168
388
  // there and still have the in-VM agent reach it. Any worktree-internal path
169
389
  // is inside the working tree, where `.gitignore` negation or a tracked file
170
- // could still expose the secret to `git add -A`. Refuse loudly; operators
171
- // who need a worktree workspace must set acp.command and manage credentials
172
- // themselves.
173
- throw new Error(`cannot auto-stage credentials in a linked worktree (.git at ${gitPath} is a file). ` +
174
- `Set acp.command explicitly and manage credentials in that command.`);
390
+ // could still expose state to `git add -A`. Linked worktrees are
391
+ // currently unsupported — use a non-linked workspace clone (e.g.
392
+ // `git clone --local`) or fork scripts/vm-agent.mjs to stage runtime
393
+ // files in whatever shape your worktree layout needs.
394
+ throw new Error(`cannot auto-stage runtime files in a linked worktree (.git at ${gitPath} is a file). ` +
395
+ `Linked worktrees are unsupported under the ACP TCP bridge transport; use a ` +
396
+ `non-linked workspace clone or fork scripts/vm-agent.mjs.`);
175
397
  }
176
- throw new Error(`cannot auto-stage credentials: ${gitPath} is neither a directory nor a file ` +
398
+ throw new Error(`cannot auto-stage runtime files: ${gitPath} is neither a directory nor a file ` +
177
399
  `(symlink, device, or other unexpected entry).`);
178
400
  }
179
401
  /**
@@ -242,28 +464,42 @@ async function ensureRealDir(p) {
242
464
  }
243
465
  }
244
466
  /**
245
- * Build the bash command symphony will exec inside the VM. Copies the staged credential
246
- * (located at `stagedRelPath`, a POSIX path relative to the in-VM cwd which equals the
247
- * workspace mount) to the adapter's expected location, chmods it, and exec's the
248
- * adapter binary.
467
+ * Build the bash command symphony will exec inside the VM. For each staged
468
+ * extra file: `mkdir -p` the destination directory, `cp` the file into place,
469
+ * `chmod 600`. Then exec the in-VM agent at `/opt/symphony/vm-agent.mjs`. It
470
+ * reads its config — SYMPHONY_ACP_URL, SYMPHONY_ACP_TOKEN,
471
+ * SYMPHONY_ADAPTER_BIN, SYMPHONY_ADAPTER_ARGS — from the environment that
472
+ * symphony sets on the in-VM exec invocation, dials the host's TCP ACP
473
+ * bridge, and spawns the adapter with kernel pipes.
249
474
  *
250
- * Every interpolated value (binary tokens, paths) is run through shQuote so future
251
- * profiles with spaces or metacharacters compose safely. `stagedRelPath` comes from
252
- * `stageCredential`, which picks a path outside the working tree when git is present.
475
+ * Why TCP through the in-VM agent: the in-VM exec stdin pump does not reliably
476
+ * wake the in-VM reader for kernel events unless host stdin keeps writing. Piping
477
+ * ACP frames through the in-VM exec stdio caused the adapter to hang after the
478
+ * first session/update. The TCP bridge (see src/acp-bridge.ts) bypasses that pump
479
+ * entirely and decouples symphony from any specific sandbox tech — any sandbox
480
+ * that can launch a process with env vars and reach the host loopback can run
481
+ * this stack unchanged.
482
+ *
483
+ * No real credential enters the VM: the guest holds only a token-shaped
484
+ * placeholder (staged as fake native creds + env), and Gondolin substitutes the
485
+ * real upstream token (Anthropic OAuth for claude, an OpenAI API key or
486
+ * ChatGPT-OAuth access token for codex, a minted GitHub Copilot token for
487
+ * opencode) into the outbound request at egress (TLS-MITM). See
488
+ * `credential-secrets.ts` / `gondolin-creds-staging.ts`.
253
489
  */
254
- export function deriveAcpCommand(profile, stagedRelPath) {
490
+ export function deriveAcpCommand(profile, extraFiles = []) {
255
491
  if (profile.binary.length === 0) {
256
492
  throw new Error(`adapter "${profile.id}" has an empty binary launch vector`);
257
493
  }
258
- const guestDir = path.posix.dirname(profile.guestCredentialPath);
259
- const guestPath = profile.guestCredentialPath;
260
- const execCmd = profile.binary.map(shQuote).join(' ');
261
- return [
262
- `mkdir -p ${shQuote(guestDir)}`,
263
- `cp ${shQuote(stagedRelPath)} ${shQuote(guestPath)}`,
264
- `chmod 600 ${shQuote(guestPath)}`,
265
- `exec ${execCmd}`,
266
- ].join(' && ');
494
+ const steps = [];
495
+ for (const f of extraFiles) {
496
+ const extraDir = path.posix.dirname(f.guestPath);
497
+ steps.push(`mkdir -p ${shQuote(extraDir)}`);
498
+ steps.push(`cp ${shQuote(f.stagedRelPath)} ${shQuote(f.guestPath)}`);
499
+ steps.push(`chmod 600 ${shQuote(f.guestPath)}`);
500
+ }
501
+ steps.push(`exec node /opt/symphony/vm-agent.mjs`);
502
+ return steps.join(' && ');
267
503
  }
268
504
  // Minimal POSIX-shell single-quoting. None of the paths we emit contain `'`, but be
269
505
  // defensive in case a future binary name or path changes.
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/agent/adapters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/agent/adapters.ts"],"names":[],"mappings":"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"}