@moretea-labs/forge 1.7.2 → 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 +26 -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 -1613
  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 +369 -99
  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 +219 -22
  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 -6655
  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 +85 -18
  609. package/src/runtime/root/package-runtime-service.ts +60 -97
  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
@@ -30,6 +30,7 @@ import {
30
30
  import { dirname, join } from 'path';
31
31
  import { fileURLToPath } from 'url';
32
32
  import { capProcessOutput } from '../../../effects/process-runner';
33
+ import { getRepository, selectRepositoryCheckout } from '../../../cli/repositories/registry';
33
34
  import { redactSensitiveText, sanitizeSensitiveTextFileInPlace } from '../../evidence/sensitive-output';
34
35
  import { isProcessAlive, terminateProcessTree } from '../../shared/process-tree';
35
36
  import { repositoryChildProcessEnvironment, resolveBunExecutable } from '../../shared/process-environment';
@@ -54,6 +55,13 @@ import {
54
55
  updateProcessRecord,
55
56
  } from './store';
56
57
  import { assertExecutionIdentity } from '../../control-plane/execution/execution-identity';
58
+ import { settleWorkHandleExpectedHeadAfterRepositoryCommand } from '../../control-plane/execution/work-head-settlement';
59
+ import {
60
+ clearWorkExecutionConcurrencyWaitForAttempt,
61
+ evaluateManagedProcessWorkCompatibility,
62
+ executionConcurrencyWaitProjection,
63
+ recordWorkExecutionConcurrencyWait,
64
+ } from '../../control-plane/concurrency/work-execution-concurrency';
57
65
  import {
58
66
  DEFAULT_INTERACTIVE_WAIT_MS,
59
67
  DEFAULT_MAX_OUTPUT_BYTES,
@@ -487,7 +495,7 @@ export function releaseProcessLeasesOnce(
487
495
  repoId,
488
496
  processId,
489
497
  expectedRefs,
490
- { visibility: 'ephemeral', notifyScheduler: false, invalidateProjection: false, emitRuntimeEvent: false },
498
+ { visibility: 'ephemeral', notifyScheduler: Boolean(record.workId), invalidateProjection: false, emitRuntimeEvent: false },
491
499
  );
492
500
  } catch (error) {
493
501
  // Exact-set or token mismatch remains pending and retryable. Failed cleanup
@@ -587,6 +595,38 @@ export function completeProcessFromEvidence(
587
595
  const afterTerminal = completion.record ?? getProcessRecord(controllerHome, repoId, processId);
588
596
  if (afterTerminal && (completion.ok || completion.reason === 'already_terminal' || afterTerminal.terminalWritten === true)) {
589
597
  const released = releaseProcessLeasesOnce(controllerHome, repoId, processId) ?? afterTerminal;
598
+ // Successful repository mutation settlement is deliberately downstream of
599
+ // durable terminal persistence. Recovery may repeat this block, but the
600
+ // WorkHandle CAS plus immutable expectedHead makes reconciliation idempotent.
601
+ if (
602
+ released.status === 'succeeded'
603
+ && released.exitCode === 0
604
+ && released.cancelled !== true
605
+ && released.timedOut !== true
606
+ && released.workId
607
+ && released.executionIdentity
608
+ ) {
609
+ try {
610
+ const repository = selectRepositoryCheckout(
611
+ getRepository(released.executionIdentity.repositoryId, controllerHome),
612
+ released.executionIdentity.checkoutId,
613
+ { allowArchived: released.executionIdentity.allowArchived },
614
+ );
615
+ settleWorkHandleExpectedHeadAfterRepositoryCommand({
616
+ controllerHome,
617
+ repository,
618
+ executionIdentity: released.executionIdentity,
619
+ workId: released.workId,
620
+ ok: true,
621
+ cancelled: false,
622
+ timedOut: false,
623
+ });
624
+ } catch {
625
+ // Terminal Process evidence remains valid even when its exact historical
626
+ // checkout is no longer selectable. Never infer authority from active
627
+ // checkout/session state; Work finalization will continue to fail closed.
628
+ }
629
+ }
590
630
  cleanupTerminalRunnerReceipts(released);
591
631
  return released;
592
632
  }
@@ -737,16 +777,14 @@ export function resolveProcessRunnerRuntime(
737
777
  return resolveBunExecutable(execPath, env);
738
778
  }
739
779
 
740
- function runnerInvocation(entry: string, descriptorPath: string): { command: string; args: string[] } {
780
+ export function resolveProcessRunnerInvocation(entry: string, descriptorPath: string): { command: string; args: string[] } {
741
781
  const scriptEntry = /\.(?:[cm]?js|tsx?)$/i.test(entry);
742
782
  let standalone = !scriptEntry && process.env.FORGE_RUNTIME_EXECUTION === 'standalone-binary';
743
- if (!scriptEntry && !standalone) {
744
- try {
745
- const manifest = JSON.parse(readFileSync(join(dirname(entry), 'manifest.json'), 'utf8')) as { executionMode?: unknown };
746
- standalone = manifest.executionMode === 'standalone-binary';
747
- } catch {
748
- /* source and legacy script releases have no execution manifest */
749
- }
783
+ try {
784
+ const manifest = JSON.parse(readFileSync(join(dirname(entry), 'manifest.json'), 'utf8')) as { executionMode?: unknown };
785
+ if (manifest.executionMode === 'standalone-binary') standalone = true;
786
+ } catch {
787
+ /* source and legacy script releases have no execution manifest */
750
788
  }
751
789
  const args = ['--descriptor', descriptorPath];
752
790
  return standalone
@@ -1043,6 +1081,7 @@ function recordToHandle(
1043
1081
  : completed ? safeProcessText(safeRecord.stderrTail || persistedStderr || '') : undefined,
1044
1082
  stdoutTail: safeRecord.stdoutTail ? safeProcessText(safeRecord.stdoutTail) : undefined,
1045
1083
  stderrTail: safeRecord.stderrTail ? safeProcessText(safeRecord.stderrTail) : undefined,
1084
+ concurrencyWait: safeRecord.concurrencyWait,
1046
1085
  durableSideEffects: {
1047
1086
  executionJobCount: 0,
1048
1087
  localJobCount: 0,
@@ -1061,7 +1100,7 @@ function spawnProcessRunner(descriptor: ProcessCommandDescriptor, descriptorPath
1061
1100
  writeFileSync(descriptorPath, `${JSON.stringify(descriptor, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
1062
1101
  const entry = resolveProcessRunnerEntryPath();
1063
1102
  const useProcessGroup = process.platform !== 'win32';
1064
- const invocation = runnerInvocation(entry, descriptorPath);
1103
+ const invocation = resolveProcessRunnerInvocation(entry, descriptorPath);
1065
1104
  // Detached so Controller crash does not kill the runner.
1066
1105
  return spawn(invocation.command, invocation.args, {
1067
1106
  cwd: descriptor.command.cwd,
@@ -1186,6 +1225,7 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1186
1225
  repoId: input.repoId,
1187
1226
  checkoutId: input.checkoutId,
1188
1227
  workId: input.workId,
1228
+ executionIdentity: input.executionIdentity,
1189
1229
  commandId: input.commandId?.trim() || processId,
1190
1230
  requestFingerprint: requestId ? commandFingerprint : undefined,
1191
1231
  checkExecution: input.checkExecution,
@@ -1253,6 +1293,61 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1253
1293
  return recordToHandle(completed!, { completed: true });
1254
1294
  }
1255
1295
 
1296
+ const leaseWaitMs = Math.max(
1297
+ 0,
1298
+ Math.min(Math.trunc(input.leaseWaitMs ?? 0), 30_000),
1299
+ );
1300
+ let compatibility = evaluateManagedProcessWorkCompatibility({
1301
+ controllerHome: input.controllerHome,
1302
+ repoId: input.repoId,
1303
+ processId,
1304
+ workId: input.workId,
1305
+ resourceClaims,
1306
+ checkExecution: input.checkExecution,
1307
+ origin: input.origin,
1308
+ });
1309
+ if (!compatibility.compatible && !compatibility.hardBlocked && leaseWaitMs > 0) {
1310
+ const semanticDeadline = Date.now() + leaseWaitMs;
1311
+ while (!compatibility.compatible && !compatibility.hardBlocked && Date.now() < semanticDeadline) {
1312
+ if (input.signal?.aborted) break;
1313
+ await new Promise((resolvePromise) => setTimeout(resolvePromise, 50));
1314
+ compatibility = evaluateManagedProcessWorkCompatibility({
1315
+ controllerHome: input.controllerHome,
1316
+ repoId: input.repoId,
1317
+ processId,
1318
+ workId: input.workId,
1319
+ resourceClaims,
1320
+ checkExecution: input.checkExecution,
1321
+ origin: input.origin,
1322
+ });
1323
+ }
1324
+ }
1325
+ if (!compatibility.compatible && compatibility.wait) {
1326
+ recordWorkExecutionConcurrencyWait({
1327
+ controllerHome: input.controllerHome,
1328
+ repoId: input.repoId,
1329
+ workId: input.workId,
1330
+ attemptId: processId,
1331
+ wait: compatibility.wait,
1332
+ resourceClaims,
1333
+ leaseRepoId: input.repoId,
1334
+ });
1335
+ updateProcessRecord(input.controllerHome, input.repoId, processId, { concurrencyWait: compatibility.wait });
1336
+ const code = compatibility.hardBlocked ? 'PROCESS_WORK_COMPATIBILITY_INVALID' : 'PROCESS_WORK_COMPATIBILITY_WAIT';
1337
+ completeProcessFromEvidence(input.controllerHome, input.repoId, processId, fenceToken, {
1338
+ status: 'failed',
1339
+ exitCode: 1,
1340
+ errorMessage: `${code}: ${compatibility.wait.blockerCode}`,
1341
+ exitReceiptPath,
1342
+ }, { authority: 'durable_pre_spawn_abandonment' });
1343
+ const blocked = getProcessRecord(input.controllerHome, input.repoId, processId)!;
1344
+ return recordToHandle(blocked, {
1345
+ completed: true,
1346
+ stdout: '',
1347
+ stderr: blocked.error?.message ?? `${code}: ${compatibility.wait.blockerCode}`,
1348
+ });
1349
+ }
1350
+
1256
1351
  // Acquire real execution leases BEFORE spawning the runner. Fail closed on conflict.
1257
1352
  let leaseRefs: ProcessLeaseRef[] = [];
1258
1353
  if (resourceClaims.length > 0) {
@@ -1313,10 +1408,6 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1313
1408
  // Minimal bounded queue behavior: when the caller opts in, wait for
1314
1409
  // conflicting leases to release instead of failing immediately. The Lease
1315
1410
  // store remains the single conflict authority; this loop only polls it.
1316
- const leaseWaitMs = Math.max(
1317
- 0,
1318
- Math.min(Math.trunc(input.leaseWaitMs ?? 0), 30_000),
1319
- );
1320
1411
  if (!acquisition.acquired && leaseWaitMs > 0) {
1321
1412
  const leaseDeadline = Date.now() + leaseWaitMs;
1322
1413
  while (!acquisition.acquired && Date.now() < leaseDeadline) {
@@ -1338,6 +1429,31 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1338
1429
  }
1339
1430
  }
1340
1431
  if (!acquisition.acquired) {
1432
+ const resourceKeys = [...new Set(acquisition.blockers.map((blocker) => blocker.resourceKey))].sort();
1433
+ const blockingWorkId = acquisition.blockers
1434
+ .map((blocker) => blocker.ownerJobId.startsWith('process:')
1435
+ ? getProcessRecord(input.controllerHome, input.repoId, blocker.ownerJobId.slice('process:'.length))?.workId
1436
+ : undefined)
1437
+ .find((value): value is string => Boolean(value));
1438
+ const wait = executionConcurrencyWaitProjection({
1439
+ source: 'resource_lease',
1440
+ blockerCode: 'resource_claim_conflict',
1441
+ disposition: 'wait',
1442
+ blockingWorkId,
1443
+ semanticScopeKeys: [],
1444
+ resourceKeys,
1445
+ wakeTrigger: { kind: 'resource_release', resourceKeys },
1446
+ });
1447
+ recordWorkExecutionConcurrencyWait({
1448
+ controllerHome: input.controllerHome,
1449
+ repoId: input.repoId,
1450
+ workId: input.workId,
1451
+ attemptId: processId,
1452
+ wait,
1453
+ resourceClaims,
1454
+ leaseRepoId: input.repoId,
1455
+ });
1456
+ updateProcessRecord(input.controllerHome, input.repoId, processId, { concurrencyWait: wait });
1341
1457
  const blockers = acquisition.blockers
1342
1458
  .map((b) => `${b.resourceKey}@${b.ownerJobId}`)
1343
1459
  .join(', ');
@@ -1363,7 +1479,8 @@ export async function spawnManagedProcess(input: SpawnManagedProcessInput): Prom
1363
1479
  checkoutId: lease.checkoutId,
1364
1480
  workId: lease.workId,
1365
1481
  }));
1366
- updateProcessRecord(input.controllerHome, input.repoId, processId, { leaseRefs });
1482
+ clearWorkExecutionConcurrencyWaitForAttempt({ controllerHome: input.controllerHome, repoId: input.repoId, workId: input.workId, attemptId: processId });
1483
+ updateProcessRecord(input.controllerHome, input.repoId, processId, { leaseRefs, concurrencyWait: undefined });
1367
1484
  }
1368
1485
 
1369
1486
  const descriptor: ProcessCommandDescriptor = {
@@ -6,6 +6,23 @@
6
6
 
7
7
  import type { ResolvedExecutionIdentity } from '../../control-plane/execution/execution-identity';
8
8
 
9
+ export interface ExecutionConcurrencyWaitProjection {
10
+ schemaVersion: 1;
11
+ source: 'work_compatibility' | 'resource_lease' | 'scheduler_capacity';
12
+ blockerCode: string;
13
+ disposition: 'wait' | 'invalid';
14
+ blockingWorkId?: string;
15
+ semanticScopeKeys: string[];
16
+ resourceKeys: string[];
17
+ wakeTrigger:
18
+ | { kind: 'work_terminal'; workId: string }
19
+ | { kind: 'resource_release'; resourceKeys: string[] }
20
+ | { kind: 'controller_release'; workId: string }
21
+ | { kind: 'scheduler_capacity'; capacityKey: string }
22
+ | { kind: 'work_contract_change'; workId: string };
23
+ observedAt: string;
24
+ }
25
+
9
26
  export type ProcessRuntimeStatus =
10
27
  | 'starting'
11
28
  | 'running'
@@ -171,6 +188,8 @@ export interface ManagedProcessRecord {
171
188
  checkoutId?: string;
172
189
  /** Optional facade WorkContract that owns this command. */
173
190
  workId?: string;
191
+ /** Immutable pre-spawn authority required for post-terminal Work reconciliation. */
192
+ executionIdentity?: ResolvedExecutionIdentity;
174
193
  /** Caller-stable command identity; defaults to processId when omitted. */
175
194
  commandId?: string;
176
195
  /** Fingerprint bound to origin.requestId before spawn. */
@@ -183,6 +202,8 @@ export interface ManagedProcessRecord {
183
202
  command: ProcessCommandSpec;
184
203
  identity?: ProcessIdentityRecord;
185
204
  resourceClaims: ProcessResourceClaim[];
205
+ /** Actionable semantic/resource wait projection; never an execution lease authority. */
206
+ concurrencyWait?: ExecutionConcurrencyWaitProjection;
186
207
  /** Real execution leases acquired before spawn; released exactly once on terminal. */
187
208
  leaseRefs?: ProcessLeaseRef[];
188
209
  /** Durable terminal cleanup phase; pending remains retryable after controller restart. */
@@ -320,6 +341,7 @@ export interface ProcessHandle {
320
341
  stderr?: string;
321
342
  stdoutTail?: string;
322
343
  stderrTail?: string;
344
+ concurrencyWait?: ExecutionConcurrencyWaitProjection;
323
345
  durableSideEffects: {
324
346
  executionJobCount: number;
325
347
  localJobCount: number;
@@ -1,14 +1,14 @@
1
1
  import { bindRepositoryEntities } from '../../../cli/repositories/entity-migration';
2
2
  import { getRepository, repositorySummary, selectRepositoryCheckout } from '../../../cli/repositories/registry';
3
- import { callRepositoryTool } from '../../../cli/mcp/repository-tools';
4
- import { callMcpTool, type CallToolResult, type McpToolContext } from '../../../cli/mcp/tools';
5
- import { runtimePolicy, type MultiRepositoryMcpToolContext } from '../../../cli/mcp/multi-repository';
6
- import { callRuntimeTool } from '../../gateway/mcp/runtime-tools';
3
+ import { callRepositoryTool } from '../../../../adapters/mcp/tool-mapping/repository-tools';
4
+ import { callMcpTool, type CallToolResult, type McpToolContext } from '../../../../adapters/mcp/tool-mapping/tools';
5
+ import { runtimePolicy, type MultiRepositoryMcpToolContext } from '../../../../adapters/mcp/multi-repository';
6
+ import { callRuntimeTool } from '../../../../adapters/mcp/runtime-gateway/runtime-tools';
7
7
  import { ensureRepositoryRuntimeStorage } from '../../../cli/repositories/runtime-storage';
8
8
  import { evaluateReleaseGate } from '../../release/release-gate';
9
9
  import { executeLocalBridgeJobInline, getLocalBridgeJob } from '../../../cli/local-bridge/job-store';
10
10
  import type { LocalBridgeJob } from '../../../cli/local-bridge/types';
11
- import { settleScheduledExecution } from '../../workflow/schedules/settlement';
11
+ import { settleScheduledExecution } from '../../../../packages/kernel/scheduler/api/index';
12
12
  import type { ExecutionJob, ExecutionJobOutcome } from '../jobs/types';
13
13
  import {
14
14
  buildDelegatedExecutionResult,
@@ -30,6 +30,7 @@ import { isAbsolute, relative, resolve, sep } from 'path';
30
30
  import { isAssistantPluginError } from '../../plugins/errors';
31
31
  import { executeWork, validateWork } from '../../control-plane/execution/work-operation-service';
32
32
  import { finalizeWork } from '../../control-plane/execution/work-finalization-service';
33
+ import { describeFailure } from '../../../../packages/protocols/failure';
33
34
 
34
35
 
35
36
  function childReferenceFromLocalJob(
@@ -255,11 +256,6 @@ function toolResultRecord(result: CallToolResult): Record<string, unknown> {
255
256
  return { content: result.content };
256
257
  }
257
258
 
258
- function errorCode(message: string): string {
259
- const index = message.indexOf(':');
260
- return index > 0 ? message.slice(0, index) : 'WORKER_EXECUTION_FAILED';
261
- }
262
-
263
259
  function materializePluginArtifacts(
264
260
  controllerHome: string,
265
261
  job: ExecutionJob,
@@ -637,8 +633,15 @@ export async function executeExecutionJob(controllerHome: string, job: Execution
637
633
  repoRoot: controllerHome,
638
634
  };
639
635
  }
640
- const message = error instanceof Error ? error.message : String(error);
641
- const retryable = /ECONN|EPIPE|temporar|timeout|worker|network/i.test(message);
642
- return { ok: false, error: { code: errorCode(message), message, retryable }, repoRoot: controllerHome };
636
+ const failure = describeFailure(error, { fallbackCode: 'WORKER_EXECUTION_FAILED' });
637
+ return {
638
+ ok: false,
639
+ error: {
640
+ code: failure.code,
641
+ message: failure.message,
642
+ retryable: failure.retryDisposition === 'transient',
643
+ },
644
+ repoRoot: controllerHome,
645
+ };
643
646
  }
644
647
  }
@@ -15,7 +15,7 @@ import {
15
15
  mergeChildReferences,
16
16
  } from '../jobs/child-reference';
17
17
  import { markOperationCompleted, markOperationStarted, operationReceiptMatchesJobOwnership, readOperationReceipt } from '../jobs/receipt-store';
18
- import { markScheduledExecutionRunning } from '../../workflow/schedules/settlement';
18
+ import { markScheduledExecutionRunning } from '../../../../packages/kernel/scheduler/api/index';
19
19
  import { invalidateExecutionWorker } from './ownership';
20
20
  import { markRepositoryProjectionDirty } from '../../projections/invalidation';
21
21
  import { bindInheritedRuntimeWriteClaimFromEnvironment } from '../../root/write-fence';
@@ -1,207 +1,2 @@
1
- import { existsSync, readFileSync } from 'fs';
2
- import type { McpToolDefinition, CallToolResult } from '../../../cli/mcp/tools';
3
- import type { MultiRepositoryMcpToolContext } from '../../../cli/mcp/multi-repository';
4
- import { repositoryGitStatus, repositoryGitDiff } from '../../../cli/repositories/structured-git';
5
- import { listControllerChecks } from '../../../cli/controller/check-runner';
6
- import { buildWorkContinuationSnapshot } from '../../control-plane/facade/work-continuation';
7
- import { currentControllerInstanceId, startExecutionSession, type ExecutionSessionContext } from '../../control-plane/execution/session-store';
8
- import { currentPermissionSnapshotVersion, validateWorkHandle } from '../../control-plane/execution/validation';
9
- import { resolveAuthorizationRequest } from '../../control-plane/governance/authorization';
10
- import { readControllerResult, searchControllerResult } from '../../evidence/result-store';
11
- import { resumeExecutionJobAfterApproval } from '../../execution/jobs/store';
12
- import { recordMcpTiming, type McpTimingTrace } from '../../diagnostics/mcp-timing';
13
- import { compactHandle, contractFor, identityFor, makeBoundedWorkResult, principalFor, requireSession, workForSession } from '../../control-plane/execution/work-execution-support';
14
- import { finalizeWork } from '../../control-plane/execution/work-finalization-service';
15
- import { bindSessionRepository, prepareWork } from '../../control-plane/execution/work-preparation-service';
16
- import { executeWork, validateWork } from '../../control-plane/execution/work-operation-service';
17
-
18
-
19
- // Compatibility exports: implementation authority lives in control-plane execution.
20
- export {
21
- inspectWorkTargetAdvance,
22
- targetAdvanceLinearMergeCommits,
23
- planTargetAdvanceValidationAuthority,
24
- targetAdvanceWorkScopeViolation,
25
- inspectDirectTargetDelivery,
26
- inspectTargetDirtyWorkOwnership,
27
- inspectDirectCanonicalTargetAdvanceReconciliation,
28
- completionReceiptChangedPaths,
29
- inspectCleanupOnlyMergedHead,
30
- resetFinalizationStagesForRequest,
31
- } from '../../control-plane/execution/work-finalization-service';
32
- export { releasePreparedWorkOwnership } from '../../control-plane/execution/work-execution-support';
33
- export { selectDefaultWorkValidationChecks } from '../../control-plane/execution/work-operation-service';
34
- export type {
35
- DirectCanonicalTargetAdvanceInspection,
36
- DirectTargetDeliveryInspection,
37
- TargetAdvanceValidationTransferPlan,
38
- TargetDirtyWorkOwnershipInspection,
39
- WorkTargetAdvanceInspection,
40
- } from '../../control-plane/execution/work-finalization-service';
41
-
42
- function definition(name: string, description: string, properties: Record<string, unknown>, required: string[] = [], readOnlyHint = false, destructiveHint = false): McpToolDefinition {
43
- return { name, description, inputSchema: { type: 'object', properties, ...(required.length ? { required } : {}), additionalProperties: false }, annotations: { readOnlyHint, openWorldHint: false, destructiveHint } };
44
- }
45
-
46
- const sessionId = { type: 'string', description: 'Controller-issued session id returned by session_start. Omit only when the MCP transport binds one.' };
47
- const workId = { type: 'string', description: 'Controller-owned work handle id returned by work_prepare.' };
48
- const repoId = { type: 'string', description: 'Stable repository id. Repository switching must be explicit through session_bind_repository.' };
49
-
50
- export const executionToolDefinitions: McpToolDefinition[] = [
51
- definition('session_start', 'Start or resume a controller-owned MCP execution session. Identity comes from the authenticated/controller-issued transport context.', {}, [], false),
52
- definition('session_bind_repository', 'Explicitly bind the current session to one registered repository and checkout.', { session_id: sessionId, repo_id: repoId, checkout_id: { type: 'string' } }, ['repo_id'], false),
53
- definition('work_prepare', 'Prepare or reuse one controller-owned work handle and bind it to a WorkContract, checkout, branch, and permission snapshot.', {
54
- session_id: sessionId, repo_id: repoId, checkout_id: { type: 'string' }, work_id: workId,
55
- objective: { type: 'string' }, goal_id: { type: 'string' }, acceptance_criteria: { type: 'array', items: { type: 'string' } }, allowed_paths: { type: 'array', items: { type: 'string' } }, checks: { type: 'array', items: { type: 'string' } },
56
- isolation: { type: 'string', enum: ['reuse', 'new_worktree', 'auto'] }, base_ref: { type: 'string' }, needs_dependencies: { type: 'boolean' },
57
- expected_previous_head: { type: 'string', description: 'Explicit prior WorkHandle HEAD required for audited successor adoption of an existing work_id.' },
58
- adopt_candidate_head: { type: 'string', description: 'Explicit current successor commit to adopt after exact identity, ownership, cleanliness, ancestry, and path-scope validation.' },
59
- }, [], false),
60
- definition('work_inspect', 'Collect bounded Git, WorkContract, path, check, and readiness evidence through one work handle.', { session_id: sessionId, repo_id: repoId, work_id: workId, detail: { type: 'string', enum: ['summary', 'detail'] } }, ['work_id'], true),
61
- definition('work_execute', 'Execute approved, repository-scoped commands against a validated work handle while preserving the existing command policy and audit path.', {
62
- session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId,
63
- command: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }] }, approval_token: { type: 'string' }, cwd: { type: 'string' }, timeout_ms: { type: 'number' }, max_output_bytes: { type: 'number' },
64
- commands: { type: 'array', items: { type: 'object' } }, approval_request_id: { type: 'string' },
65
- }, ['work_id'], false),
66
- definition('work_validate', 'Run targeted checks or read-only validation commands against a work handle with full current-state validation.', {
67
- session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId, check_ids: { type: 'array', items: { type: 'string' } }, commands: { type: 'array', items: { type: 'object' } },
68
- }, ['work_id'], false),
69
- definition('work_finalize', 'Idempotently validate, commit, merge, clean a managed worktree, and complete the existing WorkContract in independently recorded stages.', {
70
- session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId, commit: { type: 'boolean' }, message: { type: 'string' }, merge: { type: 'boolean' }, target_branch: { type: 'string' }, remote_write: { type: 'boolean', description: 'When true, push the exact locally integrated target revision to origin before cleanup and Work terminalization.' }, delete_branch: { type: 'boolean' }, cleanup: { type: 'boolean' }, no_ff: { type: 'boolean' }, approval_request_id: { type: 'string' },
71
- completion_outcome: { type: 'string', enum: ['completed_changed', 'completed_no_change'] }, no_change_evidence: { type: 'string', description: 'Objective-specific proof that the requested state already holds; required for completed_no_change.' },
72
- }, ['work_id'], false, true),
73
- definition('approval_resolve', 'Resolve a controller approval request from the current conversation; GUI approval is optional and not required for continuation.', { session_id: sessionId, repo_id: repoId, work_id: workId, approval_request_id: { type: 'string' }, confirm_authorization: { type: 'boolean' } }, ['approval_request_id', 'confirm_authorization'], false),
74
- definition('result_read', 'Read a session-scoped result reference with bounded pagination.', { session_id: sessionId, result_ref: { type: 'string' }, work_id: workId, cursor: { type: 'number' }, limit: { type: 'number' } }, ['result_ref'], true),
75
- definition('result_search', 'Search a session-scoped result reference without returning the full payload.', { session_id: sessionId, result_ref: { type: 'string' }, work_id: workId, query: { type: 'string' }, limit: { type: 'number' } }, ['result_ref', 'query'], true),
76
- ];
77
-
78
- const executionToolNames = new Set(executionToolDefinitions.map((tool) => tool.name));
79
-
80
- /**
81
- * Work mutation tool names remain grouped for compatibility with older Worker
82
- * entrypoints. On the public MCP surface they execute directly through
83
- * WorkContract + Process Runtime ownership rather than durable ExecutionJobs.
84
- */
85
- const DURABLE_WORK_OPERATION_NAMES = new Set([
86
- 'work_execute',
87
- 'work_validate',
88
- 'work_finalize',
89
- ]);
90
-
91
- export function isDurableWorkOperation(name: string): boolean {
92
- return DURABLE_WORK_OPERATION_NAMES.has(name);
93
- }
94
-
95
- function result(value: Record<string, unknown>, isError = false): CallToolResult {
96
- return { content: [{ type: 'text', text: JSON.stringify(value, null, 2) }], structuredContent: value, ...(isError ? { isError: true } : {}) };
97
- }
98
-
99
- function failure(error: unknown): CallToolResult {
100
- const message = error instanceof Error ? error.message : String(error);
101
- const code = message.includes(':') ? message.slice(0, message.indexOf(':')) : 'EXECUTION_TOOL_FAILED';
102
- return result({ error: { code, message } }, true);
103
- }
104
-
105
- function startOrResumeSession(ctx: MultiRepositoryMcpToolContext): ExecutionSessionContext {
106
- const permissionVersion = ctx.explicitRepository ? currentPermissionSnapshotVersion(ctx.controllerHome, ctx.explicitRepository.repoId) : 0;
107
- return startExecutionSession(ctx.controllerHome, {
108
- sessionId: ctx.sessionId,
109
- principalId: principalFor(ctx),
110
- controllerInstanceId: ctx.controllerInstanceId ?? currentControllerInstanceId(),
111
- permissionSnapshotVersion: permissionVersion,
112
- capabilitySnapshotVersion: 1,
113
- });
114
- }
115
-
116
- function inspectWork(ctx: MultiRepositoryMcpToolContext, args: Record<string, unknown>): Record<string, unknown> {
117
- const session = requireSession(ctx, args);
118
- // work_inspect is authorized read-only evidence; it must not require the write lease.
119
- const handle = workForSession(ctx, session, args);
120
- const started = performance.now();
121
- const validationStarted = performance.now();
122
- const validated = validateWorkHandle(ctx.controllerHome, handle, identityFor(ctx, args), 'cheap', 'inspect');
123
- const validationMs = performance.now() - validationStarted;
124
- const status = repositoryGitStatus(validated.worktreeRepository);
125
- const diff = repositoryGitDiff(validated.worktreeRepository, { maxBytes: 64 * 1024 });
126
- const contract = contractFor(ctx, handle);
127
- const checks = contract?.checks ?? [];
128
- const packageManifest = existsSync(`${validated.worktreeRepository.canonicalRoot}/package.json`)
129
- ? JSON.parse(readFileSync(`${validated.worktreeRepository.canonicalRoot}/package.json`, 'utf-8')) as Record<string, unknown>
130
- : undefined;
131
- const value = {
132
- session: { sessionId: session.sessionId, repoId: session.activeRepositoryId, checkoutId: session.activeCheckoutId },
133
- work: compactHandle(handle),
134
- readiness: { valid: true, warnings: validated.warnings, permissionSnapshotVersion: handle.permissionSnapshotVersion },
135
- git: { status, diff: { nameOnly: diff.nameOnly, stat: diff.stat, patch: diff.patch, truncated: diff.truncated } },
136
- workContract: contract ? {
137
- workId: contract.workId,
138
- status: contract.status,
139
- objective: contract.objective,
140
- checks: contract.checks,
141
- acceptanceCriteria: contract.acceptanceCriteria,
142
- allowedPaths: contract.allowedPaths,
143
- semantics: buildWorkContinuationSnapshot(contract).semantics,
144
- } : undefined,
145
- continuation: contract ? buildWorkContinuationSnapshot(contract) : undefined,
146
- paths: { allowed: handle.workContractId ? contract?.allowedPaths ?? [] : [], relevant: diff.nameOnly },
147
- checks: checks.map((checkId) => ({ checkId, registered: listControllerChecks(validated.worktreeRepository.canonicalRoot).some((check) => check.id === checkId) })),
148
- package: packageManifest ? { name: packageManifest.name, scripts: packageManifest.scripts } : undefined,
149
- };
150
- const response = makeBoundedWorkResult(ctx, session, handle.repositoryId, handle.workId, 'inspection', value);
151
- const trace: McpTimingTrace = { tool: 'work_inspect', sessionResolutionMs: 0, repositoryResolutionMs: 0, workHandleValidationMs: Math.round(validationMs * 100) / 100, resultSerializationMs: 0, totalToolDurationMs: Math.round((performance.now() - started) * 100) / 100, sessionId: session.sessionId, repoId: handle.repositoryId, workId: handle.workId };
152
- recordMcpTiming(ctx.controllerHome, trace);
153
- return response;
154
- }
155
-
156
- export async function callExecutionTool(ctx: MultiRepositoryMcpToolContext, name: string, args: Record<string, unknown>): Promise<CallToolResult | undefined> {
157
- if (!executionToolNames.has(name)) return undefined;
158
- try {
159
- switch (name) {
160
- case 'session_start': {
161
- const session = startOrResumeSession(ctx);
162
- return result({ session: { sessionId: session.sessionId, principalId: session.principalId, activeRepositoryId: session.activeRepositoryId, activeCheckoutId: session.activeCheckoutId, activeWorkId: session.activeWorkId, permissionSnapshotVersion: session.permissionSnapshotVersion, capabilitySnapshotVersion: session.capabilitySnapshotVersion, controllerInstanceId: session.controllerInstanceId, createdAt: session.createdAt, updatedAt: session.updatedAt } });
163
- }
164
- case 'session_bind_repository': return result(bindSessionRepository(ctx, args));
165
- case 'work_prepare': return result(prepareWork(ctx, args));
166
- case 'work_inspect': return result(inspectWork(ctx, args));
167
- case 'work_execute': return result(await executeWork(ctx, args));
168
- case 'work_validate': return result(await validateWork(ctx, args));
169
- case 'work_finalize': return result(await finalizeWork(ctx, args));
170
- case 'approval_resolve': {
171
- const session = requireSession(ctx, args);
172
- const repositoryId = typeof args.repo_id === 'string' && args.repo_id.trim() ? args.repo_id.trim() : session.activeRepositoryId;
173
- if (!repositoryId) throw new Error('SESSION_REPOSITORY_REQUIRED: bind a repository before resolving approval');
174
- const resolved = resolveAuthorizationRequest({
175
- controllerHome: ctx.controllerHome,
176
- repositoryId,
177
- approvalRequestId: String(args.approval_request_id ?? ''),
178
- sessionId: session.sessionId,
179
- principalId: session.principalId,
180
- workId: typeof args.work_id === 'string' ? args.work_id : session.activeWorkId,
181
- permissionSnapshotVersion: currentPermissionSnapshotVersion(ctx.controllerHome, repositoryId),
182
- confirm: args.confirm_authorization === true,
183
- });
184
- const resumed = resumeExecutionJobAfterApproval(ctx.controllerHome, repositoryId, resolved.approvalRequestId);
185
- return result({
186
- authorization: { decision: 'allow', source: 'user_confirmation', reason: 'User confirmation was recorded for the exact pending operation.' },
187
- approval: resolved,
188
- resumedJob: resumed ? { jobId: resumed.jobId, status: resumed.status, requestId: resumed.requestId } : undefined,
189
- continuation: resumed
190
- ? `The original durable Job ${resumed.jobId} was resumed with the resolved approval request.`
191
- : `Retry the original operation with approval_request_id=${resolved.approvalRequestId}.`,
192
- });
193
- }
194
- case 'result_read': {
195
- const session = requireSession(ctx, args);
196
- return result(readControllerResult({ controllerHome: ctx.controllerHome, resultRef: String(args.result_ref ?? ''), sessionId: session.sessionId, principalId: session.principalId, workId: typeof args.work_id === 'string' ? args.work_id : undefined, cursor: typeof args.cursor === 'number' ? args.cursor : undefined, limit: typeof args.limit === 'number' ? args.limit : undefined }));
197
- }
198
- case 'result_search': {
199
- const session = requireSession(ctx, args);
200
- return result(searchControllerResult({ controllerHome: ctx.controllerHome, resultRef: String(args.result_ref ?? ''), sessionId: session.sessionId, principalId: session.principalId, workId: typeof args.work_id === 'string' ? args.work_id : undefined, query: String(args.query ?? ''), limit: typeof args.limit === 'number' ? args.limit : undefined }));
201
- }
202
- default: return undefined;
203
- }
204
- } catch (error) {
205
- return failure(error);
206
- }
207
- }
1
+ /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
+ export * from '../../../../adapters/mcp/runtime-gateway/execution-tools';
@@ -1,61 +1,2 @@
1
- /**
2
- * Compatibility translation only: legacy iOS MCP tool names are normalized to
3
- * the canonical typed iOS plugin action surface. This module owns no runtime,
4
- * repository, Work, approval, or plugin execution state.
5
- */
6
- export interface LegacyIosPluginInvocation {
7
- actionId: string;
8
- requestId: string;
9
- arguments: Record<string, unknown>;
10
- confirmAuthorization: boolean;
11
- }
12
-
13
- function definedArguments(value: Record<string, unknown>): Record<string, unknown> {
14
- return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
15
- }
16
-
17
- function optionalString(args: Record<string, unknown>, key: string): string | undefined {
18
- return typeof args[key] === 'string' ? args[key] as string : undefined;
19
- }
20
-
21
- function optionalNumber(args: Record<string, unknown>, key: string): number | undefined {
22
- return typeof args[key] === 'number' ? args[key] as number : undefined;
23
- }
24
-
25
- export function legacyIosPluginInvocation(
26
- legacyTool: string,
27
- args: Record<string, unknown>,
28
- ): LegacyIosPluginInvocation | undefined {
29
- const invocation = (() => {
30
- switch (legacyTool) {
31
- case 'ios_xcode_status':
32
- return { actionId: 'xcode_status', arguments: {} };
33
- case 'ios_simulators_list':
34
- return { actionId: 'list_simulators', arguments: { runtime: optionalString(args, 'runtime'), name: optionalString(args, 'name') } };
35
- case 'ios_project_discover':
36
- return { actionId: 'discover_project', arguments: {} };
37
- case 'ios_schemes_list':
38
- return { actionId: 'list_schemes', arguments: { workspace: optionalString(args, 'workspace'), project: optionalString(args, 'project') } };
39
- case 'ios_simulator_boot':
40
- return { actionId: 'launch_simulator', arguments: { udid: String(args.udid ?? '').trim(), open_simulator: args.open_simulator !== false, timeout_ms: optionalNumber(args, 'timeout_ms') } };
41
- case 'ios_app_build':
42
- return { actionId: 'build', arguments: { scheme: String(args.scheme ?? '').trim(), udid: optionalString(args, 'udid'), simulator_name: optionalString(args, 'simulator_name'), workspace: optionalString(args, 'workspace'), project: optionalString(args, 'project'), configuration: optionalString(args, 'configuration'), timeout_ms: optionalNumber(args, 'timeout_ms') } };
43
- case 'ios_simulator_screenshot':
44
- return { actionId: 'capture_screenshot', arguments: { udid: String(args.udid ?? '').trim(), label: optionalString(args, 'label') } };
45
- case 'ios_ui_smoke_test':
46
- return { actionId: 'smoke_review', arguments: { scheme: optionalString(args, 'scheme'), bundle_id: optionalString(args, 'bundle_id'), udid: optionalString(args, 'udid'), simulator_name: optionalString(args, 'simulator_name'), workspace: optionalString(args, 'workspace'), project: optionalString(args, 'project'), configuration: optionalString(args, 'configuration'), app_path: optionalString(args, 'app_path'), screenshot_label: optionalString(args, 'screenshot_label') } };
47
- default:
48
- return undefined;
49
- }
50
- })();
51
- if (!invocation) return undefined;
52
- const requestId = typeof args.request_id === 'string' && args.request_id.trim()
53
- ? args.request_id.trim()
54
- : `legacy-${legacyTool}-${Date.now()}`;
55
- return {
56
- actionId: invocation.actionId,
57
- requestId,
58
- arguments: definedArguments(invocation.arguments),
59
- confirmAuthorization: args.confirm_authorization === true,
60
- };
61
- }
1
+ /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
+ export * from '../../../../adapters/mcp/runtime-gateway/legacy-ios-tool-adapter';
@@ -1,3 +1,2 @@
1
- // Compatibility import path. Persisted check execution belongs to Process Runtime
2
- // so Scheduler reconciliation can advance validation without depending on Gateway.
3
- export * from '../../execution/process-runtime/persisted-check';
1
+ /** @deprecated Kernel V2 compatibility shim. MCP gateway mapping authority lives in adapters/mcp. */
2
+ export * from '../../../../adapters/mcp/runtime-gateway/persisted-check-process';