@moretea-labs/forge 1.7.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/AGENTS.md +58 -62
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +42 -62
  4. package/README.md +2 -2
  5. package/SKILL.md +0 -1
  6. package/THIRD_PARTY_NOTICES.md +5 -2
  7. package/adapters/browser/index.ts +2 -0
  8. package/adapters/chatgpt/browser-delivery-host.ts +71 -0
  9. package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
  10. package/adapters/chatgpt/controller-binding-store.ts +55 -0
  11. package/adapters/chatgpt/controller-host.ts +119 -0
  12. package/adapters/chatgpt/controller-round-host.ts +78 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
  14. package/adapters/chatgpt/provider-delivery.ts +113 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/desktop-operator-contract.ts +7 -0
  18. package/adapters/computer/desktop-operator-discovery.ts +201 -0
  19. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  20. package/adapters/computer/desktop-operator-provider.ts +312 -0
  21. package/adapters/computer/index.ts +1 -0
  22. package/adapters/computer/interaction-target-authority.ts +944 -0
  23. package/adapters/controller-process/binding-store.ts +34 -0
  24. package/adapters/controller-process/controller-host.ts +26 -0
  25. package/adapters/mcp/access-mode.ts +132 -0
  26. package/adapters/mcp/audit.ts +32 -0
  27. package/adapters/mcp/auth.ts +407 -0
  28. package/adapters/mcp/controller-round-compatibility.ts +184 -0
  29. package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
  30. package/adapters/mcp/instructions.ts +36 -0
  31. package/adapters/mcp/legacy-context.ts +18 -0
  32. package/adapters/mcp/multi-repository.ts +437 -0
  33. package/adapters/mcp/oauth.ts +391 -0
  34. package/adapters/mcp/paths.ts +140 -0
  35. package/adapters/mcp/policy.ts +232 -0
  36. package/adapters/mcp/proxy-env.ts +62 -0
  37. package/adapters/mcp/readiness-projection.ts +24 -0
  38. package/adapters/mcp/redaction.ts +21 -0
  39. package/adapters/mcp/repo.ts +24 -0
  40. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  41. package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
  42. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
  43. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
  44. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  45. package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
  46. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  47. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
  48. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  49. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  50. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  51. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  52. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
  53. package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
  54. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
  55. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
  56. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  57. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  58. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
  59. package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
  60. package/adapters/mcp/runtime-gateway/router.ts +728 -0
  61. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
  62. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
  63. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  64. package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
  65. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
  66. package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
  67. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
  68. package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
  69. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
  70. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  71. package/adapters/mcp/server.ts +1048 -0
  72. package/adapters/mcp/setup.ts +791 -0
  73. package/adapters/mcp/tool-capability-cache.ts +87 -0
  74. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  75. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
  76. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
  77. package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
  78. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  79. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  80. package/adapters/mcp/toolset-names.ts +74 -0
  81. package/adapters/mcp/toolset-selection.ts +41 -0
  82. package/adapters/mcp/toolset.ts +336 -0
  83. package/adapters/mcp/transports/http.ts +1456 -0
  84. package/adapters/mcp/transports/session-registry.ts +513 -0
  85. package/adapters/mcp/transports/stdio.ts +8 -0
  86. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
  87. package/adapters/mcp/types.ts +41 -0
  88. package/assets/AGENTS.md +2 -16
  89. package/assets/CLAUDE.md +2 -16
  90. package/assets/hooks/AGENTS.md +3 -14
  91. package/assets/hooks/CLAUDE.md +3 -14
  92. package/assets/hooks/hook-input.sh +9 -2
  93. package/assets/hooks/lib/workflow-state.sh +28 -10
  94. package/assets/hooks/prompt-guard.sh +63 -37
  95. package/assets/hooks/security-sentinel.sh +2 -1
  96. package/assets/hooks/session-start-context.sh +7 -5
  97. package/assets/hooks/stop-orchestrator.sh +13 -3
  98. package/assets/initializer-question-pack.v4.json +11 -7
  99. package/assets/partials/05-workflow.partial.md +18 -73
  100. package/assets/partials/07-footer.partial.md +1 -1
  101. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  102. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  103. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  104. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  105. package/assets/plan-map.json +11 -11
  106. package/assets/plugin-registry.v1.json +9 -3
  107. package/assets/plugin-trust-policy.v1.json +6 -0
  108. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  109. package/assets/recovery/forge-wsl-rescue +271 -0
  110. package/assets/reference-configs/development-protocol.md +11 -15
  111. package/assets/reference-configs/document-generation.md +1 -1
  112. package/assets/reference-configs/global-working-rules.md +9 -1
  113. package/assets/reference-configs/harness-overview.md +22 -112
  114. package/assets/reference-configs/hook-operations.md +1 -1
  115. package/assets/reference-configs/sprint-contracts.md +2 -2
  116. package/assets/skill-version.json +2 -2
  117. package/assets/templates/helpers/architecture-event.ts +3 -34
  118. package/assets/templates/helpers/architecture-queue.sh +61 -10
  119. package/assets/templates/helpers/archive-workflow.sh +90 -180
  120. package/assets/templates/helpers/capability-config.ts +8 -11
  121. package/assets/templates/helpers/capability-resolver.ts +37 -19
  122. package/assets/templates/helpers/capture-plan.sh +2 -2
  123. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  124. package/assets/templates/helpers/check-task-sync.sh +82 -11
  125. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  126. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  127. package/assets/templates/helpers/contract-worktree.sh +26 -24
  128. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  129. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  130. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  131. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  132. package/assets/templates/helpers/new-plan.sh +2 -2
  133. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  134. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  135. package/assets/templates/helpers/switch-plan.sh +1 -1
  136. package/assets/templates/helpers/workflow-contract.ts +1 -0
  137. package/assets/workflow-contract.v1.json +63 -171
  138. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  139. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  140. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  141. package/docs/architecture/CURRENT.md +148 -13
  142. package/docs/architecture/EVOLUTION.md +13 -0
  143. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  144. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  145. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  146. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  147. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
  148. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
  149. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  150. package/docs/architecture/domains/verification.md +7 -0
  151. package/docs/architecture/domains/workflow-engine.md +1 -1
  152. package/docs/architecture/index.md +3 -3
  153. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  154. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  155. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  156. package/docs/forge-plugin-management.md +20 -4
  157. package/docs/forge-runtime-self-healing-loop.md +2 -0
  158. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  159. package/docs/operations/controller-browser-plugin.md +3 -1
  160. package/docs/operations/homebrew.md +2 -2
  161. package/docs/operations/platform-support.md +16 -8
  162. package/docs/operations/platform-support.zh-CN.md +2 -2
  163. package/docs/operations/standalone-disaster-recovery.md +26 -1
  164. package/docs/operations/uu-remote-rescue.md +41 -0
  165. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  166. package/docs/public-usage-guide.md +1 -1
  167. package/docs/public-usage-guide.zh-CN.md +1 -1
  168. package/docs/tutorials/01-install-and-start.md +1 -1
  169. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  170. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  171. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  172. package/docs/wiki/Implementation.md +1 -1
  173. package/package.json +23 -14
  174. package/packages/kernel/controller/api/index.ts +2 -0
  175. package/packages/kernel/controller/application/controller-round-service.ts +29 -0
  176. package/packages/kernel/controller/application/controller-service.ts +30 -0
  177. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
  178. package/packages/kernel/controller/domain/controller-round.ts +107 -0
  179. package/packages/kernel/controller/domain/execution-quality.ts +133 -0
  180. package/packages/kernel/controller/domain/types.ts +56 -0
  181. package/packages/kernel/controller/index.ts +1 -0
  182. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  183. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
  184. package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
  185. package/packages/kernel/controller/ports/controller-host.ts +16 -0
  186. package/packages/kernel/goal/api/index.ts +1 -0
  187. package/packages/kernel/goal/domain/types.ts +40 -0
  188. package/packages/kernel/goal/index.ts +1 -0
  189. package/packages/kernel/identity/api/index.ts +5 -0
  190. package/packages/kernel/identity/application/identity-service.ts +67 -0
  191. package/packages/kernel/identity/domain/scope.ts +63 -0
  192. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  193. package/packages/kernel/identity/domain/types.ts +44 -0
  194. package/packages/kernel/identity/domain/workspace.ts +56 -0
  195. package/packages/kernel/identity/index.ts +1 -0
  196. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  197. package/packages/kernel/memory/api/index.ts +5 -0
  198. package/packages/kernel/memory/application/experience-service.ts +118 -0
  199. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  200. package/packages/kernel/memory/domain/experience.ts +103 -0
  201. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  202. package/packages/kernel/memory/index.ts +1 -0
  203. package/packages/kernel/progression/api/index.ts +2 -0
  204. package/packages/kernel/progression/application/projector.ts +211 -0
  205. package/packages/kernel/progression/domain/types.ts +116 -0
  206. package/packages/kernel/progression/index.ts +1 -0
  207. package/packages/kernel/scheduler/api/index.ts +6 -0
  208. package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
  209. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  210. package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
  211. package/packages/kernel/scheduler/application/settlement.ts +197 -0
  212. package/packages/kernel/scheduler/domain/continuation.ts +38 -0
  213. package/packages/kernel/scheduler/domain/schedule.ts +149 -0
  214. package/packages/kernel/scheduler/index.ts +1 -0
  215. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
  216. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
  217. package/packages/kernel/work/api/index.ts +15 -0
  218. package/packages/kernel/work/application/work-service.ts +148 -0
  219. package/packages/kernel/work/domain/admission-policy.ts +34 -0
  220. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  221. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  222. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  223. package/packages/kernel/work/domain/engineering-design.ts +281 -0
  224. package/packages/kernel/work/domain/engineering-profile.ts +242 -0
  225. package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
  226. package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
  227. package/packages/kernel/work/domain/implementation-review.ts +510 -0
  228. package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
  229. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  230. package/packages/kernel/work/domain/state-machine.ts +259 -0
  231. package/packages/kernel/work/domain/types.ts +528 -0
  232. package/packages/kernel/work/index.ts +1 -0
  233. package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
  234. package/packages/kernel/work/ports/work-contract-store.ts +18 -0
  235. package/packages/plugin-runtime/browser/index.ts +3 -0
  236. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  237. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  238. package/packages/plugin-runtime/browser/session-authority.ts +61 -0
  239. package/packages/plugin-runtime/computer/index.ts +6 -0
  240. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  241. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  242. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  243. package/packages/plugin-runtime/computer/provider.ts +19 -0
  244. package/packages/plugin-runtime/computer/target-authority.ts +190 -0
  245. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  246. package/packages/plugin-runtime/external/index.ts +1 -0
  247. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
  248. package/packages/plugin-runtime/index.ts +3 -0
  249. package/packages/protocols/browser/index.ts +1 -0
  250. package/packages/protocols/browser/session.ts +98 -0
  251. package/packages/protocols/computer/contract.ts +199 -0
  252. package/packages/protocols/computer/index.ts +1 -0
  253. package/packages/protocols/failure/contract.ts +158 -0
  254. package/packages/protocols/failure/index.ts +1 -0
  255. package/packages/protocols/handoff/index.ts +1 -0
  256. package/packages/protocols/handoff/status.ts +22 -0
  257. package/packages/protocols/mcp/execution-context.ts +11 -0
  258. package/packages/protocols/mcp/index.ts +2 -0
  259. package/packages/protocols/mcp/tool-contract.ts +42 -0
  260. package/packages/workflow-runtime/api/index.ts +2 -0
  261. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  262. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  263. package/packages/workflow-runtime/index.ts +1 -0
  264. package/scripts/assemble-template.ts +1 -1
  265. package/scripts/benchmark-computer-hotpath.ts +255 -0
  266. package/scripts/benchmark-controller-round2.ts +54 -2
  267. package/scripts/benchmark-ios-agent-device.ts +3 -6
  268. package/scripts/benchmark-mcp-transport.ts +3 -4
  269. package/scripts/benchmark-operational-memory-activation.ts +235 -0
  270. package/scripts/benchmark-operational-shadow.ts +28 -0
  271. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  272. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  273. package/scripts/canary-controller-semantic-wait.ts +195 -0
  274. package/scripts/canary-global-hook.sh +2 -2
  275. package/scripts/check-mcp-compatibility.ts +173 -7
  276. package/scripts/check-platform-support.mjs +28 -2
  277. package/scripts/check-public-docs.sh +1 -1
  278. package/scripts/check-release-readiness.sh +1 -1
  279. package/scripts/check-repository-hygiene.mjs +92 -0
  280. package/scripts/check-runtime-architecture.mjs +1206 -95
  281. package/scripts/check-source-duplication.mjs +9 -1
  282. package/scripts/check-tarball-install-smoke.sh +98 -15
  283. package/scripts/controller-ngrok-rotation.sh +5 -4
  284. package/scripts/create-project-dirs.sh +10 -74
  285. package/scripts/forge-local-recovery-helper.mjs +204 -0
  286. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  287. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  288. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  289. package/scripts/hook-shim.sh +2 -2
  290. package/scripts/init-project.sh +12 -70
  291. package/scripts/install-desktop-operator-registration.ts +4 -2
  292. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  293. package/scripts/install-standalone-recovery.ts +122 -10
  294. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  295. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  296. package/scripts/lib/controller-home-env.sh +6 -3
  297. package/scripts/lib/project-init-lib.sh +39 -582
  298. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  299. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  300. package/scripts/open-source-audit-allowlist.txt +12 -1
  301. package/scripts/portability-bindings.mjs +70 -0
  302. package/scripts/run-bounded-command.mjs +55 -0
  303. package/scripts/run-bun-test-file.ts +22 -6
  304. package/scripts/run-governed-gate.ts +4 -1
  305. package/scripts/smoke-mcp-http-runtime.ts +1 -1
  306. package/scripts/smoke-runtime-recovery.ts +34 -1
  307. package/scripts/smoke-schedule-engine.ts +1 -1
  308. package/scripts/stage-runtime-release.ts +6 -1
  309. package/scripts/test-governance.ts +51 -2
  310. package/src/cli/agent-jobs/job-manager.ts +10 -1
  311. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  312. package/src/cli/chatgpt-browser/binding.ts +20 -10
  313. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  314. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  315. package/src/cli/chatgpt-browser/engine.ts +10 -11
  316. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  317. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  318. package/src/cli/chatgpt-browser/types.ts +1 -0
  319. package/src/cli/commands/bootstrap-control.ts +334 -0
  320. package/src/cli/commands/brain-assistant.ts +38 -0
  321. package/src/cli/commands/brain.ts +193 -40
  322. package/src/cli/commands/chatgpt.ts +127 -0
  323. package/src/cli/commands/computer.ts +437 -0
  324. package/src/cli/commands/doctor.ts +18 -1
  325. package/src/cli/commands/init-hook.ts +71 -61
  326. package/src/cli/commands/init.ts +3 -1
  327. package/src/cli/commands/mcp.ts +16 -10
  328. package/src/cli/commands/plugin.ts +38 -12
  329. package/src/cli/commands/recovery.ts +493 -80
  330. package/src/cli/commands/runtime.ts +9 -4
  331. package/src/cli/commands/setup-profile.ts +89 -39
  332. package/src/cli/commands/status.ts +2 -1
  333. package/src/cli/controller/check-runner.ts +487 -98
  334. package/src/cli/controller/context/types.ts +7 -1
  335. package/src/cli/controller/context-pack.ts +23 -3
  336. package/src/cli/controller/issue-store.ts +1 -1
  337. package/src/cli/controller/systemd-user.ts +110 -0
  338. package/src/cli/controller/types.ts +10 -70
  339. package/src/cli/controller/worklog.ts +67 -13
  340. package/src/cli/editing/edit-operation-contract.ts +92 -0
  341. package/src/cli/editing/edit-session.ts +289 -13
  342. package/src/cli/github/plugin.ts +17 -12
  343. package/src/cli/hook/route-registry.ts +3 -5
  344. package/src/cli/hook/runtime.ts +49 -3
  345. package/src/cli/index.ts +3 -0
  346. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  347. package/src/cli/local-bridge/console-automations.ts +2 -2
  348. package/src/cli/local-bridge/facade-api.ts +41 -14
  349. package/src/cli/local-bridge/job-store.ts +1 -1
  350. package/src/cli/local-bridge/server.ts +24 -27
  351. package/src/cli/mcp/access-mode.ts +2 -132
  352. package/src/cli/mcp/access-tools.ts +2 -387
  353. package/src/cli/mcp/audit.ts +2 -32
  354. package/src/cli/mcp/auth.ts +2 -404
  355. package/src/cli/mcp/instructions.ts +2 -34
  356. package/src/cli/mcp/legacy-context.ts +2 -16
  357. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  358. package/src/cli/mcp/multi-repository.ts +2 -436
  359. package/src/cli/mcp/oauth.ts +2 -375
  360. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  361. package/src/cli/mcp/paths.ts +2 -140
  362. package/src/cli/mcp/policy.ts +2 -232
  363. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  364. package/src/cli/mcp/proxy-env.ts +2 -62
  365. package/src/cli/mcp/readiness-projection.ts +2 -24
  366. package/src/cli/mcp/redaction.ts +2 -21
  367. package/src/cli/mcp/repo.ts +2 -24
  368. package/src/cli/mcp/repository-tools.ts +2 -1585
  369. package/src/cli/mcp/server.ts +2 -951
  370. package/src/cli/mcp/setup.ts +2 -737
  371. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  372. package/src/cli/mcp/tool-contract.ts +2 -14
  373. package/src/cli/mcp/tools.ts +2 -9
  374. package/src/cli/mcp/toolset-names.ts +2 -70
  375. package/src/cli/mcp/toolset-selection.ts +2 -41
  376. package/src/cli/mcp/toolset.ts +2 -336
  377. package/src/cli/mcp/transports/AGENTS.md +1 -10
  378. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  379. package/src/cli/mcp/transports/http.ts +2 -1414
  380. package/src/cli/mcp/transports/session-registry.ts +2 -490
  381. package/src/cli/mcp/transports/stdio.ts +2 -8
  382. package/src/cli/mcp/types.ts +2 -41
  383. package/src/cli/mcp/umbrella-tools.ts +2 -117
  384. package/src/cli/repositories/command-executor.ts +64 -18
  385. package/src/cli/repositories/command-scope.ts +117 -1
  386. package/src/cli/repositories/controller-home.ts +119 -1
  387. package/src/cli/repositories/identity.ts +13 -0
  388. package/src/cli/repositories/registry.ts +68 -49
  389. package/src/cli/repositories/repository-snapshot.ts +53 -7
  390. package/src/cli/repositories/runtime-storage.ts +27 -2
  391. package/src/cli/repositories/safe-patch.ts +34 -38
  392. package/src/cli/repositories/selected-path-actions.ts +22 -2
  393. package/src/cli/repositories/structured-git.ts +105 -25
  394. package/src/cli/runtime/helper-runner.ts +7 -0
  395. package/src/cli/runtime-invocation.ts +8 -1
  396. package/src/cli/tools/codegraph.ts +44 -25
  397. package/src/core/adoption/manifest-templates.ts +1 -1
  398. package/src/core/adoption/plan.ts +3 -26
  399. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  400. package/src/effects/process-runner.ts +8 -14
  401. package/src/runtime/context/assistant-context.ts +154 -0
  402. package/src/runtime/context/assistant-work-context.ts +147 -0
  403. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  404. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  405. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  406. package/src/runtime/context/context-closure.ts +268 -0
  407. package/src/runtime/context/context-plane.ts +211 -0
  408. package/src/runtime/context/project-engineering-contract.ts +60 -0
  409. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  410. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  411. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  412. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  413. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  414. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  415. package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
  416. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  417. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
  418. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
  419. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
  420. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
  421. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +417 -100
  422. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
  423. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  424. package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
  425. package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
  426. package/src/runtime/control-plane/execution/validation.ts +28 -3
  427. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
  428. package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
  429. package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
  430. package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
  431. package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
  432. package/src/runtime/control-plane/execution/work-handle-authority.ts +267 -16
  433. package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
  434. package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
  435. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
  436. package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
  437. package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
  438. package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
  439. package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
  440. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
  441. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
  442. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  443. package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
  444. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
  445. package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
  446. package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
  447. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  448. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
  449. package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
  450. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
  451. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
  452. package/src/runtime/control-plane/facade/index.ts +4 -2
  453. package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
  454. package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
  455. package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
  456. package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
  457. package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
  458. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
  459. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  460. package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
  461. package/src/runtime/control-plane/facade/types.ts +189 -532
  462. package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
  463. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  464. package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
  465. package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
  466. package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
  467. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
  468. package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
  469. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  470. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  471. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
  472. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  473. package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
  474. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  475. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
  476. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  477. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
  478. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
  479. package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
  480. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  481. package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
  482. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  483. package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
  484. package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
  485. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  486. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  487. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  488. package/src/runtime/control-plane/release-retention.ts +56 -16
  489. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  490. package/src/runtime/control-plane/routing/route-policy.ts +19 -0
  491. package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
  492. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  493. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
  494. package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
  495. package/src/runtime/diagnostics/incident-repair.ts +406 -0
  496. package/src/runtime/diagnostics/mcp-timing.ts +125 -6
  497. package/src/runtime/diagnostics/performance.ts +6 -14
  498. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  499. package/src/runtime/evidence/artifact-store.ts +65 -2
  500. package/src/runtime/evidence/operational-shadow.ts +38 -0
  501. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  502. package/src/runtime/evidence/sensitive-output.ts +4 -4
  503. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  504. package/src/runtime/execution/jobs/store.ts +121 -2
  505. package/src/runtime/execution/managed-workspace.ts +55 -5
  506. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  507. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  508. package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
  509. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  510. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  511. package/src/runtime/execution/process-runtime/check-result.ts +73 -2
  512. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
  513. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  514. package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
  515. package/src/runtime/execution/process-runtime/index.ts +1 -0
  516. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  517. package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
  518. package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
  519. package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
  520. package/src/runtime/execution/process-runtime/runtime.ts +132 -15
  521. package/src/runtime/execution/process-runtime/types.ts +22 -0
  522. package/src/runtime/execution/workers/executor.ts +16 -13
  523. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  524. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  525. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  526. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  527. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  528. package/src/runtime/gateway/mcp/router.ts +2 -1125
  529. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  530. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6651
  531. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  532. package/src/runtime/maintenance/cleanup.ts +38 -24
  533. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  534. package/src/runtime/platform/computer-platform.ts +14 -0
  535. package/src/runtime/platform/executable-discovery.ts +54 -0
  536. package/src/runtime/platform/fetch-http-server.ts +90 -0
  537. package/src/runtime/platform/service-manager.ts +138 -0
  538. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  539. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  540. package/src/runtime/plugins/action-application.ts +135 -0
  541. package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
  542. package/src/runtime/plugins/browser-adapter.ts +140 -100
  543. package/src/runtime/plugins/browser-automation-service.ts +15 -36
  544. package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
  545. package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
  546. package/src/runtime/plugins/browser-native-session-service.ts +1 -1
  547. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  548. package/src/runtime/plugins/browser-registration.ts +16 -0
  549. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  550. package/src/runtime/plugins/browser-runtime.ts +41 -9
  551. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  552. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  553. package/src/runtime/plugins/browser-session-store.ts +229 -36
  554. package/src/runtime/plugins/browser-session-types.ts +2 -98
  555. package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
  556. package/src/runtime/plugins/catalog-trust.ts +82 -0
  557. package/src/runtime/plugins/computer-registration.ts +839 -0
  558. package/src/runtime/plugins/config-store.ts +119 -0
  559. package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
  560. package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
  561. package/src/runtime/plugins/errors.ts +8 -1
  562. package/src/runtime/plugins/external-adapter.ts +45 -322
  563. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  564. package/src/runtime/plugins/external-registration.ts +9 -1
  565. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  566. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  567. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  568. package/src/runtime/plugins/first-party-registry.ts +3 -1
  569. package/src/runtime/plugins/github-adapter.ts +1 -2
  570. package/src/runtime/plugins/gmail-adapter.ts +6 -6
  571. package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
  572. package/src/runtime/plugins/google-shared.ts +31 -46
  573. package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
  574. package/src/runtime/plugins/ios-adapter.ts +1 -2
  575. package/src/runtime/plugins/local-system-adapter.ts +180 -0
  576. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  577. package/src/runtime/plugins/resend-adapter.ts +15 -24
  578. package/src/runtime/plugins/store.ts +493 -51
  579. package/src/runtime/plugins/types.ts +8 -1
  580. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  581. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  582. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  583. package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
  584. package/src/runtime/projections/controller-context.ts +12 -6
  585. package/src/runtime/projections/git-status-sampler.ts +73 -22
  586. package/src/runtime/projections/materialized-view.ts +14 -8
  587. package/src/runtime/recovery/capability-action-application.ts +228 -0
  588. package/src/runtime/recovery/index.ts +3 -0
  589. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  590. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  591. package/src/runtime/recovery/maintenance-executor.ts +358 -76
  592. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  593. package/src/runtime/release/identity.ts +6 -0
  594. package/src/runtime/resources/leases/store.ts +1 -1
  595. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  596. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  597. package/src/runtime/root/browser-session-composition.ts +59 -0
  598. package/src/runtime/root/computer-composition.ts +191 -0
  599. package/src/runtime/root/computer-target-composition.ts +16 -0
  600. package/src/runtime/root/computer-target-persistence.ts +39 -0
  601. package/src/runtime/root/controller-round-composition.ts +107 -0
  602. package/src/runtime/root/controller-services.ts +2 -0
  603. package/src/runtime/root/entry.ts +4 -3
  604. package/src/runtime/root/gateway-adapter.ts +3 -3
  605. package/src/runtime/root/local-bridge.ts +5 -2
  606. package/src/runtime/root/mcp-transport.ts +5 -5
  607. package/src/runtime/root/package-connector-service.ts +108 -56
  608. package/src/runtime/root/package-runtime-release.ts +86 -18
  609. package/src/runtime/root/package-runtime-service.ts +63 -86
  610. package/src/runtime/root/release-execution-canary.ts +71 -0
  611. package/src/runtime/root/release-loader.ts +68 -0
  612. package/src/runtime/root/release-manifest.ts +106 -2
  613. package/src/runtime/root/release-materialize.ts +103 -4
  614. package/src/runtime/root/release-store.ts +31 -2
  615. package/src/runtime/root/runtime.ts +240 -25
  616. package/src/runtime/root/scheduled-controller-composition.ts +51 -0
  617. package/src/runtime/root/scheduler.ts +12 -4
  618. package/src/runtime/root/service-runner.ts +1 -1
  619. package/src/runtime/root/service.ts +41 -16
  620. package/src/runtime/root/status.ts +1 -0
  621. package/src/runtime/root/types.ts +24 -1
  622. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  623. package/src/runtime/shared/process-environment.ts +19 -4
  624. package/src/runtime/shared/storage-capacity.ts +68 -0
  625. package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
  626. package/src/runtime/standalone-recovery/core.ts +984 -230
  627. package/src/runtime/standalone-recovery/entry.ts +182 -51
  628. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  629. package/src/runtime/standalone-recovery/installer.ts +212 -104
  630. package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
  631. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  632. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  633. package/src/runtime/standalone-recovery/performance.ts +135 -0
  634. package/src/runtime/standalone-recovery/release.ts +5 -0
  635. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  636. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
  637. package/src/runtime/workflow/schedules/engine.ts +191 -343
  638. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  639. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  640. package/src/runtime/workflow/schedules/store.ts +2 -607
  641. package/src/runtime/workflow/schedules/types.ts +2 -127
  642. package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
  643. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  644. package/src/runtime/workflows/runtime.ts +486 -0
  645. package/src/testing/test-governance.ts +90 -29
  646. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  647. package/docs/architecture/history/README.md +0 -7
  648. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  649. package/docs/architecture/history/global-hook-runtime.md +0 -166
  650. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  651. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  652. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  653. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  654. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  655. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  656. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  657. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  658. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  659. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  660. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  661. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  662. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  663. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  664. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  665. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  666. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  667. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  668. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  669. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  670. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  671. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  672. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  673. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  674. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  675. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  676. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  677. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  678. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  679. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  680. package/docs/architecture/requests/archive/2026/root.md +0 -68
  681. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  682. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  683. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  684. package/scripts/archive-architecture-request.sh +0 -4
  685. package/scripts/run-skill-evals.ts +0 -1022
