smol-symphony 0.2.0 → 0.3.1

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 (540) hide show
  1. package/AGENTS.md +41 -22
  2. package/DESIGN.md +494 -273
  3. package/README.md +109 -57
  4. package/SPEC.md +33 -24
  5. package/WORKFLOW.minimal.yaml +34 -0
  6. package/{WORKFLOW.template.md → WORKFLOW.template.yaml} +409 -256
  7. package/WORKFLOW.yaml +487 -0
  8. package/assets/skills/symphony-issues/SKILL.md +136 -0
  9. package/assets/symphony-mise.system.toml +68 -0
  10. package/dist/bin/symphony.js +22 -786
  11. package/dist/bin/symphony.js.map +1 -1
  12. package/dist/core/actions/context.js +109 -0
  13. package/dist/core/actions/context.js.map +1 -0
  14. package/dist/{actions/parsing.js → core/actions/parse.js} +33 -114
  15. package/dist/core/actions/parse.js.map +1 -0
  16. package/dist/core/actions/plan.js +197 -0
  17. package/dist/core/actions/plan.js.map +1 -0
  18. package/dist/core/actions/predicates.js +111 -0
  19. package/dist/core/actions/predicates.js.map +1 -0
  20. package/dist/core/actions/run-fold.js +248 -0
  21. package/dist/core/actions/run-fold.js.map +1 -0
  22. package/dist/core/actions/template.js +118 -0
  23. package/dist/core/actions/template.js.map +1 -0
  24. package/dist/core/cli/args.js +116 -0
  25. package/dist/core/cli/args.js.map +1 -0
  26. package/dist/core/coerce.js +75 -0
  27. package/dist/core/coerce.js.map +1 -0
  28. package/dist/core/credential/account-id.js +20 -0
  29. package/dist/core/credential/account-id.js.map +1 -0
  30. package/dist/core/credential/adapter-config.js +136 -0
  31. package/dist/core/credential/adapter-config.js.map +1 -0
  32. package/dist/core/credential/availability.js +98 -0
  33. package/dist/core/credential/availability.js.map +1 -0
  34. package/dist/core/credential/extract.js +228 -0
  35. package/dist/core/credential/extract.js.map +1 -0
  36. package/dist/core/credential/fake-creds.js +171 -0
  37. package/dist/core/credential/fake-creds.js.map +1 -0
  38. package/dist/core/credential/identity.js +125 -0
  39. package/dist/core/credential/identity.js.map +1 -0
  40. package/dist/core/credential/shape.js +230 -0
  41. package/dist/core/credential/shape.js.map +1 -0
  42. package/dist/core/credential/strings.js +15 -0
  43. package/dist/core/credential/strings.js.map +1 -0
  44. package/dist/core/doctor/checks.js +303 -0
  45. package/dist/core/doctor/checks.js.map +1 -0
  46. package/dist/core/git/result.js +107 -0
  47. package/dist/core/git/result.js.map +1 -0
  48. package/dist/core/http/decisions.js +225 -0
  49. package/dist/core/http/decisions.js.map +1 -0
  50. package/dist/{http.js → core/http/render.js} +472 -738
  51. package/dist/core/http/render.js.map +1 -0
  52. package/dist/{http-handlers.js → core/http/routes.js} +52 -87
  53. package/dist/core/http/routes.js.map +1 -0
  54. package/dist/core/http/views.js +181 -0
  55. package/dist/core/http/views.js.map +1 -0
  56. package/dist/core/image/managed-image.js +95 -0
  57. package/dist/core/image/managed-image.js.map +1 -0
  58. package/dist/core/issue/file.js +149 -0
  59. package/dist/core/issue/file.js.map +1 -0
  60. package/dist/core/issue/parse.js +210 -0
  61. package/dist/core/issue/parse.js.map +1 -0
  62. package/dist/core/mcp/dispatch.js +239 -0
  63. package/dist/core/mcp/dispatch.js.map +1 -0
  64. package/dist/core/mcp/post-move.js +92 -0
  65. package/dist/core/mcp/post-move.js.map +1 -0
  66. package/dist/core/mcp/protocol.js +293 -0
  67. package/dist/core/mcp/protocol.js.map +1 -0
  68. package/dist/core/mcp/url.js +162 -0
  69. package/dist/core/mcp/url.js.map +1 -0
  70. package/dist/core/path.js +63 -0
  71. package/dist/core/path.js.map +1 -0
  72. package/dist/core/reconcile/image-decide.js +48 -0
  73. package/dist/core/reconcile/image-decide.js.map +1 -0
  74. package/dist/core/reconcile/ledger.js +142 -0
  75. package/dist/core/reconcile/ledger.js.map +1 -0
  76. package/dist/core/reconcile/pr-classify.js +62 -0
  77. package/dist/core/reconcile/pr-classify.js.map +1 -0
  78. package/dist/{reconciler → core/reconcile}/pr-decide.js +25 -12
  79. package/dist/core/reconcile/pr-decide.js.map +1 -0
  80. package/dist/core/reconcile/pr-loop.js +161 -0
  81. package/dist/core/reconcile/pr-loop.js.map +1 -0
  82. package/dist/core/reconcile/pr-notes.js +35 -0
  83. package/dist/core/reconcile/pr-notes.js.map +1 -0
  84. package/dist/core/reconcile/vm-decide.js +70 -0
  85. package/dist/core/reconcile/vm-decide.js.map +1 -0
  86. package/dist/core/reconcile/vm-reap.js +207 -0
  87. package/dist/core/reconcile/vm-reap.js.map +1 -0
  88. package/dist/core/reconcile/workspace-decide.js +162 -0
  89. package/dist/core/reconcile/workspace-decide.js.map +1 -0
  90. package/dist/core/runlog/summary.js +231 -0
  91. package/dist/core/runlog/summary.js.map +1 -0
  92. package/dist/core/runner/dispatch-config.js +95 -0
  93. package/dist/core/runner/dispatch-config.js.map +1 -0
  94. package/dist/core/runner/injection.js +61 -0
  95. package/dist/core/runner/injection.js.map +1 -0
  96. package/dist/core/runner/mise.js +210 -0
  97. package/dist/core/runner/mise.js.map +1 -0
  98. package/dist/core/runner/prompt.js +720 -0
  99. package/dist/core/runner/prompt.js.map +1 -0
  100. package/dist/core/runner/turn.js +242 -0
  101. package/dist/core/runner/turn.js.map +1 -0
  102. package/dist/core/runner/vm-plan.js +390 -0
  103. package/dist/core/runner/vm-plan.js.map +1 -0
  104. package/dist/core/schedule/admission.js +123 -0
  105. package/dist/core/schedule/admission.js.map +1 -0
  106. package/dist/core/schedule/circuit-breaker.js +111 -0
  107. package/dist/core/schedule/circuit-breaker.js.map +1 -0
  108. package/dist/core/schedule/eligibility.js +83 -0
  109. package/dist/core/schedule/eligibility.js.map +1 -0
  110. package/dist/core/schedule/reconcile-issue.js +82 -0
  111. package/dist/core/schedule/reconcile-issue.js.map +1 -0
  112. package/dist/core/schedule/retry.js +96 -0
  113. package/dist/core/schedule/retry.js.map +1 -0
  114. package/dist/core/schedule/sleep-cycle.js +133 -0
  115. package/dist/core/schedule/sleep-cycle.js.map +1 -0
  116. package/dist/core/schedule/slots.js +124 -0
  117. package/dist/core/schedule/slots.js.map +1 -0
  118. package/dist/core/schedule/tick.js +553 -0
  119. package/dist/core/schedule/tick.js.map +1 -0
  120. package/dist/core/schedule/token-fold.js +181 -0
  121. package/dist/core/schedule/token-fold.js.map +1 -0
  122. package/dist/core/state-resolve.js +86 -0
  123. package/dist/core/state-resolve.js.map +1 -0
  124. package/dist/core/vm-guards.js +278 -0
  125. package/dist/core/vm-guards.js.map +1 -0
  126. package/dist/core/workflow/derive.js +107 -0
  127. package/dist/core/workflow/derive.js.map +1 -0
  128. package/dist/core/workflow/parse.js +687 -0
  129. package/dist/core/workflow/parse.js.map +1 -0
  130. package/dist/core/workflow/prompt-probe.js +78 -0
  131. package/dist/core/workflow/prompt-probe.js.map +1 -0
  132. package/dist/core/workflow/validate.js +189 -0
  133. package/dist/core/workflow/validate.js.map +1 -0
  134. package/dist/core/workspace-key.js +19 -0
  135. package/dist/core/workspace-key.js.map +1 -0
  136. package/dist/shell/actions-runner.js +356 -0
  137. package/dist/shell/actions-runner.js.map +1 -0
  138. package/dist/shell/adapter/adapter-registry.js +45 -0
  139. package/dist/shell/adapter/adapter-registry.js.map +1 -0
  140. package/dist/shell/adapter/clock-random.js +96 -0
  141. package/dist/shell/adapter/clock-random.js.map +1 -0
  142. package/dist/shell/adapter/gondolin-dispatch-helpers.js +158 -0
  143. package/dist/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
  144. package/dist/shell/adapter/gondolin-dispatch.js +385 -0
  145. package/dist/shell/adapter/gondolin-dispatch.js.map +1 -0
  146. package/dist/shell/adapter/gondolin-image-converter.js +233 -0
  147. package/dist/shell/adapter/gondolin-image-converter.js.map +1 -0
  148. package/dist/shell/adapter/gondolin-image-fetch.js +180 -0
  149. package/dist/shell/adapter/gondolin-image-fetch.js.map +1 -0
  150. package/dist/shell/adapter/launcher-asset.js +57 -0
  151. package/dist/shell/adapter/launcher-asset.js.map +1 -0
  152. package/dist/shell/adapter/mise-config-asset.js +65 -0
  153. package/dist/shell/adapter/mise-config-asset.js.map +1 -0
  154. package/dist/shell/adapter/workflow-loader.js +304 -0
  155. package/dist/shell/adapter/workflow-loader.js.map +1 -0
  156. package/dist/shell/cli/doctor.js +268 -0
  157. package/dist/shell/cli/doctor.js.map +1 -0
  158. package/dist/shell/effect-interpreter-families.js +314 -0
  159. package/dist/shell/effect-interpreter-families.js.map +1 -0
  160. package/dist/shell/effect-interpreter.js +29 -0
  161. package/dist/shell/effect-interpreter.js.map +1 -0
  162. package/dist/shell/interp/acp-frame.js +137 -0
  163. package/dist/shell/interp/acp-frame.js.map +1 -0
  164. package/dist/shell/interp/acp-ws-conn.js +320 -0
  165. package/dist/shell/interp/acp-ws-conn.js.map +1 -0
  166. package/dist/shell/interp/acp-ws-frames.js +159 -0
  167. package/dist/shell/interp/acp-ws-frames.js.map +1 -0
  168. package/dist/shell/interp/acp-ws.js +197 -0
  169. package/dist/shell/interp/acp-ws.js.map +1 -0
  170. package/dist/shell/interp/acp.js +319 -0
  171. package/dist/shell/interp/acp.js.map +1 -0
  172. package/dist/shell/interp/credential-defaults.js +128 -0
  173. package/dist/shell/interp/credential-defaults.js.map +1 -0
  174. package/dist/shell/interp/credential-hooks.js +149 -0
  175. package/dist/shell/interp/credential-hooks.js.map +1 -0
  176. package/dist/shell/interp/credential-registry.js +226 -0
  177. package/dist/shell/interp/credential-registry.js.map +1 -0
  178. package/dist/shell/interp/credential.js +103 -0
  179. package/dist/shell/interp/credential.js.map +1 -0
  180. package/dist/shell/interp/gh.js +163 -0
  181. package/dist/shell/interp/gh.js.map +1 -0
  182. package/dist/shell/interp/git.js +28 -0
  183. package/dist/shell/interp/git.js.map +1 -0
  184. package/dist/shell/interp/log.js +213 -0
  185. package/dist/shell/interp/log.js.map +1 -0
  186. package/dist/shell/interp/process.js +178 -0
  187. package/dist/shell/interp/process.js.map +1 -0
  188. package/dist/shell/interp/runlog.js +193 -0
  189. package/dist/shell/interp/runlog.js.map +1 -0
  190. package/dist/shell/interp/timer.js +64 -0
  191. package/dist/shell/interp/timer.js.map +1 -0
  192. package/dist/shell/interp/tracker-disk.js +99 -0
  193. package/dist/shell/interp/tracker-disk.js.map +1 -0
  194. package/dist/shell/interp/tracker-parse.js +71 -0
  195. package/dist/shell/interp/tracker-parse.js.map +1 -0
  196. package/dist/shell/interp/tracker-scan.js +238 -0
  197. package/dist/shell/interp/tracker-scan.js.map +1 -0
  198. package/dist/shell/interp/tracker-write.js +91 -0
  199. package/dist/shell/interp/tracker-write.js.map +1 -0
  200. package/dist/shell/interp/tracker.js +41 -0
  201. package/dist/shell/interp/tracker.js.map +1 -0
  202. package/dist/shell/interp/tty.js +48 -0
  203. package/dist/shell/interp/tty.js.map +1 -0
  204. package/dist/shell/interp/vm.js +199 -0
  205. package/dist/shell/interp/vm.js.map +1 -0
  206. package/dist/shell/interp/workspace.js +310 -0
  207. package/dist/shell/interp/workspace.js.map +1 -0
  208. package/dist/shell/main-acp.js +78 -0
  209. package/dist/shell/main-acp.js.map +1 -0
  210. package/dist/shell/main-adapters.js +222 -0
  211. package/dist/shell/main-adapters.js.map +1 -0
  212. package/dist/shell/main-credential.js +122 -0
  213. package/dist/shell/main-credential.js.map +1 -0
  214. package/dist/shell/main-doctor.js +22 -0
  215. package/dist/shell/main-doctor.js.map +1 -0
  216. package/dist/shell/main-entry.js +46 -0
  217. package/dist/shell/main-entry.js.map +1 -0
  218. package/dist/shell/main-http-csrf.js +45 -0
  219. package/dist/shell/main-http-csrf.js.map +1 -0
  220. package/dist/shell/main-http-handler.js +389 -0
  221. package/dist/shell/main-http-handler.js.map +1 -0
  222. package/dist/shell/main-http-mcp.js +122 -0
  223. package/dist/shell/main-http-mcp.js.map +1 -0
  224. package/dist/shell/main-http-views.js +253 -0
  225. package/dist/shell/main-http-views.js.map +1 -0
  226. package/dist/shell/main-http.js +76 -0
  227. package/dist/shell/main-http.js.map +1 -0
  228. package/dist/shell/main-loops.js +130 -0
  229. package/dist/shell/main-loops.js.map +1 -0
  230. package/dist/shell/main-mcp.js +129 -0
  231. package/dist/shell/main-mcp.js.map +1 -0
  232. package/dist/shell/main-orchestrator.js +120 -0
  233. package/dist/shell/main-orchestrator.js.map +1 -0
  234. package/dist/shell/main-preflight.js +43 -0
  235. package/dist/shell/main-preflight.js.map +1 -0
  236. package/dist/shell/main-reconcilers-helpers.js +244 -0
  237. package/dist/shell/main-reconcilers-helpers.js.map +1 -0
  238. package/dist/shell/main-reconcilers-pr.js +148 -0
  239. package/dist/shell/main-reconcilers-pr.js.map +1 -0
  240. package/dist/shell/main-reconcilers.js +225 -0
  241. package/dist/shell/main-reconcilers.js.map +1 -0
  242. package/dist/shell/main-runner.js +355 -0
  243. package/dist/shell/main-runner.js.map +1 -0
  244. package/dist/shell/main-scaffold.js +116 -0
  245. package/dist/shell/main-scaffold.js.map +1 -0
  246. package/dist/shell/main-shutdown.js +115 -0
  247. package/dist/shell/main-shutdown.js.map +1 -0
  248. package/dist/shell/main-startup.js +48 -0
  249. package/dist/shell/main-startup.js.map +1 -0
  250. package/dist/shell/main-substrates.js +43 -0
  251. package/dist/shell/main-substrates.js.map +1 -0
  252. package/dist/shell/main.js +385 -0
  253. package/dist/shell/main.js.map +1 -0
  254. package/dist/shell/orchestrator-feedback.js +69 -0
  255. package/dist/shell/orchestrator-feedback.js.map +1 -0
  256. package/dist/shell/orchestrator-image.js +167 -0
  257. package/dist/shell/orchestrator-image.js.map +1 -0
  258. package/dist/shell/orchestrator-loop.js +468 -0
  259. package/dist/shell/orchestrator-loop.js.map +1 -0
  260. package/dist/shell/orchestrator-reconcile.js +36 -0
  261. package/dist/shell/orchestrator-reconcile.js.map +1 -0
  262. package/dist/shell/reconciler-loop.js +228 -0
  263. package/dist/shell/reconciler-loop.js.map +1 -0
  264. package/dist/shell/runner-loop-turn.js +301 -0
  265. package/dist/shell/runner-loop-turn.js.map +1 -0
  266. package/dist/shell/runner-loop.js +338 -0
  267. package/dist/shell/runner-loop.js.map +1 -0
  268. package/dist/shell/server/http.js +208 -0
  269. package/dist/shell/server/http.js.map +1 -0
  270. package/dist/shell/server/mcp-runtime-effects.js +237 -0
  271. package/dist/shell/server/mcp-runtime-effects.js.map +1 -0
  272. package/dist/shell/server/mcp-runtime.js +99 -0
  273. package/dist/shell/server/mcp-runtime.js.map +1 -0
  274. package/dist/shell/workspace-key.js +14 -0
  275. package/dist/shell/workspace-key.js.map +1 -0
  276. package/dist/types/acp.js +8 -0
  277. package/dist/types/acp.js.map +1 -0
  278. package/dist/types/actions/plan.js +6 -0
  279. package/dist/types/actions/plan.js.map +1 -0
  280. package/dist/types/actions/predicates.js +6 -0
  281. package/dist/types/actions/predicates.js.map +1 -0
  282. package/dist/types/actions/run-fold.js +8 -0
  283. package/dist/types/actions/run-fold.js.map +1 -0
  284. package/dist/types/actions.js +7 -0
  285. package/dist/types/actions.js.map +1 -0
  286. package/dist/types/adapter/clock-random.js +4 -0
  287. package/dist/types/adapter/clock-random.js.map +1 -0
  288. package/dist/types/adapter/gondolin-image-converter.js +5 -0
  289. package/dist/types/adapter/gondolin-image-converter.js.map +1 -0
  290. package/dist/types/adapter/gondolin-image-fetch.js +5 -0
  291. package/dist/types/adapter/gondolin-image-fetch.js.map +1 -0
  292. package/dist/types/adapter/workflow-loader.js +4 -0
  293. package/dist/types/adapter/workflow-loader.js.map +1 -0
  294. package/dist/types/cli/args.js +8 -0
  295. package/dist/types/cli/args.js.map +1 -0
  296. package/dist/types/config.js +8 -0
  297. package/dist/types/config.js.map +1 -0
  298. package/dist/types/credential-interp.js +6 -0
  299. package/dist/types/credential-interp.js.map +1 -0
  300. package/dist/types/credentials.js +10 -0
  301. package/dist/types/credentials.js.map +1 -0
  302. package/dist/types/doctor.js +7 -0
  303. package/dist/types/doctor.js.map +1 -0
  304. package/dist/types/domain.js +7 -0
  305. package/dist/types/domain.js.map +1 -0
  306. package/dist/types/effect.js +15 -0
  307. package/dist/types/effect.js.map +1 -0
  308. package/dist/types/errors.js +39 -0
  309. package/dist/types/errors.js.map +1 -0
  310. package/dist/types/http/decisions.js +6 -0
  311. package/dist/types/http/decisions.js.map +1 -0
  312. package/dist/types/http/render.js +10 -0
  313. package/dist/types/http/render.js.map +1 -0
  314. package/dist/types/http/views.js +6 -0
  315. package/dist/types/http/views.js.map +1 -0
  316. package/dist/types/http.js +9 -0
  317. package/dist/types/http.js.map +1 -0
  318. package/dist/types/image/managed-image.js +7 -0
  319. package/dist/types/image/managed-image.js.map +1 -0
  320. package/dist/types/interp/effect-interpreter.js +8 -0
  321. package/dist/types/interp/effect-interpreter.js.map +1 -0
  322. package/dist/types/interp/tracker.js +7 -0
  323. package/dist/types/interp/tracker.js.map +1 -0
  324. package/dist/types/issue/file.js +6 -0
  325. package/dist/types/issue/file.js.map +1 -0
  326. package/dist/types/issue/parse.js +8 -0
  327. package/dist/types/issue/parse.js.map +1 -0
  328. package/dist/types/main-acp.js +13 -0
  329. package/dist/types/main-acp.js.map +1 -0
  330. package/dist/types/main-adapters.js +5 -0
  331. package/dist/types/main-adapters.js.map +1 -0
  332. package/dist/types/main-credential.js +21 -0
  333. package/dist/types/main-credential.js.map +1 -0
  334. package/dist/types/main-doctor.js +6 -0
  335. package/dist/types/main-doctor.js.map +1 -0
  336. package/dist/types/main-http-handler.js +12 -0
  337. package/dist/types/main-http-handler.js.map +1 -0
  338. package/dist/types/main-http.js +5 -0
  339. package/dist/types/main-http.js.map +1 -0
  340. package/dist/types/main-loops.js +5 -0
  341. package/dist/types/main-loops.js.map +1 -0
  342. package/dist/types/main-mcp.js +12 -0
  343. package/dist/types/main-mcp.js.map +1 -0
  344. package/dist/types/main-orchestrator.js +5 -0
  345. package/dist/types/main-orchestrator.js.map +1 -0
  346. package/dist/types/main-reconcilers.js +11 -0
  347. package/dist/types/main-reconcilers.js.map +1 -0
  348. package/dist/types/main-runner.js +13 -0
  349. package/dist/types/main-runner.js.map +1 -0
  350. package/dist/types/main-startup.js +5 -0
  351. package/dist/types/main-startup.js.map +1 -0
  352. package/dist/types/main-substrates.js +5 -0
  353. package/dist/types/main-substrates.js.map +1 -0
  354. package/dist/types/mcp/dispatch.js +4 -0
  355. package/dist/types/mcp/dispatch.js.map +1 -0
  356. package/dist/types/mcp/post-move.js +7 -0
  357. package/dist/types/mcp/post-move.js.map +1 -0
  358. package/dist/types/mcp.js +9 -0
  359. package/dist/types/mcp.js.map +1 -0
  360. package/dist/types/ports.js +12 -0
  361. package/dist/types/ports.js.map +1 -0
  362. package/dist/types/reconcile/image-decide.js +5 -0
  363. package/dist/types/reconcile/image-decide.js.map +1 -0
  364. package/dist/types/reconcile/ledger.js +7 -0
  365. package/dist/types/reconcile/ledger.js.map +1 -0
  366. package/dist/types/reconcile/pr-loop.js +8 -0
  367. package/dist/types/reconcile/pr-loop.js.map +1 -0
  368. package/dist/types/reconcile/vm-reap.js +8 -0
  369. package/dist/types/reconcile/vm-reap.js.map +1 -0
  370. package/dist/types/reconcile/workspace-decide.js +7 -0
  371. package/dist/types/reconcile/workspace-decide.js.map +1 -0
  372. package/dist/types/reconcile.js +9 -0
  373. package/dist/types/reconcile.js.map +1 -0
  374. package/dist/types/runlog.js +7 -0
  375. package/dist/types/runlog.js.map +1 -0
  376. package/dist/types/runner/actions-runner.js +12 -0
  377. package/dist/types/runner/actions-runner.js.map +1 -0
  378. package/dist/types/runner/gondolin-dispatch.js +5 -0
  379. package/dist/types/runner/gondolin-dispatch.js.map +1 -0
  380. package/dist/types/runner/injection.js +6 -0
  381. package/dist/types/runner/injection.js.map +1 -0
  382. package/dist/types/runner/runner-loop.js +5 -0
  383. package/dist/types/runner/runner-loop.js.map +1 -0
  384. package/dist/types/runner/turn.js +4 -0
  385. package/dist/types/runner/turn.js.map +1 -0
  386. package/dist/types/runner/vm-plan.js +4 -0
  387. package/dist/types/runner/vm-plan.js.map +1 -0
  388. package/dist/types/runtime.js +9 -0
  389. package/dist/types/runtime.js.map +1 -0
  390. package/dist/types/schedule/admission.js +7 -0
  391. package/dist/types/schedule/admission.js.map +1 -0
  392. package/dist/types/schedule/circuit-breaker.js +2 -0
  393. package/dist/types/schedule/circuit-breaker.js.map +1 -0
  394. package/dist/types/schedule/eligibility.js +9 -0
  395. package/dist/types/schedule/eligibility.js.map +1 -0
  396. package/dist/types/schedule/orchestrator-loop.js +10 -0
  397. package/dist/types/schedule/orchestrator-loop.js.map +1 -0
  398. package/dist/types/schedule/sleep-cycle.js +4 -0
  399. package/dist/types/schedule/sleep-cycle.js.map +1 -0
  400. package/dist/types/schedule/slots.js +8 -0
  401. package/dist/types/schedule/slots.js.map +1 -0
  402. package/dist/types/schedule/tick.js +9 -0
  403. package/dist/types/schedule/tick.js.map +1 -0
  404. package/dist/types/server/mcp-runtime.js +8 -0
  405. package/dist/types/server/mcp-runtime.js.map +1 -0
  406. package/dist/types/workflow/parse.js +4 -0
  407. package/dist/types/workflow/parse.js.map +1 -0
  408. package/package.json +22 -10
  409. package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
  410. package/prompts/Reflect.md +91 -0
  411. package/prompts/Review.md +97 -0
  412. package/prompts/Todo.md +96 -0
  413. package/prompts/_footer.md +41 -0
  414. package/prompts/_preamble.md +42 -0
  415. package/prompts-minimal/Todo.md +26 -0
  416. package/scripts/postinstall.mjs +63 -0
  417. package/scripts/vm-agent.mjs +312 -90
  418. package/WORKFLOW.md +0 -744
  419. package/dist/acp-bridge.js +0 -324
  420. package/dist/acp-bridge.js.map +0 -1
  421. package/dist/actions/cache.js +0 -191
  422. package/dist/actions/cache.js.map +0 -1
  423. package/dist/actions/effects.js +0 -41
  424. package/dist/actions/effects.js.map +0 -1
  425. package/dist/actions/executor.js +0 -570
  426. package/dist/actions/executor.js.map +0 -1
  427. package/dist/actions/index.js +0 -13
  428. package/dist/actions/index.js.map +0 -1
  429. package/dist/actions/parsing.js.map +0 -1
  430. package/dist/actions/predicate-env.js +0 -27
  431. package/dist/actions/predicate-env.js.map +0 -1
  432. package/dist/actions/predicates.js +0 -49
  433. package/dist/actions/predicates.js.map +0 -1
  434. package/dist/actions/templating.js +0 -66
  435. package/dist/actions/templating.js.map +0 -1
  436. package/dist/actions/types.js +0 -15
  437. package/dist/actions/types.js.map +0 -1
  438. package/dist/agent/acp.js +0 -473
  439. package/dist/agent/acp.js.map +0 -1
  440. package/dist/agent/adapter-names.js +0 -159
  441. package/dist/agent/adapter-names.js.map +0 -1
  442. package/dist/agent/adapters.js +0 -511
  443. package/dist/agent/adapters.js.map +0 -1
  444. package/dist/agent/credential-extractors.js +0 -342
  445. package/dist/agent/credential-extractors.js.map +0 -1
  446. package/dist/agent/credential-secrets.js +0 -628
  447. package/dist/agent/credential-secrets.js.map +0 -1
  448. package/dist/agent/credential-ticker.js +0 -57
  449. package/dist/agent/credential-ticker.js.map +0 -1
  450. package/dist/agent/gondolin-creds-staging.js +0 -356
  451. package/dist/agent/gondolin-creds-staging.js.map +0 -1
  452. package/dist/agent/gondolin-dispatch.js +0 -375
  453. package/dist/agent/gondolin-dispatch.js.map +0 -1
  454. package/dist/agent/gondolin.js +0 -124
  455. package/dist/agent/gondolin.js.map +0 -1
  456. package/dist/agent/runner-decisions.js +0 -134
  457. package/dist/agent/runner-decisions.js.map +0 -1
  458. package/dist/agent/runner.js +0 -1456
  459. package/dist/agent/runner.js.map +0 -1
  460. package/dist/agent/tool-call-summary.js +0 -102
  461. package/dist/agent/tool-call-summary.js.map +0 -1
  462. package/dist/agent/vm-acp-mapping.js +0 -73
  463. package/dist/agent/vm-acp-mapping.js.map +0 -1
  464. package/dist/agent/vm-guards.js +0 -262
  465. package/dist/agent/vm-guards.js.map +0 -1
  466. package/dist/agent/vm-port.js +0 -22
  467. package/dist/agent/vm-port.js.map +0 -1
  468. package/dist/agent/vm-process-registry.js +0 -79
  469. package/dist/agent/vm-process-registry.js.map +0 -1
  470. package/dist/bin/cli-args.js +0 -105
  471. package/dist/bin/cli-args.js.map +0 -1
  472. package/dist/errors.js +0 -15
  473. package/dist/errors.js.map +0 -1
  474. package/dist/http-disk.js +0 -135
  475. package/dist/http-disk.js.map +0 -1
  476. package/dist/http-handlers.js.map +0 -1
  477. package/dist/http.js.map +0 -1
  478. package/dist/issues.js +0 -178
  479. package/dist/issues.js.map +0 -1
  480. package/dist/logging.js +0 -203
  481. package/dist/logging.js.map +0 -1
  482. package/dist/mcp.js +0 -706
  483. package/dist/mcp.js.map +0 -1
  484. package/dist/memory.js +0 -85
  485. package/dist/memory.js.map +0 -1
  486. package/dist/orchestrator-decisions.js +0 -331
  487. package/dist/orchestrator-decisions.js.map +0 -1
  488. package/dist/orchestrator.js +0 -1569
  489. package/dist/orchestrator.js.map +0 -1
  490. package/dist/prompt.js +0 -65
  491. package/dist/prompt.js.map +0 -1
  492. package/dist/reconciler/cache.js +0 -65
  493. package/dist/reconciler/cache.js.map +0 -1
  494. package/dist/reconciler/index.js +0 -448
  495. package/dist/reconciler/index.js.map +0 -1
  496. package/dist/reconciler/ledger.js +0 -131
  497. package/dist/reconciler/ledger.js.map +0 -1
  498. package/dist/reconciler/pr-adapters.js +0 -174
  499. package/dist/reconciler/pr-adapters.js.map +0 -1
  500. package/dist/reconciler/pr-decide.js.map +0 -1
  501. package/dist/reconciler/pr.js +0 -422
  502. package/dist/reconciler/pr.js.map +0 -1
  503. package/dist/reconciler/types.js +0 -12
  504. package/dist/reconciler/types.js.map +0 -1
  505. package/dist/reconciler/vm.js +0 -243
  506. package/dist/reconciler/vm.js.map +0 -1
  507. package/dist/reconciler/workspace-defaults.js +0 -83
  508. package/dist/reconciler/workspace-defaults.js.map +0 -1
  509. package/dist/reconciler/workspace.js +0 -272
  510. package/dist/reconciler/workspace.js.map +0 -1
  511. package/dist/runlog.js +0 -403
  512. package/dist/runlog.js.map +0 -1
  513. package/dist/scaffold.js +0 -165
  514. package/dist/scaffold.js.map +0 -1
  515. package/dist/trackers/local.js +0 -445
  516. package/dist/trackers/local.js.map +0 -1
  517. package/dist/trackers/types.js +0 -10
  518. package/dist/trackers/types.js.map +0 -1
  519. package/dist/types.js +0 -3
  520. package/dist/types.js.map +0 -1
  521. package/dist/util/clock.js +0 -12
  522. package/dist/util/clock.js.map +0 -1
  523. package/dist/util/crypto.js +0 -25
  524. package/dist/util/crypto.js.map +0 -1
  525. package/dist/util/frontmatter.js +0 -70
  526. package/dist/util/frontmatter.js.map +0 -1
  527. package/dist/util/fs-issues.js +0 -22
  528. package/dist/util/fs-issues.js.map +0 -1
  529. package/dist/util/process.js +0 -152
  530. package/dist/util/process.js.map +0 -1
  531. package/dist/util/workspace-key.js +0 -10
  532. package/dist/util/workspace-key.js.map +0 -1
  533. package/dist/workflow-loader.js +0 -147
  534. package/dist/workflow-loader.js.map +0 -1
  535. package/dist/workflow.js +0 -822
  536. package/dist/workflow.js.map +0 -1
  537. package/dist/workspace-types.js +0 -8
  538. package/dist/workspace-types.js.map +0 -1
  539. package/dist/workspace.js +0 -443
  540. package/dist/workspace.js.map +0 -1
