@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
@@ -1,10 +1,9 @@
1
1
  import { randomUUID } from 'crypto';
2
- import { spawn, spawnSync, type SpawnSyncReturns } from 'child_process';
3
- import { closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, writeFileSync } from 'fs';
4
- import { homedir } from 'os';
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'fs';
5
3
  import { setTimeout as sleep } from 'timers/promises';
6
4
  import { dirname, join, resolve } from 'path';
7
5
  import { resolveControllerHome } from '../../cli/repositories/controller-home';
6
+ import { createPlatformServiceManagerHost, probeSystemdUserAvailable, type PlatformServiceManagerHost, type PlatformServiceManagerKind, type SystemdUserUnitInput } from '../platform/service-manager';
8
7
  import { RUNTIME_WRITE_CLAIM_ENV } from './write-fence';
9
8
  import {
10
9
  activeRuntimeEntrypoint,
@@ -18,16 +17,10 @@ import {
18
17
  } from './service';
19
18
  import { materializePackageRuntimeRelease, type PackageRuntimeRelease } from './package-runtime-release';
20
19
  import { readRuntimeReleaseAuthority, revertInitialRuntimeReleasePublication, rollbackRuntimeRelease } from './release-store';
21
- import { loadMcpServiceLocalConfig } from '../../cli/mcp/auth';
20
+ import { loadMcpServiceLocalConfig } from '../../../adapters/mcp/auth';
22
21
  import { ensurePackageConnectorService, type PackageConnectorServiceResult } from './package-connector-service';
23
- import {
24
- bootstrapLaunchAgentWithRetryV2,
25
- currentUserLaunchdDomain,
26
- installLaunchAgent,
27
- launchAgentPath,
28
- } from '../../cli/controller/launch-agents';
29
22
 
30
- export type PackageRuntimeServiceMode = 'launchd' | 'systemd-user' | 'portable';
23
+ export type PackageRuntimeServiceMode = PlatformServiceManagerKind;
31
24
 
32
25
  export type PackageRuntimeActivationStatus = 'activation_scheduled' | 'activated' | 'failed+rollback';
33
26
 
@@ -124,45 +117,17 @@ function atomicWrite(path: string, content: string, mode = 0o600): void {
124
117
  renameSync(temporary, path);
125
118
  }
126
119
 
127
- function systemdEscape(value: string): string {
128
- return `"${value.replaceAll('%', '%%').replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
129
- }
130
-
131
120
  export function renderForgeRuntimeSystemdUserUnit(input: {
132
121
  description?: string;
133
122
  executable: string;
134
123
  args: string[];
135
124
  environment: Record<string, string>;
136
125
  }): string {
137
- const environment = Object.entries(input.environment)
138
- .sort(([left], [right]) => left.localeCompare(right))
139
- .map(([key, value]) => `Environment=${systemdEscape(`${key}=${value}`)}`)
140
- .join('\n');
141
- return [
142
- '[Unit]',
143
- `Description=${input.description ?? 'Forge Runtime'}`,
144
- 'After=network-online.target',
145
- '',
146
- '[Service]',
147
- 'Type=simple',
148
- `ExecStart=${[input.executable, ...input.args].map(systemdEscape).join(' ')}`,
149
- ...(environment ? [environment] : []),
150
- 'Restart=on-failure',
151
- 'RestartSec=5',
152
- '',
153
- '[Install]',
154
- 'WantedBy=default.target',
155
- '',
156
- ].join('\n');
157
- }
158
-
159
- function commandSucceeded(command: string, args: string[], env: NodeJS.ProcessEnv): SpawnSyncReturns<string> {
160
- return spawnSync(command, args, { encoding: 'utf8', env, timeout: 30_000 });
126
+ return createPlatformServiceManagerHost({ platform: 'linux', systemdUserAvailable: true }).renderSystemdUserUnit({ ...input, description: input.description ?? 'Forge Runtime' });
161
127
  }
162
128
 
163
129
  export function systemdUserAvailable(env: NodeJS.ProcessEnv = process.env): boolean {
164
- const result = commandSucceeded('systemctl', ['--user', 'show-environment'], env);
165
- return result.status === 0;
130
+ return probeSystemdUserAvailable(env);
166
131
  }
167
132
 
168
133
  function cleanRuntimeInstallerEnvironment(env: NodeJS.ProcessEnv, releaseEnvironment: Record<string, string>): NodeJS.ProcessEnv {
@@ -176,43 +141,56 @@ function cleanRuntimeInstallerEnvironment(env: NodeJS.ProcessEnv, releaseEnviron
176
141
  return { ...next, ...releaseEnvironment };
177
142
  }
178
143
 
179
- function installSystemdUserService(controllerHome: string, env: NodeJS.ProcessEnv): string {
144
+ export function systemdRuntimeInstallCommands(unitName: string): string[][] {
145
+ return createPlatformServiceManagerHost({ platform: 'linux', systemdUserAvailable: true }).systemdUserInstallCommands(unitName);
146
+ }
147
+
148
+ export function packageRuntimeSystemdUserUnitInput(controllerHome: string): SystemdUserUnitInput {
180
149
  const entrypoint = activeRuntimeEntrypoint(controllerHome);
181
150
  const launch = activeRuntimeLaunchSpec(controllerHome);
182
151
  if (!entrypoint || !launch) throw new Error('FORGE_PACKAGE_RUNTIME_LAUNCH_SPEC_MISSING');
183
- const label = forgeRuntimeServicePaths(controllerHome).label;
184
- const unitName = `${label}.service`;
185
- const unitPath = join(env.HOME ?? homedir(), '.config', 'systemd', 'user', unitName);
186
- atomicWrite(unitPath, renderForgeRuntimeSystemdUserUnit({ executable: entrypoint, args: launch.args, environment: launch.environment }), 0o644);
187
- for (const args of [['--user', 'daemon-reload'], ['--user', 'enable', '--now', unitName]]) {
188
- const result = commandSucceeded('systemctl', args, env);
189
- if (result.status !== 0) throw new Error(`FORGE_RUNTIME_SYSTEMD_INSTALL_FAILED: systemctl ${args.join(' ')}: ${(result.stderr || result.stdout || '').trim()}`);
190
- }
191
- return unitPath;
152
+ return { description: 'Forge Runtime', executable: entrypoint, args: launch.args, environment: launch.environment };
192
153
  }
193
154
 
194
- function startPortableRuntime(controllerHome: string, env: NodeJS.ProcessEnv): number {
155
+ export function renderPackageRuntimeSystemdUserService(controllerHome: string): string {
156
+ return createPlatformServiceManagerHost({ platform: 'linux', systemdUserAvailable: true }).renderSystemdUserUnit(packageRuntimeSystemdUserUnitInput(controllerHome));
157
+ }
158
+
159
+ export function writePackageRuntimeSystemdUserService(
160
+ controllerHome: string,
161
+ env: NodeJS.ProcessEnv = process.env,
162
+ ): string {
163
+ return createPlatformServiceManagerHost({ platform: 'linux', env, systemdUserAvailable: true }).writeSystemdUserUnit(
164
+ forgeRuntimeServicePaths(controllerHome).label,
165
+ packageRuntimeSystemdUserUnitInput(controllerHome),
166
+ env,
167
+ );
168
+ }
169
+
170
+ function installSystemdUserService(controllerHome: string, env: NodeJS.ProcessEnv, host: PlatformServiceManagerHost): string {
171
+ return host.installSystemdUserUnit({
172
+ unitName: forgeRuntimeServicePaths(controllerHome).label,
173
+ unit: packageRuntimeSystemdUserUnitInput(controllerHome),
174
+ env,
175
+ errorPrefix: 'FORGE_RUNTIME_SYSTEMD_INSTALL_FAILED',
176
+ });
177
+ }
178
+
179
+ function startPortableRuntime(controllerHome: string, env: NodeJS.ProcessEnv, host: PlatformServiceManagerHost): number {
195
180
  const entrypoint = activeRuntimeEntrypoint(controllerHome);
196
181
  const launch = activeRuntimeLaunchSpec(controllerHome);
197
182
  if (!entrypoint || !launch) throw new Error('FORGE_PACKAGE_RUNTIME_LAUNCH_SPEC_MISSING');
198
183
  const paths = forgeRuntimeServicePaths(controllerHome);
199
- mkdirSync(join(paths.serviceRoot, 'logs'), { recursive: true, mode: 0o700 });
200
- const stdout = openSync(paths.stdoutPath, 'a', 0o600);
201
- const stderr = openSync(paths.stderrPath, 'a', 0o600);
202
- try {
203
- const child = spawn(entrypoint, launch.args, {
204
- detached: true,
205
- stdio: ['ignore', stdout, stderr],
206
- env: cleanRuntimeInstallerEnvironment(env, launch.environment),
207
- });
208
- if (!child.pid) throw new Error('FORGE_PORTABLE_RUNTIME_START_FAILED: child pid unavailable');
209
- child.unref();
210
- atomicWrite(join(paths.serviceRoot, 'portable.json'), `${JSON.stringify({ schemaVersion: 1, pid: child.pid, startedAt: new Date().toISOString() }, null, 2)}\n`);
211
- return child.pid;
212
- } finally {
213
- closeSync(stdout);
214
- closeSync(stderr);
215
- }
184
+ const pid = host.startDetached({
185
+ executable: entrypoint,
186
+ args: launch.args,
187
+ environment: cleanRuntimeInstallerEnvironment(env, launch.environment),
188
+ stdoutPath: paths.stdoutPath,
189
+ stderrPath: paths.stderrPath,
190
+ errorCode: 'FORGE_PORTABLE_RUNTIME_START_FAILED',
191
+ });
192
+ atomicWrite(join(paths.serviceRoot, 'portable.json'), `${JSON.stringify({ schemaVersion: 1, pid, startedAt: new Date().toISOString() }, null, 2)}\n`);
193
+ return pid;
216
194
  }
217
195
 
218
196
 
@@ -320,9 +298,10 @@ export function renderPackageRuntimeActivationLaunchAgent(request: PackageRuntim
320
298
 
321
299
  async function scheduleDarwinPackageRuntimeActivation(request: PackageRuntimeActivationRequest): Promise<{ label: string; servicePath: string }> {
322
300
  if (process.platform !== 'darwin') throw new Error('FORGE_PACKAGE_RUNTIME_ACTIVATION_HELPER_PLATFORM_UNSUPPORTED');
301
+ const host = createPlatformServiceManagerHost({ platform: 'darwin' });
323
302
  atomicWrite(request.helperSourcePlistPath, renderPackageRuntimeActivationLaunchAgent(request), 0o600);
324
- installLaunchAgent(request.helperSourcePlistPath, request.helperLabel);
325
- const result = await bootstrapLaunchAgentWithRetryV2({ label: request.helperLabel, plistPath: request.helperInstalledPlistPath });
303
+ host.installLaunchd(request.helperSourcePlistPath, request.helperLabel);
304
+ const result = await host.bootstrapLaunchd({ label: request.helperLabel, plistPath: request.helperInstalledPlistPath });
326
305
  if (!result.ok) throw new Error(`FORGE_PACKAGE_RUNTIME_ACTIVATION_HELPER_BOOTSTRAP_FAILED: ${result.diagnostics.join('; ')}`);
327
306
  return { label: request.helperLabel, servicePath: request.helperInstalledPlistPath };
328
307
  }
@@ -345,13 +324,7 @@ async function waitForInstallerExit(pid: number): Promise<void> {
345
324
  async function cleanupActivationHelper(request: PackageRuntimeActivationRequest): Promise<void> {
346
325
  rmSync(request.helperSourcePlistPath, { force: true });
347
326
  rmSync(request.helperInstalledPlistPath, { force: true });
348
- if (process.platform !== 'darwin') return;
349
- const child = spawn('/bin/launchctl', ['bootout', `${currentUserLaunchdDomain()}/${request.helperLabel}`], {
350
- detached: true,
351
- stdio: 'ignore',
352
- env: { PATH: '/usr/bin:/bin:/usr/sbin:/sbin' },
353
- });
354
- child.unref();
327
+ createPlatformServiceManagerHost({ platform: process.platform }).detachLaunchdBootout(request.helperLabel);
355
328
  }
356
329
 
357
330
  async function rollbackPackageRuntimeActivation(
@@ -386,9 +359,12 @@ async function rollbackPackageRuntimeActivation(
386
359
  if (request.priorAuthorityPresent && request.priorConfigBytes !== undefined) {
387
360
  try {
388
361
  const priorConfig = readForgeRuntimeServiceConfig(servicePaths.configPath);
362
+ const restoredAuthority = readRuntimeReleaseAuthority(request.controllerHome);
363
+ if (!restoredAuthority) throw new Error('FORGE_PACKAGE_RUNTIME_ROLLBACK_RELEASE_AUTHORITY_MISSING');
364
+ const restoredReleaseRoot = dirname(resolve(restoredAuthority.active.manifestPath));
389
365
  await installDarwinService({
390
366
  config: priorConfig,
391
- runnerPath: join(priorConfig.repositoryRoot, 'bin', 'forge-runtime-service.mjs'),
367
+ runnerPath: join(restoredReleaseRoot, 'package', 'bin', 'forge-runtime-service.mjs'),
392
368
  nodeExecutable: request.nodeExecutable,
393
369
  });
394
370
  } catch (error) {
@@ -492,7 +468,6 @@ export async function installPackageRuntimeService(
492
468
  const config: ForgeRuntimeServiceConfig = {
493
469
  schemaVersion: 1,
494
470
  controllerHome,
495
- repositoryRoot: release.packageRoot,
496
471
  host: options.host ?? '127.0.0.1',
497
472
  port: options.port ?? 8765,
498
473
  authTokenFile: options.authTokenFile,
@@ -502,13 +477,15 @@ export async function installPackageRuntimeService(
502
477
  syncForgeRuntimeActiveEntrypoint(controllerHome);
503
478
  const platform = options.platform ?? process.platform;
504
479
  const env = options.env ?? process.env;
480
+ const serviceHost = createPlatformServiceManagerHost({ platform, env, forcePortable: options.forcePortable });
481
+ const serviceManager = serviceHost.selection;
505
482
  const installDarwinService = dependencies.installDarwinService ?? installForgeRuntimeService;
506
483
  const explicitInjectedInline = Boolean(dependencies.installDarwinService && !dependencies.scheduleDarwinActivation && !dependencies.activationMode);
507
484
  const activationMode = dependencies.activationMode ?? (explicitInjectedInline ? 'inline' : 'detached');
508
485
  const connectorEndpoint = loadMcpServiceLocalConfig(controllerHome)?.chatgpt?.localEndpoint;
509
486
 
510
487
  let base: PackageRuntimeServiceInstallResult;
511
- if (!options.forcePortable && platform === 'darwin' && activationMode === 'detached') {
488
+ if (serviceManager.kind === 'launchd' && activationMode === 'detached') {
512
489
  const paths = activationPaths(controllerHome, operationId);
513
490
  const helperLabel = `com.moretea.forge.runtime-activation.${operationId.replace(/[^A-Za-z0-9.-]+/g, '-').slice(-48)}`;
514
491
  const createdAt = new Date().toISOString();
@@ -530,7 +507,7 @@ export async function installPackageRuntimeService(
530
507
  receiptPath: paths.receiptPath,
531
508
  helperLabel,
532
509
  helperSourcePlistPath: paths.helperSourcePlistPath,
533
- helperInstalledPlistPath: launchAgentPath(helperLabel),
510
+ helperInstalledPlistPath: serviceHost.launchdInstalledPath(helperLabel),
534
511
  createdAt,
535
512
  };
536
513
  writeActivationRequest(request);
@@ -570,14 +547,14 @@ export async function installPackageRuntimeService(
570
547
  };
571
548
  } else {
572
549
  try {
573
- if (!options.forcePortable && platform === 'darwin') {
550
+ if (serviceManager.kind === 'launchd') {
574
551
  const paths = await installDarwinService({ config, runnerPath: join(release.packageRoot, 'bin', 'forge-runtime-service.mjs'), nodeExecutable: process.execPath });
575
552
  base = { status: 'activated', mode: 'launchd', persistent: true, controllerHome, release, servicePath: paths.installedPlistPath, warnings: [] };
576
- } else if (!options.forcePortable && platform === 'linux' && systemdUserAvailable(env)) {
577
- const unitPath = installSystemdUserService(controllerHome, env);
553
+ } else if (serviceManager.kind === 'systemd-user') {
554
+ const unitPath = installSystemdUserService(controllerHome, env, serviceHost);
578
555
  base = { status: 'activated', mode: 'systemd-user', persistent: true, controllerHome, release, servicePath: unitPath, warnings: [] };
579
556
  } else {
580
- const pid = startPortableRuntime(controllerHome, env);
557
+ const pid = startPortableRuntime(controllerHome, env, serviceHost);
581
558
  base = {
582
559
  status: 'activated', mode: 'portable', persistent: false, controllerHome, release, pid,
583
560
  warnings: [platform === 'win32'
@@ -0,0 +1,71 @@
1
+ import { runProcess } from '../../effects/process-runner';
2
+ import { PROCESS_RUNTIME_RELEASE_CANARY_ARG } from '../execution/process-runtime/canary';
3
+ import {
4
+ assertRuntimeReleaseExecutionSurface,
5
+ type RuntimeReleaseExecutionSurface,
6
+ } from './release-manifest';
7
+
8
+ export interface RuntimeReleaseExecutionCanaryCommand {
9
+ name: RuntimeReleaseExecutionSurface['entries'][number]['name'];
10
+ executable: string;
11
+ args: string[];
12
+ }
13
+
14
+ export interface RuntimeReleaseExecutionCanaryDependencies {
15
+ runExecutionEntryCanary?: (input: RuntimeReleaseExecutionCanaryCommand) => {
16
+ ok: boolean;
17
+ stderr?: string;
18
+ stdout?: string;
19
+ error?: string;
20
+ };
21
+ }
22
+
23
+ /**
24
+ * Release execution canaries deliberately do not inherit developer-tool PATH
25
+ * entries. A manifest-owned executable that only works because Homebrew, Bun,
26
+ * nvm, etc. happens to be present is not an immutable Runtime artifact.
27
+ */
28
+ export function runtimeReleaseCanaryEnvironment(
29
+ env: NodeJS.ProcessEnv = process.env,
30
+ platform: NodeJS.Platform = process.platform,
31
+ ): NodeJS.ProcessEnv {
32
+ if (platform === 'win32') {
33
+ const systemRoot = env.SystemRoot ?? env.SYSTEMROOT;
34
+ const systemPath = systemRoot
35
+ ? `${systemRoot}\\System32;${systemRoot};${systemRoot}\\System32\\Wbem`
36
+ : '';
37
+ return { ...env, PATH: systemPath };
38
+ }
39
+ return { ...env, PATH: '/usr/bin:/bin:/usr/sbin:/sbin' };
40
+ }
41
+
42
+ /** Execute the exact manifest-owned Process/Check Runner artifacts in bounded no-op mode. */
43
+ export function assertRuntimeReleaseExecutionCanaries(
44
+ manifestPath: string,
45
+ controllerHome: string,
46
+ dependencies: RuntimeReleaseExecutionCanaryDependencies = {},
47
+ ): RuntimeReleaseExecutionSurface {
48
+ const surface = assertRuntimeReleaseExecutionSurface(manifestPath, controllerHome);
49
+ const runExecutionEntryCanary = dependencies.runExecutionEntryCanary ?? ((request: RuntimeReleaseExecutionCanaryCommand) => runProcess(
50
+ request.executable,
51
+ request.args,
52
+ {
53
+ cwd: surface.releaseRoot,
54
+ env: runtimeReleaseCanaryEnvironment(),
55
+ timeoutMs: 10_000,
56
+ maxOutputBytes: 64 * 1024,
57
+ },
58
+ ));
59
+ for (const entry of surface.entries) {
60
+ const canary: RuntimeReleaseExecutionCanaryCommand = {
61
+ name: entry.name,
62
+ executable: entry.path,
63
+ args: [PROCESS_RUNTIME_RELEASE_CANARY_ARG],
64
+ };
65
+ const result = runExecutionEntryCanary(canary);
66
+ if (!result.ok) {
67
+ throw new Error(`RUNTIME_RELEASE_EXECUTION_CANARY_FAILED: ${canary.name}: ${result.stderr || result.stdout || result.error || 'unknown failure'}`.slice(0, 2_000));
68
+ }
69
+ }
70
+ return surface;
71
+ }
@@ -0,0 +1,68 @@
1
+ import { createHash } from 'crypto';
2
+ import { readFileSync } from 'fs';
3
+ import { dirname, join, resolve } from 'path';
4
+ import { pathToFileURL } from 'url';
5
+
6
+ export const RUNTIME_BUNDLE_ENTRYPOINT = 'forge-runtime-bundle.js' as const;
7
+
8
+ interface RuntimeBundleManifestRecord {
9
+ runtimeBundleEntrypoint?: unknown;
10
+ runtimeBundleArtifactIdentity?: unknown;
11
+ }
12
+
13
+ function releaseManifestPath(argv: readonly string[]): string {
14
+ const index = argv.indexOf('--release-manifest');
15
+ const value = index >= 0 ? argv[index + 1] : undefined;
16
+ if (!value?.trim()) throw new Error('RUNTIME_RELEASE_MANIFEST_ARGUMENT_REQUIRED');
17
+ return resolve(value);
18
+ }
19
+
20
+ export function resolveCompiledRuntimeBundle(argv: readonly string[] = process.argv): {
21
+ manifestPath: string;
22
+ bundlePath: string;
23
+ artifactIdentity: string;
24
+ } {
25
+ const manifestPath = releaseManifestPath(argv);
26
+ let manifest: RuntimeBundleManifestRecord;
27
+ try {
28
+ manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as RuntimeBundleManifestRecord;
29
+ } catch (error) {
30
+ throw new Error(`RUNTIME_RELEASE_LOADER_MANIFEST_INVALID: ${error instanceof Error ? error.message : String(error)}`);
31
+ }
32
+ if (manifest.runtimeBundleEntrypoint !== RUNTIME_BUNDLE_ENTRYPOINT) {
33
+ throw new Error(`RUNTIME_RELEASE_BUNDLE_ENTRYPOINT_INVALID: expected ${RUNTIME_BUNDLE_ENTRYPOINT}`);
34
+ }
35
+ const artifactIdentity = typeof manifest.runtimeBundleArtifactIdentity === 'string'
36
+ ? manifest.runtimeBundleArtifactIdentity.trim().toLowerCase()
37
+ : '';
38
+ if (!/^sha256:[a-f0-9]{64}$/.test(artifactIdentity)) {
39
+ throw new Error('RUNTIME_RELEASE_BUNDLE_IDENTITY_INVALID');
40
+ }
41
+ const bundlePath = join(dirname(manifestPath), RUNTIME_BUNDLE_ENTRYPOINT);
42
+ let actualIdentity: string;
43
+ try {
44
+ actualIdentity = `sha256:${createHash('sha256').update(readFileSync(bundlePath)).digest('hex')}`;
45
+ } catch (error) {
46
+ throw new Error(`RUNTIME_RELEASE_BUNDLE_READ_FAILED: ${error instanceof Error ? error.message : String(error)}`);
47
+ }
48
+ if (actualIdentity !== artifactIdentity) {
49
+ throw new Error('RUNTIME_RELEASE_BUNDLE_ARTIFACT_IDENTITY_MISMATCH');
50
+ }
51
+ return { manifestPath, bundlePath, artifactIdentity };
52
+ }
53
+
54
+ export async function runCompiledRuntimeLoader(argv: string[] = process.argv): Promise<void> {
55
+ const bundle = resolveCompiledRuntimeBundle(argv);
56
+ const loaded = await import(pathToFileURL(bundle.bundlePath).href) as { runCanonicalRuntimeCli?: (argv?: string[]) => Promise<void> };
57
+ if (typeof loaded.runCanonicalRuntimeCli !== 'function') {
58
+ throw new Error('RUNTIME_RELEASE_BUNDLE_ENTRY_EXPORT_MISSING');
59
+ }
60
+ await loaded.runCanonicalRuntimeCli(argv);
61
+ }
62
+
63
+ if (import.meta.main) {
64
+ runCompiledRuntimeLoader().catch((error) => {
65
+ console.error(error instanceof Error ? error.message : String(error));
66
+ process.exitCode = 1;
67
+ });
68
+ }
@@ -1,5 +1,6 @@
1
- import { existsSync, readFileSync, realpathSync } from 'fs';
2
- import { resolve } from 'path';
1
+ import { createHash } from 'crypto';
2
+ import { existsSync, lstatSync, readFileSync, realpathSync } from 'fs';
3
+ import { dirname, join, resolve } from 'path';
3
4
  import { CONTROL_PLANE_SCHEMA_VERSION } from '../control-plane/persistence/sqlite-store';
4
5
  import type { RuntimeReleaseManifest } from './types';
5
6
 
@@ -50,11 +51,15 @@ function optionalRuntimeComponent<
50
51
  }
51
52
 
52
53
  export const COMPILED_RUNTIME_RELEASE_COMPONENT_FIELDS = [
54
+ 'executionMode',
55
+ 'runtimeBundleEntrypoint', 'runtimeBundleArtifactIdentity',
53
56
  'diagnosticEntrypoint', 'diagnosticArtifactIdentity',
54
57
  'browserNodeBridgeEntrypoint', 'browserNodeBridgeArtifactIdentity',
55
58
  'browserHandoffEntrypoint', 'browserHandoffArtifactIdentity',
56
59
  'processRunnerEntrypoint', 'processRunnerArtifactIdentity',
57
60
  'checkRunnerEntrypoint', 'checkRunnerArtifactIdentity',
61
+ 'schedulerWorkerEntrypoint', 'schedulerWorkerArtifactIdentity',
62
+ 'periodicCleanupEntrypoint', 'periodicCleanupArtifactIdentity',
58
63
  'pluginActionSidecarEntrypoint', 'pluginActionSidecarArtifactIdentity',
59
64
  'externalPluginProbeEntrypoint', 'externalPluginProbeArtifactIdentity',
60
65
  'codeGraphNodeEntrypoint', 'codeGraphNodeArtifactIdentity',
@@ -103,6 +108,18 @@ export function loadRuntimeReleaseManifest(
103
108
  if (entrypoint !== 'forge-runtime') {
104
109
  throw new Error(`RELEASE_MANIFEST_INVALID: entrypoint must be forge-runtime, got ${entrypoint}`);
105
110
  }
111
+ const executionMode = value.executionMode === undefined
112
+ ? undefined
113
+ : requireString(value.executionMode, 'executionMode');
114
+ if (executionMode !== undefined && executionMode !== 'standalone-binary') {
115
+ throw new Error(`RELEASE_MANIFEST_INVALID: executionMode must be standalone-binary, got ${executionMode}`);
116
+ }
117
+ const runtimeBundle = optionalRuntimeComponent({
118
+ value,
119
+ entryField: 'runtimeBundleEntrypoint',
120
+ identityField: 'runtimeBundleArtifactIdentity',
121
+ canonicalEntry: 'forge-runtime-bundle.js',
122
+ });
106
123
  if (value.configurationSchemaVersion !== 1) {
107
124
  throw new Error('RELEASE_MANIFEST_INVALID: configurationSchemaVersion must be 1');
108
125
  }
@@ -151,6 +168,18 @@ export function loadRuntimeReleaseManifest(
151
168
  identityField: 'checkRunnerArtifactIdentity',
152
169
  canonicalEntry: 'forge-check-runner',
153
170
  });
171
+ const schedulerWorker = optionalRuntimeComponent({
172
+ value,
173
+ entryField: 'schedulerWorkerEntrypoint',
174
+ identityField: 'schedulerWorkerArtifactIdentity',
175
+ canonicalEntry: 'forge-scheduler-worker',
176
+ });
177
+ const periodicCleanup = optionalRuntimeComponent({
178
+ value,
179
+ entryField: 'periodicCleanupEntrypoint',
180
+ identityField: 'periodicCleanupArtifactIdentity',
181
+ canonicalEntry: 'forge-periodic-cleanup',
182
+ });
154
183
  const pluginActionSidecar = optionalRuntimeComponent({
155
184
  value,
156
185
  entryField: 'pluginActionSidecarEntrypoint',
@@ -249,11 +278,15 @@ export function loadRuntimeReleaseManifest(
249
278
  releaseId: requireString(value.releaseId, 'releaseId'),
250
279
  artifactIdentity: requireString(value.artifactIdentity, 'artifactIdentity'),
251
280
  entrypoint: 'forge-runtime',
281
+ ...(executionMode ? { executionMode: 'standalone-binary' as const } : {}),
282
+ ...(runtimeBundle ?? {}),
252
283
  ...(diagnostic ?? {}),
253
284
  ...(browserNodeBridge ?? {}),
254
285
  ...(browserHandoff ?? {}),
255
286
  ...(processRunner ?? {}),
256
287
  ...(checkRunner ?? {}),
288
+ ...(schedulerWorker ?? {}),
289
+ ...(periodicCleanup ?? {}),
257
290
  ...(pluginActionSidecar ?? {}),
258
291
  ...(externalPluginProbe ?? {}),
259
292
  ...(browserAutomationHelper ?? {}),
@@ -265,9 +298,80 @@ export function loadRuntimeReleaseManifest(
265
298
  controllerHome,
266
299
  databaseSchemaCompatibility: { minimum, maximum },
267
300
  workerProtocolVersion,
301
+ ...(typeof value.sourceRepositoryId === 'string' && value.sourceRepositoryId.trim() ? { sourceRepositoryId: value.sourceRepositoryId.trim() } : {}),
268
302
  ...(typeof value.sourceCommit === 'string' && value.sourceCommit.trim() ? { sourceCommit: value.sourceCommit.trim() } : {}),
269
303
  ...(typeof value.releaseRevision === 'string' && value.releaseRevision.trim() ? { releaseRevision: value.releaseRevision.trim() } : {}),
270
304
  ...(typeof value.cleanWorkspace === 'boolean' ? { cleanWorkspace: value.cleanWorkspace } : {}),
271
305
  createdAt,
272
306
  };
273
307
  }
308
+
309
+ export interface RuntimeReleaseExecutionSurface {
310
+ manifest: RuntimeReleaseManifest;
311
+ releaseRoot: string;
312
+ entries: Array<{
313
+ name: 'process_runner' | 'check_runner' | 'scheduler_worker' | 'periodic_cleanup';
314
+ path: string;
315
+ artifactIdentity: string;
316
+ }>;
317
+ }
318
+
319
+ /**
320
+ * Validate the manifest-owned minimum Process Runtime execution surface.
321
+ * This is physical artifact evidence only. Release publication, activation,
322
+ * known-good and rollback authority remain owned by their existing lifecycle.
323
+ */
324
+ export function assertRuntimeReleaseExecutionSurface(
325
+ manifestPath: string,
326
+ expectedControllerHome: string,
327
+ ): RuntimeReleaseExecutionSurface {
328
+ const resolvedManifestPath = resolve(manifestPath);
329
+ const manifest = loadRuntimeReleaseManifest(resolvedManifestPath, expectedControllerHome);
330
+ if (!manifest.processRunnerEntrypoint || !manifest.processRunnerArtifactIdentity
331
+ || !manifest.checkRunnerEntrypoint || !manifest.checkRunnerArtifactIdentity) {
332
+ throw new Error('RUNTIME_RELEASE_PROCESS_RUNTIME_SURFACE_INCOMPLETE: process-runner.js and forge-check-runner are required');
333
+ }
334
+ if (manifest.executionMode === 'standalone-binary'
335
+ && (!manifest.schedulerWorkerEntrypoint || !manifest.schedulerWorkerArtifactIdentity
336
+ || !manifest.periodicCleanupEntrypoint || !manifest.periodicCleanupArtifactIdentity)) {
337
+ throw new Error('RUNTIME_RELEASE_SCHEDULER_SURFACE_INCOMPLETE: forge-scheduler-worker and forge-periodic-cleanup are required');
338
+ }
339
+ const releaseRoot = dirname(resolvedManifestPath);
340
+ const entries: RuntimeReleaseExecutionSurface['entries'] = [
341
+ {
342
+ name: 'process_runner',
343
+ path: join(releaseRoot, manifest.processRunnerEntrypoint),
344
+ artifactIdentity: manifest.processRunnerArtifactIdentity,
345
+ },
346
+ {
347
+ name: 'check_runner',
348
+ path: join(releaseRoot, manifest.checkRunnerEntrypoint),
349
+ artifactIdentity: manifest.checkRunnerArtifactIdentity,
350
+ },
351
+ ...(manifest.schedulerWorkerEntrypoint && manifest.schedulerWorkerArtifactIdentity ? [{
352
+ name: 'scheduler_worker' as const,
353
+ path: join(releaseRoot, manifest.schedulerWorkerEntrypoint),
354
+ artifactIdentity: manifest.schedulerWorkerArtifactIdentity,
355
+ }] : []),
356
+ ...(manifest.periodicCleanupEntrypoint && manifest.periodicCleanupArtifactIdentity ? [{
357
+ name: 'periodic_cleanup' as const,
358
+ path: join(releaseRoot, manifest.periodicCleanupEntrypoint),
359
+ artifactIdentity: manifest.periodicCleanupArtifactIdentity,
360
+ }] : []),
361
+ ];
362
+ for (const entry of entries) {
363
+ if (!existsSync(entry.path)) throw new Error(`RUNTIME_RELEASE_EXECUTION_ENTRY_MISSING: ${entry.name}: ${entry.path}`);
364
+ const status = lstatSync(entry.path);
365
+ if (status.isSymbolicLink() || !status.isFile()) {
366
+ throw new Error(`RUNTIME_RELEASE_EXECUTION_ENTRY_NOT_REGULAR: ${entry.name}: ${entry.path}`);
367
+ }
368
+ if ((status.mode & 0o111) === 0) {
369
+ throw new Error(`RUNTIME_RELEASE_EXECUTION_ENTRY_NOT_EXECUTABLE: ${entry.name}: ${entry.path}`);
370
+ }
371
+ const observed = `sha256:${createHash('sha256').update(readFileSync(entry.path)).digest('hex')}`;
372
+ if (observed !== entry.artifactIdentity) {
373
+ throw new Error(`RUNTIME_RELEASE_EXECUTION_ENTRY_IDENTITY_MISMATCH: ${entry.name}: expected ${entry.artifactIdentity} observed ${observed}`);
374
+ }
375
+ }
376
+ return { manifest, releaseRoot, entries };
377
+ }