@@ -0,0 +1,308 @@
1
+ import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
2
+ import type { MultiRepositoryMcpToolContext } from '../multi-repository';
3
+ import { buildWorkspaceAuthStatus, prepareWorkspaceAuthLogin, summarizePluginForLowInterception } from '../../../src/runtime/safe-tooling';
4
+ import {
5
+ assistantPluginScope,
6
+ controllerPluginRepository,
7
+ getAssistantPluginManifest,
8
+ listAssistantPluginManifests,
9
+ } from '../../../src/runtime/plugins/store';
10
+ import { executeAssistantPluginActionApplication } from '../../../src/runtime/plugins/action-application';
11
+ import { mcpPluginExecutionOrigin } from '../../../src/runtime/plugins/execution-origin';
12
+ import type { AssistantPluginManifest } from '../../../src/runtime/plugins/types';
13
+ import { result, resultWithPluginArtifactImages } from './result-adapter';
14
+ import { selected } from './shared-adapter';
15
+
16
+ function pluginRepository(
17
+ ctx: MultiRepositoryMcpToolContext,
18
+ args: Record<string, unknown>,
19
+ pluginId: string,
20
+ ) {
21
+ return assistantPluginScope(pluginId, ctx.controllerHome) === 'controller'
22
+ ? controllerPluginRepository(ctx.controllerHome)
23
+ : selected(ctx, args);
24
+ }
25
+
26
+ function summarizePlugin(manifest: AssistantPluginManifest): Record<string, unknown> {
27
+ return {
28
+ pluginId: manifest.pluginId,
29
+ provider: manifest.provider,
30
+ displayName: manifest.displayName,
31
+ pluginVersion: manifest.pluginVersion,
32
+ revision: manifest.revision,
33
+ enabled: manifest.enabled,
34
+ lifecycle: manifest.lifecycle,
35
+ health: manifest.health,
36
+ authority: manifest.authority,
37
+ permissions: manifest.permissions,
38
+ capabilities: manifest.capabilities,
39
+ actions: manifest.actions.map((action) => ({
40
+ actionId: action.actionId,
41
+ title: action.title,
42
+ description: action.description,
43
+ readOnly: action.readOnly,
44
+ risk: action.risk,
45
+ confirmation: action.confirmation,
46
+ requiredConfirmationText: action.requiredConfirmationText,
47
+ defaultTimeoutMs: action.defaultTimeoutMs,
48
+ cancellable: action.cancellable,
49
+ idempotent: action.idempotent,
50
+ scopes: action.scopes,
51
+ resourceClaims: action.resourceClaims,
52
+ argumentsSchema: action.argumentsSchema,
53
+ })),
54
+ updatedAt: manifest.updatedAt,
55
+ };
56
+ }
57
+
58
+ function summarizePluginActionReceipt(manifest: AssistantPluginManifest): Record<string, unknown> {
59
+ return {
60
+ pluginId: manifest.pluginId,
61
+ provider: manifest.provider,
62
+ displayName: manifest.displayName,
63
+ pluginVersion: manifest.pluginVersion,
64
+ revision: manifest.revision,
65
+ enabled: manifest.enabled,
66
+ lifecycleState: manifest.lifecycle.state,
67
+ health: {
68
+ state: manifest.health.state,
69
+ ready: manifest.health.ready,
70
+ checkedAt: manifest.health.checkedAt,
71
+ errorCount: manifest.health.errors.length,
72
+ warningCount: manifest.health.warnings.length,
73
+ },
74
+ updatedAt: manifest.updatedAt,
75
+ };
76
+ }
77
+
78
+ function compactSubmittedPluginActionResult(value: Record<string, unknown> | undefined): Record<string, unknown> | undefined {
79
+ if (!value) return undefined;
80
+ const nested = value.result;
81
+ if (!nested || typeof nested !== 'object' || Array.isArray(nested)) return value;
82
+ const work = value.work;
83
+ return {
84
+ ...(nested as Record<string, unknown>),
85
+ ...(work && typeof work === 'object' && !Array.isArray(work) ? { work } : {}),
86
+ };
87
+ }
88
+
89
+ export async function callPluginAdapter(
90
+ ctx: MultiRepositoryMcpToolContext,
91
+ name: string,
92
+ args: Record<string, unknown>,
93
+ ): Promise<CallToolResult | undefined> {
94
+ switch (name) {
95
+ case 'list_plugins': {
96
+ const controllerRepository = controllerPluginRepository(ctx.controllerHome);
97
+ const controllerPlugins = listAssistantPluginManifests(ctx.controllerHome, controllerRepository, {
98
+ forceRefresh: true,
99
+ }).map(summarizePlugin);
100
+ let repositoryPlugins: ReturnType<typeof summarizePlugin>[] = [];
101
+ let repositoryId: string | undefined;
102
+ try {
103
+ const repository = selected(ctx, args);
104
+ repositoryId = repository.repoId;
105
+ repositoryPlugins = listAssistantPluginManifests(ctx.controllerHome, repository, {
106
+ forceRefresh: true,
107
+ }).map(summarizePlugin);
108
+ } catch (error) {
109
+ if (typeof args.repo_id === 'string' && args.repo_id.trim()) throw error;
110
+ }
111
+ return result({
112
+ scope: repositoryPlugins.length > 0 ? 'combined' : 'controller',
113
+ repositoryId,
114
+ plugins: [...repositoryPlugins, ...controllerPlugins]
115
+ .sort((left, right) => String(left.pluginId).localeCompare(String(right.pluginId))),
116
+ });
117
+ }
118
+ case 'get_plugin': {
119
+ const pluginId = String(args.plugin_id ?? '').trim();
120
+ const repository = pluginRepository(ctx, args, pluginId);
121
+ return result({
122
+ scope: repository.repoId === '__controller__' ? 'controller' : 'repository',
123
+ plugin: summarizePlugin(getAssistantPluginManifest(ctx.controllerHome, repository, pluginId)),
124
+ });
125
+ }
126
+ case 'plugin_action_execute': {
127
+ const pluginId = String(args.plugin_id ?? '').trim();
128
+ const workId = typeof args.work_id === 'string' && args.work_id.trim() ? args.work_id.trim() : undefined;
129
+ const repository = pluginRepository(ctx, args, pluginId);
130
+ const workRepository = workId ? selected(ctx, args) : undefined;
131
+ const actionId = String(args.action_id ?? '').trim();
132
+ const requestId = String(args.request_id ?? '').trim();
133
+ const actionArguments = args.arguments && typeof args.arguments === 'object' && !Array.isArray(args.arguments)
134
+ ? args.arguments as Record<string, unknown>
135
+ : {};
136
+ const request = {
137
+ pluginId,
138
+ actionId,
139
+ requestId,
140
+ workId,
141
+ ...(workId && workRepository ? { workRepoId: workRepository.repoId } : {}),
142
+ args: actionArguments,
143
+ timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : undefined,
144
+ signal: ctx.signal,
145
+ confirmAuthorization: args.confirm_authorization === true,
146
+ confirmationText: typeof args.confirmation_text === 'string' ? args.confirmation_text : undefined,
147
+ origin: mcpPluginExecutionOrigin(ctx.principalId, 'plugin_action_execute', requestId),
148
+ };
149
+ const application = await executeAssistantPluginActionApplication({
150
+ controllerHome: ctx.controllerHome,
151
+ repository,
152
+ request,
153
+ interactiveWaitMs: typeof args.interactive_wait_ms === 'number' ? args.interactive_wait_ms : 750,
154
+ wait: args.wait === true,
155
+ waitMs: typeof args.wait_ms === 'number' ? args.wait_ms : 15_000,
156
+ });
157
+
158
+ if (application.kind === 'direct_read') {
159
+ const value = {
160
+ accepted: true,
161
+ direct: true,
162
+ durable: false,
163
+ plugin: summarizePluginActionReceipt(application.manifest),
164
+ action: {
165
+ actionId: application.action.actionId,
166
+ risk: application.action.risk,
167
+ confirmation: application.action.confirmation,
168
+ },
169
+ scope: repository.repoId === '__controller__' ? 'controller' : 'repository',
170
+ result: application.result,
171
+ detail: {
172
+ tool: 'rh_context',
173
+ arguments: {
174
+ ...(repository.repoId === '__controller__' ? {} : { repo_id: repository.repoId }),
175
+ capability_id: `plugin.${pluginId}.${actionId}`,
176
+ detail_level: 'detail',
177
+ },
178
+ },
179
+ next: 'Continue with the returned bounded result; use rh_context capability detail only when the typed action schema/policy is needed.',
180
+ };
181
+ return resultWithPluginArtifactImages(value, ctx.controllerHome, repository.repoId, application.result);
182
+ }
183
+
184
+ if (application.kind === 'direct_non_persistent') {
185
+ return result({
186
+ accepted: true,
187
+ direct: true,
188
+ durable: false,
189
+ replayable: false,
190
+ mode: 'direct_non_persistent',
191
+ plugin: summarizePluginActionReceipt(application.manifest),
192
+ action: {
193
+ actionId: application.action.actionId,
194
+ risk: application.action.risk,
195
+ confirmation: application.action.confirmation,
196
+ },
197
+ scope: repository.repoId === '__controller__' ? 'controller' : 'repository',
198
+ requestId,
199
+ result: application.result,
200
+ detail: {
201
+ tool: 'rh_context',
202
+ arguments: {
203
+ ...(repository.repoId === '__controller__' ? {} : { repo_id: repository.repoId }),
204
+ capability_id: `plugin.${pluginId}.${actionId}`,
205
+ detail_level: 'detail',
206
+ },
207
+ },
208
+ next: 'This protected action completed inline without durable replay state. Use the returned result only for the immediate next protected action.',
209
+ });
210
+ }
211
+
212
+ if (application.kind === 'lightweight_running') {
213
+ return result({
214
+ accepted: true,
215
+ direct: false,
216
+ durable: false,
217
+ mode: 'lightweight_process',
218
+ plugin: summarizePluginActionReceipt(application.manifest),
219
+ action: application.action ? {
220
+ actionId: application.action.actionId,
221
+ risk: application.action.risk,
222
+ confirmation: application.action.confirmation,
223
+ requiredConfirmationText: application.action.requiredConfirmationText,
224
+ } : { actionId },
225
+ scope: 'repository',
226
+ requestId,
227
+ process: application.process,
228
+ resultRef: { kind: 'process_logs', processId: application.process.processId },
229
+ next: 'The typed plugin action is isolated from the Canonical Runtime. Use process_wait on processId; after completion, call plugin_action_execute again with the same request_id to retrieve the deduplicated structured receipt.',
230
+ });
231
+ }
232
+
233
+ if (application.kind === 'lightweight_failed') {
234
+ const handle = application.process;
235
+ return result({
236
+ accepted: true,
237
+ direct: false,
238
+ durable: false,
239
+ mode: 'lightweight_process',
240
+ requestId,
241
+ process: handle,
242
+ error: {
243
+ code: handle.timedOut ? 'PLUGIN_ACTION_TIMEOUT' : handle.cancelled ? 'PLUGIN_ACTION_CANCELLED' : 'PLUGIN_ACTION_FAILED',
244
+ message: handle.stderrTail || handle.stdoutTail || `Plugin action process exited with code ${String(handle.exitCode)}`,
245
+ },
246
+ }, true);
247
+ }
248
+
249
+ const submitted = application.submitted;
250
+ const compactResult = compactSubmittedPluginActionResult(submitted.result);
251
+ const value = {
252
+ accepted: true,
253
+ deduplicated: submitted.deduplicated,
254
+ direct: true,
255
+ durable: false,
256
+ plugin: summarizePluginActionReceipt(submitted.manifest),
257
+ action: {
258
+ actionId: submitted.action.actionId,
259
+ risk: submitted.action.risk,
260
+ confirmation: submitted.action.confirmation,
261
+ requiredConfirmationText: submitted.action.requiredConfirmationText,
262
+ },
263
+ scope: repository.repoId === '__controller__' ? 'controller' : 'repository',
264
+ receiptId: submitted.receipt.receiptId,
265
+ requestId: submitted.receipt.requestId,
266
+ ...(submitted.receipt.workId ? { workId: submitted.receipt.workId } : {}),
267
+ authorization: submitted.authorization,
268
+ result: compactResult,
269
+ detail: {
270
+ tool: 'rh_context',
271
+ arguments: {
272
+ ...(repository.repoId === '__controller__' ? {} : { repo_id: repository.repoId }),
273
+ capability_id: `plugin.${pluginId}.${actionId}`,
274
+ detail_level: 'detail',
275
+ },
276
+ },
277
+ next: 'Continue with the returned bounded plugin result; use rh_context capability detail only when the typed action schema/policy is needed.',
278
+ };
279
+ return resultWithPluginArtifactImages(value, ctx.controllerHome, repository.repoId, compactResult);
280
+ }
281
+ case 'workspace_auth_status': {
282
+ const repository = selected(ctx, args);
283
+ return result(buildWorkspaceAuthStatus(listAssistantPluginManifests(ctx.controllerHome, repository)));
284
+ }
285
+ case 'workspace_auth_login_prepare': {
286
+ selected(ctx, args);
287
+ return result(prepareWorkspaceAuthLogin(ctx.controllerHome, {
288
+ service: typeof args.service === 'string' ? args.service : undefined,
289
+ scopes: Array.isArray(args.scopes) ? args.scopes.map(String) : undefined,
290
+ redirectUri: typeof args.redirect_uri === 'string' ? args.redirect_uri : undefined,
291
+ }));
292
+ }
293
+ case 'toolchain_plugin_summary': {
294
+ const pluginId = String(args.plugin_id ?? '').trim();
295
+ const repository = pluginRepository(ctx, args, pluginId);
296
+ const manifest = getAssistantPluginManifest(ctx.controllerHome, repository, pluginId);
297
+ return result({
298
+ plugin: summarizePluginForLowInterception(manifest),
299
+ nonOpaque: true,
300
+ next: manifest.pluginId === 'browser'
301
+ ? 'Use rh_context for browser capability schemas and plugin_action_execute for typed HTTP(S) browser actions.'
302
+ : undefined,
303
+ });
304
+ }
305
+ default:
306
+ return undefined;
307
+ }
308
+ }
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Repository-scoped Lightweight/Durable Process lifecycle MCP tools.
3
+ *
4
+ * process_get / process_wait / process_logs / process_cancel
5
+ *
6
+ * These tools attach to an existing in-memory lightweight or persisted durable
7
+ * handle. They never re-execute the original command.
8
+ */
9
+
10
+ import type { McpToolDefinition, CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
11
+ import type { MultiRepositoryMcpToolContext } from '../multi-repository';
12
+ import {
13
+ cancelRepositoryCommandProcess,
14
+ getRepositoryCommandProcess,
15
+ readRepositoryCommandProcessLogs,
16
+ waitRepositoryCommandProcess,
17
+ } from '../../../src/runtime/execution/process-runtime';
18
+ import { redactSensitiveText, redactSensitiveValue } from '../../../src/runtime/evidence/sensitive-output';
19
+
20
+ function definition(
21
+ name: string,
22
+ description: string,
23
+ properties: Record<string, unknown>,
24
+ required: string[] = [],
25
+ readOnlyHint = false,
26
+ destructiveHint = false,
27
+ ): McpToolDefinition {
28
+ return {
29
+ name,
30
+ description,
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties,
34
+ ...(required.length ? { required } : {}),
35
+ additionalProperties: false,
36
+ },
37
+ annotations: { readOnlyHint, openWorldHint: false, destructiveHint },
38
+ };
39
+ }
40
+
41
+ const repoIdProp = {
42
+ type: 'string',
43
+ description: 'Repository or ephemeral workspace scope id returned by the originating command. Process must belong to this scope.',
44
+ };
45
+ const processIdProp = {
46
+ type: 'string',
47
+ description: 'Lightweight or durable process id returned by run_check / repository_command_execute.',
48
+ };
49
+
50
+ export const processToolDefinitions: McpToolDefinition[] = [
51
+ definition(
52
+ 'run_check',
53
+ 'Run one focused repository check, or launch one resource-compatible check wave, through Process Runtime. Use check_id for the existing single-check behavior or check_ids for a batch; do not send both. Batch mode validates the existing check-scheduling resource model and starts every check in one compatible wave concurrently without waiting for completion or creating a second scheduler. Cross-wave, invalid, release, and multi-phase batches fail closed. Long ordinary checks return managed handles; attach only at a real dependency boundary.',
54
+ {
55
+ repo_id: repoIdProp,
56
+ checkout_id: { type: 'string' },
57
+ check_id: { type: 'string', description: 'Single check id. Mutually exclusive with check_ids.' },
58
+ check_ids: { type: 'array', items: { type: 'string' }, minItems: 1, maxItems: 32, uniqueItems: true, description: 'Batch check ids. All requested checks must fit one resource-compatible execution wave; mutually exclusive with check_id.' },
59
+ timeout_ms: { type: 'number' },
60
+ request_id: { type: 'string' },
61
+ issue_id: { type: 'string' },
62
+ task_id: { type: 'string' },
63
+ mode: { type: 'string', enum: ['direct', 'async', 'durable'] },
64
+ apply_mode: { type: 'string', enum: ['sync', 'async'] },
65
+ force_durable: { type: 'boolean' },
66
+ },
67
+ [],
68
+ false,
69
+ ),
70
+ definition(
71
+ 'process_get',
72
+ 'Non-blocking observation of a lightweight or durable process; never re-executes. Use only when the observation can change the next decision. It is not a synchronization join.',
73
+ {
74
+ repo_id: repoIdProp,
75
+ process_id: processIdProp,
76
+ },
77
+ ['repo_id', 'process_id'],
78
+ true,
79
+ ),
80
+ definition(
81
+ 'process_wait',
82
+ 'Explicit dependency synchronization for one lightweight or durable process. Call only when the next decision or acceptance boundary is blocked on this exact result; do not use as periodic polling. Waits never re-execute the command.',
83
+ {
84
+ repo_id: repoIdProp,
85
+ process_id: processIdProp,
86
+ timeout_ms: { type: 'number', description: 'Max wait milliseconds (default 15000).' },
87
+ },
88
+ ['repo_id', 'process_id'],
89
+ true,
90
+ ),
91
+ definition(
92
+ 'process_logs',
93
+ 'Read a bounded tail of lightweight or durable process stdout/stderr. Never loads unbounded logs. Readonly.',
94
+ {
95
+ repo_id: repoIdProp,
96
+ process_id: processIdProp,
97
+ max_bytes: { type: 'number', description: 'Max tail bytes per stream (default 32KiB).' },
98
+ },
99
+ ['repo_id', 'process_id'],
100
+ true,
101
+ ),
102
+ definition(
103
+ 'process_cancel',
104
+ 'Cancel a lightweight or durable process through its owning runtime handle. Classified as workspace-write / process-control.',
105
+ {
106
+ repo_id: repoIdProp,
107
+ process_id: processIdProp,
108
+ },
109
+ ['repo_id', 'process_id'],
110
+ false,
111
+ true,
112
+ ),
113
+ ];
114
+
115
+ const processToolNames = new Set(processToolDefinitions.map((tool) => tool.name));
116
+ const processAttachmentToolNames = new Set(['process_get', 'process_wait', 'process_logs', 'process_cancel']);
117
+ // A long-lived MCP wait can monopolize shared Runtime request/transport capacity
118
+ // even though the underlying Process wait is asynchronous. Keep public waits
119
+ // short and return a normal running snapshot; the Process continues unchanged
120
+ // and callers can attach again only when the result is a real dependency.
121
+ export const DEFAULT_PROCESS_WAIT_ATTACH_BUDGET_MS = 5_000;
122
+
123
+ /**
124
+ * Stable controller-facing continuation semantics for a returned Process.
125
+ * This is deliberately response-only: Process Runtime remains the sole owner
126
+ * of execution and no polling scheduler or second state authority is created.
127
+ */
128
+ export function managedProcessContinuation(handle: { completed?: boolean }): Record<string, string> {
129
+ if (handle.completed === true) {
130
+ return {
131
+ state: 'terminal',
132
+ nextAction: 'consume_terminal_result',
133
+ join: 'complete',
134
+ reexecution: 'forbidden',
135
+ };
136
+ }
137
+ return {
138
+ state: 'background',
139
+ nextAction: 'continue_independent_work',
140
+ join: 'required_at_dependency_boundary',
141
+ observation: 'process_get_if_it_can_change_the_next_decision',
142
+ repeatedWait: 'not_recommended',
143
+ reexecution: 'forbidden',
144
+ };
145
+ }
146
+
147
+ function result(value: Record<string, unknown>, isError = false): CallToolResult {
148
+ const safe = redactSensitiveValue(value).value;
149
+ return {
150
+ content: [{ type: 'text', text: JSON.stringify(safe, null, 2) }],
151
+ structuredContent: safe,
152
+ ...(isError ? { isError: true } : {}),
153
+ };
154
+ }
155
+
156
+ function failure(error: unknown): CallToolResult {
157
+ const message = redactSensitiveText(error instanceof Error ? error.message : String(error)).text;
158
+ const code = message.includes(':') ? message.slice(0, message.indexOf(':')) : 'PROCESS_TOOL_FAILED';
159
+ return result({ error: { code, message } }, true);
160
+ }
161
+
162
+ function requireRepoAndProcess(
163
+ ctx: MultiRepositoryMcpToolContext,
164
+ args: Record<string, unknown>,
165
+ ): { repoId: string; processId: string } {
166
+ const repoId = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
167
+ const processId = typeof args.process_id === 'string' ? args.process_id.trim() : '';
168
+ if (!repoId) throw new Error('REPOSITORY_ID_REQUIRED: repo_id is required for process tools');
169
+ if (!processId) throw new Error('PROCESS_ID_REQUIRED: process_id is required for process tools');
170
+
171
+ // The Process handle is the scope authority. Ephemeral workspace targets are
172
+ // intentionally not registered in Repository Registry, so requiring a live
173
+ // repository record here would make their returned managed handles impossible
174
+ // to resume. Exact repo/workspace scope + process id still fails closed.
175
+ const handle = getRepositoryCommandProcess(ctx.controllerHome, repoId, processId);
176
+ if (!handle) {
177
+ throw new Error(`PROCESS_NOT_FOUND: process ${processId} is not registered under repo ${repoId}`);
178
+ }
179
+ return { repoId, processId };
180
+ }
181
+
182
+ function handleToPayload(handle: NonNullable<ReturnType<typeof getRepositoryCommandProcess>>): Record<string, unknown> {
183
+ return {
184
+ processId: handle.processId,
185
+ workId: handle.workId,
186
+ commandId: handle.commandId,
187
+ status: handle.status,
188
+ contractStatus: handle.contractStatus,
189
+ route: handle.route,
190
+ pid: handle.pid,
191
+ startedAt: handle.startedAt,
192
+ interactiveWaitMs: handle.interactiveWaitMs,
193
+ timeoutMs: handle.timeoutMs,
194
+ completed: handle.completed === true,
195
+ ok: handle.ok,
196
+ exitCode: handle.exitCode,
197
+ timedOut: handle.timedOut,
198
+ cancelled: handle.cancelled,
199
+ stdout: handle.stdout,
200
+ stderr: handle.stderr,
201
+ // Keep the bounded tail available after completion for callers that use it
202
+ // as their compact log view. Lightweight terminal receipts bound this tail
203
+ // separately, so retaining the established field does not restore the
204
+ // previous full-output duplication in persisted state.
205
+ stdoutTail: handle.stdoutTail,
206
+ stderrTail: handle.stderrTail,
207
+ continuation: managedProcessContinuation(handle),
208
+ durableSideEffects: handle.durableSideEffects,
209
+ };
210
+ }
211
+
212
+ export async function callProcessTool(
213
+ ctx: MultiRepositoryMcpToolContext,
214
+ name: string,
215
+ args: Record<string, unknown>,
216
+ ): Promise<CallToolResult | undefined> {
217
+ // run_check shares this module's public schema, but its execution authority is
218
+ // the Gateway check facade in router.ts. Only attachment/lifecycle operations
219
+ // consume an existing process_id here.
220
+ if (!processAttachmentToolNames.has(name)) return undefined;
221
+ try {
222
+ const { repoId, processId } = requireRepoAndProcess(ctx, args);
223
+ switch (name) {
224
+ case 'process_get': {
225
+ const handle = getRepositoryCommandProcess(ctx.controllerHome, repoId, processId);
226
+ if (!handle) throw new Error(`PROCESS_NOT_FOUND: ${processId}`);
227
+ return result({
228
+ repoId,
229
+ process: handleToPayload(handle),
230
+ });
231
+ }
232
+ case 'process_wait': {
233
+ const requestedWaitMs = typeof args.timeout_ms === 'number' && Number.isFinite(args.timeout_ms)
234
+ ? Math.max(1, Math.trunc(args.timeout_ms))
235
+ : 15_000;
236
+ const testBudget = (ctx as MultiRepositoryMcpToolContext & { processWaitAttachBudgetMs?: unknown }).processWaitAttachBudgetMs;
237
+ const attachBudgetMs = typeof testBudget === 'number' && Number.isFinite(testBudget)
238
+ ? Math.max(1, Math.trunc(testBudget))
239
+ : DEFAULT_PROCESS_WAIT_ATTACH_BUDGET_MS;
240
+ const startedAt = Date.now();
241
+ const handle = await waitRepositoryCommandProcess(ctx.controllerHome, repoId, processId, {
242
+ timeoutMs: Math.min(requestedWaitMs, attachBudgetMs),
243
+ });
244
+ return result({
245
+ repoId,
246
+ process: handleToPayload(handle),
247
+ synchronization: handle.completed === true ? 'terminal_result_available' : 'continue_independent_work',
248
+ waitedMs: Date.now() - startedAt,
249
+ requestedWaitMs,
250
+ attachBudgetMs,
251
+ reExecuted: false,
252
+ });
253
+ }
254
+ case 'process_logs': {
255
+ const maxBytes = typeof args.max_bytes === 'number' && Number.isFinite(args.max_bytes)
256
+ ? Math.max(256, Math.trunc(args.max_bytes))
257
+ : 32 * 1024;
258
+ const logs = readRepositoryCommandProcessLogs(ctx.controllerHome, repoId, processId, maxBytes);
259
+ if (!logs) throw new Error(`PROCESS_NOT_FOUND: ${processId}`);
260
+ return result({
261
+ repoId,
262
+ processId,
263
+ stdout: logs.stdout,
264
+ stderr: logs.stderr,
265
+ stdoutBytes: logs.stdoutBytes,
266
+ stderrBytes: logs.stderrBytes,
267
+ truncated: logs.truncated,
268
+ maxBytes,
269
+ });
270
+ }
271
+ case 'process_cancel': {
272
+ const handle = await cancelRepositoryCommandProcess(ctx.controllerHome, repoId, processId);
273
+ return result({
274
+ repoId,
275
+ process: handleToPayload(handle),
276
+ cancelled: handle.cancelled === true || handle.status === 'cancelled' || handle.status === 'completed_unknown',
277
+ });
278
+ }
279
+ default:
280
+ return undefined;
281
+ }
282
+ } catch (error) {
283
+ return failure(error);
284
+ }
285
+ }
286
+
287
+ export function isProcessTool(name: string): boolean {
288
+ return processToolNames.has(name);
289
+ }
@@ -0,0 +1,76 @@
1
+ import { COMPUTER_CONSOLE_UNLOCK_CAPABILITY } from '../../../packages/protocols/computer/index';
2
+ import {
3
+ executeProtectedConsoleUnlockInvocation,
4
+ executeProtectedConsoleUnlockPreparation,
5
+ } from '../../../src/runtime/plugins/computer-registration';
6
+ import type { MultiRepositoryMcpToolContext } from '../multi-repository';
7
+ import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
8
+ import { result } from './result-adapter';
9
+
10
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
11
+ const FROZEN_CLIENT_PREPARE_CARRIER = 'prepare_provider_local';
12
+
13
+ function protectedErrorCode(error: unknown): string {
14
+ if (error && typeof error === 'object' && typeof (error as { code?: unknown }).code === 'string') {
15
+ return String((error as { code: string }).code);
16
+ }
17
+ const message = error instanceof Error ? error.message : String(error);
18
+ return /^([A-Z][A-Z0-9_]+)(?::|$)/.exec(message)?.[1] ?? 'COMPUTER_CONSOLE_UNLOCK_FAILED';
19
+ }
20
+
21
+ export { executeProtectedConsoleUnlockInvocation, executeProtectedConsoleUnlockPreparation };
22
+ export type {
23
+ ProtectedConsoleUnlockInvocationInput,
24
+ ProtectedConsoleUnlockPreparationInput,
25
+ } from '../../../src/runtime/plugins/computer-registration';
26
+
27
+ export async function callProtectedComputerAdapter(
28
+ ctx: MultiRepositoryMcpToolContext,
29
+ name: string,
30
+ args: Record<string, unknown>,
31
+ ): Promise<CallToolResult | undefined> {
32
+ if (name !== 'computer_console_unlock_prepare' && name !== 'computer_console_unlock') return undefined;
33
+ if (name === 'computer_console_unlock' && args.credential_handle === undefined && typeof args.credential === 'string') {
34
+ if (args.credential === FROZEN_CLIENT_PREPARE_CARRIER) {
35
+ name = 'computer_console_unlock_prepare';
36
+ } else if (UUID_PATTERN.test(args.credential)) {
37
+ args = { ...args, credential_handle: args.credential };
38
+ } else {
39
+ return result({
40
+ accepted: false,
41
+ capability: COMPUTER_CONSOLE_UNLOCK_CAPABILITY,
42
+ action: 'unlock_console',
43
+ error: {
44
+ code: 'COMPUTER_CONSOLE_UNLOCK_FROZEN_CLIENT_CARRIER_INVALID',
45
+ message: 'Frozen clients may pass only the provider-local prepare sentinel or an opaque UUID handle; raw credentials are forbidden.',
46
+ },
47
+ }, true);
48
+ }
49
+ }
50
+ const action = name === 'computer_console_unlock_prepare' ? 'prepare_unlock_console' : 'unlock_console';
51
+ try {
52
+ const payload = name === 'computer_console_unlock_prepare'
53
+ ? await executeProtectedConsoleUnlockPreparation({
54
+ confirmAuthorization: args.confirm_authorization === true,
55
+ timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : undefined,
56
+ }, ctx.controllerHome)
57
+ : await executeProtectedConsoleUnlockInvocation({
58
+ credentialHandle: typeof args.credential_handle === 'string' ? args.credential_handle : '',
59
+ confirmAuthorization: args.confirm_authorization === true,
60
+ timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : undefined,
61
+ }, ctx.controllerHome);
62
+ return result({ accepted: true, ...payload });
63
+ } catch (error) {
64
+ return result({
65
+ accepted: false,
66
+ capability: COMPUTER_CONSOLE_UNLOCK_CAPABILITY,
67
+ action,
68
+ error: {
69
+ code: protectedErrorCode(error),
70
+ message: action === 'prepare_unlock_console'
71
+ ? 'Protected console-unlock credential preparation did not complete.'
72
+ : 'Protected console unlock did not complete. Provider-local credential material was not exposed.',
73
+ },
74
+ }, true);
75
+ }
76
+ }