@@ -1,57 +0,0 @@
1
- // Host-side OAuth ticker — periodically drives a credential refresh so the
2
- // on-demand fallback isn't the only thing keeping the host access token fresh
3
- // during long idle windows.
4
- //
5
- // Under the Gondolin secret-substitution model the work is delegated to the
6
- // credential registry's `refreshAll()` (which fans `refreshAdapter` over every
7
- // live adapter); the registry's per-adapter refresh carries the shared flock +
8
- // single-flight, so concurrent ticks + a per-VM proactive `expiresAt` tick
9
- // collapse into a single host-side refresh.
10
- //
11
- // Lifecycle:
12
- // start() — install the interval timer. Idempotent.
13
- // stop() — clear the timer. Idempotent.
14
- import { log } from '../logging.js';
15
- export class CredentialTicker {
16
- timer = null;
17
- stopped = false;
18
- intervalMs;
19
- refreshAll;
20
- constructor(opts) {
21
- this.intervalMs = opts.intervalMs;
22
- this.refreshAll = opts.refreshAll;
23
- }
24
- start() {
25
- if (this.timer || this.stopped)
26
- return;
27
- if (this.intervalMs <= 0) {
28
- log.info('credential ticker disabled (interval_ms <= 0)');
29
- return;
30
- }
31
- this.timer = setInterval(() => void this.tick(), this.intervalMs);
32
- // Don't prevent process shutdown on the ticker — the lifecycle is owned
33
- // by `stop()` below, but if a future code path drops the reference, we
34
- // shouldn't keep the event loop alive.
35
- if (typeof this.timer.unref === 'function')
36
- this.timer.unref();
37
- log.info('credential ticker started', { interval_ms: this.intervalMs });
38
- }
39
- stop() {
40
- this.stopped = true;
41
- if (this.timer) {
42
- clearInterval(this.timer);
43
- this.timer = null;
44
- }
45
- }
46
- async tick() {
47
- if (this.stopped)
48
- return;
49
- try {
50
- await this.refreshAll();
51
- }
52
- catch (err) {
53
- log.warn('credential ticker: refresh failed', { error: err.message });
54
- }
55
- }
56
- }
57
- //# sourceMappingURL=credential-ticker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credential-ticker.js","sourceRoot":"","sources":["../../src/agent/credential-ticker.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,4BAA4B;AAC5B,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,4CAA4C;AAC5C,EAAE;AACF,aAAa;AACb,sDAAsD;AACtD,2CAA2C;AAE3C,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAapC,MAAM,OAAO,gBAAgB;IACnB,KAAK,GAA0B,IAAI,CAAC;IACpC,OAAO,GAAG,KAAK,CAAC;IACP,UAAU,CAAS;IACnB,UAAU,CAAsB;IAEjD,YAAY,IAA6B;QACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACvC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAClE,wEAAwE;QACxE,uEAAuE;QACvE,uCAAuC;QACvC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/D,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;CACF"}
@@ -1,356 +0,0 @@
1
- // Per-adapter Gondolin fake-native-credential staging (design §3.3).
2
- //
3
- // This is the credential-MODEL half of the Gondolin backend — NOT the old proxy
4
- // model. There is no proxy server and no base-URL injection: the in-VM client
5
- // dials its REAL upstream (claude→api.anthropic.com, codex→chatgpt.com backend,
6
- // opencode→api.githubcopilot.com) in its NATIVE mode, with a token-shaped
7
- // PLACEHOLDER as its bearer. Gondolin substitutes the real access token into the
8
- // outbound request at egress (TLS-MITM) per the per-VM `secretManager`; the real
9
- // refresh/durable token NEVER enters the guest (the invariant).
10
- //
11
- // Given an adapter id + the placeholder value (from `createHttpHooks().env`) +
12
- // identity inputs, this module builds the set of FAKE native credential FILES to
13
- // stage into the guest (guest path + JSON content), each holding ONLY
14
- // placeholders (plus, for codex, the non-secret `account_id` read from the host
15
- // auth.json), and the guest ENV additions (the placeholder bearer keyed by the
16
- // secret name) for a client that reads its bearer from env rather than a file.
17
- //
18
- // CRITICAL — placeholder identity: Gondolin substitutes the secret by EXACT
19
- // string match in the outbound `Authorization` header (design §2). So the bearer
20
- // the guest sends MUST equal the placeholder Gondolin holds. We therefore use the
21
- // placeholder from `createHttpHooks().env[secretName]` VERBATIM as the staged
22
- // file's bearer field (claude `claudeAiOauth.accessToken`, codex
23
- // `tokens.access_token`). For codex that placeholder is ALREADY JWT-shaped with a
24
- // far-future `exp` (see `credential-secrets.ts` `codexPlaceholder`/
25
- // `assemblePlaceholderJwt`), so codex's native mode never refreshes it.
26
- //
27
- // Pure-ish: the only IO is reading the host `~/.codex/auth.json` to copy the
28
- // non-secret `account_id` (codex) and the host `~/.claude.json` to copy the
29
- // non-secret oauthAccount identity (claude). Both are injected via `hostReaders`
30
- // so tests pass fakes — no real creds, no FS.
31
- //
32
- // INVARIANT (precise — codex review): the host `~/.codex/auth.json` DOES contain
33
- // real tokens, so the default reader parses a file whose bytes include them (the
34
- // host process already holds these tokens — `credential-secrets.ts` reads the same
35
- // file for the access token, so this is no new host-side exposure). What this
36
- // module guarantees is that it **extracts and EMITS only non-secret identity +
37
- // metadata** (codex `account_id` / `auth_mode` / `last_refresh`, claude
38
- // oauthAccount UUIDs — all read by an allowlist of known non-secret keys) — a real
39
- // access/refresh token (or a real `OPENAI_API_KEY`) is never returned to the
40
- // caller, never written into a staged file, and never put in the guest env. The
41
- // guest-facing invariant (no real token in the VM) holds.
42
- //
43
- // LIVE: the runner (`runner.ts`) and `gondolin-dispatch.ts` consume this on the
44
- // dispatch path. The runtime (non-credential) files still flow through
45
- // `adapters.ts`' `stage*` helpers.
46
- //
47
- // The fake-creds shapes are the ones the spike VERIFIED end-to-end (B5 claude,
48
- // C7 codex) — see `spike/gondolin/tests/{b5-claude-real,c7-codex-real}.mjs` and
49
- // `docs/research/gondolin-sandbox-migration.md` §3.3.
50
- import os from 'node:os';
51
- import path from 'node:path';
52
- import { log } from '../logging.js';
53
- import { buildOpencodeConfig, OPENCODE_CONFIG_GUEST_PATH } from './adapters.js';
54
- // ---------------------------------------------------------------------------
55
- // Constants.
56
- // ---------------------------------------------------------------------------
57
- // Guest paths the fake native creds land at (the VM runs as root). These mirror
58
- // the runner's `stageAdapterExtras` guest paths (runner.ts) so a client finds its
59
- // creds in exactly the place its native mode looks.
60
- const CLAUDE_CREDENTIALS_GUEST_PATH = '/root/.claude/.credentials.json';
61
- const CLAUDE_CONFIG_GUEST_PATH = '/root/.claude.json';
62
- const CODEX_AUTH_GUEST_PATH = '/root/.codex/auth.json';
63
- const CRED_FILE_MODE = 0o600;
64
- // Far-future expiry (2100-01-01T00:00:00Z, ms since epoch) so the claude client
65
- // never proactively refreshes the placeholder (a refresh attempt would be
66
- // egress-blocked and is pure waste). Matches the spike's `4102444800000`. (codex's
67
- // far-future `exp` lives inside its JWT placeholder, set in credential-secrets.ts.)
68
- const FAR_FUTURE_MS = 4_102_444_800_000;
69
- // A junk refresh token: token-SHAPED but explicitly never a real token. The guest
70
- // has nothing to rotate (the real refresh token stays host-side, layer 1).
71
- const JUNK_REFRESH = 'JUNK-PLACEHOLDER-REFRESH-not-a-real-token';
72
- // ---------------------------------------------------------------------------
73
- // Builders per adapter.
74
- // ---------------------------------------------------------------------------
75
- /**
76
- * Build the fake native creds + env additions for `adapterId`. The placeholder
77
- * (a fake, token-shaped value) is what the guest sees as its bearer; Gondolin
78
- * substitutes the real token at egress. The returned `env` is always the
79
- * single-entry `{ [secretName]: placeholder }` so a client reading its bearer
80
- * from env (not a file) still gets the placeholder.
81
- */
82
- export async function buildGondolinFakeCreds(adapterId, input) {
83
- const env = { [input.secretName]: input.placeholder };
84
- const readers = input.hostReaders ?? defaultHostIdentityReaders();
85
- switch (adapterId) {
86
- case 'claude':
87
- return { files: await buildClaudeFiles(input.placeholder, readers), env };
88
- case 'codex':
89
- return { files: await buildCodexFiles(input.placeholder, readers), env };
90
- case 'opencode':
91
- return { files: buildOpencodeFiles(input.opencodeModel ?? null), env };
92
- }
93
- }
94
- /**
95
- * claude fake `~/.claude/.credentials.json` = `{ claudeAiOauth: { accessToken:
96
- * <placeholder>, refreshToken: <junk>, expiresAt: <far future ms> } }` (spike B5).
97
- * Far-future expiry ⇒ no proactive refresh. ALSO stage the scrubbed
98
- * `~/.claude.json` identity (oauthAccount UUIDs only — the real accountUuid /
99
- * organizationUuid are identifiers, NOT secrets) when the host provides one;
100
- * absent identity is non-fatal (best-effort, matching `stageClaudeIdentity`).
101
- */
102
- async function buildClaudeFiles(placeholder, readers) {
103
- const credsContent = JSON.stringify({
104
- claudeAiOauth: {
105
- accessToken: placeholder,
106
- refreshToken: JUNK_REFRESH,
107
- expiresAt: FAR_FUTURE_MS,
108
- },
109
- });
110
- const files = [credFile(CLAUDE_CREDENTIALS_GUEST_PATH, credsContent)];
111
- const identity = await safeReadClaudeIdentity(readers);
112
- if (identity !== null) {
113
- const configContent = JSON.stringify({
114
- hasCompletedOnboarding: true,
115
- oauthAccount: identity,
116
- projects: {},
117
- });
118
- files.push(credFile(CLAUDE_CONFIG_GUEST_PATH, configContent));
119
- }
120
- return files;
121
- }
122
- /**
123
- * codex fake `~/.codex/auth.json`, shaped to be COMPLETE for codex 0.135.
124
- *
125
- * GO-LIVE FINDING (2026-05-30, the real root cause; the earlier "post-101 WS
126
- * drop" was a red herring): codex 0.135's local auth manager runs a COMPLETENESS
127
- * check on auth.json BEFORE it will send the `Authorization` bearer. A too-minimal
128
- * `{ tokens: { access_token, id_token, refresh_token, account_id } }` is judged
129
- * "credentials incomplete" — so codex sends NO bearer at all → unauthenticated →
130
- * 401 → a blocked refresh → turn refusal. With a COMPLETE auth.json the WS Upgrade
131
- * gets a clean 101 through Gondolin and the turn completes. The proven-working
132
- * shape (spike C7, VERIFIED) carries the non-secret top-level completeness fields
133
- * `auth_mode` + `last_refresh` (and `OPENAI_API_KEY: null`) alongside the tokens
134
- * block.
135
- *
136
- * SAFETY-FIRST: we do NOT spread the host auth.json into the staged file (that
137
- * would leak a real token if any secret field were missed). Instead we read ONLY
138
- * an ALLOWLIST of non-secret metadata via the injected reader and BUILD a fresh
139
- * object from scratch:
140
- * - top level: `OPENAI_API_KEY: null` (the OAuth tokens block is the live cred,
141
- * never an apikey) + the non-secret `auth_mode` + `last_refresh` when known;
142
- * - `tokens`: the JWT-shaped `placeholder` as both `access_token` (codex's
143
- * bearer; Gondolin substitutes the real token at egress) and `id_token`, a
144
- * JUNK `refresh_token` (the guest has nothing real to rotate), and the
145
- * non-secret `account_id` (the `chatgpt-account-id` routing identifier).
146
- * The placeholder's far-future JWT `exp` (baked in by `credential-secrets.ts`)
147
- * keeps codex from proactively refreshing. The real access/id/refresh token never
148
- * enters this object.
149
- */
150
- async function buildCodexFiles(placeholder, readers) {
151
- const meta = await safeReadCodexMetadata(readers);
152
- // Re-validate at this STAGING chokepoint (codex review, HIGH). `HostIdentityReaders`
153
- // is an injectable boundary, so even though the default reader already guards via
154
- // `extractCodexMetadata`, a custom/buggy/hostile reader could hand us a non-UUID
155
- // `accountId` (or an out-of-allowlist `authMode`/`lastRefresh`). The same shared
156
- // guards run again here so a token-shaped value is OMITTED from the staged
157
- // auth.json regardless of which reader produced it (defense-in-depth).
158
- const accountId = validAccountId(meta?.accountId ?? null);
159
- const authMode = validAuthMode(meta?.authMode ?? null);
160
- const lastRefresh = validLastRefresh(meta?.lastRefresh ?? null);
161
- const tokens = {
162
- access_token: placeholder,
163
- id_token: placeholder,
164
- refresh_token: JUNK_REFRESH,
165
- ...(accountId !== null ? { account_id: accountId } : {}),
166
- };
167
- // Top-level non-secret completeness fields. `OPENAI_API_KEY: null` mirrors the
168
- // host (codex stores the OAuth tokens block, NOT an api key); `auth_mode` /
169
- // `last_refresh` are the markers codex 0.135's completeness check requires (see
170
- // the doc comment). All are non-secret; absent/invalid ⇒ omitted (best-effort).
171
- const auth = {
172
- OPENAI_API_KEY: null,
173
- ...(authMode !== null ? { auth_mode: authMode } : {}),
174
- tokens,
175
- ...(lastRefresh !== null ? { last_refresh: lastRefresh } : {}),
176
- };
177
- return [credFile(CODEX_AUTH_GUEST_PATH, JSON.stringify(auth))];
178
- }
179
- /**
180
- * opencode reuses the existing custom-provider config (`buildOpencodeConfig`):
181
- * `apiKey: {env:OPENCODE_PROXY_TOKEN}`. The placeholder bearer is delivered via
182
- * the env additions (the `{env:…}` interpolation reads it), so the config file
183
- * itself holds no token — only the provider declaration + model.
184
- */
185
- function buildOpencodeFiles(model) {
186
- return [credFile(OPENCODE_CONFIG_GUEST_PATH, buildOpencodeConfig(model))];
187
- }
188
- // ---------------------------------------------------------------------------
189
- // Helpers.
190
- // ---------------------------------------------------------------------------
191
- function credFile(guestPath, content) {
192
- return { guestPath, content, mode: CRED_FILE_MODE };
193
- }
194
- async function safeReadClaudeIdentity(readers) {
195
- try {
196
- return await readers.readClaudeIdentity();
197
- }
198
- catch (err) {
199
- log.warn('gondolin-creds-staging: claude identity read failed (non-fatal)', {
200
- error: err.message,
201
- });
202
- return null;
203
- }
204
- }
205
- async function safeReadCodexMetadata(readers) {
206
- try {
207
- return await readers.readCodexMetadata();
208
- }
209
- catch (err) {
210
- log.warn('gondolin-creds-staging: codex metadata read failed (non-fatal)', {
211
- error: err.message,
212
- });
213
- return null;
214
- }
215
- }
216
- // ---------------------------------------------------------------------------
217
- // Default host identity readers (real FS; parse host creds but emit only identity).
218
- // ---------------------------------------------------------------------------
219
- /**
220
- * Default readers backed by the host filesystem. Each parses the host file and
221
- * returns ONLY the non-secret identity/metadata — the claude oauthAccount UUIDs,
222
- * the codex `account_id`, and the codex completeness metadata (account_id /
223
- * auth_mode / last_refresh, allowlisted). The codex auth.json's bytes also contain
224
- * real tokens; they are parsed-then-discarded and never returned/emitted (module
225
- * header invariant). A missing/malformed file yields null.
226
- */
227
- export function defaultHostIdentityReaders() {
228
- const readCodexAuth = () => readHostJson(path.join(os.homedir(), '.codex', 'auth.json'));
229
- return {
230
- readClaudeIdentity: async () => extractClaudeIdentity(await readHostJson(path.join(os.homedir(), '.claude.json'))),
231
- readCodexAccountId: async () => extractCodexAccountId(await readCodexAuth()),
232
- readCodexMetadata: async () => extractCodexMetadata(await readCodexAuth()),
233
- };
234
- }
235
- async function readHostJson(p) {
236
- const { readFile } = await import('node:fs/promises');
237
- let raw;
238
- try {
239
- raw = await readFile(p, 'utf8');
240
- }
241
- catch {
242
- return null;
243
- }
244
- try {
245
- return JSON.parse(raw);
246
- }
247
- catch {
248
- return null;
249
- }
250
- }
251
- /**
252
- * Pure: pull ONLY the non-secret oauthAccount UUIDs out of a parsed `~/.claude.json`.
253
- * Mirrors `adapters.ts` `extractOauthAccountIdentity` — no token, no device/session
254
- * id, no local config.
255
- */
256
- export function extractClaudeIdentity(parsed) {
257
- const acct = pickObject(parsed, 'oauthAccount');
258
- if (acct === null)
259
- return null;
260
- const accountUuid = pickString(acct, 'accountUuid');
261
- const organizationUuid = pickString(acct, 'organizationUuid');
262
- if (accountUuid === null || organizationUuid === null)
263
- return null;
264
- return { accountUuid, organizationUuid };
265
- }
266
- /**
267
- * Pure: pull ONLY the non-secret `account_id` out of a parsed `~/.codex/auth.json`
268
- * `tokens` block. The parsed object also holds the real access/refresh tokens (the
269
- * caller parsed the whole file), but this function reads + returns ONLY `account_id`
270
- * — the tokens are never returned or emitted.
271
- *
272
- * SAFETY-CRITICAL (codex review, HIGH): this value flows (via `symphony.ts` →
273
- * `buildAdapterCredentialSpecs({ codexAccountId })` → `codexPlaceholder` →
274
- * `assemblePlaceholderJwt`) into the placeholder JWT's `chatgpt_account_id` claim,
275
- * and that JWT IS the guest's staged `tokens.access_token` BEARER. So we validate
276
- * the value through the SHARED {@link validAccountId} UUID guard here: a hostile /
277
- * malformed `account_id` (a token / `sk-…` / JWT string) is NOT a UUID → returns
278
- * null → the claim is OMITTED from the bearer (the SAFE failure), never embedded.
279
- */
280
- export function extractCodexAccountId(parsed) {
281
- const tokens = pickObject(parsed, 'tokens');
282
- if (tokens === null)
283
- return null;
284
- return validAccountId(pickString(tokens, 'account_id'));
285
- }
286
- /**
287
- * Pure: pull ONLY the allowlisted NON-SECRET codex completeness metadata out of a
288
- * parsed `~/.codex/auth.json`. SAFETY-CRITICAL: this reads three explicit
289
- * non-secret keys by name (`tokens.account_id`, top-level `auth_mode`,
290
- * `last_refresh`) and NEVER touches `tokens.access_token` / `tokens.id_token` /
291
- * `tokens.refresh_token` / a real `OPENAI_API_KEY` — even though the parsed object
292
- * holds them. Returns null only when the file is entirely missing/unparseable
293
- * (parsed === null); a present-but-sparse auth.json yields a struct with null
294
- * fields (each omitted downstream). The non-null fields are pure identity /
295
- * metadata that codex 0.135 needs to consider the staged creds complete.
296
- */
297
- export function extractCodexMetadata(parsed) {
298
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
299
- return null;
300
- const top = parsed;
301
- const tokens = pickObject(parsed, 'tokens');
302
- // Strict format guards (codex review, HIGH): account_id flows into the placeholder
303
- // JWT payload → the guest BEARER, so a hostile/malformed host auth.json must not be
304
- // able to smuggle a token-shaped value through it. Real tokens (JWT/`sk-…`/refresh)
305
- // don't match a UUID / a known auth_mode / an ISO-timestamp shape, so on a mismatch
306
- // we OMIT the field — codex may then judge creds incomplete (the SAFE failure)
307
- // rather than us staging a real-looking value into a bearer/metadata slot.
308
- return {
309
- accountId: validAccountId(tokens !== null ? pickString(tokens, 'account_id') : null),
310
- authMode: validAuthMode(pickString(top, 'auth_mode')),
311
- lastRefresh: validLastRefresh(pickString(top, 'last_refresh')),
312
- };
313
- }
314
- /** A ChatGPT account_id is a UUID; a real token (JWT/`sk-…`/refresh) never matches this. */
315
- const UUID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
316
- /** codex auth modes are a tiny closed set. */
317
- const KNOWN_AUTH_MODES = new Set(['chatgpt', 'apikey']);
318
- /** `last_refresh` is an ISO-8601 timestamp: digits + `-:.TZ+`, bounded length. */
319
- const ISO_TIMESTAMP_RE = /^[0-9T:.Z+-]{1,40}$/;
320
- /**
321
- * SHARED account_id guard (codex review, HIGH). The `account_id` is a non-secret
322
- * UUID routing identifier; a real token (JWT / `sk-…` / refresh) NEVER matches a
323
- * UUID. Both account_id flows MUST validate through THIS one definition so a
324
- * hostile/malformed host `~/.codex/auth.json` cannot smuggle a token-shaped value
325
- * into either sink:
326
- * 1. the placeholder JWT's `https://api.openai.com/auth.chatgpt_account_id`
327
- * claim — which becomes the guest BEARER (`credential-secrets.ts`
328
- * `assemblePlaceholderJwt` imports this); and
329
- * 2. the staged `~/.codex/auth.json` `tokens.account_id` metadata
330
- * (`extractCodexMetadata`, below).
331
- * On a non-UUID value we return null so the field is OMITTED from BOTH sinks (the
332
- * JWT stays well-formed; codex may then prompt — the SAFE failure) rather than
333
- * embed a real-looking value.
334
- */
335
- export function validAccountId(v) {
336
- return v !== null && UUID_RE.test(v) ? v : null;
337
- }
338
- function validAuthMode(v) {
339
- return v !== null && KNOWN_AUTH_MODES.has(v) ? v : null;
340
- }
341
- function validLastRefresh(v) {
342
- return v !== null && ISO_TIMESTAMP_RE.test(v) ? v : null;
343
- }
344
- function pickObject(value, key) {
345
- if (!value || typeof value !== 'object' || Array.isArray(value))
346
- return null;
347
- const v = value[key];
348
- if (!v || typeof v !== 'object' || Array.isArray(v))
349
- return null;
350
- return v;
351
- }
352
- function pickString(obj, key) {
353
- const v = obj[key];
354
- return typeof v === 'string' && v.length > 0 ? v : null;
355
- }
356
- //# sourceMappingURL=gondolin-creds-staging.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gondolin-creds-staging.js","sourceRoot":"","sources":["../../src/agent/gondolin-creds-staging.ts"],"names":[],"mappings":"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"}