@moretea-labs/forge 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/AGENTS.md +70 -7
  2. package/CHANGELOG.md +14 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/THIRD_PARTY_NOTICES.md +1 -1
  6. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
  8. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  9. package/adapters/chatgpt/controller-round-host.ts +15 -25
  10. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  11. package/adapters/chatgpt/provider-delivery.ts +228 -1
  12. package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
  13. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  14. package/adapters/computer/chatgpt-target-router.ts +103 -0
  15. package/adapters/computer/chrome-extension/background.js +385 -0
  16. package/adapters/computer/chrome-extension/content.js +378 -0
  17. package/adapters/computer/chrome-extension/core.js +24 -0
  18. package/adapters/computer/chrome-extension/manifest.json +30 -0
  19. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  20. package/adapters/computer/interaction-target-authority.ts +142 -18
  21. package/adapters/mcp/auth.ts +0 -1
  22. package/adapters/mcp/instructions.ts +5 -4
  23. package/adapters/mcp/multi-repository.ts +3 -19
  24. package/adapters/mcp/oauth.ts +73 -0
  25. package/adapters/mcp/paths.ts +4 -1
  26. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  27. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  28. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  29. package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
  30. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  31. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  32. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  33. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  34. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  35. package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
  36. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  37. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
  38. package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
  39. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  40. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  41. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  42. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  43. package/adapters/mcp/runtime-gateway/router.ts +18 -504
  44. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  45. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
  46. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  47. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
  48. package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
  49. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
  50. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  51. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
  52. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  53. package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
  54. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  55. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  56. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  57. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  58. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  59. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  60. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  61. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  62. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  63. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  64. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  65. package/adapters/mcp/server.ts +67 -23
  66. package/adapters/mcp/setup.ts +1 -3
  67. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
  68. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
  69. package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
  70. package/adapters/mcp/toolset-names.ts +5 -0
  71. package/adapters/mcp/toolset.ts +6 -5
  72. package/adapters/mcp/transports/http-observation.ts +365 -0
  73. package/adapters/mcp/transports/http.ts +154 -677
  74. package/adapters/mcp/transports/oauth-http.ts +322 -0
  75. package/adapters/mcp/transports/session-registry.ts +6 -0
  76. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  77. package/assets/plugin-registry.v1.json +6 -4
  78. package/assets/reference-configs/agentic-development-flow.md +25 -0
  79. package/assets/reference-configs/global-working-rules.md +19 -0
  80. package/assets/skill-version.json +2 -2
  81. package/docs/architecture/CURRENT.md +111 -41
  82. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  83. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  84. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  85. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  86. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  87. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  88. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  89. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  90. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  91. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  92. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  93. package/docs/architecture/domains/verification.md +1 -0
  94. package/docs/architecture/domains/workflow-engine.md +6 -0
  95. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  96. package/docs/forge-plugin-management.md +2 -2
  97. package/docs/operations/controller-performance-and-502.md +17 -0
  98. package/docs/operations/controller-reliability-runbook.md +2 -2
  99. package/docs/operations/features.md +1 -1
  100. package/docs/operations/features.zh-CN.md +1 -1
  101. package/docs/operations/homebrew.md +2 -2
  102. package/docs/operations/mcp-tool-exposure.md +2 -0
  103. package/docs/operations/releasing.md +2 -0
  104. package/docs/operations/standalone-disaster-recovery.md +14 -6
  105. package/docs/wiki/Implementation.md +1 -1
  106. package/package.json +25 -14
  107. package/packages/kernel/cognition/api/index.ts +6 -0
  108. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  109. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  110. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  111. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  112. package/packages/kernel/cognition/domain/learning.ts +106 -0
  113. package/packages/kernel/cognition/domain/memory.ts +254 -0
  114. package/packages/kernel/controller/api/index.ts +1 -0
  115. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  116. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  117. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  118. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  119. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  120. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  121. package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
  122. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  123. package/packages/kernel/identity/api/index.ts +10 -0
  124. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  125. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  126. package/packages/kernel/identity/domain/grant.ts +72 -0
  127. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  128. package/packages/kernel/identity/domain/user-request.ts +93 -0
  129. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  130. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  131. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  132. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  133. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  134. package/packages/kernel/scheduler/api/index.ts +0 -2
  135. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  136. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  137. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  138. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
  139. package/packages/kernel/work/api/index.ts +3 -2
  140. package/packages/kernel/work/application/work-service.ts +17 -42
  141. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  142. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  143. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  144. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  145. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  146. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  147. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  148. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  149. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  150. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  151. package/packages/kernel/work/domain/state-machine.ts +25 -63
  152. package/packages/kernel/work/domain/types.ts +57 -51
  153. package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
  154. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  155. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  156. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  157. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  158. package/packages/plugin-runtime/computer/index.ts +2 -0
  159. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  160. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  161. package/packages/protocols/computer/contract.ts +27 -1
  162. package/scripts/activate-source-baseline.ts +7 -9
  163. package/scripts/canary-controller-semantic-wait.ts +12 -24
  164. package/scripts/check-mcp-compatibility.ts +48 -136
  165. package/scripts/check-runtime-architecture.mjs +622 -217
  166. package/scripts/forge-local-recovery-helper.mjs +93 -15
  167. package/scripts/lib/project-init-lib.sh +3 -0
  168. package/scripts/open-source-audit-allowlist.txt +1 -2
  169. package/scripts/run-bounded-command.mjs +5 -0
  170. package/scripts/run-governed-gate.ts +0 -1
  171. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  172. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  173. package/scripts/smoke-mcp-http-runtime.ts +5 -0
  174. package/scripts/smoke-runtime-recovery.ts +12 -43
  175. package/scripts/smoke-schedule-engine.ts +23 -15
  176. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  177. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  178. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  179. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  180. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  181. package/scripts/smoke-workflow-supervisor.ts +103 -0
  182. package/scripts/verify-forge-runtime.sh +2 -1
  183. package/src/cli/agent-jobs/executor-health.ts +11 -34
  184. package/src/cli/agent-jobs/integration.ts +18 -49
  185. package/src/cli/agent-jobs/job-manager.ts +7 -3
  186. package/src/cli/commands/brain-assistant.ts +27 -13
  187. package/src/cli/commands/brain.ts +13 -15
  188. package/src/cli/commands/chatgpt.ts +1 -163
  189. package/src/cli/commands/recovery.ts +135 -121
  190. package/src/cli/commands/runtime.ts +3 -3
  191. package/src/cli/commands/setup-profile.ts +8 -0
  192. package/src/cli/controller/check-runner.ts +13 -2
  193. package/src/cli/controller/completion-backlog.ts +3 -3
  194. package/src/cli/controller/completion-orchestrator.ts +4 -43
  195. package/src/cli/controller/completion-target.ts +3 -72
  196. package/src/cli/controller/context/source-materializer.ts +81 -100
  197. package/src/cli/controller/context-pack.ts +10 -8
  198. package/src/cli/controller/execution-completion.ts +4 -7
  199. package/src/cli/controller/execution-policy.ts +36 -153
  200. package/src/cli/controller/governance.ts +2 -3
  201. package/src/cli/controller/issue-store.ts +4 -99
  202. package/src/cli/controller/launch-agents.ts +59 -18
  203. package/src/cli/controller/operational-plan.ts +24 -51
  204. package/src/cli/controller/runtime-config.ts +5 -1
  205. package/src/cli/controller/stuck-state-migration.ts +2 -3
  206. package/src/cli/controller/systemd-user.ts +39 -1
  207. package/src/cli/editing/edit-session.ts +1 -7
  208. package/src/cli/local-bridge/console-automations.ts +18 -13
  209. package/src/cli/local-bridge/console-view-models.ts +3 -12
  210. package/src/cli/local-bridge/facade-api.ts +64 -191
  211. package/src/cli/local-bridge/server.ts +24 -147
  212. package/src/cli/local-bridge/types.ts +0 -1
  213. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  214. package/src/cli/repositories/command-executor.ts +29 -23
  215. package/src/cli/repositories/command-scope.ts +35 -16
  216. package/src/cli/repositories/controller-home.ts +48 -0
  217. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  218. package/src/cli/repositories/git-command-executor.ts +2 -2
  219. package/src/cli/repositories/registry.ts +77 -11
  220. package/src/cli/repositories/structured-git.ts +62 -2
  221. package/src/cli/repository/session-cache.ts +92 -6
  222. package/src/runtime/context/assistant-context.ts +20 -7
  223. package/src/runtime/context/assistant-work-context.ts +89 -27
  224. package/src/runtime/context/automatic-learning.ts +565 -0
  225. package/src/runtime/context/cognitive-attention.ts +173 -0
  226. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  227. package/src/runtime/context/context-closure.ts +46 -9
  228. package/src/runtime/context/context-pack-process.ts +103 -0
  229. package/src/runtime/context/context-plane.ts +1 -9
  230. package/src/runtime/context/direct-controller-learning.ts +298 -0
  231. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  232. package/src/runtime/context/semantic-navigation.ts +6 -34
  233. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  234. package/src/runtime/context/typescript-navigation.ts +89 -3
  235. package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
  236. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  237. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  238. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  239. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  240. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  241. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  242. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  243. package/src/runtime/control-plane/execution/validation.ts +6 -8
  244. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  245. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  246. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  247. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  248. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  249. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  250. package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
  251. package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
  252. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  253. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  254. package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
  255. package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
  256. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  257. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  258. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
  259. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
  260. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  261. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  262. package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
  263. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  264. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  265. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  266. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  267. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  268. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  269. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  270. package/src/runtime/control-plane/facade/index.ts +0 -1
  271. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  272. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  273. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  274. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  275. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  276. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  277. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  278. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  279. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  280. package/src/runtime/control-plane/facade/types.ts +49 -108
  281. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  282. package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
  283. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  284. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  285. package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
  286. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
  287. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  288. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  289. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  290. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  291. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  292. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
  293. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  294. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  295. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  296. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  297. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  298. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  299. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  300. package/src/runtime/control-plane/release-retention.ts +135 -47
  301. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  302. package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
  303. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  304. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  305. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  306. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  307. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  308. package/src/runtime/evidence/artifact-store.ts +158 -40
  309. package/src/runtime/evidence/evidence-store.ts +112 -8
  310. package/src/runtime/evidence/output-handle-index.ts +225 -0
  311. package/src/runtime/evidence/result-store.ts +158 -44
  312. package/src/runtime/execution/jobs/store.ts +3 -4
  313. package/src/runtime/execution/managed-workspace.ts +57 -0
  314. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  315. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  316. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  317. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  318. package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
  319. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  320. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  321. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  322. package/src/runtime/execution/process-runtime/index.ts +3 -0
  323. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  324. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  325. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  326. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  327. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  328. package/src/runtime/execution/process-runtime/runtime.ts +35 -2
  329. package/src/runtime/execution/process-runtime/store.ts +30 -2
  330. package/src/runtime/execution/process-runtime/types.ts +6 -1
  331. package/src/runtime/execution/workers/executor.ts +2 -6
  332. package/src/runtime/platform/service-inventory.ts +130 -0
  333. package/src/runtime/platform/service-manager.ts +8 -0
  334. package/src/runtime/plugins/action-application.ts +85 -28
  335. package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
  336. package/src/runtime/plugins/browser-adapter.ts +757 -34
  337. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  338. package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
  339. package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
  340. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  341. package/src/runtime/plugins/browser-registration.ts +16 -0
  342. package/src/runtime/plugins/browser-runtime.ts +14 -1
  343. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  344. package/src/runtime/plugins/browser-session-store.ts +46 -76
  345. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  346. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  347. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  348. package/src/runtime/plugins/computer-registration.ts +222 -11
  349. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  350. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  351. package/src/runtime/plugins/external-adapter.ts +42 -6
  352. package/src/runtime/plugins/external-registration.ts +21 -1
  353. package/src/runtime/plugins/gmail-adapter.ts +23 -2
  354. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  355. package/src/runtime/plugins/google-shared.ts +14 -7
  356. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  357. package/src/runtime/plugins/ios-adapter.ts +1 -1
  358. package/src/runtime/plugins/lightweight-action.ts +208 -2
  359. package/src/runtime/plugins/local-system-adapter.ts +12 -2
  360. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  361. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  362. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  363. package/src/runtime/plugins/store.ts +602 -428
  364. package/src/runtime/plugins/types.ts +20 -0
  365. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  366. package/src/runtime/projections/invalidation.ts +7 -3
  367. package/src/runtime/projections/materialized-view.ts +80 -36
  368. package/src/runtime/recovery/actions.ts +3 -3
  369. package/src/runtime/recovery/capability-action-application.ts +46 -45
  370. package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
  371. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  372. package/src/runtime/recovery/store.ts +29 -11
  373. package/src/runtime/release/release-coordinator.ts +296 -0
  374. package/src/runtime/release/release-session.ts +716 -0
  375. package/src/runtime/release/release-state-migration.ts +25 -0
  376. package/src/runtime/resources/leases/store.ts +56 -25
  377. package/src/runtime/root/computer-composition.ts +191 -6
  378. package/src/runtime/root/controller-progression-composition.ts +192 -0
  379. package/src/runtime/root/controller-round-composition.ts +20 -1
  380. package/src/runtime/root/deployment-topology.ts +106 -0
  381. package/src/runtime/root/entry.ts +4 -3
  382. package/src/runtime/root/known-good-recovery.ts +184 -0
  383. package/src/runtime/root/local-bridge.ts +0 -1
  384. package/src/runtime/root/mcp-transport.ts +111 -18
  385. package/src/runtime/root/ownership.ts +261 -9
  386. package/src/runtime/root/package-connector-service.ts +105 -19
  387. package/src/runtime/root/package-runtime-release.ts +117 -18
  388. package/src/runtime/root/package-runtime-service.ts +17 -11
  389. package/src/runtime/root/release-execution-canary.ts +44 -12
  390. package/src/runtime/root/release-loader.ts +90 -8
  391. package/src/runtime/root/release-manifest.ts +80 -6
  392. package/src/runtime/root/release-materialize.ts +372 -28
  393. package/src/runtime/root/release-store.ts +395 -36
  394. package/src/runtime/root/runtime-lane.ts +191 -0
  395. package/src/runtime/root/runtime.ts +159 -27
  396. package/src/runtime/root/scheduled-controller-composition.ts +28 -3
  397. package/src/runtime/root/service-runner.ts +2 -2
  398. package/src/runtime/root/service.ts +36 -33
  399. package/src/runtime/root/status.ts +48 -0
  400. package/src/runtime/root/types.ts +32 -3
  401. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  402. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  403. package/src/runtime/root/write-fence.ts +50 -2
  404. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  405. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  406. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  407. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  408. package/src/runtime/shared/process-environment.ts +20 -9
  409. package/src/runtime/shared/response-budget.ts +1 -3
  410. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  411. package/src/runtime/standalone-recovery/core.ts +3702 -342
  412. package/src/runtime/standalone-recovery/entry.ts +469 -39
  413. package/src/runtime/standalone-recovery/installer.ts +262 -148
  414. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  415. package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
  416. package/src/runtime/standalone-recovery/performance.ts +54 -16
  417. package/src/runtime/standalone-recovery/release.ts +53 -5
  418. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  419. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  420. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  421. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
  422. package/src/runtime/workflow/schedules/engine.ts +138 -172
  423. package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
  424. package/src/runtime/workflows/runtime.ts +15 -19
  425. package/src/testing/test-governance.ts +5 -1
  426. package/supervisor/chatgpt-conversation.ts +23 -0
  427. package/supervisor/client.ts +201 -0
  428. package/supervisor/control-plane.ts +868 -0
  429. package/supervisor/entry.ts +15 -0
  430. package/supervisor/forge-validators.ts +80 -0
  431. package/supervisor/index.ts +5 -0
  432. package/supervisor/native-browser-adapter.ts +786 -0
  433. package/supervisor/native-messaging/host.ts +39 -0
  434. package/supervisor/native-messaging/manifest.ts +26 -0
  435. package/supervisor/native-messaging/protocol.ts +27 -0
  436. package/supervisor/paths.ts +18 -0
  437. package/supervisor/protocol.ts +202 -0
  438. package/supervisor/server.ts +404 -0
  439. package/supervisor/store.ts +1451 -0
  440. package/supervisor/tsconfig.json +8 -0
  441. package/supervisor/types.ts +255 -0
  442. package/adapters/chatgpt/controller-host.ts +0 -119
  443. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  444. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  445. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  446. package/packages/kernel/progression/api/index.ts +0 -2
  447. package/packages/kernel/progression/application/projector.ts +0 -211
  448. package/packages/kernel/progression/domain/types.ts +0 -116
  449. package/packages/kernel/progression/index.ts +0 -1
  450. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  451. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  452. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  453. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  454. package/scripts/benchmark-background-check-overlap.ts +0 -228
  455. package/scripts/benchmark-computer-hotpath.ts +0 -255
  456. package/scripts/benchmark-controller-hotpath.ts +0 -212
  457. package/scripts/benchmark-controller-round2.ts +0 -191
  458. package/scripts/benchmark-ios-agent-device.ts +0 -511
  459. package/scripts/benchmark-mcp-host.sh +0 -117
  460. package/scripts/benchmark-mcp-transport.ts +0 -169
  461. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  462. package/scripts/benchmark-operational-shadow.ts +0 -28
  463. package/scripts/benchmark-quality-harness.ts +0 -146
  464. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  465. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  466. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  467. package/scripts/benchmark-thin-harness.ts +0 -251
  468. package/scripts/benchmark-typescript-navigation.ts +0 -186
  469. package/scripts/benchmark-work-efficiency.ts +0 -334
  470. package/scripts/build-controller-ui.ts +0 -28
  471. package/scripts/check-npm-release.sh +0 -32
  472. package/scripts/check-public-release-surface.sh +0 -19
  473. package/scripts/check-release-published.sh +0 -57
  474. package/scripts/check-release-readiness.sh +0 -37
  475. package/scripts/check-release-version.mjs +0 -74
  476. package/scripts/check-tarball-install-smoke.sh +0 -150
  477. package/scripts/package-source-archive.sh +0 -147
  478. package/scripts/public-release-files.txt +0 -39
  479. package/scripts/public-release.ts +0 -174
  480. package/scripts/publish-release-tarball.sh +0 -27
  481. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  482. package/scripts/stage-runtime-release.ts +0 -44
  483. package/src/cli/controller/progress.ts +0 -656
  484. package/src/cli/controller/work-mode.ts +0 -181
  485. package/src/cli/local-bridge/console-assets.ts +0 -17
  486. package/src/cli/local-bridge/dashboard.ts +0 -17
  487. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  488. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  489. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  490. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  491. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  492. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  493. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  494. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  495. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  496. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  497. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  498. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  499. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  500. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  501. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  502. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  503. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  504. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  505. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  506. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  507. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  508. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  509. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  510. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  511. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  512. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  513. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  514. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  515. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  516. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  517. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  518. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  519. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  520. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  521. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  522. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  523. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  524. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  525. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  526. package/src/runtime/control-plane/routing/index.ts +0 -1
  527. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  528. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -1,6 +1,7 @@
