@moretea-labs/forge 1.7.1 → 1.8.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 (685) hide show
  1. package/AGENTS.md +58 -62
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +42 -62
  4. package/README.md +2 -2
  5. package/SKILL.md +0 -1
  6. package/THIRD_PARTY_NOTICES.md +5 -2
  7. package/adapters/browser/index.ts +2 -0
  8. package/adapters/chatgpt/browser-delivery-host.ts +71 -0
  9. package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
  10. package/adapters/chatgpt/controller-binding-store.ts +55 -0
  11. package/adapters/chatgpt/controller-host.ts +119 -0
  12. package/adapters/chatgpt/controller-round-host.ts +78 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
  14. package/adapters/chatgpt/provider-delivery.ts +113 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/desktop-operator-contract.ts +7 -0
  18. package/adapters/computer/desktop-operator-discovery.ts +201 -0
  19. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  20. package/adapters/computer/desktop-operator-provider.ts +312 -0
  21. package/adapters/computer/index.ts +1 -0
  22. package/adapters/computer/interaction-target-authority.ts +944 -0
  23. package/adapters/controller-process/binding-store.ts +34 -0
  24. package/adapters/controller-process/controller-host.ts +26 -0
  25. package/adapters/mcp/access-mode.ts +132 -0
  26. package/adapters/mcp/audit.ts +32 -0
  27. package/adapters/mcp/auth.ts +407 -0
  28. package/adapters/mcp/controller-round-compatibility.ts +184 -0
  29. package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
  30. package/adapters/mcp/instructions.ts +36 -0
  31. package/adapters/mcp/legacy-context.ts +18 -0
  32. package/adapters/mcp/multi-repository.ts +437 -0
  33. package/adapters/mcp/oauth.ts +391 -0
  34. package/adapters/mcp/paths.ts +140 -0
  35. package/adapters/mcp/policy.ts +232 -0
  36. package/adapters/mcp/proxy-env.ts +62 -0
  37. package/adapters/mcp/readiness-projection.ts +24 -0
  38. package/adapters/mcp/redaction.ts +21 -0
  39. package/adapters/mcp/repo.ts +24 -0
  40. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  41. package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
  42. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
  43. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
  44. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  45. package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
  46. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  47. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
  48. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  49. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  50. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  51. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  52. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
  53. package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
  54. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
  55. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
  56. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  57. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  58. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
  59. package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
  60. package/adapters/mcp/runtime-gateway/router.ts +728 -0
  61. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
  62. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
  63. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  64. package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
  65. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
  66. package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
  67. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
  68. package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
  69. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
  70. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  71. package/adapters/mcp/server.ts +1048 -0
  72. package/adapters/mcp/setup.ts +791 -0
  73. package/adapters/mcp/tool-capability-cache.ts +87 -0
  74. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  75. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
  76. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
  77. package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
  78. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  79. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  80. package/adapters/mcp/toolset-names.ts +74 -0
  81. package/adapters/mcp/toolset-selection.ts +41 -0
  82. package/adapters/mcp/toolset.ts +336 -0
  83. package/adapters/mcp/transports/http.ts +1456 -0
  84. package/adapters/mcp/transports/session-registry.ts +513 -0
  85. package/adapters/mcp/transports/stdio.ts +8 -0
  86. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
  87. package/adapters/mcp/types.ts +41 -0
  88. package/assets/AGENTS.md +2 -16
  89. package/assets/CLAUDE.md +2 -16
  90. package/assets/hooks/AGENTS.md +3 -14
  91. package/assets/hooks/CLAUDE.md +3 -14
  92. package/assets/hooks/hook-input.sh +9 -2
  93. package/assets/hooks/lib/workflow-state.sh +28 -10
  94. package/assets/hooks/prompt-guard.sh +63 -37
  95. package/assets/hooks/security-sentinel.sh +2 -1
  96. package/assets/hooks/session-start-context.sh +7 -5
  97. package/assets/hooks/stop-orchestrator.sh +13 -3
  98. package/assets/initializer-question-pack.v4.json +11 -7
  99. package/assets/partials/05-workflow.partial.md +18 -73
  100. package/assets/partials/07-footer.partial.md +1 -1
  101. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  102. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  103. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  104. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  105. package/assets/plan-map.json +11 -11
  106. package/assets/plugin-registry.v1.json +9 -3
  107. package/assets/plugin-trust-policy.v1.json +6 -0
  108. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  109. package/assets/recovery/forge-wsl-rescue +271 -0
  110. package/assets/reference-configs/development-protocol.md +11 -15
  111. package/assets/reference-configs/document-generation.md +1 -1
  112. package/assets/reference-configs/global-working-rules.md +9 -1
  113. package/assets/reference-configs/harness-overview.md +22 -112
  114. package/assets/reference-configs/hook-operations.md +1 -1
  115. package/assets/reference-configs/sprint-contracts.md +2 -2
  116. package/assets/skill-version.json +2 -2
  117. package/assets/templates/helpers/architecture-event.ts +3 -34
  118. package/assets/templates/helpers/architecture-queue.sh +61 -10
  119. package/assets/templates/helpers/archive-workflow.sh +90 -180
  120. package/assets/templates/helpers/capability-config.ts +8 -11
  121. package/assets/templates/helpers/capability-resolver.ts +37 -19
  122. package/assets/templates/helpers/capture-plan.sh +2 -2
  123. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  124. package/assets/templates/helpers/check-task-sync.sh +82 -11
  125. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  126. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  127. package/assets/templates/helpers/contract-worktree.sh +26 -24
  128. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  129. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  130. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  131. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  132. package/assets/templates/helpers/new-plan.sh +2 -2
  133. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  134. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  135. package/assets/templates/helpers/switch-plan.sh +1 -1
  136. package/assets/templates/helpers/workflow-contract.ts +1 -0
  137. package/assets/workflow-contract.v1.json +63 -171
  138. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  139. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  140. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  141. package/docs/architecture/CURRENT.md +148 -13
  142. package/docs/architecture/EVOLUTION.md +13 -0
  143. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  144. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  145. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  146. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  147. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
  148. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
  149. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  150. package/docs/architecture/domains/verification.md +7 -0
  151. package/docs/architecture/domains/workflow-engine.md +1 -1
  152. package/docs/architecture/index.md +3 -3
  153. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  154. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  155. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  156. package/docs/forge-plugin-management.md +20 -4
  157. package/docs/forge-runtime-self-healing-loop.md +2 -0
  158. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  159. package/docs/operations/controller-browser-plugin.md +3 -1
  160. package/docs/operations/homebrew.md +2 -2
  161. package/docs/operations/platform-support.md +16 -8
  162. package/docs/operations/platform-support.zh-CN.md +2 -2
  163. package/docs/operations/standalone-disaster-recovery.md +26 -1
  164. package/docs/operations/uu-remote-rescue.md +41 -0
  165. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  166. package/docs/public-usage-guide.md +1 -1
  167. package/docs/public-usage-guide.zh-CN.md +1 -1
  168. package/docs/tutorials/01-install-and-start.md +1 -1
  169. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  170. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  171. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  172. package/docs/wiki/Implementation.md +1 -1
  173. package/package.json +23 -14
  174. package/packages/kernel/controller/api/index.ts +2 -0
  175. package/packages/kernel/controller/application/controller-round-service.ts +29 -0
  176. package/packages/kernel/controller/application/controller-service.ts +30 -0
  177. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
  178. package/packages/kernel/controller/domain/controller-round.ts +107 -0
  179. package/packages/kernel/controller/domain/execution-quality.ts +133 -0
  180. package/packages/kernel/controller/domain/types.ts +56 -0
  181. package/packages/kernel/controller/index.ts +1 -0
  182. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  183. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
  184. package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
  185. package/packages/kernel/controller/ports/controller-host.ts +16 -0
  186. package/packages/kernel/goal/api/index.ts +1 -0
  187. package/packages/kernel/goal/domain/types.ts +40 -0
  188. package/packages/kernel/goal/index.ts +1 -0
  189. package/packages/kernel/identity/api/index.ts +5 -0
  190. package/packages/kernel/identity/application/identity-service.ts +67 -0
  191. package/packages/kernel/identity/domain/scope.ts +63 -0
  192. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  193. package/packages/kernel/identity/domain/types.ts +44 -0
  194. package/packages/kernel/identity/domain/workspace.ts +56 -0
  195. package/packages/kernel/identity/index.ts +1 -0
  196. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  197. package/packages/kernel/memory/api/index.ts +5 -0
  198. package/packages/kernel/memory/application/experience-service.ts +118 -0
  199. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  200. package/packages/kernel/memory/domain/experience.ts +103 -0
  201. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  202. package/packages/kernel/memory/index.ts +1 -0
  203. package/packages/kernel/progression/api/index.ts +2 -0
  204. package/packages/kernel/progression/application/projector.ts +211 -0
  205. package/packages/kernel/progression/domain/types.ts +116 -0
  206. package/packages/kernel/progression/index.ts +1 -0
  207. package/packages/kernel/scheduler/api/index.ts +6 -0
  208. package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
  209. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  210. package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
  211. package/packages/kernel/scheduler/application/settlement.ts +197 -0
  212. package/packages/kernel/scheduler/domain/continuation.ts +38 -0
  213. package/packages/kernel/scheduler/domain/schedule.ts +149 -0
  214. package/packages/kernel/scheduler/index.ts +1 -0
  215. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
  216. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
  217. package/packages/kernel/work/api/index.ts +15 -0
  218. package/packages/kernel/work/application/work-service.ts +148 -0
  219. package/packages/kernel/work/domain/admission-policy.ts +34 -0
  220. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  221. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  222. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  223. package/packages/kernel/work/domain/engineering-design.ts +281 -0
  224. package/packages/kernel/work/domain/engineering-profile.ts +242 -0
  225. package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
  226. package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
  227. package/packages/kernel/work/domain/implementation-review.ts +510 -0
  228. package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
  229. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  230. package/packages/kernel/work/domain/state-machine.ts +259 -0
  231. package/packages/kernel/work/domain/types.ts +528 -0
  232. package/packages/kernel/work/index.ts +1 -0
  233. package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
  234. package/packages/kernel/work/ports/work-contract-store.ts +18 -0
  235. package/packages/plugin-runtime/browser/index.ts +3 -0
  236. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  237. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  238. package/packages/plugin-runtime/browser/session-authority.ts +61 -0
  239. package/packages/plugin-runtime/computer/index.ts +6 -0
  240. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  241. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  242. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  243. package/packages/plugin-runtime/computer/provider.ts +19 -0
  244. package/packages/plugin-runtime/computer/target-authority.ts +190 -0
  245. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  246. package/packages/plugin-runtime/external/index.ts +1 -0
  247. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
  248. package/packages/plugin-runtime/index.ts +3 -0
  249. package/packages/protocols/browser/index.ts +1 -0
  250. package/packages/protocols/browser/session.ts +98 -0
  251. package/packages/protocols/computer/contract.ts +199 -0
  252. package/packages/protocols/computer/index.ts +1 -0
  253. package/packages/protocols/failure/contract.ts +158 -0
  254. package/packages/protocols/failure/index.ts +1 -0
  255. package/packages/protocols/handoff/index.ts +1 -0
  256. package/packages/protocols/handoff/status.ts +22 -0
  257. package/packages/protocols/mcp/execution-context.ts +11 -0
  258. package/packages/protocols/mcp/index.ts +2 -0
  259. package/packages/protocols/mcp/tool-contract.ts +42 -0
  260. package/packages/workflow-runtime/api/index.ts +2 -0
  261. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  262. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  263. package/packages/workflow-runtime/index.ts +1 -0
  264. package/scripts/assemble-template.ts +1 -1
  265. package/scripts/benchmark-computer-hotpath.ts +255 -0
  266. package/scripts/benchmark-controller-round2.ts +54 -2
  267. package/scripts/benchmark-ios-agent-device.ts +3 -6
  268. package/scripts/benchmark-mcp-transport.ts +3 -4
  269. package/scripts/benchmark-operational-memory-activation.ts +235 -0
  270. package/scripts/benchmark-operational-shadow.ts +28 -0
  271. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  272. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  273. package/scripts/canary-controller-semantic-wait.ts +195 -0
  274. package/scripts/canary-global-hook.sh +2 -2
  275. package/scripts/check-mcp-compatibility.ts +173 -7
  276. package/scripts/check-platform-support.mjs +28 -2
  277. package/scripts/check-public-docs.sh +1 -1
  278. package/scripts/check-release-readiness.sh +1 -1
  279. package/scripts/check-repository-hygiene.mjs +92 -0
  280. package/scripts/check-runtime-architecture.mjs +1206 -95
  281. package/scripts/check-source-duplication.mjs +9 -1
  282. package/scripts/check-tarball-install-smoke.sh +98 -15
  283. package/scripts/controller-ngrok-rotation.sh +5 -4
  284. package/scripts/create-project-dirs.sh +10 -74
  285. package/scripts/forge-local-recovery-helper.mjs +204 -0
  286. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  287. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  288. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  289. package/scripts/hook-shim.sh +2 -2
  290. package/scripts/init-project.sh +12 -70
  291. package/scripts/install-desktop-operator-registration.ts +4 -2
  292. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  293. package/scripts/install-standalone-recovery.ts +122 -10
  294. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  295. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  296. package/scripts/lib/controller-home-env.sh +6 -3
  297. package/scripts/lib/project-init-lib.sh +39 -582
  298. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  299. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  300. package/scripts/open-source-audit-allowlist.txt +12 -1
  301. package/scripts/portability-bindings.mjs +70 -0
  302. package/scripts/run-bounded-command.mjs +55 -0
  303. package/scripts/run-bun-test-file.ts +22 -6
  304. package/scripts/run-governed-gate.ts +4 -1
  305. package/scripts/smoke-mcp-http-runtime.ts +1 -1
  306. package/scripts/smoke-runtime-recovery.ts +34 -1
  307. package/scripts/smoke-schedule-engine.ts +1 -1
  308. package/scripts/stage-runtime-release.ts +6 -1
  309. package/scripts/test-governance.ts +51 -2
  310. package/src/cli/agent-jobs/job-manager.ts +10 -1
  311. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  312. package/src/cli/chatgpt-browser/binding.ts +20 -10
  313. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  314. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  315. package/src/cli/chatgpt-browser/engine.ts +10 -11
  316. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  317. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  318. package/src/cli/chatgpt-browser/types.ts +1 -0
  319. package/src/cli/commands/bootstrap-control.ts +334 -0
  320. package/src/cli/commands/brain-assistant.ts +38 -0
  321. package/src/cli/commands/brain.ts +193 -40
  322. package/src/cli/commands/chatgpt.ts +127 -0
  323. package/src/cli/commands/computer.ts +437 -0
  324. package/src/cli/commands/doctor.ts +18 -1
  325. package/src/cli/commands/init-hook.ts +71 -61
  326. package/src/cli/commands/init.ts +3 -1
  327. package/src/cli/commands/mcp.ts +16 -10
  328. package/src/cli/commands/plugin.ts +38 -12
  329. package/src/cli/commands/recovery.ts +493 -80
  330. package/src/cli/commands/runtime.ts +9 -4
  331. package/src/cli/commands/setup-profile.ts +89 -39
  332. package/src/cli/commands/status.ts +2 -1
  333. package/src/cli/controller/check-runner.ts +487 -98
  334. package/src/cli/controller/context/types.ts +7 -1
  335. package/src/cli/controller/context-pack.ts +23 -3
  336. package/src/cli/controller/issue-store.ts +1 -1
  337. package/src/cli/controller/systemd-user.ts +110 -0
  338. package/src/cli/controller/types.ts +10 -70
  339. package/src/cli/controller/worklog.ts +67 -13
  340. package/src/cli/editing/edit-operation-contract.ts +92 -0
  341. package/src/cli/editing/edit-session.ts +289 -13
  342. package/src/cli/github/plugin.ts +17 -12
  343. package/src/cli/hook/route-registry.ts +3 -5
  344. package/src/cli/hook/runtime.ts +49 -3
  345. package/src/cli/index.ts +3 -0
  346. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  347. package/src/cli/local-bridge/console-automations.ts +2 -2
  348. package/src/cli/local-bridge/facade-api.ts +41 -14
  349. package/src/cli/local-bridge/job-store.ts +1 -1
  350. package/src/cli/local-bridge/server.ts +24 -27
  351. package/src/cli/mcp/access-mode.ts +2 -132
  352. package/src/cli/mcp/access-tools.ts +2 -387
  353. package/src/cli/mcp/audit.ts +2 -32
  354. package/src/cli/mcp/auth.ts +2 -404
  355. package/src/cli/mcp/instructions.ts +2 -34
  356. package/src/cli/mcp/legacy-context.ts +2 -16
  357. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  358. package/src/cli/mcp/multi-repository.ts +2 -436
  359. package/src/cli/mcp/oauth.ts +2 -375
  360. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  361. package/src/cli/mcp/paths.ts +2 -140
  362. package/src/cli/mcp/policy.ts +2 -232
  363. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  364. package/src/cli/mcp/proxy-env.ts +2 -62
  365. package/src/cli/mcp/readiness-projection.ts +2 -24
  366. package/src/cli/mcp/redaction.ts +2 -21
  367. package/src/cli/mcp/repo.ts +2 -24
  368. package/src/cli/mcp/repository-tools.ts +2 -1585
  369. package/src/cli/mcp/server.ts +2 -951
  370. package/src/cli/mcp/setup.ts +2 -737
  371. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  372. package/src/cli/mcp/tool-contract.ts +2 -14
  373. package/src/cli/mcp/tools.ts +2 -9
  374. package/src/cli/mcp/toolset-names.ts +2 -70
  375. package/src/cli/mcp/toolset-selection.ts +2 -41
  376. package/src/cli/mcp/toolset.ts +2 -336
  377. package/src/cli/mcp/transports/AGENTS.md +1 -10
  378. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  379. package/src/cli/mcp/transports/http.ts +2 -1414
  380. package/src/cli/mcp/transports/session-registry.ts +2 -490
  381. package/src/cli/mcp/transports/stdio.ts +2 -8
  382. package/src/cli/mcp/types.ts +2 -41
  383. package/src/cli/mcp/umbrella-tools.ts +2 -117
  384. package/src/cli/repositories/command-executor.ts +64 -18
  385. package/src/cli/repositories/command-scope.ts +117 -1
  386. package/src/cli/repositories/controller-home.ts +119 -1
  387. package/src/cli/repositories/identity.ts +13 -0
  388. package/src/cli/repositories/registry.ts +68 -49
  389. package/src/cli/repositories/repository-snapshot.ts +53 -7
  390. package/src/cli/repositories/runtime-storage.ts +27 -2
  391. package/src/cli/repositories/safe-patch.ts +34 -38
  392. package/src/cli/repositories/selected-path-actions.ts +22 -2
  393. package/src/cli/repositories/structured-git.ts +105 -25
  394. package/src/cli/runtime/helper-runner.ts +7 -0
  395. package/src/cli/runtime-invocation.ts +8 -1
  396. package/src/cli/tools/codegraph.ts +44 -25
  397. package/src/core/adoption/manifest-templates.ts +1 -1
  398. package/src/core/adoption/plan.ts +3 -26
  399. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  400. package/src/effects/process-runner.ts +8 -14
  401. package/src/runtime/context/assistant-context.ts +154 -0
  402. package/src/runtime/context/assistant-work-context.ts +147 -0
  403. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  404. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  405. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  406. package/src/runtime/context/context-closure.ts +268 -0
  407. package/src/runtime/context/context-plane.ts +211 -0
  408. package/src/runtime/context/project-engineering-contract.ts +60 -0
  409. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  410. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  411. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  412. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  413. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  414. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  415. package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
  416. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  417. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
  418. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
  419. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
  420. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
  421. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +417 -100
  422. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
  423. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  424. package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
  425. package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
  426. package/src/runtime/control-plane/execution/validation.ts +28 -3
  427. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
  428. package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
  429. package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
  430. package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
  431. package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
  432. package/src/runtime/control-plane/execution/work-handle-authority.ts +267 -16
  433. package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
  434. package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
  435. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
  436. package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
  437. package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
  438. package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
  439. package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
  440. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
  441. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
  442. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  443. package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
  444. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
  445. package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
  446. package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
  447. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  448. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
  449. package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
  450. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
  451. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
  452. package/src/runtime/control-plane/facade/index.ts +4 -2
  453. package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
  454. package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
  455. package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
  456. package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
  457. package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
  458. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
  459. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  460. package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
  461. package/src/runtime/control-plane/facade/types.ts +189 -532
  462. package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
  463. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  464. package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
  465. package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
  466. package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
  467. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
  468. package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
  469. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  470. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  471. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
  472. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  473. package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
  474. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  475. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
  476. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  477. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
  478. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
  479. package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
  480. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  481. package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
  482. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  483. package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
  484. package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
  485. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  486. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  487. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  488. package/src/runtime/control-plane/release-retention.ts +56 -16
  489. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  490. package/src/runtime/control-plane/routing/route-policy.ts +19 -0
  491. package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
  492. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  493. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
  494. package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
  495. package/src/runtime/diagnostics/incident-repair.ts +406 -0
  496. package/src/runtime/diagnostics/mcp-timing.ts +125 -6
  497. package/src/runtime/diagnostics/performance.ts +6 -14
  498. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  499. package/src/runtime/evidence/artifact-store.ts +65 -2
  500. package/src/runtime/evidence/operational-shadow.ts +38 -0
  501. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  502. package/src/runtime/evidence/sensitive-output.ts +4 -4
  503. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  504. package/src/runtime/execution/jobs/store.ts +121 -2
  505. package/src/runtime/execution/managed-workspace.ts +55 -5
  506. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  507. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  508. package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
  509. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  510. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  511. package/src/runtime/execution/process-runtime/check-result.ts +73 -2
  512. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
  513. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  514. package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
  515. package/src/runtime/execution/process-runtime/index.ts +1 -0
  516. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  517. package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
  518. package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
  519. package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
  520. package/src/runtime/execution/process-runtime/runtime.ts +132 -15
  521. package/src/runtime/execution/process-runtime/types.ts +22 -0
  522. package/src/runtime/execution/workers/executor.ts +16 -13
  523. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  524. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  525. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  526. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  527. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  528. package/src/runtime/gateway/mcp/router.ts +2 -1125
  529. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  530. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6651
  531. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  532. package/src/runtime/maintenance/cleanup.ts +38 -24
  533. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  534. package/src/runtime/platform/computer-platform.ts +14 -0
  535. package/src/runtime/platform/executable-discovery.ts +54 -0
  536. package/src/runtime/platform/fetch-http-server.ts +90 -0
  537. package/src/runtime/platform/service-manager.ts +138 -0
  538. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  539. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  540. package/src/runtime/plugins/action-application.ts +135 -0
  541. package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
  542. package/src/runtime/plugins/browser-adapter.ts +140 -100
  543. package/src/runtime/plugins/browser-automation-service.ts +15 -36
  544. package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
  545. package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
  546. package/src/runtime/plugins/browser-native-session-service.ts +1 -1
  547. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  548. package/src/runtime/plugins/browser-registration.ts +16 -0
  549. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  550. package/src/runtime/plugins/browser-runtime.ts +41 -9
  551. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  552. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  553. package/src/runtime/plugins/browser-session-store.ts +229 -36
  554. package/src/runtime/plugins/browser-session-types.ts +2 -98
  555. package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
  556. package/src/runtime/plugins/catalog-trust.ts +82 -0
  557. package/src/runtime/plugins/computer-registration.ts +839 -0
  558. package/src/runtime/plugins/config-store.ts +119 -0
  559. package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
  560. package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
  561. package/src/runtime/plugins/errors.ts +8 -1
  562. package/src/runtime/plugins/external-adapter.ts +45 -322
  563. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  564. package/src/runtime/plugins/external-registration.ts +9 -1
  565. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  566. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  567. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  568. package/src/runtime/plugins/first-party-registry.ts +3 -1
  569. package/src/runtime/plugins/github-adapter.ts +1 -2
  570. package/src/runtime/plugins/gmail-adapter.ts +6 -6
  571. package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
  572. package/src/runtime/plugins/google-shared.ts +31 -46
  573. package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
  574. package/src/runtime/plugins/ios-adapter.ts +1 -2
  575. package/src/runtime/plugins/local-system-adapter.ts +180 -0
  576. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  577. package/src/runtime/plugins/resend-adapter.ts +15 -24
  578. package/src/runtime/plugins/store.ts +493 -51
  579. package/src/runtime/plugins/types.ts +8 -1
  580. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  581. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  582. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  583. package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
  584. package/src/runtime/projections/controller-context.ts +12 -6
  585. package/src/runtime/projections/git-status-sampler.ts +73 -22
  586. package/src/runtime/projections/materialized-view.ts +14 -8
  587. package/src/runtime/recovery/capability-action-application.ts +228 -0
  588. package/src/runtime/recovery/index.ts +3 -0
  589. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  590. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  591. package/src/runtime/recovery/maintenance-executor.ts +358 -76
  592. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  593. package/src/runtime/release/identity.ts +6 -0
  594. package/src/runtime/resources/leases/store.ts +1 -1
  595. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  596. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  597. package/src/runtime/root/browser-session-composition.ts +59 -0
  598. package/src/runtime/root/computer-composition.ts +191 -0
  599. package/src/runtime/root/computer-target-composition.ts +16 -0
  600. package/src/runtime/root/computer-target-persistence.ts +39 -0
  601. package/src/runtime/root/controller-round-composition.ts +107 -0
  602. package/src/runtime/root/controller-services.ts +2 -0
  603. package/src/runtime/root/entry.ts +4 -3
  604. package/src/runtime/root/gateway-adapter.ts +3 -3
  605. package/src/runtime/root/local-bridge.ts +5 -2
  606. package/src/runtime/root/mcp-transport.ts +5 -5
  607. package/src/runtime/root/package-connector-service.ts +108 -56
  608. package/src/runtime/root/package-runtime-release.ts +86 -18
  609. package/src/runtime/root/package-runtime-service.ts +63 -86
  610. package/src/runtime/root/release-execution-canary.ts +71 -0
  611. package/src/runtime/root/release-loader.ts +68 -0
  612. package/src/runtime/root/release-manifest.ts +106 -2
  613. package/src/runtime/root/release-materialize.ts +103 -4
  614. package/src/runtime/root/release-store.ts +31 -2
  615. package/src/runtime/root/runtime.ts +240 -25
  616. package/src/runtime/root/scheduled-controller-composition.ts +51 -0
  617. package/src/runtime/root/scheduler.ts +12 -4
  618. package/src/runtime/root/service-runner.ts +1 -1
  619. package/src/runtime/root/service.ts +41 -16
  620. package/src/runtime/root/status.ts +1 -0
  621. package/src/runtime/root/types.ts +24 -1
  622. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  623. package/src/runtime/shared/process-environment.ts +19 -4
  624. package/src/runtime/shared/storage-capacity.ts +68 -0
  625. package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
  626. package/src/runtime/standalone-recovery/core.ts +984 -230
  627. package/src/runtime/standalone-recovery/entry.ts +182 -51
  628. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  629. package/src/runtime/standalone-recovery/installer.ts +212 -104
  630. package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
  631. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  632. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  633. package/src/runtime/standalone-recovery/performance.ts +135 -0
  634. package/src/runtime/standalone-recovery/release.ts +5 -0
  635. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  636. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
  637. package/src/runtime/workflow/schedules/engine.ts +191 -343
  638. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  639. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  640. package/src/runtime/workflow/schedules/store.ts +2 -607
  641. package/src/runtime/workflow/schedules/types.ts +2 -127
  642. package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
  643. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  644. package/src/runtime/workflows/runtime.ts +486 -0
  645. package/src/testing/test-governance.ts +90 -29
  646. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  647. package/docs/architecture/history/README.md +0 -7
  648. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  649. package/docs/architecture/history/global-hook-runtime.md +0 -166
  650. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  651. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  652. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  653. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  654. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  655. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  656. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  657. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  658. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  659. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  660. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  661. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  662. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  663. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  664. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  665. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  666. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  667. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  668. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  669. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  670. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  671. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  672. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  673. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  674. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  675. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  676. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  677. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  678. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  679. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  680. package/docs/architecture/requests/archive/2026/root.md +0 -68
  681. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  682. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  683. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  684. package/scripts/archive-architecture-request.sh +0 -4
  685. package/scripts/run-skill-evals.ts +0 -1022
