@moretea-labs/forge 1.8.0 → 1.8.2

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 (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -18,13 +18,13 @@ export interface ControllerOperationalPlan {
18
18
  reviewRequired: boolean;
19
19
  };
20
20
  validationStrategy: {
21
- source: "task-targeted-validation-policy";
21
+ source: "declared-check-projection";
22
22
  policy: "minimal" | "task-targeted" | "release-gate";
23
23
  checks: string[];
24
24
  reason: string;
25
25
  };
26
26
  recipeSystem: {
27
- source: "controller-recipe-system";
27
+ source: "legacy-recipe-projection";
28
28
  recipes: Array<{
29
29
  id: string;
30
30
  label: string;
@@ -34,7 +34,7 @@ export interface ControllerOperationalPlan {
34
34
  }>;
35
35
  };
36
36
  workerAbstraction: {
37
- source: "worker-routing-abstraction";
37
+ source: "execution-capability-projection";
38
38
  workers: Array<{
39
39
  id: string;
40
40
  role: string;
@@ -107,11 +107,9 @@ export function buildControllerOperationalPlan(repoRoot: string, ledger: TaskLed
107
107
  const dirty = changedFiles.length > 0;
108
108
  const blocked = ledger.status.kind === "blocked" || ledger.status.kind === "needs_retry_decision";
109
109
  const needsAttention = blocked || ledger.status.severity === "action" || ledger.status.severity === "warning" || dirty;
110
- const policy = checks.some((check) => check.includes("release") || check.includes("ci"))
111
- ? "release-gate" as const
112
- : checks.length > 0
113
- ? "task-targeted" as const
114
- : "minimal" as const;
110
+ // Compatibility projection only. Declared checks are facts the model may use;
111
+ // this projection does not choose a validation method or release gate.
112
+ const policy = "minimal" as const;
115
113
 
116
114
  return {
117
115
  schemaVersion: OPERATIONAL_PLAN_SCHEMA_VERSION,
@@ -122,70 +120,45 @@ export function buildControllerOperationalPlan(repoRoot: string, ledger: TaskLed
122
120
  "task-ledger",
123
121
  "context-pack",
124
122
  "diff-projection",
125
- "validation-strategy",
126
- "recipe-system",
127
- "worker-abstraction",
123
+ "declared-check-projection",
124
+ "legacy-recipe-projection",
125
+ "execution-capability-projection",
128
126
  "gui-interaction-model",
129
127
  "mcp-tool-schema-convergence",
130
128
  "controller-home-runtime-storage-policy",
131
129
  "branch-worktree-cleanup-policy",
132
130
  "task-recovery-loop",
133
131
  ],
134
- remainingDecisionPoints: dirty
135
- ? ["Review and commit or discard current diff before dispatching unrelated work."]
136
- : [],
132
+ remainingDecisionPoints: [],
137
133
  diffProjection: {
138
134
  source: "live-git-diff-projection",
139
135
  dirty,
140
136
  changedFiles,
141
137
  diffStat: diffStat.ok ? diffStat.stdout.trim() : diffStat.error || diffStat.stderr.trim(),
142
- reviewRequired: dirty,
138
+ // Legacy field retained for UI ABI only. Dirty state is a fact, not an
139
+ // automatic review lifecycle decision.
140
+ reviewRequired: false,
143
141
  },
144
142
  validationStrategy: {
145
- source: "task-targeted-validation-policy",
143
+ source: "declared-check-projection",
146
144
  policy,
147
145
  checks,
148
- reason: policy === "release-gate"
149
- ? "Release or CI checks are declared by the focused work."
150
- : policy === "task-targeted"
151
- ? "Use checks declared on the focused task or ready queue; do not expand validation scope by default."
152
- : "No task-specific checks were found; keep validation minimal and explicit.",
146
+ reason: checks.length > 0
147
+ ? "These checks are declared context only; the model decides whether, when, and how to validate."
148
+ : "No declared checks were found; Forge does not invent a validation strategy.",
153
149
  },
154
150
  recipeSystem: {
155
- source: "controller-recipe-system",
156
- recipes: [
157
- {
158
- id: "scoped-direct-edit",
159
- label: "Scoped direct edit",
160
- when: "Known files and low/medium-risk bounded changes.",
161
- steps: ["build context pack", "read exact ranges", "apply bounded patch", "review diff projection", "run task-targeted checks"],
162
- requiredEvidence: ["contextPack", "diffProjection", "validationStrategy"],
163
- },
164
- {
165
- id: "isolated-worker-run",
166
- label: "Isolated worker run",
167
- when: "Large, risky, or long-running implementation requiring agent execution.",
168
- steps: ["derive worker scope", "dispatch isolated run", "inspect run diff", "integrate through edit session", "verify exact revision"],
169
- requiredEvidence: ["run", "task diff", "integration session", "checks"],
170
- },
171
- {
172
- id: "recovery-resume",
173
- label: "Fresh-session recovery",
174
- when: "A controller session restarts or loses conversation state.",
175
- steps: ["load task ledger", "read operational plan", "select continuation state", "expand only needed context", "resume or ask for the one missing decision"],
176
- requiredEvidence: ["taskLedger", "operationalPlan", "recoveryArtifacts"],
177
- },
178
- ],
151
+ source: "legacy-recipe-projection",
152
+ recipes: [],
179
153
  },
180
154
  workerAbstraction: {
181
- source: "worker-routing-abstraction",
155
+ source: "execution-capability-projection",
182
156
  workers: [
183
- { id: "direct_edit", role: "transactional patch executor", preferredFor: ["small scoped edits", "known paths"], avoidWhen: ["unknown architecture", "long-running generation"] },
184
- { id: "quick_agent", role: "bounded investigation or small implementation", preferredFor: ["uncertain file discovery", "medium-risk changes"], avoidWhen: ["dirty main workspace", "release-critical changes"] },
185
- { id: "isolated_task_run", role: "durable worker with worktree", preferredFor: ["parallel tasks", "risky implementation"], avoidWhen: ["single-line fixes"] },
186
- { id: "github_copilot", role: "visible cloud coding session", preferredFor: ["remote reviewable work", "GitHub issue flow"], avoidWhen: ["secret-local context", "offline tasks"] },
157
+ { id: "direct_capability", role: "direct domain capability execution", preferredFor: [], avoidWhen: [] },
158
+ { id: "isolated_process", role: "isolated process/workspace capability when explicitly useful", preferredFor: [], avoidWhen: [] },
159
+ { id: "external_provider", role: "optional external model/provider capability", preferredFor: [], avoidWhen: [] },
187
160
  ],
188
- recommendedWorker: dirty ? "direct_edit" : ledger.status.kind === "ready_to_dispatch" ? "isolated_task_run" : "direct_edit",
161
+ recommendedWorker: "model_selected",
189
162
  },
190
163
  guiInteraction: {
191
164
  source: "controller-console-interaction-model",
@@ -196,7 +169,7 @@ export function buildControllerOperationalPlan(repoRoot: string, ledger: TaskLed
196
169
  mcpToolSchemaConvergence: {
197
170
  source: "mcp-tool-schema-convergence",
198
171
  readModels: ["controller_context", "rh_context", "work_status_digest", "prepare_transfer_artifacts"],
199
- commandModels: ["rh_work", "run_check", "repository_command_execute", "plugin_action_execute", "repository_safe_patch_apply"],
172
+ commandModels: ["rh_work", "run_check", "execute_command", "plugin_action_execute", "repository_safe_patch_apply"],
200
173
  compatibilityRules: [
201
174
  "compact reads are default",
202
175
  "raw code and raw logs require explicit opt-in tools",
@@ -6,7 +6,11 @@ export { FORGE_VERSION } from '../../version';
6
6
  /** Product identity exposed by every Forge runtime surface. */
7
7
  export const FORGE_TOOL_SURFACE = FORGE_PRODUCT_ID;
8
8
  /** Payload schema for MCP health/config records; this is not a product/component version. */
9
- export const FORGE_MCP_SCHEMA_VERSION = 10;
9
+ // 12: autonomous continuation is addressed by Workflow Supervisor task identity
10
+ // rather than optional Work identity. Tool names stay bounded; the served input
11
+ // schema changes and therefore must fence stale Connector schema snapshots.
12
+ // A served-schema change must be visible to connector freshness checks.
13
+ export const FORGE_MCP_SCHEMA_VERSION = 12;
10
14
 
11
15
  type ToolSurfaceDefinition = {
12
16
  name: string;
@@ -3,7 +3,7 @@ import { spawnSync } from 'child_process';
3
3
  import { createHash } from 'crypto';
4
4
  import { inspectCompletionBacklog, type CompletionBacklogItem } from './completion-backlog';
5
5
  import { getIssue, listIssues, updateIssue, updateTask } from './issue-store';
6
- import { completionEvidenceComplete, taskExecutionPolicy, verificationEvidencePassed } from './execution-policy';
6
+ import { completionEvidenceComplete, verificationEvidencePassed } from './execution-policy';
7
7
  import type { CompletionReceipt, ControllerIssue, ControllerTask } from './types';
8
8
  import { resolveCompletionTargetBranch } from './completion-target';
9
9
  import { legacyIssueAuthorityRetired } from './legacy-issue-cutover';
@@ -174,8 +174,7 @@ function reachable(repoRoot: string, revision: string, branch: string): boolean
174
174
 
175
175
  function historicalCompletionReceipt(repoRoot: string, issue: ControllerIssue, task: ControllerTask): CompletionReceipt | undefined {
176
176
  if (!task.verification) return undefined;
177
- const policy = taskExecutionPolicy(task);
178
- const outcome = verificationEvidencePassed(task, task.verification, policy);
177
+ const outcome = verificationEvidencePassed(task, task.verification);
179
178
  if (!outcome.ok) return undefined;
180
179
  const target = currentTarget(repoRoot);
181
180
  if (!target) return undefined;
@@ -1,7 +1,8 @@
1
+ import { writeAtomicTextFile } from '../../runtime/shared/atomic-text-file';
1
2
  import { spawnSync, type SpawnSyncReturns } from 'child_process';
2
- import { mkdirSync, renameSync, writeFileSync } from 'fs';
3
+ import { existsSync, rmSync } from 'fs';
3
4
  import { homedir } from 'os';
4
- import { dirname, join } from 'path';
5
+ import { join } from 'path';
5
6
 
6
7
  export interface SystemdUserUnitInput {
7
8
  description?: string;
@@ -12,13 +13,6 @@ export interface SystemdUserUnitInput {
12
13
  restartSec?: number;
13
14
  }
14
15
 
15
- function atomicWrite(path: string, content: string, mode = 0o644): void {
16
- mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
17
- const temporary = `${path}.${process.pid}.tmp`;
18
- writeFileSync(temporary, content, { encoding: 'utf8', mode });
19
- renameSync(temporary, path);
20
- }
21
-
22
16
  export function systemdEscape(value: string): string {
23
17
  return `"${value.replaceAll('%', '%%').replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
24
18
  }
@@ -79,7 +73,7 @@ export function writeSystemdUserUnit(
79
73
  env: NodeJS.ProcessEnv = process.env,
80
74
  ): string {
81
75
  const unitPath = systemdUserUnitPath(unitName, env);
82
- atomicWrite(unitPath, renderSystemdUserUnit(input), 0o644);
76
+ writeAtomicTextFile(unitPath, renderSystemdUserUnit(input), 0o644);
83
77
  return unitPath;
84
78
  }
85
79
 
@@ -108,3 +102,41 @@ export function systemdUserServicePid(unitName: string, env: NodeJS.ProcessEnv =
108
102
  const pid = Number(result.stdout.trim());
109
103
  return Number.isInteger(pid) && pid > 0 ? pid : undefined;
110
104
  }
105
+
106
+ export interface ExactSystemdUserUnitRetirementResult {
107
+ unitName: string;
108
+ unitPath: string;
109
+ serviceWasPresent: boolean;
110
+ unitFileWasPresent: boolean;
111
+ absentAfter: boolean;
112
+ }
113
+
114
+ function systemdUnitLoaded(unitName: string, env: NodeJS.ProcessEnv): boolean {
115
+ const result = commandSucceeded('systemctl', ['--user', 'show', '--property', 'LoadState', '--value', systemdUserUnitName(unitName)], env);
116
+ return result.status === 0 && result.stdout.trim() !== '' && result.stdout.trim() !== 'not-found';
117
+ }
118
+
119
+ export function retireSystemdUserUnitExact(
120
+ input: { unitName: string; env?: NodeJS.ProcessEnv },
121
+ ): ExactSystemdUserUnitRetirementResult {
122
+ const env = input.env ?? process.env;
123
+ const unitName = systemdUserUnitName(input.unitName);
124
+ const unitPath = systemdUserUnitPath(unitName, env);
125
+ const serviceWasPresent = systemdUnitLoaded(unitName, env);
126
+ const unitFileWasPresent = existsSync(unitPath);
127
+ if (serviceWasPresent || unitFileWasPresent) {
128
+ const disabled = commandSucceeded('systemctl', ['--user', 'disable', '--now', unitName], env);
129
+ const detail = `${disabled.stderr ?? ''}\n${disabled.stdout ?? ''}`;
130
+ if (disabled.status !== 0 && !/not loaded|not found|does not exist|not enabled|no files found/i.test(detail)) {
131
+ throw new Error(`SYSTEMD_USER_EXACT_RETIRE_FAILED: ${unitName}: ${detail.trim()}`);
132
+ }
133
+ }
134
+ rmSync(unitPath, { force: true });
135
+ const reload = commandSucceeded('systemctl', ['--user', 'daemon-reload'], env);
136
+ if (reload.status !== 0) {
137
+ throw new Error(`SYSTEMD_USER_EXACT_RETIRE_RELOAD_FAILED: ${unitName}: ${(reload.stderr || reload.stdout || '').trim()}`);
138
+ }
139
+ const absentAfter = !systemdUnitLoaded(unitName, env) && !existsSync(unitPath);
140
+ if (!absentAfter) throw new Error(`SYSTEMD_USER_EXACT_RETIRE_VERIFY_FAILED: ${unitName}`);
141
+ return { unitName, unitPath, serviceWasPresent, unitFileWasPresent, absentAfter };
142
+ }
@@ -9,8 +9,8 @@ import {
9
9
  type ControllerCheckResult,
10
10
  } from '../controller/check-runner';
11
11
  import { tryAppendControllerWorklogEvent } from '../controller/worklog';
12
- import { globMatches, resolveMcpPath } from '../mcp/paths';
13
- import type { McpPolicy } from '../mcp/types';
12
+ import { globMatches, resolveMcpPath } from '../../../adapters/mcp/paths';
13
+ import type { McpPolicy } from '../../../adapters/mcp/types';
14
14
  import type { ProcessCheckCompletionReceipt, ProcessCheckReceiptStatus } from '../../runtime/execution/process-runtime/check-receipt';
15
15
  import { invalidateRepositoryReadCaches } from '../repository/inspector';
16
16
  import type { EditOperation } from './edit-operation-contract';
@@ -86,7 +86,6 @@ export interface EditSessionBinding {
86
86
  checkoutId?: string;
87
87
  principalId?: string;
88
88
  controllerInstanceId?: string;
89
- routeDecisionFingerprint?: string;
90
89
  }
91
90
 
92
91
  export interface EditSession {
@@ -99,7 +98,6 @@ export interface EditSession {
99
98
  checkoutId?: string;
100
99
  principalId?: string;
101
100
  controllerInstanceId?: string;
102
- routeDecisionFingerprint?: string;
103
101
  workspaceFingerprint?: string;
104
102
  assurance?: EditSessionAssurance;
105
103
  purpose: string;
@@ -293,8 +291,7 @@ export function assertEditSessionDurableBinding(
293
291
  session.workId
294
292
  || session.repoId
295
293
  || session.checkoutId
296
- || session.principalId
297
- || session.routeDecisionFingerprint,
294
+ || session.principalId,
298
295
  );
299
296
  if (options.requireBoundIdentity === true && hasDurableIdentity && !binding) {
300
297
  throw new Error('EDIT_SESSION_IDENTITY_MISMATCH: binding');
@@ -305,7 +302,6 @@ export function assertEditSessionDurableBinding(
305
302
  ['repoId', session.repoId, binding.repoId],
306
303
  ['checkoutId', session.checkoutId, binding.checkoutId],
307
304
  ['principalId', session.principalId, binding.principalId],
308
- ['routeDecisionFingerprint', session.routeDecisionFingerprint, binding.routeDecisionFingerprint],
309
305
  ];
310
306
  for (const [field, expected, observed] of pairs) {
311
307
  if (expected && expected !== observed) throw new Error(`EDIT_SESSION_IDENTITY_MISMATCH: ${String(field)}`);
@@ -316,6 +312,10 @@ function bindSessionControllerInstance(repoRoot: string, session: EditSession, b
316
312
  assertEditSessionDurableBinding(session, binding);
317
313
  const nextInstanceId = binding?.controllerInstanceId?.trim();
318
314
  if (!nextInstanceId || session.controllerInstanceId === nextInstanceId) return session;
315
+ // A non-Work Safe Patch session has no Controller instance owner to rebind.
316
+ // Its persisted repository identity is still checked above; never promote
317
+ // a caller-supplied transient Runtime identity into durable session authority.
318
+ if (!session.workId && !session.controllerInstanceId) return session;
319
319
  const durableIdentity = [
320
320
  [session.workId, binding?.workId],
321
321
  [session.repoId, binding?.repoId],
@@ -404,7 +404,6 @@ function normalizeStoredSession(value: Partial<EditSession> & { sessionId: strin
404
404
  checkoutId: value.checkoutId,
405
405
  principalId: value.principalId,
406
406
  controllerInstanceId: value.controllerInstanceId,
407
- routeDecisionFingerprint: value.routeDecisionFingerprint,
408
407
  workspaceFingerprint: value.workspaceFingerprint,
409
408
  assurance: value.assurance,
410
409
  purpose: value.purpose ?? 'Direct edit',
@@ -1149,7 +1148,7 @@ function sessionSummary(session: EditSession): EditSessionSummary {
1149
1148
  };
1150
1149
  }
1151
1150
 
1152
- function findOccurrence(value: string, anchor: string, occurrence: number): number {
1151
+ export function findOccurrence(value: string, anchor: string, occurrence: number): number {
1153
1152
  let from = 0;
1154
1153
  for (let current = 1; current <= occurrence; current += 1) {
1155
1154
  const index = value.indexOf(anchor, from);
@@ -1206,7 +1205,6 @@ export function beginEditSession(repoRoot: string, input: {
1206
1205
  checkoutId: input.binding?.checkoutId?.trim() || undefined,
1207
1206
  principalId: input.binding?.principalId?.trim() || undefined,
1208
1207
  controllerInstanceId: input.binding?.controllerInstanceId?.trim() || undefined,
1209
- routeDecisionFingerprint: input.binding?.routeDecisionFingerprint?.trim() || undefined,
1210
1208
  workspaceFingerprint: workspaceFingerprint(repoRoot),
1211
1209
  purpose,
1212
1210
  status: 'open',
@@ -1919,9 +1917,17 @@ export function finalizeEditSession(repoRoot: string, sessionId: string, input:
1919
1917
  } = {}): EditSession {
1920
1918
  let session = getEditSession(repoRoot, sessionId);
1921
1919
  session = bindSessionControllerInstance(repoRoot, session, input.binding);
1922
- if (session.baseRevision && gitRevision(repoRoot) !== session.baseRevision) throw new Error('EDIT_SESSION_BASE_REVISION_CHANGED');
1923
- if (session.workspaceFingerprint && workspaceFingerprint(repoRoot) !== session.workspaceFingerprint) throw new Error('EDIT_SESSION_WORKSPACE_FINGERPRINT_CHANGED');
1920
+ const baseRevisionChanged = Boolean(session.baseRevision && gitRevision(repoRoot) !== session.baseRevision);
1921
+ const workspaceFingerprintChanged = Boolean(session.workspaceFingerprint && workspaceFingerprint(repoRoot) !== session.workspaceFingerprint);
1924
1922
  if (session.assurance?.approvalRequired && input.approvalConfirmed !== true) throw new Error('EDIT_SESSION_APPROVAL_REQUIRED');
1923
+ if (baseRevisionChanged || workspaceFingerprintChanged) {
1924
+ // A commit changes HEAD and Git's workspace fingerprint even when the exact edit-session after-images are now integrated.
1925
+ // Reconcile through the canonical after-image + clean-tracked-path checks before rejecting the stale snapshot.
1926
+ const reconciled = reconcileEditSession(repoRoot, session.sessionId, input);
1927
+ if (reconciled.status === 'finalized' || reconciled.status === 'superseded') return reconciled;
1928
+ if (baseRevisionChanged) throw new Error('EDIT_SESSION_BASE_REVISION_CHANGED');
1929
+ throw new Error('EDIT_SESSION_WORKSPACE_FINGERPRINT_CHANGED');
1930
+ }
1925
1931
  const emptyOpenSession = session.status === 'open' && session.operations.length === 0;
1926
1932
  if (!emptyOpenSession && !['dirty', 'checked', 'check_failed'].includes(session.status)) {
1927
1933
  throw new Error(`edit session cannot be finalized from ${session.status}`);
@@ -121,7 +121,7 @@ export function buildGitHubWorkflowDispatchArgs(repository: string, input: GitHu
121
121
  return args;
122
122
  }
123
123
 
124
- function gh(repoRoot: string, args: string[], input?: string, maxOutputBytes = 512 * 1024) {
124
+ export function gh(repoRoot: string, args: string[], input?: string, maxOutputBytes = 512 * 1024) {
125
125
  return runProcess('gh', args, {
126
126
  cwd: repoRoot,
127
127
  timeoutMs: 120_000,
@@ -284,7 +284,7 @@ function parseIssueUrl(output: string): { url: string; number: number } {
284
284
  return { url, number };
285
285
  }
286
286
 
287
- function addProjectItem(repoRoot: string, link: GitHubIssueLink, projectOwner?: string, projectNumber?: number): GitHubIssueLink {
287
+ export function addProjectItem(repoRoot: string, link: GitHubIssueLink, projectOwner?: string, projectNumber?: number): GitHubIssueLink {
288
288
  if (!projectOwner || !projectNumber) return link;
289
289
  const result = gh(repoRoot, ['project', 'item-add', String(projectNumber), '--owner', projectOwner, '--url', link.url, '--format', 'json']);
290
290
  if (!result.ok) throw new Error(`failed to add ${link.url} to GitHub Project: ${result.error || result.stderr}`);
@@ -302,7 +302,7 @@ function withoutPairedOption(args: string[], option: string): string[] {
302
302
  return args.filter((entry, index, all) => entry !== option && all[index - 1] !== option);
303
303
  }
304
304
 
305
- function createGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, title: string, bodyPath: string, labels: string[], parentNumber?: number): GitHubIssueLink {
305
+ export function createGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, title: string, bodyPath: string, labels: string[], parentNumber?: number): GitHubIssueLink {
306
306
  const args = ['issue', 'create', '--repo', repo.nameWithOwner, '--title', title, '--body-file', bodyPath];
307
307
  for (const label of labels) args.push('--label', label);
308
308
  if (parentNumber) args.push('--parent', String(parentNumber));
@@ -323,7 +323,7 @@ function createGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, title:
323
323
  return { owner: repo.owner, repo: repo.repo, number: parsed.number, url: parsed.url, syncedAt: new Date().toISOString() };
324
324
  }
325
325
 
326
- function updateGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, link: GitHubIssueLink, title: string, bodyPath: string): GitHubIssueLink {
326
+ export function updateGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, link: GitHubIssueLink, title: string, bodyPath: string): GitHubIssueLink {
327
327
  const result = gh(repoRoot, ['issue', 'edit', String(link.number), '--repo', repo.nameWithOwner, '--title', title, '--body-file', bodyPath]);
328
328
  if (!result.ok) throw new Error(`failed to update GitHub issue #${link.number}: ${result.error || result.stderr}`);
329
329
  return { ...link, owner: repo.owner, repo: repo.repo, syncedAt: new Date().toISOString() };
@@ -0,0 +1,174 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from 'fs';
2
+ import { tmpdir } from 'os';
3
+ import { join } from 'path';
4
+ import { listRepositories } from '../repositories/registry';
5
+ import { resolveRepoPreferredControllerHome } from '../repositories/controller-home';
6
+ import { getWorkContract, listWorkContracts, type WorkContract } from '../../../packages/kernel/work/api/index';
7
+ import { getPlanContract, planSemanticView } from '../../runtime/control-plane/facade/plan-contract-store';
8
+ import { readRequirement } from '../../runtime/control-plane/persistence/requirement-store';
9
+ import type { GitHubIssueLink } from '../controller/types';
10
+ import { gh, createGitHubIssue, updateGitHubIssue, addProjectItem, resolveGitHubRepository } from './github';
11
+
12
+ interface RemoteIssue { number: number; url: string; title: string; body: string }
13
+ export interface SemanticReleaseProjectionInput {
14
+ releaseWorkId: string;
15
+ repository?: string;
16
+ projectOwner?: string;
17
+ projectNumber?: number;
18
+ }
19
+ export interface SemanticReleaseProjectionResult {
20
+ releaseIssue: string;
21
+ children: Array<{ workId: string; issue: string }>;
22
+ created: number;
23
+ updated: number;
24
+ unchanged: number;
25
+ }
26
+
27
+ function safeIdentity(value: string): string {
28
+ if (!/^[A-Za-z0-9_.:-]{1,200}$/.test(value)) throw new Error('GITHUB_SEMANTIC_ID_INVALID');
29
+ return value;
30
+ }
31
+
32
+ function marker(workId: string): string {
33
+ return '<!-- forge-semantic-work:' + safeIdentity(workId) + ' -->';
34
+ }
35
+
36
+ function lines(values: readonly string[] | undefined, prefix = '- '): string {
37
+ return values?.length ? values.map((line) => prefix + line).join('\n') : '- 尚无记录';
38
+ }
39
+
40
+ function workDisplayTitle(work: WorkContract, home: string): string {
41
+ const requirement = work.requirementId
42
+ ? readRequirement({ controllerHome: home }, work.requirementId)?.value
43
+ : undefined;
44
+ return (requirement?.title || work.objective).replace(/\s+/g, ' ').slice(0, 96);
45
+ }
46
+
47
+ function semanticWorkText(work: WorkContract, home: string): string {
48
+ const requirement = work.requirementId
49
+ ? readRequirement({ controllerHome: home }, work.requirementId)?.value
50
+ : undefined;
51
+ const plan = work.planId
52
+ ? getPlanContract({ controllerHome: home, repoId: work.repoId }, work.planId)
53
+ : undefined;
54
+ const planView = plan ? planSemanticView(plan) : undefined;
55
+ const text = [
56
+ marker(work.workId),
57
+ '> Forge 生成视图(单向投影)。Requirement / Plan / Work 的正式状态只由 Forge 持有。GitHub 上的勾选或评论不改变执行授权。',
58
+ '',
59
+ '## 工作目标', work.objective,
60
+ '',
61
+ '## Forge 当前事实',
62
+ '- Work: `' + work.workId + '`',
63
+ '- 语义状态: `' + work.semanticState + '`',
64
+ '- Requirement: `' + (work.requirementId || '未绑定') + '`',
65
+ '- Plan: `' + (work.planId || '未绑定') + '`',
66
+ '- 父 Work: `' + (work.semanticParentWorkId || '无') + '`',
67
+ '- 最近语义更新: ' + (work.semanticUpdatedAt || work.updatedAt),
68
+ '',
69
+ '## 已选择的交付结果引用',
70
+ lines(work.semanticResultRefs),
71
+ ];
72
+ if (requirement) {
73
+ text.push('', '## 原始需求:' + requirement.title, requirement.outcomeStatement, '',
74
+ '### 验收标准', lines(requirement.acceptanceCriteria));
75
+ if (requirement.needsAttention && requirement.attentionSummary) {
76
+ text.push('', '### Forge 记录的需关注事项', requirement.attentionSummary);
77
+ }
78
+ }
79
+ if (planView) {
80
+ text.push('', '## 当前方案', planView.goal, '',
81
+ '### 方案决定', lines(planView.resolvedDecisions), '',
82
+ '### 方案项(描述性工作记忆,不是自动审批状态)',
83
+ lines(planView.items.map((item) => item.id + ' — ' + item.objective)));
84
+ }
85
+ text.push('', '> 未明确记录的用户产品审批、测试、发布均不能推断为通过。');
86
+ return text.join('\n') + '\n';
87
+ }
88
+
89
+ export function syncGitHubSemanticRelease(
90
+ repoRoot: string,
91
+ input: SemanticReleaseProjectionInput,
92
+ ): SemanticReleaseProjectionResult {
93
+ const home = resolveRepoPreferredControllerHome(repoRoot);
94
+ const repositoryRecord = listRepositories(home).find((record) =>
95
+ record.canonicalRoot === repoRoot || record.localRoot === repoRoot ||
96
+ record.checkouts.some((checkout) => checkout.canonicalRoot === repoRoot || checkout.localRoot === repoRoot));
97
+ if (!repositoryRecord) throw new Error('GITHUB_SEMANTIC_REPOSITORY_NOT_REGISTERED');
98
+ const repoId = repositoryRecord.repoId;
99
+ const store = { controllerHome: home, repoId };
100
+ const releaseWorkId = safeIdentity(input.releaseWorkId);
101
+ const parent = getWorkContract(store, releaseWorkId);
102
+ if (!parent || parent.lifecycleRole === 'execution_child') throw new Error('GITHUB_SEMANTIC_RELEASE_WORK_NOT_FOUND');
103
+ if (parent.semanticParentWorkId) throw new Error('GITHUB_SEMANTIC_RELEASE_MUST_BE_ROOT');
104
+ const all: WorkContract[] = [];
105
+ for (let offset = 0; offset < 10_000; offset += 100) {
106
+ const page = listWorkContracts({ ...store, state: 'all', limit: 100, offset });
107
+ all.push(...page);
108
+ if (page.length < 100) break;
109
+ if (offset + 100 >= 10_000) throw new Error('GITHUB_SEMANTIC_WORK_INVENTORY_TOO_LARGE');
110
+ }
111
+ const children = all.filter((work) => work.semanticParentWorkId === releaseWorkId &&
112
+ work.lifecycleRole !== 'execution_child').sort((a, b) => a.workId.localeCompare(b.workId));
113
+
114
+ // The GitHub Issue is a projection; never import remote status back into Work.
115
+ if (Boolean(input.projectOwner) !== Boolean(input.projectNumber)) throw new Error('GITHUB_SEMANTIC_PROJECT_CONFIG_INCOMPLETE');
116
+ const repo = resolveGitHubRepository(repoRoot, input.repository);
117
+ const inventory = gh(repoRoot,
118
+ ['issue', 'list', '--repo', repo.nameWithOwner, '--state', 'all', '--limit', '1000',
119
+ '--json', 'number,url,title,body'], undefined, 4 * 1024 * 1024);
120
+ if (!inventory.ok) throw new Error('GITHUB_SEMANTIC_ISSUE_INVENTORY_FAILED: ' + (inventory.error || inventory.stderr));
121
+ const remote = JSON.parse(inventory.stdout) as RemoteIssue[];
122
+ if (!Array.isArray(remote) || remote.length === 1000) {
123
+ throw new Error('GITHUB_SEMANTIC_ISSUE_INVENTORY_UNBOUNDED');
124
+ }
125
+ let created = 0;
126
+ let updated = 0;
127
+ let unchanged = 0;
128
+ const tmp = mkdtempSync(join(tmpdir(), 'forge-semantic-github-'));
129
+ function ensureIssue(workId: string, title: string, body: string): string {
130
+ const matches = remote.filter((issue) => issue.body?.includes(marker(workId)));
131
+ if (matches.length > 1) throw new Error('GITHUB_SEMANTIC_DUPLICATE_REMOTE_IDENTITY: ' + workId);
132
+ const file = join(tmp, 'issue.md');
133
+ writeFileSync(file, body, 'utf8');
134
+ let link: GitHubIssueLink;
135
+ if (matches.length === 1) {
136
+ const current = matches[0]!;
137
+ link = { owner: repo.owner, repo: repo.repo, number: current.number, url: current.url, syncedAt: '' };
138
+ if (current.title === title && current.body === body) unchanged++;
139
+ else { link = updateGitHubIssue(repoRoot, repo, link, title, file); updated++; }
140
+ } else {
141
+ link = createGitHubIssue(repoRoot, repo, title, file, []);
142
+ remote.push({ number: link.number, title, body, url: link.url });
143
+ created++;
144
+ }
145
+ if (input.projectOwner && input.projectNumber) {
146
+ addProjectItem(repoRoot, link, input.projectOwner, input.projectNumber);
147
+ }
148
+ return link.url;
149
+ }
150
+ try {
151
+ const linked = children.map((work) => ({
152
+ workId: work.workId,
153
+ title: workDisplayTitle(work, home),
154
+ issue: ensureIssue(work.workId, workDisplayTitle(work, home),
155
+ semanticWorkText(work, home)),
156
+ }));
157
+ const counts = {
158
+ open: children.filter((work) => work.semanticState === 'open').length,
159
+ completed: children.filter((work) => work.semanticState === 'completed').length,
160
+ cancelled: children.filter((work) => work.semanticState === 'cancelled').length,
161
+ };
162
+ const releaseBody = semanticWorkText(parent, home) + '\n## 版本关联工作\n' +
163
+ (linked.length
164
+ ? linked.map((child) => '- [' + child.title + '](' + child.issue + ') — \`' + child.workId + '\`').join('\n')
165
+ : '- 暂无已关联子 Work') +
166
+ '\n\n## 版本进度(真实 Work 事实,不是提交/发布证明)\n' +
167
+ '- 关联:' + linked.length + '\n- Open:' + counts.open +
168
+ '\n- Completed:' + counts.completed + '\n- Cancelled:' + counts.cancelled + '\n';
169
+ const releaseIssue = ensureIssue(releaseWorkId, workDisplayTitle(parent, home), releaseBody);
170
+ return { releaseIssue, children: linked, created, updated, unchanged };
171
+ } finally {
172
+ rmSync(tmp, { recursive: true, force: true });
173
+ }
174
+ }
@@ -465,15 +465,6 @@ export function isAgenticPackagingIntent(ctx: PromptIntentContext): boolean {
465
465
  return AGENTIC_PACKAGING.test(ctx.text);
466
466
  }
467
467
 
468
- const CODEGRAPH_ROUTE = re(
469
- String.raw`(who calls|what calls|callers|callees|impact|impact radius|trace\s+(flow|path|call)|where\s.*(defined|definition)|definition of|symbol named|调用关系|谁调用|调用了谁|哪里定义|定义在哪|影响面|调用链|追踪(路径|调用|链)|从.*到.*怎么走)`,
470
- );
471
-
472
- export function isCodegraphRouteIntent(ctx: PromptIntentContext): boolean {
473
- if (isTriggerQuestionPrompt(ctx)) return false;
474
- return CODEGRAPH_ROUTE.test(ctx.text);
475
- }
476
-
477
468
  const GIT_STATUS_LINE = re(
478
469
  String.raw`^${SP}*(git\s+(status|log|show|diff|push|pull|commit)|status|commit|push|merge|提交|推送|合并|看状态|看看状态)(${SP}|$)`,
479
470
  );