1
1
  import type { McpToolDefinition } from '../../../packages/protocols/mcp/tool-contract';
2
- import { CONTROLLER_CONTEXT_IMPACT_DOMAINS } from '../../../src/cli/controller/context-pack';
3
- import { RH_WORK_OPERATIONS } from '../../../src/runtime/control-plane/facade/rh-work-operation-contract';
2
+ import { CONTROLLER_CONTEXT_IMPACT_DOMAINS } from '../../../src/cli/controller/context/types';
3
+ import { RH_WORK_MODEL_OPERATIONS } from '../../../src/runtime/control-plane/facade/rh-work-operation-contract';
4
+ import { CONTROLLER_LEARNING_SIGNAL_ENVELOPE_MAX_ITEMS } from '../../../src/runtime/context/automatic-learning';
4
5
 
5
6
  function definition(name: string, description: string, properties: Record<string, unknown>, required: string[] = [], readOnly = true): McpToolDefinition {
6
7
  return {
@@ -23,26 +24,40 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
23
24
  chatgpt_pull_failed: { type: 'boolean' },
24
25
  destructive: { type: 'boolean' },
25
26
  }),
26
- definition('rh_inbox', 'Preferred ChatGPT facade: pending handoff decisions only (not logs).', {
27
- repo_id: repoId,
27
+ definition('rh_inbox', 'Preferred ChatGPT facade: instance-level UserRequest inbox for genuine human actions/decisions. Repository-scoped handoff_id remains a legacy compatibility lookup.', {
28
+ repo_id: { ...repoId, description: 'Optional legacy repository context. Omit for canonical instance-level UserRequest operations.' },
28
29
  operation: { type: 'string', enum: ['list', 'get', 'ack', 'accept', 'resolve', 'dismiss', 'create'], description: 'Defaults to list (pending).' },
29
- handoff_id: { type: 'string' },
30
+ request_id: { type: 'string', description: 'Canonical instance-level UserRequest id.' },
31
+ handoff_id: { type: 'string', description: 'Legacy compatibility id.' },
30
32
  work_id: { type: 'string' },
31
33
  title: { type: 'string' },
32
34
  reason: { type: 'string' },
33
35
  summary: { type: 'string' },
34
36
  recommended_decision: { type: 'string' },
35
37
  recommended_prompt: { type: 'string' },
38
+ action_required: { type: 'string', enum: ['login', 'grant_permission', 'confirm_destructive', 'product_decision'] },
39
+ request_kind: { type: 'string', enum: ['user_action_request', 'user_decision_request'] },
40
+ root_cause_key: { type: 'string' },
36
41
  decision: { type: 'string', description: 'Recorded on resolve/dismiss.' },
37
42
  resolver: { type: 'string', description: 'Who resolved or dismissed the handoff.' },
38
43
  detail_level: { type: 'string', enum: ['summary', 'detail'] },
39
44
  limit: { type: 'number' },
40
45
  }),
41
- definition('rh_context', 'Preferred ChatGPT facade and default repository code-discovery/read path. Start broad once to combine heuristic lexical discovery, current raw source, and optional CodeGraph structural evidence with few round trips. Natural-language lexical terms are discovery hints: do not require every guessed term to match and do not repeat the same broad search merely because a heuristic term missed. After credible files or symbols are found, derive follow-up paths/symbols from the returned source and prefer known_paths, compiler semantic_navigation/@tsnav for TypeScript, or structural relationships before another broad lexical pass. Call rh_context repeatedly only when that progressive expansion can materially improve correctness; follow-ups reuse session-scoped evidence when source identity is unchanged. Shell rg/grep/sed/cat loops are fallback-only when this Context Plane cannot supply the needed evidence.', {
46
+ definition('rh_context', 'Preferred ChatGPT facade and default repository code-discovery/read path. Semantic task/capability queries can also recall an initial bounded, relevance-gated Cognitive advisory working set when Project/Workspace scope is available. That first pack is an attention envelope, never a claim that the top N items are cognitively complete. Reuse it through routine micro-steps; when the model judges prior context insufficient, progressively narrow/expand recall with another semantic query or explicit knowledge audit. Start broad once to combine heuristic lexical discovery, current raw source, and optional CodeGraph structural evidence with few round trips. Natural-language lexical terms are discovery hints: do not require every guessed term to match and do not repeat the same broad search merely because a heuristic term missed. After credible files or symbols are found, derive follow-up paths/symbols from the returned source and prefer known_paths, compiler semantic_navigation/@tsnav for TypeScript, or structural relationships before another broad lexical pass. Call rh_context repeatedly only when that progressive expansion can materially improve correctness; follow-ups reuse session-scoped evidence when source identity is unchanged. Shell rg/grep/sed/cat loops are fallback-only when this Context Plane cannot supply the needed evidence.', {
42
47
  repo_id: repoId,
43
48
  checkout_id: { type: 'string', description: 'Optional checkout identity for repositories with multiple worktrees.' },
44
49
  operation: { type: 'string', enum: ['list', 'get', 'search'], description: 'Defaults to get. Use search as the default code-location path when an exact file is unknown.' },
45
50
  query: { type: 'string', description: 'Code/content intent for operation=search. For operation=list, a natural-language capability intent such as "configure Xcode provisioning" returns ranked read-only capability candidates while execution remains on the capability\'s typed executor. Frozen-schema clients may append @tsnav or @swiftnav references|definition|implementations <repo-path>:<line>:<column> for compiler/LSP-backed semantic navigation.' },
51
+ include_learning_recall: { type: 'boolean', description: 'Defaults to true for semantic task/capability queries. Set false for routine progressive source follow-ups or micro-steps when the already recalled working set is still valid. This is a model-owned attention/cadence choice, not a Forge semantic trigger.' },
52
+ knowledge_query: { type: 'string', description: 'Optional explicit read-only Cognitive audit query. Ordinary code/capability intent queries already receive a bounded relevant-learning recall; use this field for deliberate memory inspection. May be used without code query. Use "*" or omit text with filters to list learned advisory memory in scopes reachable from this repo/Work.' },
53
+ knowledge_memory_id: { type: 'string', description: 'Optional exact Cognitive memory id for inspection.' },
54
+ knowledge_scope_kind: { type: 'string', enum: ['work', 'requirement', 'plan', 'plan_step', 'project', 'workspace'], description: 'Optional Cognitive scope filter; it must already be reachable from the selected repo/Work.' },
55
+ knowledge_scope_id: { type: 'string', description: 'Optional Cognitive scope id paired with knowledge_scope_kind.' },
56
+ knowledge_concept: { type: 'string', description: 'Optional exact learned concept filter.' },
57
+ knowledge_facet: { type: 'string', description: 'Optional exact learned facet filter.' },
58
+ knowledge_source_kind: { type: 'string', enum: ['experience', 'outcome', 'knowledge', 'controller', 'system', 'external'], description: 'Optional provenance source-kind filter.' },
59
+ knowledge_source_work_id: { type: 'string', description: 'Optional provenance source Work filter.' },
60
+ knowledge_limit: { type: 'number', minimum: 1, maximum: 100, description: 'Per-call read envelope for explicit Cognitive audit/expansion; defaults to 24. This is a context/transport budget, not a semantic claim that N memories are sufficient.' },
46
61
  known_paths: { type: 'array', items: { type: 'string' }, description: 'Optional exact paths or globs that should receive highest retrieval priority.' },
47
62
  include_globs: { type: 'array', items: { type: 'string' } },
48
63
  exclude_globs: { type: 'array', items: { type: 'string' } },
@@ -52,7 +67,7 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
52
67
  semantic_navigation: {
53
68
  type: 'array',
54
69
  maxItems: 8,
55
- description: 'Optional bounded semantic navigation through the provider registry. TypeScript uses the in-process Language Service; Swift uses SourceKit-LSP only with existing build settings; registered generic LSP providers currently cover Rust, Go, Python, and C/C++ when their language-server executable and project root markers already exist. Providers start lazily only for explicit semantic requests; Forge never installs a server, triggers a build, or treats language-server output as source authority.',
70
+ description: 'Optional bounded semantic navigation through the provider registry. TypeScript uses a short-lived release-owned Language Service sidecar so compiler/project allocator growth never remains resident in the canonical Runtime; Swift uses SourceKit-LSP only with existing build settings; registered generic LSP providers currently cover Rust, Go, Python, and C/C++ when their language-server executable and project root markers already exist. Providers start lazily only for explicit semantic requests; Forge never installs a server, triggers a build, or treats language-server output as source authority.',
56
71
  items: {
57
72
  type: 'object',
58
73
  required: ['navigation', 'path', 'line', 'column'],
@@ -74,59 +89,73 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
74
89
  work_id: { type: 'string' },
75
90
  detail_level: { type: 'string', enum: ['summary', 'detail', 'raw'], description: 'Defaults to summary; raw is still bounded.' },
76
91
  }),
77
- definition('rh_work', 'Preferred ChatGPT facade for bounded execution, optional Requirement authority, optional planning, controller ownership, and external SuperController launch. Requirement and Plan are not universal prerequisites: start explicit bounded work directly when safe, establish Requirement authority only when durable goal identity is useful, and use Plan only for real decomposition, dependency ordering, or replanning.', {
92
+ definition('rh_work', 'Preferred ChatGPT facade for optional durable Requirement/Plan/Work semantic context, explicit recovery, scheduling/workflow intent, and external controller launch. Ordinary execution and validation use direct domain capabilities; provider/session binding, retries, transport recovery, dedupe, and other mechanical bookkeeping stay internal.', {
78
93
  repo_id: repoId,
79
94
  checkout_id: { type: 'string', description: 'Optional checkout identity for exact Work and Plan source selection.' },
80
- operation: { type: 'string', enum: [...RH_WORK_OPERATIONS], description: 'Defaults to start. controller_disposition records ChatGPT\'s explicit end-of-round continue/wait decision; Forge never infers the semantic next step. requirement_create establishes optional durable Requirement authority only and never implies plan_create. requirement_continue records an explicit semantic continue for a Requirement waiting_for_user and resumes it to active without creating a new Work or Plan. Plan-bound starts require plan_id and plan_step_id, but Plan is a late semantic commitment for real decomposition/replanning rather than a universal complex-task wrapper. plan_accept_step records explicit Controller semantic acceptance after machine delivery leaves a step validating. schedule_* manages Work-bound continuation, bounded browser observation, and explicit standalone browser keepalive.' },
95
+ operation: { type: 'string', enum: [...RH_WORK_MODEL_OPERATIONS], description: 'Defaults to start. list reads current semantic Work plus a bounded recent terminal history for the selected repository; start creates semantic Work context only. Requirement, Plan, and Work remain model-authored durable semantic records; execution and validation use direct capabilities. Work completion is an explicit semantic update rather than an execution phase transition.' },
96
+ limit: { type: 'number', minimum: 1, maximum: 100, description: 'Bounded result limit for list operations.' },
81
97
  objective: { type: 'string' },
82
- capability_id: { type: 'string', description: 'Legacy-readable compatibility input. operation=repair maps semantic.v1:<bounded-payload> only to an explicitly allowlisted forward-compatible semantic facade operation and then re-enters its canonical Runtime handler; current allowlist supports requirement_create, plan_create obligation continuity, and bounded start technical admission fields (work_kind, engineering_preconditions, paired controller_authority_id/relay_scope_id) while requirement_id remains an explicit stable field. Existing compatibility forms also map schedule.delete:<scheduleId>, controller.disposition:<disposition>:<relayScopeId> for live-owner rounds or controller.disposition:<disposition>:<authorityId>:<relayScopeId> for exact terminal closure, controller.round:<operation>:<authorityId>:<relayScopeId> including plan_accept_step, controller.authority.recover:<workId>, plan.step.retry:<workId>, and work.review:<decision>:<workId> without creating alternate lifecycle or persistence authority.' },
98
+ capability_id: { type: 'string', description: 'Compatibility-only carrier. Current callers should use typed rh_work fields directly. The outer adapter accepts only the bounded frozen semantic.v1 bridge and current-conversation enrollment, validates them without persistence, and routes them into the same Thin owners.' },
83
99
  work_id: { type: 'string' },
84
100
  workflow_id: { type: 'string', description: 'Versioned Workflow asset identity for workflow_execute/workflow_reconcile.' },
85
101
  workflow_run_id: { type: 'string', description: 'Stable run identity. Reusing it resumes only the exact same workflow/content/input identity.' },
86
102
  workflow_inputs: { type: 'object', description: 'Typed Workflow inputs validated against the installed asset contract.' },
87
103
  workflow_scope_project_id: { type: 'string', description: 'Optional project-scoped Workflow registry identity. First-party Xiaohongshu assets use controller scope and still validate the owning Work project/account inputs.' },
88
104
  workflow_reconciliation_request_id: { type: 'string', description: 'Fresh idempotency identity for one reconciliation observation. Retry the same observation with the same id; use a new id only for a later observation.' },
89
- related_work_id: { type: 'string', description: 'Optional explicit existing Work ownership target for continue/extend semantics. Unrelated active Work is never inferred as a semantic target.' },
90
- work_relation: { type: 'string', enum: ['continue', 'extend', 'parallel', 'new_goal'], description: 'Optional semantic relation to an explicitly related Work. This field never selects Direct/Process/Durable execution depth; checkout conflicts are resolved by placement.' },
91
- related_plan_id: { type: 'string', description: 'Explicit existing Plan target for compatibility extend/revision semantics. Requirement membership alone never selects a related Plan.' },
92
- plan_relation: { type: 'string', enum: ['extend', 'parallel'], description: 'Compatibility relation to an explicitly related Plan. Requirement membership alone never requires a relation. extend revises the related stable Plan identity in place (draft repair or durable committed revision); parallel remains accepted for older clients, while a distinct scope can create directly without it.' },
93
- requested_by: { type: 'string', enum: ['chatgpt', 'user', 'system', 'scheduler'], description: 'Origin of the request. Scheduler-origin starts are continuation-only and cannot create new durable Work.' },
94
- requirement_id: { type: 'string', description: 'Stable Requirement authority for requirement_create/requirement_continue or optional authority used to find related active Work before creation; ordinary Work may start without Requirement or Plan authority.' },
105
+ requirement_id: { type: 'string', description: 'Stable Requirement identity for requirement_get/requirement_revise/requirement_create or optional semantic context link for Work/Plan.' },
106
+ expected_revision: { type: 'number', minimum: 1, description: 'Expected current semantic revision for requirement_revise, plan_revise, revise, or complete. Stale writers fail and return current state; Forge never performs an implicit merge.' },
107
+ work_state: { type: 'string', enum: ['open', 'completed', 'cancelled'], description: 'Thin semantic Work state for revise.' },
108
+ work_result_refs: { type: 'array', maxItems: 100, uniqueItems: true, items: { type: 'string', maxLength: 512 }, description: 'Model/user-selected result references for thin semantic Work; separate from mechanical evidence and delivery receipts.' },
109
+ semantic_parent_work_id: { type: 'string', minLength: 1, maxLength: 256, description: 'Optional objective-decomposition parent for primary semantic Work. Distinct from execution parentWorkId and continuation lineage.' },
110
+ depends_on_work_ids: { type: 'array', maxItems: 32, uniqueItems: true, items: { type: 'string', minLength: 1, maxLength: 256 }, description: 'Explicit semantic ordering dependencies for primary Work. No edge means siblings may proceed independently; this field never dispatches or blocks Scheduler execution by itself.' },
111
+ requirement_revision: { type: 'number', minimum: 1, description: 'Work start defaults to selected Requirement head; Work revise explicitly adopts an existing semantic revision via expected_revision CAS, including historical revisions. For Plan, optional provenance.' },
112
+ plan_revision: { type: 'number', minimum: 1, description: 'Work start defaults to selected Plan head; Work revise explicitly adopts an existing semantic revision via expected_revision CAS, including historical revisions. Work get compares adopted and current heads without rebinding.' },
95
113
  requirement_title: { type: 'string', description: 'Human-readable Requirement title for requirement_create.' },
96
114
  requirement_outcome: { type: 'string', description: 'Durable outcome statement for requirement_create.' },
97
115
  requirement_acceptance_criteria: { type: 'array', items: { type: 'string' }, description: 'Bounded semantic acceptance criteria for requirement_create.' },
98
116
  requirement_delivery_references: { type: 'array', items: { type: 'string' }, description: 'Optional durable delivery/reference identifiers for requirement_create.' },
99
117
  requirement_legacy_aliases: { type: 'array', items: { type: 'string' }, description: 'Optional migration aliases for requirement_create; not a second identity authority.' },
100
- handoff_id: { type: 'string', description: 'Optional existing HandoffItem used to resume controller context. Required for controller_disposition=wait_for_user.' },
101
- disposition: { type: 'string', enum: ['continue_immediately', 'wait', 'wait_for_user', 'goal_complete'], description: 'Explicit ChatGPT end-of-round semantic decision. continue_immediately is consumed only after the current controller lease closes.' },
102
- relay_scope_id: { type: 'string', description: 'Stable Requirement/Goal relay identity. Requirement-bound Work uses requirement:<id>; otherwise reuse the exact returned goal scope across Works.' },
103
- controller_authority_id: { type: 'string', description: 'Opaque durable authority for the currently dispatched ChatGPT controller round. Required with relay_scope_id for lifecycle mutation of relay-bound Work; rotates before a successor round while surviving MCP transport/Runtime rotation within the same round.' },
104
- assistant_context_digest: { type: 'string', description: 'Exact digest returned at controller_claim for the context snapshot whose items are being classified at round close.' },
105
- assistant_context_usage: { type: 'array', maxItems: 32, items: { type: 'object', additionalProperties: false,
106
- properties: { kind: { type: 'string', enum: ['knowledge', 'experience'] }, itemId: { type: 'string' }, decision: { type: 'string', enum: ['used', 'rejected'] }, reason: { type: 'string', maxLength: 1000 } },
107
- required: ['kind', 'itemId', 'decision', 'reason'] }, description: 'Exact claim-time context items classified as used or rejected. If supplied, every delivered item must be classified; omitted usage remains an explicit coverage gap.' },
108
- execution_quality_decisions: { type: 'array', maxItems: 8, items: { type: 'object', additionalProperties: false,
109
- properties: { fingerprint: { type: 'string' }, action: { type: 'string', enum: ['no_adjustment', 'adjustment'] },
110
- reason: { type: 'string', maxLength: 1000 }, verificationCondition: { type: 'string', maxLength: 1000 } },
111
- required: ['fingerprint', 'action', 'reason'] }, description: 'Controller diagnosis of delivered execution-quality signals. Adjustments require an explicit verification condition; budgets and mandatory checks remain unchanged.' },
112
- execution_quality_adjustment_results: { type: 'array', maxItems: 8, items: { type: 'object', additionalProperties: false,
113
- properties: { fingerprint: { type: 'string' }, outcome: { type: 'string', enum: ['improved', 'not_improved', 'inconclusive'] }, evidenceRefs: { type: 'array', maxItems: 16, items: { type: 'string' } }, reason: { type: 'string', maxLength: 1000 } },
114
- required: ['fingerprint', 'outcome', 'evidenceRefs', 'reason'] }, description: 'Post-adjustment result for a prior adjustment decision. Every evidenceRef must be a Work check receipt recorded after that decision; the result never resets ControllerRound budgets.' },
115
- outcome_observation: { type: 'object', description: 'Typed OutcomeObservation draft for outcome_record. sourceWorkId/sourceRoundId are derived from the exact current Controller authority and cannot be supplied by the caller.' },
116
- experience_draft: { type: 'object', description: 'Typed Experience draft for experience_record. source Work/Round authority is derived from the current Controller claim.' },
117
- quality_adjustment_fingerprint: { type: 'string', description: 'Optional quality adjustment fingerprint. When present, experience_record requires a verified non-inconclusive adjustment result and includes all of its verification receipts as evidence.' },
118
- state_fingerprint: { type: 'string', description: 'Optional controller-observed semantic-state fingerprint. When omitted, Forge derives a mechanical fingerprint from current Requirement/Work/Handoff state.' },
119
- max_rounds: { type: 'number', description: 'Mechanical immediate-relay round budget; defaults to 8 and cannot be loosened within an existing relay scope.' },
120
- max_repeated_state: { type: 'number', description: 'Mechanical repeated-state fence; defaults to 2 repeated observations and cannot be loosened within an existing relay scope.' },
121
- controller_id: { type: 'string', description: 'Stable external SuperController identity for controller_claim/release.' },
122
- controller_type: { type: 'string', enum: ['chatgpt', 'codex', 'grok', 'claude', 'human'], description: 'Controller kind for claims and launcher_start.' },
123
- session_id: { type: 'string', description: 'Controller-owned session identity used for an exclusive Work lease.' },
124
- lease_ms: { type: 'number', description: 'Authenticated Controller ownership lease duration, bounded to one hour. Legacy launcher callers may still use this as a launch-reservation TTL.' },
118
+ requirement_state: { type: 'string', enum: ['open', 'completed', 'cancelled'], description: 'Thin semantic Requirement state for requirement_revise.' },
119
+ requirement_candidate_id: { type: 'string', description: 'Exact Cognitive memory id for operation=requirement_promote_candidate.' },
120
+ handoff_id: { type: 'string', description: 'Optional existing HandoffItem to include as bounded context for launcher_start.' },
121
+ learning_signals: { type: 'array', maxItems: CONTROLLER_LEARNING_SIGNAL_ENVELOPE_MAX_ITEMS, items: { type: 'object', additionalProperties: false,
122
+ properties: {
123
+ scope_kind: { type: 'string', enum: ['work', 'requirement', 'project', 'workspace'] },
124
+ kind: { type: 'string', maxLength: 64, description: 'Compact model-authored descriptive kind (for example principle, procedure, product-model, architecture-pattern). This vocabulary is open and never an admission gate.' },
125
+ valence: { type: 'string', enum: ['positive', 'negative', 'neutral'] },
126
+ summary: { type: 'string', maxLength: 2000 },
127
+ concepts: { type: 'array', minItems: 1, maxItems: 32, uniqueItems: true, items: { type: 'string', maxLength: 256 } },
128
+ facets: { type: 'array', maxItems: 12, uniqueItems: true, items: { type: 'string', maxLength: 128 } },
129
+ admission_source: { type: 'string', enum: ['explicit_human', 'controller_observation', 'system_inference'] },
130
+ portability: { type: 'string', enum: ['local', 'portable'] },
131
+ salience: { type: 'number', minimum: 0, maximum: 1 },
132
+ confidence: { type: 'number', minimum: 0, maximum: 1 },
133
+ utility: { type: 'number', minimum: 0, maximum: 1 },
134
+ evidence_refs: { type: 'array', maxItems: 16, uniqueItems: true, items: { type: 'string', maxLength: 512 } },
135
+ counter_evidence_refs: { type: 'array', maxItems: 16, uniqueItems: true, items: { type: 'string', maxLength: 512 } },
136
+ expires_at: { type: 'string' },
137
+ },
138
+ required: ['scope_kind', 'kind', 'valence', 'summary', 'concepts', 'admission_source', 'portability', 'salience', 'confidence', 'utility'] },
139
+ description: 'Model-authored semantic deltas, never keyword/phrase-derived lessons. The array bound is only one MCP transport envelope; it is not a per-interaction learning quota. With operation=learning_record, project/workspace learning is lifecycle-free; when work_id is selected, its server-derived reachable Work/Requirement scopes are also available through the same writer. Distill reusable judgement/procedure/product/architecture knowledge rather than copying raw transcripts or source prose.' },
140
+ learning_feedback: { type: 'array', maxItems: 32, items: { type: 'object', additionalProperties: false,
141
+ properties: {
142
+ memory_address: { type: 'string', maxLength: 1024, description: 'Exact stable memoryId/address returned by learningRecall or Cognitive audit.' },
143
+ decision: { type: 'string', enum: ['used', 'rejected'] },
144
+ reason: { type: 'string', maxLength: 1000 },
145
+ rejection_kind: { type: 'string', enum: ['irrelevant', 'stale', 'contradicted'], description: 'Required only for rejected feedback. Semantic classification is model-authored, never inferred from keywords.' },
146
+ },
147
+ required: ['memory_address', 'decision', 'reason'] },
148
+ description: 'Lifecycle-free advisory retrieval feedback for operation=learning_feedback. The current principal/session and repository-reachable Cognitive scope are server-derived; feedback influences retrieval utility only and never factual confidence or execution authority.' },
149
+ outcome_observation: { type: 'object', description: 'Typed Work-specific OutcomeObservation draft for outcome_record. Work semantic provenance is derived server-side and cannot be supplied by the caller.' },
150
+ experience_draft: { type: 'object', description: 'Typed verified Work Experience draft for experience_record. Generic teaching/correction belongs in learning_record instead; source provenance is derived from current Work semantic context.' },
151
+ quality_adjustment_fingerprint: { type: 'string', description: 'Optional quality adjustment fingerprint for experience_record when backed by verified evidence.' },
152
+ controller_type: { type: 'string', enum: ['chatgpt', 'codex', 'grok', 'claude'], description: 'External controller kind for launcher_start.' },
125
153
  launch_reservation_ms: { type: 'number', description: 'Short duplicate-spawn reservation TTL for launcher_start or schedule_create; does not grant Work ownership.' },
126
154
  executable: { type: 'string', description: 'External controller executable for launcher_start. This is owned by the Launcher, not the Kernel.' },
127
155
  launch_args: { type: 'array', items: { type: 'string' }, description: 'Provider-specific arguments for launcher_start.' },
128
156
  browser_session_id: { type: 'string', description: 'Saved Forge ChatGPT browser session to continue when controller_type=chatgpt.' },
129
157
  conversation_url: { type: 'string', description: 'Explicit https://chatgpt.com conversation URL used when no saved Forge browser session exists.' },
158
+ transport_conversation: { type: 'string', enum: ['bound', 'fresh'], description: 'ChatGPT launcher transport only. When omitted, an existing Work binding or explicit conversation_url is reused; otherwise a fresh conversation is created. bound requires an existing binding or explicit conversation_url. fresh always starts a new conversation and records transport metadata after provider delivery is observed.' },
130
159
  continuation_prompt: { type: 'string', description: 'Bounded Work continuation instruction.' },
131
160
  schedule_id: { type: 'string', description: 'Schedule identity for schedule_get/pause/resume/delete/trigger.' },
132
161
  schedule_name: { type: 'string', description: 'Human-readable schedule name.' },
@@ -163,151 +192,23 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
163
192
  backoff_max_minutes: { type: 'number' },
164
193
  include_occurrences: { type: 'boolean' },
165
194
  plan_id: { type: 'string' },
166
- plan_step_id: { type: 'string', description: 'PlanContract step identity. Used to bind a complex Goal Workloop start and to accept a validating step.' },
167
- acceptance_rationale: { type: 'string', description: 'Controller rationale for plan_accept_step after reviewing the completed Work evidence against the Plan step acceptance criteria.' },
168
- scope_key: { type: 'string', description: 'Stable normalized scope identity used to prevent overlapping active plans.' },
195
+ superseded_by: { type: 'string', description: 'For plan_revise only: record the one-way successor Plan lineage. Once set it cannot be cleared or redirected; current Plan listings exclude the predecessor without restoring legacy Plan lifecycle semantics.' },
196
+ scope_key: { type: 'string', description: 'Optional normalized semantic scope label for Plan discovery/lineage; it is not execution ownership or a repository mutex.' },
169
197
  source_revision: { type: 'string', description: 'Repository revision observed during read-only planning preflight.' },
170
- plan_steps: { type: 'array', items: { type: 'object' }, description: 'Bounded plan steps with id, objective, dependencies, authoritative_files, allowed_paths, forbidden_paths, check_ids, and acceptance_criteria.' },
198
+ plan_items: { type: 'array', maxItems: 100, items: { type: 'object', required: ['id', 'objective'], additionalProperties: false, properties: { id: { type: 'string', maxLength: 200 }, objective: { type: 'string', maxLength: 2000 }, dependencies: { type: 'array', maxItems: 100, items: { type: 'string', maxLength: 200 } } } }, description: 'Thin model-authored Plan items for plan_create/plan_revise. Items are descriptive working memory only and never own paths, checks, Work, scheduling, or acceptance.' },
171
199
  non_goals: { type: 'array', items: { type: 'string' } },
172
200
  assumptions: { type: 'array', items: { type: 'string' } },
173
201
  resolved_decisions: { type: 'array', items: { type: 'string' } },
174
202
  stop_conditions: { type: 'array', items: { type: 'string' } },
175
203
  replan_conditions: { type: 'array', items: { type: 'string' } },
176
204
  integration_strategy: { type: 'string' },
177
- obligation_dispositions: { type: 'array', items: { type: 'object' }, description: 'For successor Plans, explicit predecessor obligation reconciliation. Each item carries predecessor_plan_id, obligation_id, disposition keep/change/defer/drop, successor_refs, and rationale for change/defer/drop.' },
178
- superseded_by: { type: 'string', description: 'For plan_supersede, the explicit replacement Plan id. For legacy active Plan-bound Work scope repair, a compatibility revision label only; the stable Plan identity is not replaced.' },
179
- expected_files: { type: 'number' },
180
- expected_changed_lines: { type: 'number' },
181
- mode: { type: 'string', enum: ['plan', 'scale'], description: 'Explicit durable Plan/Scale mode for start. Plan binds one approved PlanContract delivery step without implying isolation; Scale additionally coordinates parallel delivery through existing Work/Process/resource-claim authorities.' },
182
- work_kind: { type: 'string', enum: ['repository_change', 'completed_no_change', 'read_only_review', 'investigation', 'local_effect', 'remote_effect', 'reconciliation'], description: 'Explicit technical Work evidence shape for operation=start. read_only_review is a recoverable source-frozen review lifecycle: it permits inspected-path/finding persistence without repository edits and only clean-finalizes after unchanged-source proof. local_effect/remote_effect represent effect-only execution; completed_no_change/investigation/reconciliation likewise do not imply a source mutation. None imply semantic completion; ChatGPT must still explicitly finalize after reviewing evidence.' },
183
- scope_clear: { type: 'boolean' },
184
- requires_investigation: { type: 'boolean' },
185
- requires_long_running_checks: { type: 'boolean' },
186
- requires_parallelism: { type: 'boolean' },
187
- needs_dependencies: { type: 'boolean' },
188
- requires_recovery: { type: 'boolean' },
189
- requires_worker: { type: 'boolean', description: 'Opt-in only. Set true only when the user explicitly requests Codex/Claude or another agent worker; never infer it from task complexity.' },
190
- requires_external_effect: { type: 'boolean' },
191
- requires_approval: { type: 'boolean' },
192
- requires_user_approval: { type: 'boolean' },
193
- destructive: { type: 'boolean' },
194
- remote_write: { type: 'boolean' },
195
- secret_access: { type: 'boolean' },
196
205
  approval_confirmed: { type: 'boolean' },
197
206
  dry_run: { type: 'boolean', description: 'Defaults to true for repair.' },
198
- check_ids: { type: 'array', items: { type: 'string' }, description: 'Requested checks. Before launching multiple checks concurrently, call rh_context with requested_check_ids to read resource-compatible checkScheduling waves; do not overlap checks from different waves.' },
199
- check_id: { type: 'string' },
200
- acceptance_criteria: { type: 'array', items: { type: 'string' } },
201
- allowed_paths: { type: 'array', items: { type: 'string' } },
202
- initial_likely_paths: { type: 'array', items: { type: 'string' }, description: 'Non-authoritative first-pass discovery candidates. May expand after investigation; allowed_paths remains a policy fence only.' },
203
- engineering_preconditions: {
204
- type: 'object',
205
- description: 'Semantic precondition draft for start/continue. Context Closure must be the complete rh_context receipt; Product DoD, Design and independent critique are semantic content. Forge validates current source/provenance and mints the durable receipt ids server-side; raw caller-supplied evidence ids are never accepted as admission authority.',
206
- properties: {
207
- context_closure: { type: 'object' },
208
- product_dod: { type: 'object', properties: {
209
- user_outcome: { type: 'string' },
210
- completion_conditions: { type: 'array', items: { type: 'string' } },
211
- non_regression: { type: 'array', items: { type: 'string' } },
212
- performance_expectations: { type: 'array', items: { type: 'string' } },
213
- non_goals: { type: 'array', items: { type: 'string' } },
214
- }, required: ['user_outcome', 'completion_conditions', 'non_regression', 'performance_expectations', 'non_goals'], additionalProperties: false },
215
- design_decision: { type: 'object', properties: {
216
- semantic_scope_keys: { type: 'array', items: { type: 'string' } },
217
- mutation_class: { type: 'string', enum: ['readonly', 'isolated_write', 'integration_write', 'external_effect'] },
218
- supersedes_receipt_id: { type: 'string' },
219
- decisions: { type: 'object', properties: {
220
- ownership: { type: 'string' }, single_writer: { type: 'string' }, transaction: { type: 'string' }, lifecycle: { type: 'string' }, concurrency: { type: 'string' }, persistence: { type: 'string' }, failure: { type: 'string' }, projection_cache: { type: 'string' }, time: { type: 'string' }, performance: { type: 'string' }, compatibility: { type: 'string' },
221
- }, required: ['ownership', 'single_writer', 'transaction', 'lifecycle', 'concurrency', 'persistence', 'failure', 'projection_cache', 'time', 'performance', 'compatibility'], additionalProperties: false },
222
- complexity_budget: { type: 'object', properties: {
223
- added_writers: { type: 'number' }, added_durable_mechanisms: { type: 'number' }, projection_paths: { type: 'number' }, global_invalidations: { type: 'number' }, lifecycle_hooks: { type: 'number' }, synchronous_critical_path_work: { type: 'number' }, notes: { type: 'array', items: { type: 'string' } },
224
- }, additionalProperties: false },
225
- }, required: ['semantic_scope_keys', 'mutation_class', 'decisions', 'complexity_budget'], additionalProperties: false },
226
- independent_critique: { type: 'object', properties: {
227
- decision: { type: 'string', enum: ['approved', 'changes_required', 'blocked'] },
228
- findings: { type: 'array', items: { type: 'object', properties: { severity: { type: 'string', enum: ['critical', 'high', 'medium', 'low', 'info'] }, summary: { type: 'string' } }, required: ['severity', 'summary'], additionalProperties: false } },
229
- }, required: ['decision', 'findings'], additionalProperties: false },
230
- },
231
- required: ['context_closure', 'product_dod', 'design_decision', 'independent_critique'],
232
- additionalProperties: false,
233
- },
234
- engineering_blocker: { type: 'object', description: 'Explicit semantic blocker classification for continue. Forge derives return_to_design vs linked_work; free text cannot widen the current Work.', properties: {
235
- blocker_id: { type: 'string' }, classification: { type: 'string', enum: ['same_root_cause', 'unrelated'] }, rationale: { type: 'string' }, semantic_scope_keys: { type: 'array', items: { type: 'string' } },
236
- }, required: ['blocker_id', 'classification', 'rationale'], additionalProperties: false },
237
- additional_likely_paths: { type: 'array', items: { type: 'string' }, description: 'Non-authoritative candidates discovered after Work start. Valid for continue; does not widen allowed_paths.' },
238
- inspected_paths: { type: 'array', items: { type: 'string' }, description: 'Paths actually inspected during progressive discovery. Valid for continue; does not widen allowed_paths.' },
239
- review_findings: { type: 'array', items: { type: 'string' }, description: 'Concise semantic findings for operation=continue on work_kind=read_only_review. Findings are source-bound durable review evidence and prevent clean completed_no_change finalization until a successor repair/review resolves them.' },
240
- review_decision: { type: 'string', enum: ['approved', 'changes_required', 'blocked'], description: 'Explicit Controller implementation-review decision for operation=review. No default approval.' },
241
- review_rationale: { type: 'string', description: 'Explicit Controller rationale for operation=review.' },
242
- implementation_review_findings: { type: 'array', items: { type: 'object', required: ['severity', 'category', 'summary'], properties: { severity: { type: 'string', enum: ['critical', 'high', 'medium', 'low', 'info'] }, category: { type: 'string' }, summary: { type: 'string' }, path: { type: 'string' }, symbol: { type: 'string' } }, additionalProperties: false }, description: 'Structured implementation-review findings. Candidate source, fingerprints, paths, and evidence identities are derived by Forge and are never accepted from the caller.' },
243
- acceptance_evidence: { type: 'array', items: { type: 'object', required: ['criterion', 'evidence_ids', 'rationale'], properties: { criterion: { type: 'string', description: 'Exact declared Work acceptance criterion reviewed by the Controller.' }, evidence_ids: { type: 'array', items: { type: 'string' }, description: 'Durable evidence ids already attributed to this Work that support this exact criterion.' }, rationale: { type: 'string', description: 'Controller rationale for why the cited evidence satisfies this exact criterion.' } }, additionalProperties: false }, description: 'Operation=continue only. Explicit Controller-reviewed criterion-to-evidence bindings for no-check local_effect Work. Mechanical plugin/process attribution alone never implies semantic acceptance.' },
244
- acceptance_failure_decision: { type: 'string', enum: ['repair', 'rescope'], description: 'Explicit Controller decision for operation=continue after a deterministic valid_fail. Bypasses acceptance-review handoff only for this bounded repair/re-scope decision; never inferred from free text.' },
245
- forbidden_paths: { type: 'array', items: { type: 'string' } },
246
- constraints: {
247
- type: 'object',
248
- properties: {
249
- max_changed_files: { type: 'number' },
250
- max_changed_lines: { type: 'number' },
251
- allow_commit: { type: 'boolean' },
252
- allow_merge: { type: 'boolean' },
253
- allow_cleanup: { type: 'boolean' },
254
- allow_destructive: { type: 'boolean' },
255
- require_handoff_on_ambiguity: { type: 'boolean' },
256
- access_mode: { type: 'string', enum: ['request', 'full_access'] },
257
- workspace_mode: { type: 'string', enum: ['current', 'isolated', 'auto'], description: 'Typed placement policy. isolated is an admission fence and cannot be downgraded to Direct Control.' },
258
- require_worktree: { type: 'boolean', description: 'Typed placement policy. true requires isolated Work placement before routing.' },
259
- direct_main_prohibited: { type: 'boolean', description: 'Typed admission fence. true forbids Direct Control/current-main repository mutation.' },
260
- },
261
- additionalProperties: true,
262
- },
263
207
  repair_operation: { type: 'string', enum: ['diagnose', 'repair', 'verify', 'handoff'] },
264
- target: { type: 'string', enum: ['codex', 'grok', 'claude'], description: 'Explicit small-brain delegate target for operation=delegate. Delegation is never the default execution path.' },
265
- available: { type: 'boolean', description: 'Whether the delegate target is currently available.' },
266
- codex_available: { type: 'boolean' },
267
- simulate_check: { type: 'boolean', description: 'Test hook: skip real check execution and use infrastructure_failed/check_failed flags.' },
268
- infrastructure_failed: { type: 'boolean' },
269
- check_failed: { type: 'boolean' },
270
208
  authorize_destructive_cleanup: { type: 'boolean' },
271
- commit: { type: 'boolean', description: 'Finalize override. Defaults to true only when the Work owns uncommitted changes.' },
272
- merge: { type: 'boolean', description: 'Finalize override. Defaults to true for managed Work delivery.' },
273
- cleanup: { type: 'boolean', description: 'Finalize/stop override. Defaults to true so managed worktrees close automatically.' },
274
- target_branch: { type: 'string', description: 'Delivery branch; defaults to the repository default branch.' },
275
- delete_branch: { type: 'boolean', description: 'Defaults to true after target-branch containment is proven.' },
276
- no_ff: { type: 'boolean' },
277
- completion_outcome: { type: 'string', enum: ['completed_changed', 'completed_no_change', 'completed_local', 'completed_remote'], description: 'Explicit completion semantics. completed_local is for controller-local effect Work finalized from durable result evidence; completed_remote remains bound to a durable remote plugin receipt.' },
278
- no_change_evidence: { type: 'string', description: 'Optional explicit proof for a no-change completion; otherwise the lifecycle coordinator derives proof only for an unchanged validated HEAD.' },
279
- reconcile_historical_delivery: { type: 'boolean', description: 'Explicitly request reviewed reconciliation for a historically delivered repository Work whose original receipt is missing. Managed Work is eligible only after merge, branch cleanup, and worktree cleanup are durably complete.' },
280
- reconcile_target_revision: { type: 'string', description: 'Exact already-integrated commit accepted by the reviewer.' },
281
- reconcile_compared_paths: { type: 'array', items: { type: 'string' }, description: 'Complete exact path set changed from the Work base revision to reconcile_target_revision.' },
282
- reconcile_rationale: { type: 'string', description: 'Bounded reviewer rationale for accepting the historical delivery.' },
283
- reconcile_cleanup_proof: { type: 'string', description: 'Concrete proof that no owned cleanup remains or that cleanup is complete.' },
284
209
  detail_level: { type: 'string', enum: ['summary', 'detail'] },
285
210
  reason: { type: 'string', description: 'Bounded reason for a work stop or repair record.' },
286
211
  }, [], false),
287
- definition('work_get', 'Resume one Work by work_id or request_id. Repository scope is always enforced.', {
288
- repo_id: repoId,
289
- work_id: { type: 'string' },
290
- request_id: { type: 'string' },
291
- include_events: { type: 'boolean' },
292
- wait: { type: 'boolean', description: 'When true, wait for terminal status before returning digest.' },
293
- wait_ms: { type: 'number' },
294
- }),
295
- definition('work_list', 'List recent resumable Work for one repository.', {
296
- repo_id: repoId,
297
- limit: { type: 'number' },
298
- }),
299
- definition('work_cancel', 'Cancel one queued or running Work by work_id or request_id.', {
300
- repo_id: repoId,
301
- work_id: { type: 'string' },
302
- request_id: { type: 'string' },
303
- reason: { type: 'string' },
304
- }, [], false),
305
- definition('work_wait', 'Wait for one Work/ExecutionJob/managed process to reach a terminal status and return a bounded operation digest.', {
306
- repo_id: repoId,
307
- work_id: { type: 'string' },
308
- request_id: { type: 'string' },
309
- wait_ms: { type: 'number', description: 'Max wait in ms. Default 15000, max 120000.' },
310
- }),
311
212
  definition('git_diff_paths', 'Return a bounded Git diff and status for explicit repository-relative paths only.', {
312
213
  repo_id: repoId,
313
214
  paths: { type: 'array', items: { type: 'string' } },
@@ -335,7 +236,7 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
335
236
  wait: { type: 'boolean', description: 'When true, wait for terminal status before returning digest.' },
336
237
  wait_ms: { type: 'number' },
337
238
  }, ['job_id']),
338
- definition('get_artifact', 'Read one bounded Evidence Plane artifact by id. Large content remains bounded.', { artifact_id: { type: 'string' }, repo_id: repoId, max_bytes: { type: 'number' } }, ['artifact_id', 'repo_id']),
239
+ definition('get_artifact', 'Read one bounded Evidence Plane artifact/evidence handle by opaque id. repo_id is optional and used only to adopt a historical repository-partitioned handle once.', { artifact_id: { type: 'string' }, repo_id: { ...repoId, description: 'Legacy repository hint only. Omit for canonical ForgeInstance output handles.' }, max_bytes: { type: 'number' } }, ['artifact_id']),
339
240
  definition('repository_change_verify', 'Composite: verify checkout/SHA, apply bounded patch, run checks, return first failure inline without get_job/get_artifact follow-ups.', {
340
241
  repo_id: repoId,
341
242
  expected_branch: { type: 'string' },
@@ -470,6 +371,30 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
470
371
  confirm_authorization: { type: 'boolean', description: 'Must be true to authorize this exact one-shot console unlock invocation.' },
471
372
  timeout_ms: { type: 'number', description: 'Bounded provider/postcondition timeout in milliseconds. Defaults to 15000 and is capped at 30000.' },
472
373
  }, ['credential_handle', 'confirm_authorization'], false),
374
+ definition('computer_console_unlock_enroll', 'Enroll provider-local device-only protected console recovery. Credential material never enters ChatGPT, Forge Runtime, plugin receipts, or replayable jobs. Requires confirm_authorization=true for every invocation.', {
375
+ confirm_authorization: { type: 'boolean', description: 'Must be true to authorize this exact provider-local enrollment invocation.' },
376
+ timeout_ms: { type: 'number', description: 'Bounded provider timeout in milliseconds. Defaults to 15000 and is capped at 30000.' },
377
+ }, ['confirm_authorization'], false),
378
+ definition('computer_console_unlock_status', 'Read protected console recovery enrollment and availability without exposing provider-local credential material. Requires confirm_authorization=true for every invocation.', {
379
+ confirm_authorization: { type: 'boolean', description: 'Must be true to authorize this exact protected status invocation.' },
380
+ timeout_ms: { type: 'number', description: 'Bounded provider timeout in milliseconds. Defaults to 15000 and is capped at 30000.' },
381
+ }, ['confirm_authorization'], false),
382
+ definition('computer_console_unlock_recover', 'Recover a locked macOS console using only previously enrolled provider-local device-only credential material. No credential is transported through ChatGPT or Forge Runtime. Requires confirm_authorization=true for every invocation.', {
383
+ confirm_authorization: { type: 'boolean', description: 'Must be true to authorize this exact one-shot recovery invocation.' },
384
+ timeout_ms: { type: 'number', description: 'Bounded provider/postcondition timeout in milliseconds. Defaults to 15000 and is capped at 30000.' },
385
+ }, ['confirm_authorization'], false),
386
+ definition('computer_console_unlock_revoke', 'Revoke provider-local protected console recovery enrollment. Requires confirm_authorization=true for every invocation.', {
387
+ confirm_authorization: { type: 'boolean', description: 'Must be true to authorize this exact provider-local revocation invocation.' },
388
+ timeout_ms: { type: 'number', description: 'Bounded provider timeout in milliseconds. Defaults to 15000 and is capped at 30000.' },
389
+ }, ['confirm_authorization'], false),
390
+ definition('capability_execute', 'Execute one typed Forge core capability through its canonical substrate owner. Discover the exact action schema with rh_context capability_id first. This stable facade prevents one top-level MCP tool per atomic repository operation; plugin capabilities continue to use plugin_action_execute.', {
391
+ repo_id: repoId,
392
+ checkout_id: { type: 'string', description: 'Optional exact checkout identity.' },
393
+ capability_id: { type: 'string', description: 'Exact core capability identity returned by rh_context.' },
394
+ action: { type: 'string', description: 'Exact capability action returned by rh_context.' },
395
+ request_id: { type: 'string', description: 'Stable idempotency identity for this invocation.' },
396
+ arguments: { type: 'object', description: 'Action-specific arguments validated by the capability owner.' },
397
+ }, ['capability_id', 'action', 'request_id'], false),
473
398
  definition('plugin_action_execute', 'Execute one typed repository or controller-scoped plugin action through the plugin provider authority. rh_context exposes plugin schemas/policy; rh_work does not execute plugin capabilities. For confirmation=authorization, normal host permission is authoritative and an exact-target Forge capability grant may be reused; do not set confirm_authorization merely because an ordinary authorization-class action was previously allowed. Strong-confirmation actions still require their explicit confirmation contract.', {
474
399
  repo_id: repoId,
475
400
  plugin_id: { type: 'string' },
@@ -528,6 +453,21 @@ export const runtimeToolDefinitions: McpToolDefinition[] = [
528
453
  recent_safe_error: { type: 'string' },
529
454
  model: { type: 'string' },
530
455
  }),
456
+ definition('supervisor_task', 'Start, list, inspect, revise, recover, stop, or prove standalone Workflow Supervisor autonomous tasks. Supervisor task/effect state is the continuation authority; Requirement, Plan, and Work are optional and are not created by this tool.', {
457
+ repo_id: { ...repoId, description: 'Optional repository provenance for start/proof; never Work authority.' },
458
+ operation: { type: 'string', enum: ['start', 'list', 'get', 'revise', 'recover', 'stop', 'proof'] },
459
+ task_id: { type: 'string' },
460
+ objective: { type: 'string', description: 'Outcome objective for start/revise; revise never changes task or conversation identity.' },
461
+ expected_objective_sha256: { type: 'string', description: 'For revise: CAS hash of the exact current objective.' },
462
+ reason: { type: 'string', description: 'Operator reason recorded for stop/recover.' },
463
+ source_effect_id: { type: 'string', description: 'Optional exact source effect for operator recovery fencing.' },
464
+ supersede_unknown: { type: 'boolean', description: 'For recover only: explicitly retire one outcome-unknown effect instead of replaying it.' },
465
+ authorized_by: { type: 'string', description: 'Optional operator identity recorded by canonical recovery authority.' },
466
+ active_only: { type: 'boolean', description: 'For list, defaults true; exclude terminal tasks.' },
467
+ request_id: { type: 'string', description: 'Stable idempotency identity for start/revise/recover.' },
468
+ active_release_id: { type: 'string', description: 'Active Runtime release expected in proof dispatch evidence.' },
469
+ not_before: { type: 'string', description: 'ISO-8601 lower bound for proof completions.' },
470
+ }, ['operation'], false),
531
471
  definition('review_artifacts_prepare', 'Create bounded repo-local review artifact roots for browser/iOS screenshot review workflows.', { repo_id: repoId }, [], false),
532
472
  definition('review_artifacts_index', 'Index bounded repo-local browser/iOS screenshots, logs, and build reports for visual review.', { repo_id: repoId, limit: { type: 'number' } }),
533
473
  definition('browser_review_packet', 'Build a browser visual review packet from indexed browser screenshots.', { repo_id: repoId, limit: { type: 'number' } }),
@@ -5,13 +5,14 @@ import { callLegacyIosAdapter } from './legacy-ios-tool-adapter';
5
5
  import { result } from './result-adapter';
6
6
  import { callContextAdapter } from './context-adapter';import { callPluginAdapter } from './plugin-adapter';import { callRecoveryAdapter } from './recovery-adapter';import { callArtifactAdapter } from './artifact-adapter';import { callFilesystemAdapter } from './filesystem-adapter';import { callModelAdapter } from './model-adapter';
7
7
  import { callProtectedComputerAdapter } from './protected-computer-adapter';
8
- import { callWorkCompatibilityAdapter } from './work-compat-adapter';
8
+ import { callWorkflowSupervisorAdapter } from './workflow-supervisor-adapter';
9
9
  import { callRepositoryCompatibilityAdapter } from './repository-compat-adapter';
10
10
  import { callSchedulerAdapter } from './scheduler-adapter';
11
11
  import { callRuntimeObservationAdapter } from './runtime-observation-adapter';
12
12
  import { callExecutionControlAdapter } from './execution-control-adapter';
13
13
  import { callMaintenanceAdapter } from './maintenance-adapter';
14
14
  import { callStatusInboxAdapter } from './status-inbox-adapter';
15
+ import { callCoreCapabilityAdapter } from './core-capability-adapter';
15
16
  export { boundedPluginArtifactImageContent } from './result-adapter';
16
17
  export { classifyTerminalCheckEvidence } from '../../../src/runtime/execution/process-runtime/check-result';
17
18
 
@@ -21,8 +22,9 @@ export {
21
22
  runtimeToolDefinitions,
22
23
  } from './runtime-tool-definitions';
23
24
  import { callWorkAdapter, runFacadeRepair } from './work-adapter';
25
+ import { automationMetadata, persistAutomationReceipt } from './automation-receipt-adapter';
24
26
 
25
- export async function callRuntimeTool(ctx: MultiRepositoryMcpToolContext, name: string, args: Record<string, unknown>): Promise<CallToolResult | undefined> {
27
+ async function callRuntimeToolUnchecked(ctx: MultiRepositoryMcpToolContext, name: string, args: Record<string, unknown>): Promise<CallToolResult | undefined> {
26
28
  try {
27
29
  const statusInbox = await callStatusInboxAdapter(ctx, name, args, { repair: runFacadeRepair });
28
30
  if (statusInbox) return statusInbox;
@@ -30,6 +32,8 @@ export async function callRuntimeTool(ctx: MultiRepositoryMcpToolContext, name:
30
32
  if (context) return context;
31
33
  const protectedComputer = await callProtectedComputerAdapter(ctx, name, args);
32
34
  if (protectedComputer) return protectedComputer;
35
+ const coreCapability = await callCoreCapabilityAdapter(ctx, name, args);
36
+ if (coreCapability) return coreCapability;
33
37
  const plugin = await callPluginAdapter(ctx, name, args);
34
38
  if (plugin) return plugin;
35
39
  const recovery = await callRecoveryAdapter(ctx, name, args);
@@ -40,8 +44,8 @@ export async function callRuntimeTool(ctx: MultiRepositoryMcpToolContext, name:
40
44
  if (filesystem) return filesystem;
41
45
  const model = callModelAdapter(ctx, name, args);
42
46
  if (model) return model;
43
- const workCompatibility = await callWorkCompatibilityAdapter(ctx, name, args);
44
- if (workCompatibility) return workCompatibility;
47
+ const workflowSupervisor = await callWorkflowSupervisorAdapter(ctx, name, args);
48
+ if (workflowSupervisor) return workflowSupervisor;
45
49
  const repositoryCompatibility = await callRepositoryCompatibilityAdapter(ctx, name, args);
46
50
  if (repositoryCompatibility) return repositoryCompatibility;
47
51
  const scheduler = await callSchedulerAdapter(ctx, name, args);
@@ -63,6 +67,12 @@ export async function callRuntimeTool(ctx: MultiRepositoryMcpToolContext, name:
63
67
  }
64
68
  }
65
69
 
66
- export { RH_WORK_VERIFY_LEASE_WAIT_MS } from './work-adapter';
70
+ export async function callRuntimeTool(ctx: MultiRepositoryMcpToolContext, name: string, args: Record<string, unknown>): Promise<CallToolResult | undefined> {
71
+ const metadata = automationMetadata(args);
72
+ const outcome = await callRuntimeToolUnchecked(ctx, name, args);
73
+ await persistAutomationReceipt(ctx, name, metadata, outcome);
74
+ return outcome;
75
+ }
76
+
67
77
  export { runtimeIdentitySnapshot, dispatchedChatgptRelayAuthorizesStaleControllerRecovery, sessionlessFacadeControllerAuthorityMatches } from './controller-authority-adapter';
68
78
  export type { RuntimeIdentitySnapshot } from './controller-authority-adapter';
@@ -66,6 +66,7 @@ export async function callRhWorkScheduleAdapter(
66
66
  workId,
67
67
  scheduleMode: scheduleModeRaw as 'continuation' | 'browser_watch' | 'browser_keepalive',
68
68
  controllerType: controllerType as ContinuationControllerType,
69
+ authorizationGrantRefs: Array.isArray(args.authorization_grant_refs) ? args.authorization_grant_refs.map(String) : undefined,
69
70
  executable: typeof args.executable === 'string' ? args.executable : undefined,
70
71
  launchArgs: Array.isArray(args.launch_args) ? args.launch_args.map(String) : undefined,
71
72
  launchReservationMs: typeof args.launch_reservation_ms === 'number' ? args.launch_reservation_ms : typeof args.lease_ms === 'number' ? args.lease_ms : undefined,
@@ -16,6 +16,26 @@ export function repositoryRootForRepoId(controllerHome: string, repoId: string):
16
16
  return listRepositories(controllerHome).find((repository) => repository.repoId === repoId)?.canonicalRoot;
17
17
  }
18
18
 
19
+ /**
20
+ * Repository selection for tools whose semantics can be instance-scoped.
21
+ *
22
+ * An explicitly named repository (or the MCP server's default repository
23
+ * context) stays authoritative and fails closed when invalid. When the caller
24
+ * names none, a sole enabled repository is used; zero or several repositories
25
+ * yield undefined so the caller can serve the ForgeInstance-level answer
26
+ * instead of inventing a repository.
27
+ */
28
+ export function selectedOptional(
29
+ ctx: MultiRepositoryMcpToolContext,
30
+ args: Record<string, unknown>,
31
+ ): ReturnType<typeof selected> | undefined {
32
+ const explicitRepoId = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
33
+ const explicitCheckoutId = typeof args.checkout_id === 'string' ? args.checkout_id.trim() : '';
34
+ if (explicitRepoId || explicitCheckoutId || ctx.explicitRepository) return selected(ctx, args);
35
+ const enabled = listRepositories(ctx.controllerHome).filter((record) => record.enabled);
36
+ return enabled.length === 1 ? selected(ctx, args) : undefined;
37
+ }
38
+
19
39
  export function expectedRevision(args: Record<string, unknown>, key = 'expected_revision'): number | undefined {
20
40
  return typeof args[key] === 'number' ? Math.trunc(args[key] as number) : undefined;
21
41
  }