@@ -0,0 +1,55 @@
1
+ import { withControllerLock } from '../../src/cli/repositories/locks';
2
+ import { readControlPlaneRecord, writeControlPlaneRecord } from '../../src/runtime/control-plane/persistence/sqlite-store';
3
+ import type { ControllerBinding } from '../../packages/kernel/controller/api/index';
4
+
5
+ const NAMESPACE = 'chatgpt_controller_binding';
6
+
7
+ export interface ChatgptControllerBindingPayload {
8
+ schemaVersion: 1;
9
+ bindingId: string;
10
+ repoId: string;
11
+ workId: string;
12
+ sessionId: string;
13
+ browserSessionId?: string;
14
+ conversationUrl?: string;
15
+ title?: string;
16
+ model?: string;
17
+ reasoning?: 'medium' | 'high' | 'xhigh';
18
+ tabPolicy?: 'auto' | 'reuse' | 'new';
19
+ timeoutMs?: number;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ }
23
+
24
+ function bindingId(repoId: string, workId: string): string {
25
+ return `chatgpt-controller:${repoId}:${workId}`;
26
+ }
27
+
28
+ export function upsertChatgptControllerBinding(
29
+ options: { controllerHome: string; repoId: string; now?: () => string },
30
+ input: Omit<ChatgptControllerBindingPayload, 'schemaVersion' | 'bindingId' | 'repoId' | 'createdAt' | 'updatedAt'>,
31
+ ): { binding: ControllerBinding; payload: ChatgptControllerBindingPayload } {
32
+ const id = bindingId(options.repoId, input.workId);
33
+ return withControllerLock(options.controllerHome, { scope: 'task', repoId: options.repoId, taskId: `chatgpt-controller-binding-${input.workId}` }, `chatgpt-controller-binding:${id}`, () => {
34
+ const current = readControlPlaneRecord<ChatgptControllerBindingPayload>(options.controllerHome, NAMESPACE, options.repoId, id);
35
+ const at = options.now?.() ?? new Date().toISOString();
36
+ const payload: ChatgptControllerBindingPayload = {
37
+ ...(current?.value ?? {} as ChatgptControllerBindingPayload),
38
+ ...input,
39
+ schemaVersion: 1, bindingId: id, repoId: options.repoId,
40
+ createdAt: current?.value.createdAt ?? at, updatedAt: at,
41
+ };
42
+ writeControlPlaneRecord(options.controllerHome, {
43
+ namespace: NAMESPACE, scope: options.repoId, key: id, schemaVersion: 1, value: payload,
44
+ action: current ? 'chatgpt_controller_binding_update' : 'chatgpt_controller_binding_create',
45
+ expectedRevision: current?.revision ?? null,
46
+ });
47
+ return { binding: { bindingId: id, hostKind: 'chatgpt', adapterRef: id }, payload };
48
+ });
49
+ }
50
+
51
+ export function getChatgptControllerBindingPayload(
52
+ options: { controllerHome: string; repoId: string }, adapterRef: string,
53
+ ): ChatgptControllerBindingPayload | undefined {
54
+ return readControlPlaneRecord<ChatgptControllerBindingPayload>(options.controllerHome, NAMESPACE, options.repoId, adapterRef)?.value;
55
+ }
@@ -0,0 +1,119 @@
1
+ import { createHash } from 'crypto';
2
+ import {
3
+ getControllerRoundRelay,
4
+ type ControllerBinding,
5
+ type ControllerHost,
6
+ type ControllerRoundContext,
7
+ } from '../../packages/kernel/controller/api/index';
8
+ import { runWorkChatgptContinuation } from '../../src/runtime/control-plane/launcher/chatgpt-work-continuation';
9
+ import { renderChatgptControllerRoundPrompt } from '../../src/runtime/root/controller-round-composition';
10
+ import { getChatgptControllerBindingPayload } from './controller-binding-store';
11
+ import { getChatgptWorkConversationBinding } from './work-conversation-binding-store';
12
+ import { chatgptProviderDispatchReceiptId, classifyChatgptProviderFailure } from './provider-delivery';
13
+ import { createHandoffItem, getHandoffItem } from '../../src/runtime/control-plane/facade/handoff-inbox-store';
14
+
15
+
16
+ function providerUserActionHandoffId(repoId: string, workId: string, relayScopeId: string, authorityId: string): string {
17
+ const digest = createHash('sha256').update(`${repoId}\n${workId}\n${relayScopeId}\n${authorityId}`).digest('hex').slice(0, 20);
18
+ return `hnd-chatgpt-provider-auth-${digest}`;
19
+ }
20
+
21
+ function ensureChatgptProviderUserActionHandoff(
22
+ options: { controllerHome: string; repoId: string },
23
+ roundContext: ControllerRoundContext,
24
+ code: string,
25
+ message: string,
26
+ ): string {
27
+ const id = providerUserActionHandoffId(options.repoId, roundContext.workId, roundContext.relayScopeId, roundContext.authorityId);
28
+ const existing = getHandoffItem(options, id);
29
+ if (existing && existing.status === 'pending') return existing.id;
30
+ if (existing) return existing.id;
31
+ return createHandoffItem(options, {
32
+ id,
33
+ repoId: options.repoId,
34
+ workId: roundContext.workId,
35
+ title: 'ChatGPT provider authorization required',
36
+ severity: 'needs_review',
37
+ reason: message,
38
+ creationReason: 'missing_authorization',
39
+ summary: `Provider delivery is blocked until the user completes ChatGPT authentication or permission: ${code}`,
40
+ currentState: {
41
+ repoId: options.repoId,
42
+ workId: roundContext.workId,
43
+ statusSummary: 'ControllerRound is waiting for an explicit provider authentication/permission action.',
44
+ blockedBy: [code],
45
+ nextSafeAction: 'Complete the provider login/permission action, then resolve this Handoff to trigger a fresh continuation occurrence.',
46
+ },
47
+ evidenceRefs: [],
48
+ blockingDecision: 'Complete the required ChatGPT login or permission action.',
49
+ recommendedDecision: 'Complete provider authentication/permission and resume the same durable Work.',
50
+ recommendedPrompt: `Resume exact Work ${roundContext.workId} after provider authentication is complete.`,
51
+ suggestedNextActions: [],
52
+ }).id;
53
+ }
54
+
55
+ export function createChatgptControllerHost(options: {
56
+ controllerHome: string;
57
+ repoId: string;
58
+ repoRoot: string;
59
+ }): ControllerHost {
60
+ return {
61
+ async resume(binding: ControllerBinding, roundContext: ControllerRoundContext) {
62
+ if (binding.hostKind !== 'chatgpt') return { accepted: false, reason: `CONTROLLER_HOST_KIND_MISMATCH:${binding.hostKind}` };
63
+ const payload = getChatgptControllerBindingPayload(options, binding.adapterRef);
64
+ if (!payload || payload.bindingId !== binding.bindingId || payload.workId !== roundContext.workId) {
65
+ return { accepted: false, reason: `CHATGPT_CONTROLLER_BINDING_NOT_FOUND:${binding.bindingId}` };
66
+ }
67
+ const relayStore = { controllerHome: options.controllerHome, repoId: options.repoId };
68
+ const relay = getControllerRoundRelay(relayStore, roundContext.workId);
69
+ if (!relay || relay.relayScopeId !== roundContext.relayScopeId || relay.authorityId !== roundContext.authorityId) {
70
+ return { accepted: false, reason: `CONTROLLER_ROUND_CONTEXT_STALE:${roundContext.workId}` };
71
+ }
72
+ const durableConversation = getChatgptWorkConversationBinding(relayStore, roundContext.workId);
73
+ const prompt = [
74
+ renderChatgptControllerRoundPrompt(relayStore, relay, { exactOriginWork: roundContext.exactOriginWork === true }),
75
+ roundContext.continuationHint?.trim() ? `Continuation hint: ${roundContext.continuationHint.trim()}` : '',
76
+ ].filter(Boolean).join('\n\n');
77
+ const result = await runWorkChatgptContinuation({
78
+ controllerHome: options.controllerHome,
79
+ repoId: options.repoId,
80
+ repoRoot: options.repoRoot,
81
+ workId: roundContext.workId,
82
+ prompt,
83
+ controllerAuthorityId: roundContext.authorityId,
84
+ relayScopeId: roundContext.relayScopeId,
85
+ title: payload.title,
86
+ browserSessionId: durableConversation?.latestBrowserSessionId ?? payload.browserSessionId,
87
+ conversationUrl: durableConversation?.conversationUrl ?? payload.conversationUrl,
88
+ model: payload.model ?? 'gpt-5.6',
89
+ reasoning: payload.reasoning ?? 'high',
90
+ tabPolicy: payload.tabPolicy ?? 'auto',
91
+ timeoutMs: payload.timeoutMs,
92
+ originSurface: 'schedule',
93
+ });
94
+ if (result.status === 'failed') {
95
+ const code = result.error?.code ?? 'CHATGPT_WORK_CONTINUATION_FAILED';
96
+ const message = result.error?.message ?? code;
97
+ const disposition = classifyChatgptProviderFailure(code, message);
98
+ if (disposition === 'outcome_unknown') {
99
+ throw new Error(`CONTROLLER_HOST_PROVIDER_DISPATCH_OUTCOME_UNKNOWN:${code}:${message}`);
100
+ }
101
+ if (disposition === 'wait_for_user') {
102
+ const handoffId = ensureChatgptProviderUserActionHandoff(options, roundContext, code, message);
103
+ return { accepted: false, waitForUser: true, handoffId, reason: message };
104
+ }
105
+ return { accepted: false, reason: message };
106
+ }
107
+ return {
108
+ accepted: true,
109
+ dispatchId: chatgptProviderDispatchReceiptId({
110
+ repoId: options.repoId,
111
+ workId: roundContext.workId,
112
+ relayScopeId: roundContext.relayScopeId,
113
+ controllerAuthorityId: roundContext.authorityId,
114
+ provider: result.provider,
115
+ }),
116
+ };
117
+ },
118
+ };
119
+ }
@@ -0,0 +1,78 @@
1
+ import {
2
+ readControllerRoundContextSnapshot,
3
+ type ControllerRoundRelayRecord,
4
+ type ControllerRoundRelayStoreOptions,
5
+ } from '../../packages/kernel/controller/api/index';
6
+ import { hasChatgptConversationIdentity, type ChatgptWorkConversationBinding } from './work-conversation-binding-store';
7
+
8
+ /** ChatGPT-specific rendering of one provider-neutral Kernel ControllerRound. */
9
+ export function buildChatgptControllerRoundPrompt(
10
+ options: ControllerRoundRelayStoreOptions,
11
+ record: ControllerRoundRelayRecord,
12
+ promptOptions: { exactOriginWork?: boolean } = {},
13
+ ): string {
14
+ const snapshot = readControllerRoundContextSnapshot(options, record);
15
+ const requirementLine = snapshot.requirement
16
+ ? `Requirement ${snapshot.requirement.requirementId}:state=${snapshot.requirement.state};outcome=${snapshot.requirement.outcomeStatement}`
17
+ : `当前未绑定 durable Requirement;语义 relay scope 为 ${snapshot.relayScopeId}。`;
18
+ const workLines = snapshot.works.length > 0
19
+ ? snapshot.works.map((work) => {
20
+ const summary = `- ${work.workId}:status=${work.status};phase=${work.phase};updated=${work.updatedAt};objective=${work.objective}`;
21
+ if (work.workId !== snapshot.originWorkId || work.acceptanceCriteria.length === 0) return summary;
22
+ return [
23
+ summary,
24
+ ' origin Work acceptanceCriteria(durable semantic contract):',
25
+ ...work.acceptanceCriteria.map((criterion, index) => ` ${index + 1}. ${criterion}`),
26
+ ].join('\n');
27
+ }).join('\n')
28
+ : '- 未找到关联 Work 快照';
29
+ const originWork = snapshot.works.find((work) => work.workId === snapshot.originWorkId);
30
+ const terminalOriginGuidance = originWork?.status === 'completed'
31
+ ? `origin Work ${snapshot.originWorkId} 已 completed。禁止再次 controller_claim/reclaim 这个 terminal Work。若它是 validating 的 Plan predecessor:先用当前 round authority 做 plan_accept_step;再显式 start 唯一 successor(related_work_id=${snapshot.originWorkId}, work_relation=continue,并显式提供 work_kind/所需 engineering_preconditions 以及同一 controller_authority_id + relay_scope_id);start 成功后 successor 只做 mechanical bind、不得抢占 ownership;随后显式提交 continue_immediately 得到 pending_release,最后 controller_release predecessor 触发新的 successor ControllerRound。`
32
+ : undefined;
33
+ const handoffLines = snapshot.handoffs.length > 0
34
+ ? snapshot.handoffs.map((handoff) => `- ${handoff.id}:status=${handoff.status};work=${handoff.workId ?? 'repo'};${handoff.title};reason=${handoff.reason}`).join('\n')
35
+ : '- 当前没有 active linked Handoff';
36
+ return [
37
+ `继续 Forge Requirement/Goal relay ${snapshot.relayScopeId},repo=${snapshot.repoId}。`,
38
+ '这是新的 ChatGPT controller round。第一步必须重新读取最新 Forge Requirement/Work/Handoff 状态;下面的快照只用于启动提示,不能代替 durable state。',
39
+ requirementLine,
40
+ `关联 Work 快照:\n${workLines}`,
41
+ 'origin Work 的 objective 与 acceptanceCriteria 是本轮必须显式检查的 durable semantic contract;若最新事实满足其中更具体的终态义务,不得仅凭通用 disposition 指导改写成另一种终态。',
42
+ `Active Handoff 快照:\n${handoffLines}`,
43
+ ...(snapshot.assistantContext ? [snapshot.assistantContext] : []),
44
+ ...(snapshot.executionQualitySignals?.length ? [
45
+ `Execution quality evidence (advisory): ${JSON.stringify(snapshot.executionQualitySignals)}`,
46
+ 'Review this evidence before repeating the same operation. Diagnose semantically; record whether an adjustment is justified. Do not infer a bug from edit counts, discard mandatory checks, widen authority or create another supervisor.',
47
+ ] : []),
48
+ promptOptions.exactOriginWork
49
+ ? `这是 Work-bound scheduled round。只允许 claim 并推进 origin Work ${snapshot.originWorkId}。不得选择、启动、delegate、resume sibling Work,不得新建 schedule,也不得扩大 scope。如果经过一次有界诊断或修复后仍无法安全推进,记录精确证据,提交 wait 或带 active Handoff 的 wait_for_user,释放 ownership,然后结束本轮。`
50
+ : `上一轮 relay 的 origin Work 是 ${snapshot.originWorkId}。不要假设下一步必须继续该 Work;必须依据最新 semantic state 选择、启动或 claim 正确的 Work。`,
51
+ ...(terminalOriginGuidance ? [terminalOriginGuidance] : []),
52
+ `机械 relay 预算:round=${snapshot.round.count}/${snapshot.round.maxRounds};repeated_state=${snapshot.round.repeatedStateCount}/${snapshot.round.maxRepeatedState};consecutive_failures=${snapshot.round.consecutiveFailures}/${snapshot.round.maxFailures}。`,
53
+ '仓库中的工程、验收、安全和权限约束始终有效。但如果某条 Skill/tool 指令明确限定为其他 Controller host/runtime(例如“仅 Codex 使用/发现的 Skill”),它不是 ChatGPT 当前 round 的硬 capability gate,也不得仅为了满足该 host wording 而 delegate;应使用当前 ChatGPT/Forge 已有能力完成同一工程目标,或基于真实缺失能力提交精确 blocker。',
54
+ record.authorityId
55
+ ? `本轮 durable controller authority 为 controller_authority_id=${record.authorityId}。在 controller_claim、plan_accept_step、continue、verify、review、finalize、stop、controller_release 以及 terminal-successor start 中,必须保持同一个 controller_authority_id 与 relay_scope_id=${record.relayScopeId}。Frozen client 第一次 claim 使用 controller.round:controller_claim:${record.authorityId}:${record.relayScopeId};plan_accept_step、continue、verify、finalize、stop、controller_release 使用 controller.round:<operation>:${record.authorityId}:${record.relayScopeId} authority;review 必须使用 controller.round:review:<approved|changes_required|blocked>:${record.authorityId}:${record.relayScopeId},并通过 reason 携带 review rationale。若 terminal-successor start 的旧 schema 缺 work_kind/engineering_preconditions/round 字段,使用 bounded semantic start compatibility carrier。绝不能用 transport session id 或其他 Work/conversation authority 替代。`
56
+ : '这是没有 controller authority capability 的 legacy relay record;只能沿用已经 claim 的 controller lineage,直到显式恢复本轮。',
57
+ ...(snapshot.recoveryReason
58
+ ? ['上一轮 ChatGPT 在 liveness grace 到期前没有提交显式 disposition。必须重新读取 durable state,并显式关闭本轮。']
59
+ : []),
60
+ terminalOriginGuidance
61
+ ? `terminal predecessor 必须在显式 successor start 完成 mechanical bind 后,再显式提交一次 continue_immediately;得到 pending_release 后仅释放 predecessor。若没有可执行 successor,则按最新 Plan/Requirement 事实使用 wait、带 active Handoff 的 wait_for_user 或 goal_complete。`
62
+ : `如果 Requirement/Goal 需要下一个 controller round,在释放 Work 前提交 continue_immediately,并带 relay_scope_id=${record.relayScopeId}。否则使用 wait、带 active Handoff 的 wait_for_user,或 goal_complete。Frozen MCP client 可使用 controller.disposition:<disposition>:${record.relayScopeId}。`,
63
+ '本轮结束协议是强制的:在向用户输出本轮最终回复之前,必须先提交且仅提交一次 semantic disposition,并完成 controller_release;不得只报告“继续中”“下一步继续”或输出进度后结束本轮。',
64
+ '如果最新 durable state 表明 Requirement/Goal 尚有可执行工作,且不存在真实 external blocker、active Handoff 或必须由用户决定的边界,则必须选择 continue_immediately。wait 只用于真实等待条件;wait_for_user 必须绑定 active Handoff;goal_complete 只用于 Requirement/Goal 已语义完成。',
65
+ '提交 continue_immediately 后必须立即 controller_release 当前 Work。controller_release 是立即续跑的 canonical trigger:Forge 将通过现有 ChatGPT launcher 复用 durable conversation binding 并投递下一 ControllerRound prompt。正常连续推进不得依赖用户再次发送“继续”,也不得用 interval schedule 代替该即时 relay;schedule 只能作为故障恢复/watchdog。',
66
+ 'Forge 不得自行推断 semantic next step。现有 Work ownership、Handoff authority 与 external-effect authorization 始终是权威。',
67
+ ].join('\n');
68
+ }
69
+
70
+ /** ChatGPT adapter continuity proof; Kernel only sees the opaque binding id. */
71
+ export function chatgptControllerRoundBindingAuthorizesRecovery(
72
+ record: ControllerRoundRelayRecord | undefined,
73
+ binding: ChatgptWorkConversationBinding | undefined,
74
+ ): boolean {
75
+ if (record?.controllerType !== 'chatgpt' || record.status !== 'dispatched' || !record.bindingId || !binding) return false;
76
+ if (binding.bindingId !== record.bindingId || !binding.latestBrowserSessionId) return false;
77
+ try { return hasChatgptConversationIdentity(binding.conversationUrl); } catch { return false; }
78
+ }
@@ -0,0 +1,45 @@
1
+ import { withControllerLock } from '../../src/cli/repositories/locks';
2
+ import { readControlPlaneRecord, writeControlPlaneRecord } from '../../src/runtime/control-plane/persistence/sqlite-store';
3
+
4
+ // Resource-cleanup evidence only. Provider dispatch authority is ControllerRoundRelayRecord.lifecycleStage/providerDispatchReceiptId.
5
+ const NAMESPACE = 'chatgpt_controller_round_settlement';
6
+
7
+ export type ChatgptControllerRoundSettlementStatus =
8
+ | 'round_open'
9
+ | 'retained_for_immediate_continuation'
10
+ | 'closed'
11
+ | 'preserved_user_owned'
12
+ | 'session_closed'
13
+ | 'failed';
14
+
15
+ /** Browser/tab resource settlement evidence after a semantic ControllerRound; never proof that a provider prompt was dispatched. */
16
+ export interface ChatgptControllerRoundSettlement {
17
+ schemaVersion: 1;
18
+ repoId: string;
19
+ workId: string;
20
+ relayScopeId: string;
21
+ status: ChatgptControllerRoundSettlementStatus;
22
+ recordedAt: string;
23
+ error?: string;
24
+ }
25
+
26
+ export function recordChatgptControllerRoundSettlement(
27
+ options: { controllerHome: string; repoId: string; now?: () => string },
28
+ input: { workId: string; relayScopeId: string; status: ChatgptControllerRoundSettlementStatus; error?: string },
29
+ ): ChatgptControllerRoundSettlement {
30
+ const key = `${input.workId}:${input.relayScopeId}`;
31
+ return withControllerLock(options.controllerHome, { scope: 'task', repoId: options.repoId, taskId: `chatgpt-round-settlement-${input.workId}` }, `chatgpt-round-settlement:${key}`, () => {
32
+ const existing = readControlPlaneRecord<ChatgptControllerRoundSettlement>(options.controllerHome, NAMESPACE, options.repoId, key);
33
+ const value: ChatgptControllerRoundSettlement = {
34
+ schemaVersion: 1,
35
+ repoId: options.repoId,
36
+ workId: input.workId,
37
+ relayScopeId: input.relayScopeId,
38
+ status: input.status,
39
+ recordedAt: options.now?.() ?? new Date().toISOString(),
40
+ ...(input.error?.trim() ? { error: input.error.trim().slice(0, 2_000) } : {}),
41
+ };
42
+ writeControlPlaneRecord(options.controllerHome, { namespace: NAMESPACE, scope: options.repoId, key, schemaVersion: 1, value, action: 'chatgpt_controller_round_settlement', expectedRevision: existing?.revision ?? null });
43
+ return value;
44
+ });
45
+ }
@@ -0,0 +1,113 @@
1
+ import { createHash } from 'crypto';
2
+
3
+ export const DEFAULT_CHATGPT_AUTOMATION_MODEL = 'gpt-5.6';
4
+ export const DEFAULT_CHATGPT_AUTOMATION_REASONING = 'high';
5
+ export const DEFAULT_CHATGPT_AUTOMATION_TAB_POLICY = 'auto';
6
+ export const CHATGPT_AUTOMATION_SUBMISSION_OUTCOME_UNKNOWN = 'CHATGPT_AUTOMATION_SUBMISSION_OUTCOME_UNKNOWN';
7
+
8
+ export type ChatgptAutomationReasoning = 'medium' | 'high' | 'xhigh';
9
+ export type ChatgptAutomationTabPolicy = 'auto' | 'reuse' | 'new';
10
+ export type ChatgptAutomationTabCleanupStatus = 'closed' | 'preserved_user_owned' | 'session_closed' | 'failed';
11
+
12
+ export type ChatgptProviderFailureDisposition = 'outcome_unknown' | 'wait_for_user' | 'failed';
13
+ export type ChatgptProviderDeliveryStatus = 'dispatch_confirmed' | ChatgptProviderFailureDisposition;
14
+ export type ChatgptProviderKind = 'controller-browser' | 'chatgpt-bridge';
15
+
16
+ export class ChatgptProviderDeliveryError extends Error {
17
+ readonly code: string;
18
+ readonly conversationUrl?: string;
19
+
20
+ constructor(code: string, message: string, options: { conversationUrl?: string } = {}) {
21
+ super(message);
22
+ this.name = 'ChatgptProviderDeliveryError';
23
+ this.code = code;
24
+ this.conversationUrl = options.conversationUrl;
25
+ }
26
+ }
27
+
28
+ export interface ChatgptProviderErrorEvidence {
29
+ code: string;
30
+ message: string;
31
+ conversationUrl?: string;
32
+ }
33
+
34
+ export interface ChatgptProviderDeliveryInput {
35
+ controllerHome: string;
36
+ repoId: string;
37
+ repoRoot: string;
38
+ workId: string;
39
+ prompt: string;
40
+ browserSessionId: string;
41
+ targetUrl: string;
42
+ model: string;
43
+ reasoning: 'medium' | 'high' | 'xhigh';
44
+ timeoutMs?: number;
45
+ }
46
+
47
+ export interface ChatgptProviderDeliveryResult {
48
+ status: ChatgptProviderDeliveryStatus;
49
+ provider: ChatgptProviderKind;
50
+ browserSessionId: string;
51
+ conversationUrl?: string;
52
+ executionPreferenceVerified: boolean;
53
+ error?: { code: string; message: string };
54
+ }
55
+
56
+ /** Provider delivery owns browser/bridge mutation and confirmation, never semantic Work authority. */
57
+ export interface ChatgptProviderDeliveryHost {
58
+ dispatch(input: ChatgptProviderDeliveryInput): Promise<ChatgptProviderDeliveryResult>;
59
+ }
60
+
61
+ const CHATGPT_WAIT_FOR_USER_MARKERS = [
62
+ 'LOGIN_REQUIRED',
63
+ 'AUTH_REQUIRED',
64
+ 'AUTHENTICATION_REQUIRED',
65
+ 'USER_ACTION_REQUIRED',
66
+ 'PERMISSION_REQUIRED',
67
+ 'CONSENT_REQUIRED',
68
+ ] as const;
69
+
70
+ /** Classify provider failure without turning delivery/session details into Kernel authority. */
71
+ export function classifyChatgptProviderFailure(
72
+ code?: string,
73
+ message?: string,
74
+ ): ChatgptProviderFailureDisposition {
75
+ const normalized = `${code ?? ''}\n${message ?? ''}`.toUpperCase();
76
+ if (normalized.includes('OUTCOME_UNKNOWN') || normalized.includes('SUBMISSION_NOT_CONFIRMED')) return 'outcome_unknown';
77
+ if (CHATGPT_WAIT_FOR_USER_MARKERS.some((marker) => normalized.includes(marker))) return 'wait_for_user';
78
+ return 'failed';
79
+ }
80
+
81
+
82
+ export function chatgptProviderDispatchReceiptId(input: {
83
+ repoId: string;
84
+ workId: string;
85
+ relayScopeId: string;
86
+ controllerAuthorityId: string;
87
+ provider: ChatgptProviderKind;
88
+ }): string {
89
+ const digest = createHash('sha256').update([
90
+ input.repoId,
91
+ input.workId,
92
+ input.relayScopeId,
93
+ input.controllerAuthorityId,
94
+ input.provider,
95
+ ].join('\n')).digest('hex').slice(0, 32);
96
+ return `chatgpt-dispatch:${digest}`;
97
+ }
98
+
99
+ export function chatgptProviderError(error: unknown, fallbackCode: string): ChatgptProviderErrorEvidence {
100
+ const message = error instanceof Error ? error.message : String(error);
101
+ const code = error instanceof ChatgptProviderDeliveryError
102
+ ? error.code
103
+ : error instanceof Error && error.message.includes(':')
104
+ ? error.message.split(':', 1)[0]
105
+ : fallbackCode;
106
+ return {
107
+ code,
108
+ message,
109
+ ...(error instanceof ChatgptProviderDeliveryError && error.conversationUrl
110
+ ? { conversationUrl: error.conversationUrl }
111
+ : {}),
112
+ };
113
+ }
@@ -0,0 +1,192 @@
1
+ import { withControllerLock } from '../../src/cli/repositories/locks';
2
+ import { readControlPlaneRecord, writeControlPlaneRecord } from '../../src/runtime/control-plane/persistence/sqlite-store';
3
+
4
+ const NAMESPACE = 'chatgpt_work_conversation_binding';
5
+
6
+ export interface ChatgptWorkConversationBinding {
7
+ schemaVersion: 1;
8
+ repoId: string;
9
+ workId: string;
10
+ /** Stable opaque ControllerBinding adapterRef exposed to Kernel. */
11
+ bindingId: string;
12
+ conversationUrl: string;
13
+ conversationId: string;
14
+ localAlias: string;
15
+ latestBrowserSessionId?: string;
16
+ /** Explicit controller-scoped Browser grants reusable by scheduled delivery. */
17
+ authorizationGrantRefs?: string[];
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ lastContinuedAt?: string;
21
+ }
22
+
23
+ export interface ChatgptWorkBindingStoreOptions {
24
+ controllerHome: string;
25
+ repoId: string;
26
+ now?: () => string;
27
+ }
28
+
29
+ export function chatgptControllerBindingId(repoId: string, workId: string): string {
30
+ return `chatgpt:${repoId}:${workId}`;
31
+ }
32
+
33
+ function nowIso(options: ChatgptWorkBindingStoreOptions): string {
34
+ return options.now?.() ?? new Date().toISOString();
35
+ }
36
+
37
+ export function parseChatgptConversationIdentity(value: string): { conversationUrl: string; conversationId: string } {
38
+ let url: URL;
39
+ try {
40
+ url = new URL(value);
41
+ } catch {
42
+ throw new Error('CHATGPT_WORK_CONVERSATION_URL_INVALID');
43
+ }
44
+ if (url.protocol !== 'https:' || !['chatgpt.com', 'www.chatgpt.com', 'chat.openai.com'].includes(url.hostname)) {
45
+ throw new Error('CHATGPT_WORK_CONVERSATION_URL_INVALID');
46
+ }
47
+ const parts = url.pathname.split('/').filter(Boolean);
48
+ const c = parts.lastIndexOf('c');
49
+ const conversationId = c >= 0 ? parts[c + 1]?.trim() : undefined;
50
+ if (!conversationId) throw new Error('CHATGPT_WORK_CONVERSATION_ID_MISSING');
51
+ url.protocol = 'https:';
52
+ url.hostname = 'chatgpt.com';
53
+ url.search = '';
54
+ url.hash = '';
55
+ return { conversationUrl: url.toString(), conversationId };
56
+ }
57
+
58
+ export function hasChatgptConversationIdentity(value: string): boolean {
59
+ try {
60
+ parseChatgptConversationIdentity(value);
61
+ return true;
62
+ } catch (error) {
63
+ // ChatGPT root and Project URLs are valid launch seeds, but they are not
64
+ // durable conversation identities. Persist only the /c/<id> URL observed
65
+ // after the browser confirms submission.
66
+ if (error instanceof Error && error.message === 'CHATGPT_WORK_CONVERSATION_ID_MISSING') return false;
67
+ throw error;
68
+ }
69
+ }
70
+
71
+ function record(options: ChatgptWorkBindingStoreOptions, workId: string) {
72
+ return readControlPlaneRecord<ChatgptWorkConversationBinding>(
73
+ options.controllerHome,
74
+ NAMESPACE,
75
+ options.repoId,
76
+ workId,
77
+ );
78
+ }
79
+
80
+ export function getChatgptWorkConversationBinding(
81
+ options: ChatgptWorkBindingStoreOptions,
82
+ workId: string,
83
+ ): ChatgptWorkConversationBinding | undefined {
84
+ const value = record(options, workId)?.value;
85
+ return value ? { ...value, bindingId: value.bindingId || chatgptControllerBindingId(options.repoId, workId) } : undefined;
86
+ }
87
+
88
+ export function rebindChatgptWorkConversation(
89
+ options: ChatgptWorkBindingStoreOptions,
90
+ input: {
91
+ workId: string;
92
+ previousConversationId: string;
93
+ conversationUrl: string;
94
+ latestBrowserSessionId?: string;
95
+ authorizationGrantRefs?: readonly string[];
96
+ localAlias?: string;
97
+ },
98
+ ): ChatgptWorkConversationBinding {
99
+ if (!input.workId.trim()) throw new Error('CHATGPT_WORK_BINDING_WORK_REQUIRED');
100
+ if (!input.previousConversationId.trim()) throw new Error('CHATGPT_WORK_REBIND_PREVIOUS_CONVERSATION_REQUIRED');
101
+ const identity = parseChatgptConversationIdentity(input.conversationUrl);
102
+ return withControllerLock(
103
+ options.controllerHome,
104
+ { scope: 'task', repoId: options.repoId, taskId: `chatgpt-work-binding-${input.workId}` },
105
+ `chatgpt-work-rebind:${input.workId}`,
106
+ () => {
107
+ const existing = record(options, input.workId);
108
+ if (!existing) throw new Error(`CHATGPT_WORK_CONVERSATION_BINDING_NOT_FOUND: ${input.workId}`);
109
+ if (existing.value.conversationId !== input.previousConversationId.trim()) {
110
+ throw new Error(`CHATGPT_WORK_CONVERSATION_REBIND_STALE: ${input.workId}:${existing.value.conversationId}`);
111
+ }
112
+ const now = nowIso(options);
113
+ const binding: ChatgptWorkConversationBinding = {
114
+ schemaVersion: 1,
115
+ repoId: options.repoId,
116
+ workId: input.workId,
117
+ bindingId: chatgptControllerBindingId(options.repoId, input.workId),
118
+ conversationUrl: identity.conversationUrl,
119
+ conversationId: identity.conversationId,
120
+ localAlias: (input.localAlias?.trim() || existing.value.localAlias).slice(0, 180),
121
+ latestBrowserSessionId: input.latestBrowserSessionId ?? existing.value.latestBrowserSessionId,
122
+ authorizationGrantRefs: [...new Set((input.authorizationGrantRefs ?? existing.value.authorizationGrantRefs ?? []).map((ref) => ref.trim()).filter(Boolean))],
123
+ createdAt: existing.value.createdAt,
124
+ updatedAt: now,
125
+ lastContinuedAt: now,
126
+ };
127
+ writeControlPlaneRecord(options.controllerHome, {
128
+ namespace: NAMESPACE,
129
+ scope: options.repoId,
130
+ key: input.workId,
131
+ schemaVersion: 1,
132
+ value: binding,
133
+ action: 'chatgpt_work_conversation_rebind',
134
+ expectedRevision: existing.revision,
135
+ });
136
+ return binding;
137
+ },
138
+ );
139
+ }
140
+
141
+ export function bindChatgptWorkConversation(
142
+ options: ChatgptWorkBindingStoreOptions,
143
+ input: {
144
+ workId: string;
145
+ conversationUrl: string;
146
+ latestBrowserSessionId?: string;
147
+ authorizationGrantRefs?: readonly string[];
148
+ localAlias?: string;
149
+ },
150
+ ): ChatgptWorkConversationBinding {
151
+ if (!input.workId.trim()) throw new Error('CHATGPT_WORK_BINDING_WORK_REQUIRED');
152
+ const identity = parseChatgptConversationIdentity(input.conversationUrl);
153
+ return withControllerLock(
154
+ options.controllerHome,
155
+ { scope: 'task', repoId: options.repoId, taskId: `chatgpt-work-binding-${input.workId}` },
156
+ `chatgpt-work-binding:${input.workId}`,
157
+ () => {
158
+ const existing = record(options, input.workId);
159
+ if (existing && existing.value.conversationId !== identity.conversationId) {
160
+ throw new Error(`CHATGPT_WORK_CONVERSATION_REBIND_REQUIRED: ${input.workId}:${existing.value.conversationId}`);
161
+ }
162
+ const now = nowIso(options);
163
+ const localAlias = input.localAlias?.trim()
164
+ || existing?.value.localAlias
165
+ || `Forge · ${options.repoId} · ${input.workId} · ${identity.conversationId.slice(0, 8)}`;
166
+ const binding: ChatgptWorkConversationBinding = {
167
+ schemaVersion: 1,
168
+ repoId: options.repoId,
169
+ workId: input.workId,
170
+ bindingId: chatgptControllerBindingId(options.repoId, input.workId),
171
+ conversationUrl: identity.conversationUrl,
172
+ conversationId: identity.conversationId,
173
+ localAlias: localAlias.slice(0, 180),
174
+ latestBrowserSessionId: input.latestBrowserSessionId ?? existing?.value.latestBrowserSessionId,
175
+ authorizationGrantRefs: [...new Set((input.authorizationGrantRefs ?? existing?.value.authorizationGrantRefs ?? []).map((ref) => ref.trim()).filter(Boolean))],
176
+ createdAt: existing?.value.createdAt ?? now,
177
+ updatedAt: now,
178
+ lastContinuedAt: now,
179
+ };
180
+ writeControlPlaneRecord(options.controllerHome, {
181
+ namespace: NAMESPACE,
182
+ scope: options.repoId,
183
+ key: input.workId,
184
+ schemaVersion: 1,
185
+ value: binding,
186
+ action: existing ? 'chatgpt_work_conversation_continue' : 'chatgpt_work_conversation_bind',
187
+ expectedRevision: existing?.revision ?? null,
188
+ });
189
+ return binding;
190
+ },
191
+ );
192
+ }
@@ -0,0 +1,63 @@
1
+ import { runBridgeProvider } from '../../src/cli/chatgpt-browser/bridge-provider';
2
+ import { controllerSystemRoot } from '../../src/cli/repositories/controller-home';
3
+ import {
4
+ classifyChatgptProviderFailure,
5
+ type ChatgptProviderDeliveryHost,
6
+ } from './provider-delivery';
7
+
8
+ /** WSL bridge delivery host. Windows Chrome is transport; this adapter returns the same dispatch semantics as native Browser. */
9
+ export function createChatgptWslBridgeDeliveryHost(): ChatgptProviderDeliveryHost {
10
+ return {
11
+ async dispatch(input) {
12
+ try {
13
+ const bridgeRoot = controllerSystemRoot(input.controllerHome);
14
+ const bridged = await runBridgeProvider({
15
+ repoRoot: bridgeRoot,
16
+ prompt: input.prompt,
17
+ provider: 'bridge',
18
+ chatgptUrl: input.targetUrl,
19
+ timeoutMs: input.timeoutMs ?? 60_000,
20
+ dispatchOnly: true,
21
+ }, {
22
+ prompt: input.prompt,
23
+ rendered: input.prompt,
24
+ files: [],
25
+ followups: [],
26
+ totalChars: input.prompt.length,
27
+ });
28
+ if (bridged.status !== 'completed') {
29
+ const code = bridged.error?.code ?? 'CHATGPT_BRIDGE_DISPATCH_FAILED';
30
+ const message = bridged.error?.message ?? bridged.output;
31
+ return {
32
+ status: classifyChatgptProviderFailure(code, message),
33
+ provider: 'chatgpt-bridge',
34
+ browserSessionId: input.browserSessionId,
35
+ conversationUrl: bridged.conversationUrl ?? input.targetUrl,
36
+ executionPreferenceVerified: false,
37
+ error: { code, message },
38
+ };
39
+ }
40
+ return {
41
+ status: 'dispatch_confirmed',
42
+ provider: 'chatgpt-bridge',
43
+ browserSessionId: input.browserSessionId,
44
+ conversationUrl: bridged.conversationUrl ?? input.targetUrl,
45
+ executionPreferenceVerified: false,
46
+ };
47
+ } catch (error) {
48
+ const message = error instanceof Error ? error.message : String(error);
49
+ const code = error instanceof Error && error.message.includes(':')
50
+ ? error.message.split(':', 1)[0]
51
+ : 'CHATGPT_BRIDGE_DISPATCH_FAILED';
52
+ return {
53
+ status: classifyChatgptProviderFailure(code, message),
54
+ provider: 'chatgpt-bridge',
55
+ browserSessionId: input.browserSessionId,
56
+ conversationUrl: input.targetUrl,
57
+ executionPreferenceVerified: false,
58
+ error: { code, message },
59
+ };
60
+ }
61
+ },
62
+ };
63
+ }