@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
@@ -33,6 +33,14 @@ function isPlaceholder(paths, lines) {
33
33
  return lines <= 1 && paths.every((path) => path.endsWith('/.gitkeep'));
34
34
  }
35
35
 
36
+ function isPureBarrelReExport(paths, lines) {
37
+ if (lines !== 1) return false;
38
+ return paths.every((path) => {
39
+ const source = readFileSync(path, 'utf8').trim();
40
+ return /^export\s+\*\s+from\s+['"]\.\/[^'"]+['"];?$/.test(source);
41
+ });
42
+ }
43
+
36
44
  const duplicateGroups = [...byHash.values()].filter((group) => group.length > 1);
37
45
  const failures = [];
38
46
  let classifiedGroups = 0;
@@ -41,7 +49,7 @@ for (const group of duplicateGroups) {
41
49
  const paths = group.map(({ path }) => path).sort();
42
50
  const lines = group[0].lines;
43
51
  const redundantLines = lines * (group.length - 1);
44
- if (isGeneratedTemplateProjection(paths) || isGuidanceAlias(paths) || isPlaceholder(paths, lines)) {
52
+ if (isGeneratedTemplateProjection(paths) || isGuidanceAlias(paths) || isPlaceholder(paths, lines) || isPureBarrelReExport(paths, lines)) {
45
53
  classifiedGroups += 1;
46
54
  classifiedRedundantLines += redundantLines;
47
55
  continue;
@@ -4,10 +4,29 @@ set -euo pipefail
4
4
  ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
5
  cd "$ROOT"
6
6
 
7
- PACKAGE_VERSION="$(bun -e 'const pkg = await Bun.file("package.json").json(); console.log(pkg.version)')"
7
+ PACKAGE_VERSION="$(node -e 'const fs=require("node:fs"); const pkg=JSON.parse(fs.readFileSync("package.json","utf8")); console.log(pkg.version)')"
8
8
  TMP_DIR="$(mktemp -d)"
9
9
  trap 'rm -rf "$TMP_DIR"' EXIT
10
10
 
11
+ CLEAN_HOME="$TMP_DIR/home"
12
+ CONTROLLER_HOME="$TMP_DIR/controller-home"
13
+ XDG_STATE_HOME_DIR="$TMP_DIR/xdg-state"
14
+ NPM_CACHE_DIR="$TMP_DIR/npm-cache"
15
+ mkdir -p "$CLEAN_HOME" "$XDG_STATE_HOME_DIR" "$NPM_CACHE_DIR"
16
+ export HOME="$CLEAN_HOME"
17
+ export FORGE_CONTROLLER_HOME="$CONTROLLER_HOME"
18
+ export XDG_STATE_HOME="$XDG_STATE_HOME_DIR"
19
+ export npm_config_cache="$NPM_CACHE_DIR"
20
+ unset BUN_INSTALL
21
+ # The hosting immutable Runtime may be older than the package under test. Its
22
+ # build identity must not override the installed tarball's package version.
23
+ unset FORGE_BUILD_VERSION
24
+
25
+ if [[ -e "$FORGE_CONTROLLER_HOME" ]]; then
26
+ echo "[tarball-smoke] ERROR: isolated Controller Home must start empty: $FORGE_CONTROLLER_HOME" >&2
27
+ exit 1
28
+ fi
29
+
11
30
  if [[ "$#" -gt 0 ]]; then
12
31
  TARBALL_PATH="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
13
32
  if [[ ! -f "$TARBALL_PATH" ]]; then
@@ -16,15 +35,13 @@ if [[ "$#" -gt 0 ]]; then
16
35
  fi
17
36
  TARBALL="$(basename "$TARBALL_PATH")"
18
37
  else
19
- PACK_JSON="$TMP_DIR/pack.json"
20
- npm pack --json --pack-destination "$TMP_DIR" >"$PACK_JSON"
21
- TARBALL="$(bun - "$PACK_JSON" <<'JS_EOF'
22
- const [, , path] = process.argv;
23
- const pack = await Bun.file(path).json();
24
- const entry = Array.isArray(pack) ? pack[0] : pack;
25
- console.log(entry.filename);
26
- JS_EOF
27
- )"
38
+ PACK_OUTPUT="$(npm pack --silent --pack-destination "$TMP_DIR")"
39
+ TARBALL="$(printf '%s\n' "$PACK_OUTPUT" | awk '/\.tgz$/ { name=$0 } END { print name }')"
40
+ if [[ -z "$TARBALL" ]]; then
41
+ echo "[tarball-smoke] ERROR: npm pack did not report a tarball filename" >&2
42
+ printf '%s\n' "$PACK_OUTPUT" >&2
43
+ exit 1
44
+ fi
28
45
  TARBALL_PATH="$TMP_DIR/$TARBALL"
29
46
  fi
30
47
  APP_DIR="$TMP_DIR/app"
@@ -47,11 +64,12 @@ if [[ "$VERSION" != "$PACKAGE_VERSION" ]]; then
47
64
  exit 1
48
65
  fi
49
66
 
50
- (cd "$TARGET_REPO" && "$CLI" status --json >/dev/null)
67
+ (cd "$TARGET_REPO" && "$CLI" status --json >"$TMP_DIR/status.json")
51
68
  "$CLI" adopt --repo "$TARGET_REPO" --dry-run --json >"$TMP_DIR/adopt-plan.json"
52
- bun - "$TMP_DIR/adopt-plan.json" <<'JS_EOF'
53
- const [, , path] = process.argv;
54
- const plan = await Bun.file(path).json();
69
+ node - "$TMP_DIR/adopt-plan.json" <<'JS_EOF'
70
+ const fs = require('node:fs');
71
+ const path = process.argv[2];
72
+ const plan = JSON.parse(fs.readFileSync(path, 'utf8'));
55
73
  if (plan.protocol !== 1 || plan.command !== "adopt" || plan.apply !== false) {
56
74
  console.error("[tarball-smoke] ERROR: packaged adopt dry-run did not return protocol v1 plan JSON");
57
75
  process.exit(1);
@@ -64,4 +82,69 @@ if ! "$CLI" run check-task-workflow --help >/dev/null; then
64
82
  fi
65
83
  printf '{"prompt":"review release readiness"}\n' | "$HOOK" prompt-guard-decide >/dev/null
66
84
 
67
- echo "[tarball-smoke] OK: ${TARBALL} installs and packaged CLI bins start."
85
+ SETUP_OUTPUT="$TMP_DIR/setup-open.txt"
86
+ "$CLI" setup open --controller mcp --tunnel none --capability computer.observe.v1 --json >"$SETUP_OUTPUT"
87
+ for marker in \
88
+ "forge setup: open" \
89
+ "Primary controller: mcp" \
90
+ "Install the user-level Forge Runtime" \
91
+ "forge runtime service install-package --controller-home"; do
92
+ if ! grep -Fq "$marker" "$SETUP_OUTPUT"; then
93
+ echo "[tarball-smoke] ERROR: packaged setup did not expose expected bootstrap marker: $marker" >&2
94
+ cat "$SETUP_OUTPUT" >&2
95
+ exit 1
96
+ fi
97
+ done
98
+
99
+ case "$(uname -s)" in
100
+ Darwin)
101
+ if ! grep -Eq 'Platform: macos/[^;]+; service=launchd' "$SETUP_OUTPUT"; then
102
+ echo "[tarball-smoke] ERROR: macOS packaged bootstrap did not select launchd" >&2
103
+ cat "$SETUP_OUTPUT" >&2
104
+ exit 1
105
+ fi
106
+ ;;
107
+ Linux)
108
+ if ! grep -Eq 'Platform: (linux|wsl2)/[^;]+; service=(systemd-user|portable)' "$SETUP_OUTPUT"; then
109
+ echo "[tarball-smoke] ERROR: Linux packaged bootstrap did not select systemd-user or the explicit portable fallback" >&2
110
+ cat "$SETUP_OUTPUT" >&2
111
+ exit 1
112
+ fi
113
+ ;;
114
+ esac
115
+
116
+ COMPUTER_STATUS="$TMP_DIR/computer-status.json"
117
+ "$CLI" computer status --controller-home "$FORGE_CONTROLLER_HOME" --json >"$COMPUTER_STATUS"
118
+ node - "$COMPUTER_STATUS" <<'JS_EOF'
119
+ const fs = require('node:fs');
120
+ const path = process.argv[2];
121
+ const status = JSON.parse(fs.readFileSync(path, 'utf8'));
122
+ if (status.schemaVersion !== 1 || status.product !== 'computer' || !Array.isArray(status.capabilities)) {
123
+ console.error('[tarball-smoke] ERROR: packaged Computer status did not expose the capability-level contract');
124
+ process.exit(1);
125
+ }
126
+ if (status.ready !== true) {
127
+ const blockers = status.capabilities.filter((entry) => entry.ready !== true);
128
+ if (blockers.length === 0 || blockers.some((entry) => typeof entry.reason !== 'string' || entry.reason.trim().length === 0)) {
129
+ console.error('[tarball-smoke] ERROR: non-ready Computer status lacked a precise capability blocker');
130
+ process.exit(1);
131
+ }
132
+ }
133
+ JS_EOF
134
+
135
+ if [[ -d "$FORGE_CONTROLLER_HOME" ]] && grep -RIlF "$ROOT" "$FORGE_CONTROLLER_HOME" 2>/dev/null | grep -q .; then
136
+ echo "[tarball-smoke] ERROR: packaged Controller state captured the Forge source checkout path" >&2
137
+ exit 1
138
+ fi
139
+
140
+ CLI_REALPATH="$(node -e 'const fs=require("node:fs"); console.log(fs.realpathSync(process.argv[1]))' "$CLI")"
141
+ APP_REALPATH="$(node -e 'const fs=require("node:fs"); console.log(fs.realpathSync(process.argv[1]))' "$APP_DIR")"
142
+ case "$CLI_REALPATH" in
143
+ "$APP_REALPATH"/*) ;;
144
+ *)
145
+ echo "[tarball-smoke] ERROR: packaged forge executable resolved outside isolated install: $CLI_REALPATH" >&2
146
+ exit 1
147
+ ;;
148
+ esac
149
+
150
+ echo "[tarball-smoke] OK: ${TARBALL} installs under isolated HOME/Controller Home and packaged CLI bins start without Bun."
@@ -9,9 +9,10 @@ forge_use_local_controller_home "$ROOT"
9
9
 
10
10
  REPO_ROOT="$ROOT"
11
11
  LOCAL_CLI="$ROOT/scripts/forge-local.sh"
12
- CONFIG_FILE_DEFAULT="$ROOT/_ops/secrets/controller-ngrok-rotation.env"
13
- STATE_DIR_DEFAULT="$ROOT/_ops/state"
14
- LOG_DIR_DEFAULT="$ROOT/_ops/logs"
12
+ NGROK_ROTATION_ROOT="$FORGE_CONTROLLER_HOME/system/ngrok-rotation"
13
+ CONFIG_FILE_DEFAULT="$NGROK_ROTATION_ROOT/secrets/controller-ngrok-rotation.env"
14
+ STATE_DIR_DEFAULT="$NGROK_ROTATION_ROOT/state"
15
+ LOG_DIR_DEFAULT="$NGROK_ROTATION_ROOT/logs"
15
16
 
16
17
  CONFIG_FILE="${FORGE_NGROK_ROTATION_CONFIG:-$CONFIG_FILE_DEFAULT}"
17
18
  STATE_DIR="${FORGE_NGROK_ROTATION_STATE_DIR:-$STATE_DIR_DEFAULT}"
@@ -40,7 +41,7 @@ Usage: scripts/controller-ngrok-rotation.sh <start|stop|status|logs|run> [option
40
41
 
41
42
  Options:
42
43
  --repo <path> Repository root (default: repo root containing this script)
43
- --config <path> Rotation config file (default: _ops/secrets/controller-ngrok-rotation.env)
44
+ --config <path> Rotation config file (default: Controller Home system/ngrok-rotation/secrets/controller-ngrok-rotation.env)
44
45
  --tail <lines> Approximate number of log lines for `logs` (default: 200)
45
46
  EOF
46
47
  }
@@ -5,7 +5,7 @@
5
5
  # Creates the three-layer project structure:
6
6
  # IMMUTABLE LAYER (资产层): specs, contracts, tests
7
7
  # MUTABLE LAYER (厕纸层): src
8
- # SUPPORTING (支撑层): docs, deploy, _ops, artifacts, tasks, plans
8
+ # SUPPORTING (支撑层): authored docs/deploy/tasks only; Runtime state lives in Controller Home
9
9
 
10
10
  set -euo pipefail
11
11
 
@@ -23,31 +23,14 @@ ASSETS_WORKFLOW_CONTRACT="$SCRIPT_DIR/../assets/workflow-contract.v1.json"
23
23
 
24
24
  write_runtime_gitignore_block() {
25
25
  local extra_entries=""
26
- local helper_entries=""
27
26
  if pi_should_enable_factor_factory "$(pi_plan_type)"; then
28
27
  extra_entries="$(pi_factor_factory_gitignore_entries)"
29
28
  fi
30
- helper_entries="$(pi_helper_wrapper_gitignore_entries "$ASSETS_WORKFLOW_CONTRACT")"
31
- if [[ -n "$helper_entries" ]]; then
32
- if [[ -n "$extra_entries" ]]; then
33
- extra_entries="${extra_entries}"$'\n'"${helper_entries}"
34
- else
35
- extra_entries="$helper_entries"
36
- fi
37
- fi
29
+ # Package helpers are not materialized by the v1.5 scaffold, so do not
30
+ # manufacture ignore entries for files that should never be created.
38
31
  pi_ensure_gitignore_block ".gitignore" "$PI_DEFAULT_GITIGNORE_CONTENT" "$extra_entries" "apply"
39
32
  }
40
33
 
41
- write_templates() {
42
- pi_install_templates "$PWD" "$ASSETS_TEMPLATES_DIR" "apply"
43
- }
44
-
45
- install_workflow_helpers() {
46
- local helper_names
47
- helper_names="$(pi_workflow_contract_query_lines "$ASSETS_WORKFLOW_CONTRACT" "helpers.scripts" | xargs)"
48
- pi_install_helpers "$PWD" "$ASSETS_TEMPLATES_DIR/helpers" "apply" "$helper_names"
49
- }
50
-
51
34
  install_workflow_contract() {
52
35
  pi_install_workflow_contract "$PWD" "$ASSETS_WORKFLOW_CONTRACT" "apply"
53
36
  }
@@ -84,26 +67,12 @@ if pi_should_generate_full_docs; then
84
67
  mkdir -p docs/guides
85
68
  mkdir -p docs/archives
86
69
  fi
87
- mkdir -p .ai/hooks
88
- mkdir -p .ai/context
89
- mkdir -p .ai/harness/checks
90
- mkdir -p .ai/harness/session .ai/harness/controller/packets .ai/harness/projections .ai/harness/transfers
91
- mkdir -p .ai/harness/failures
92
- mkdir -p .ai/harness/security
93
- mkdir -p .ai/harness/runs
94
70
  mkdir -p deploy/env
95
71
  mkdir -p deploy/scripts
96
72
  mkdir -p deploy/submissions
97
73
  mkdir -p deploy/runbooks
98
74
  mkdir -p deploy/release-checklists
99
75
  mkdir -p deploy/sql
100
- mkdir -p _ops/env
101
- mkdir -p _ops/secrets
102
- mkdir -p _ops/artifacts
103
- mkdir -p _ops/logs
104
- mkdir -p _ops/state
105
- mkdir -p _ops/scratch
106
- mkdir -p artifacts
107
76
  create_contract_directories
108
77
 
109
78
  # ===== Initial Files =====
@@ -131,25 +100,6 @@ Do not duplicate that execution checklist here. Record only work intentionally d
131
100
  | (none) | No deferred medium/long-term goal recorded yet. | Keep the first sprint bounded. | Add a row when a real follow-up is postponed. |
132
101
  TASK_TODO_EOF
133
102
 
134
- cat > tasks/current.md << 'TASK_CURRENT_EOF'
135
- # Current Status Snapshot
136
-
137
- <!-- generated-by: forge refresh-current-status v1 -->
138
- <!-- updated_at: bootstrap -->
139
- <!-- stale_after: 24h -->
140
-
141
- > **Status**: Idle
142
- > **Updated At**: bootstrap
143
- > **Source Branch**: main
144
- > **Source Commit**: bootstrap
145
- > **Target Branch**: main
146
- > **Stale After**: 24h
147
- > **Reason**: bootstrap
148
- > **Derived From**: active-plan, workstreams, handoff, checks, git status
149
-
150
- This file is a tracked mainline snapshot derived from repo artifacts. It is not a live lock, not a kanban board, and not an implementation gate. If it is stale, read the source artifacts below.
151
- TASK_CURRENT_EOF
152
-
153
103
  cat > tasks/lessons.md << 'TASK_LESSONS_EOF'
154
104
  # Lessons Learned (Self-Improvement Loop)
155
105
 
@@ -171,22 +121,17 @@ cat > docs/researches/README.md << 'RESEARCH_README_EOF'
171
121
  Durable research reports live in this directory as topic-scoped Markdown files.
172
122
 
173
123
  Use `YYYYMMDD-topic.md` names when chronology matters, or `<topic>.md` for
174
- stable subject reports. Keep task-local implementation decisions in
175
- `tasks/notes/`, and keep repeated correction-derived rules in `tasks/lessons.md`.
124
+ stable subject reports. Keep durable product/architecture decisions in authored
125
+ documentation; mutable Requirement/Plan/Work execution state stays in Controller Home.
176
126
  RESEARCH_README_EOF
177
127
 
178
- write_templates
179
- install_workflow_helpers
180
128
  install_workflow_contract
181
- install_hook_assets
182
129
  if pi_should_enable_factor_factory "$(pi_plan_type)"; then
183
130
  pi_install_factor_factory "$PWD" "$ASSETS_FACTOR_FACTORY_DIR" "$SCRIPT_DIR" "apply"
184
131
  fi
185
132
  ensure_task_sync_package_script
186
133
  write_runtime_gitignore_block
187
134
 
188
- pi_install_hook_adapters "$PWD" "$ASSETS_HOOKS_DIR" "apply"
189
- pi_print_codex_hook_trust_notice
190
135
 
191
136
  cat > docs/spec.md << 'DOCS_SPEC_EOF'
192
137
  # Product Spec
@@ -194,20 +139,8 @@ cat > docs/spec.md << 'DOCS_SPEC_EOF'
194
139
  > **Status**: Draft
195
140
  > **Owner**: Planner
196
141
  DOCS_SPEC_EOF
197
- # Canonical harness state surface:
198
- # - .ai/context/context-map.json
199
- # - .ai/harness/policy.json
200
- # - .ai/harness/brain-manifest.json
201
- # - .ai/harness/checks/latest.json
202
- # - .ai/harness/events.jsonl
203
- # - .ai/harness/architecture/events.jsonl
204
- # - .ai/harness/session/continuation.md
205
- # - .ai/harness/session/resume.md
206
- # - .ai/harness/failures/latest.jsonl
207
- # - .ai/harness/security/.gitkeep
208
- # - .ai/harness/worktrees/.gitkeep
209
- # - .ai/harness/runs/.gitkeep
210
- pi_ensure_harness_state_surface "$PWD" "apply"
142
+ # Mutable Forge Runtime state is intentionally not scaffolded into the repository.
143
+ # Repository registration binds Runtime state to Controller Home.
211
144
 
212
145
  cat > interfaces/types.ts << 'INTERFACES_TYPES_EOF'
213
146
  /**
@@ -244,6 +177,9 @@ bun test --watch # Watch mode
244
177
  ```
245
178
  TESTS_README_EOF
246
179
 
180
+ pi_install_root_context_files "$PWD" "apply"
181
+ pi_install_directory_context_files "$PWD" "apply"
182
+
247
183
  if [[ -d "$ASSETS_REF_DIR" ]]; then
248
184
  pi_install_reference_configs "$PWD" "$ASSETS_REF_DIR" "apply"
249
185
  else
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/env bun
2
+ import { createHash } from 'crypto';
3
+ import { existsSync, readFileSync } from 'fs';
4
+ import { isAbsolute, join, resolve } from 'path';
5
+ import { pathToFileURL } from 'url';
6
+ import { resolveControllerHome } from '../src/cli/repositories/controller-home.ts';
7
+ import { findRegisteredRepositoryByCheckoutRoot } from '../src/cli/repositories/registry.ts';
8
+ import { createRecoveryConfig, gatewayToken, loadRecoveryConfig } from '../src/runtime/standalone-recovery/core.ts';
9
+
10
+ export const PLUGIN_ID = 'local_recovery';
11
+ export const PLUGIN_VERSION = '0.1.0';
12
+ export const PROTOCOL_VERSION = 1;
13
+ export const CAPABILITIES = ['forge.local_recovery.transport.v1'];
14
+ export const ACTIONS = ['runtime_status', 'list_releases', 'stage_and_activate_runtime_release'];
15
+ const MUTATING_ACTIONS = new Set(['stage_and_activate_runtime_release']);
16
+ const LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);
17
+
18
+ function providerError(code, message, retryable = false, details) {
19
+ const error = new Error(message);
20
+ error.code = code;
21
+ error.retryable = retryable;
22
+ if (details) error.details = details;
23
+ return error;
24
+ }
25
+
26
+ function parseJson(text, code) {
27
+ try { return JSON.parse(text); } catch { throw providerError(code, 'Local Recovery provider JSON is invalid.'); }
28
+ }
29
+
30
+ export function validateProviderConfig(value) {
31
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw providerError('LOCAL_RECOVERY_CONFIG_INVALID', 'Local Recovery provider config must be an object.');
32
+ const keys = Object.keys(value);
33
+ if (keys.some((key) => key !== 'controllerHome')) throw providerError('LOCAL_RECOVERY_CONFIG_INVALID', 'Local Recovery provider config accepts only controllerHome.');
34
+ if (typeof value.controllerHome !== 'string' || !value.controllerHome.trim() || !isAbsolute(value.controllerHome.trim())) {
35
+ throw providerError('LOCAL_RECOVERY_CONTROLLER_HOME_REQUIRED', 'Local Recovery provider requires one absolute controllerHome.');
36
+ }
37
+ return { controllerHome: resolve(value.controllerHome.trim()) };
38
+ }
39
+
40
+ export function loadProviderConfig() {
41
+ const path = join(process.cwd(), 'config.json');
42
+ if (!existsSync(path)) return { controllerHome: resolveControllerHome() };
43
+ return validateProviderConfig(parseJson(readFileSync(path, 'utf8'), 'LOCAL_RECOVERY_CONFIG_INVALID'));
44
+ }
45
+
46
+ function recoveryEndpoint(config) {
47
+ const gateway = config.gateway;
48
+ if (!gateway || typeof gateway.host !== 'string' || !LOOPBACK_HOSTS.has(gateway.host) || !Number.isInteger(gateway.port) || gateway.port < 1 || gateway.port > 65535) {
49
+ throw providerError('LOCAL_RECOVERY_GATEWAY_INVALID', 'Installed Recovery Gateway must use one configured loopback endpoint.');
50
+ }
51
+ const host = gateway.host === '::1' ? '[::1]' : gateway.host;
52
+ return `http://${host}:${gateway.port}/recovery/mcp`;
53
+ }
54
+
55
+ function rpcPayload(text, contentType = '') {
56
+ if (/text\/event-stream/i.test(contentType)) {
57
+ const data = text.split(/\r?\n/).find((line) => line.startsWith('data: '));
58
+ if (!data) throw providerError('LOCAL_RECOVERY_MCP_RESPONSE_INVALID', 'Recovery MCP SSE response did not contain data.');
59
+ return parseJson(data.slice(6), 'LOCAL_RECOVERY_MCP_RESPONSE_INVALID');
60
+ }
61
+ return parseJson(text || '{}', 'LOCAL_RECOVERY_MCP_RESPONSE_INVALID');
62
+ }
63
+
64
+ async function postRpc(fetchImpl, endpoint, token, body, sessionId) {
65
+ const response = await fetchImpl(endpoint, {
66
+ method: 'POST',
67
+ headers: {
68
+ authorization: `Bearer ${token}`,
69
+ 'content-type': 'application/json',
70
+ accept: 'application/json, text/event-stream',
71
+ ...(sessionId ? { 'mcp-session-id': sessionId } : {}),
72
+ },
73
+ body: JSON.stringify(body),
74
+ });
75
+ const text = await response.text();
76
+ if (!response.ok) throw providerError('LOCAL_RECOVERY_MCP_HTTP_FAILED', `Recovery MCP returned HTTP ${response.status}.`, true, { status: response.status });
77
+ return { response, payload: text ? rpcPayload(text, response.headers.get('content-type') ?? '') : undefined };
78
+ }
79
+
80
+ export async function callRecoveryTool(controllerHome, toolName, args = {}, injected = {}) {
81
+ const loadConfig = injected.loadRecoveryConfig ?? loadRecoveryConfig;
82
+ const readToken = injected.gatewayToken ?? gatewayToken;
83
+ const fetchImpl = injected.fetch ?? fetch;
84
+ const config = loadConfig(controllerHome);
85
+ if (resolve(config.controllerHome) !== resolve(controllerHome)) throw providerError('LOCAL_RECOVERY_CONTROLLER_HOME_MISMATCH', 'Installed Recovery config belongs to a different Controller Home.');
86
+ const endpoint = recoveryEndpoint(config);
87
+ const token = readToken(config);
88
+ if (!token) throw providerError('LOCAL_RECOVERY_GATEWAY_TOKEN_UNAVAILABLE', 'Installed Recovery Gateway token is unavailable or expired.');
89
+ const initialized = await postRpc(fetchImpl, endpoint, token, {
90
+ jsonrpc: '2.0', id: 1, method: 'initialize', params: {
91
+ protocolVersion: '2025-06-18', capabilities: {}, clientInfo: { name: 'forge-local-recovery-provider', version: PLUGIN_VERSION },
92
+ },
93
+ });
94
+ const sessionId = initialized.response.headers.get('mcp-session-id');
95
+ if (!sessionId) throw providerError('LOCAL_RECOVERY_MCP_SESSION_MISSING', 'Recovery MCP initialize did not return a session id.');
96
+ try {
97
+ await postRpc(fetchImpl, endpoint, token, { jsonrpc: '2.0', method: 'notifications/initialized' }, sessionId);
98
+ const called = await postRpc(fetchImpl, endpoint, token, {
99
+ jsonrpc: '2.0', id: 2, method: 'tools/call', params: { name: toolName, arguments: args },
100
+ }, sessionId);
101
+ if (called.payload?.error) throw providerError('LOCAL_RECOVERY_TOOL_FAILED', String(called.payload.error?.message ?? 'Recovery tool failed.'), false);
102
+ const content = called.payload?.result?.content;
103
+ const text = Array.isArray(content) ? content.find((entry) => entry?.type === 'text' && typeof entry.text === 'string')?.text : undefined;
104
+ if (text) return parseJson(text, 'LOCAL_RECOVERY_TOOL_RESULT_INVALID');
105
+ return called.payload?.result ?? {};
106
+ } finally {
107
+ try {
108
+ await fetchImpl(endpoint, {
109
+ method: 'DELETE',
110
+ headers: { authorization: `Bearer ${token}`, accept: 'application/json, text/event-stream', 'mcp-session-id': sessionId },
111
+ });
112
+ } catch { /* Session cleanup is best effort; Recovery owns mutation transaction durability. */ }
113
+ }
114
+ }
115
+
116
+ function assertEmptyInput(input) {
117
+ if (!input || typeof input !== 'object' || Array.isArray(input) || Object.keys(input).length !== 0) {
118
+ throw providerError('LOCAL_RECOVERY_ARGUMENTS_FORBIDDEN', 'Local Recovery actions accept no caller endpoint, path, command, token, release, source, or tunnel arguments.');
119
+ }
120
+ }
121
+
122
+ function mutationRequestId(requestId) {
123
+ return `local-recovery:${createHash('sha256').update(String(requestId)).digest('hex').slice(0, 32)}`;
124
+ }
125
+
126
+ export function ensureSourceRepositoryProvenance(controllerHome, injected = {}) {
127
+ const loadConfig = injected.loadRecoveryConfig ?? loadRecoveryConfig;
128
+ const persistConfig = injected.createRecoveryConfig ?? createRecoveryConfig;
129
+ const findRepository = injected.findRegisteredRepositoryByCheckoutRoot ?? findRegisteredRepositoryByCheckoutRoot;
130
+ const recoveryConfig = loadConfig(controllerHome);
131
+ if (typeof recoveryConfig.primaryRuntimeSourceRepositoryId === 'string' && recoveryConfig.primaryRuntimeSourceRepositoryId.trim()) return recoveryConfig;
132
+ const sourceRoot = typeof recoveryConfig.primaryRuntimeSourceRoot === 'string' ? recoveryConfig.primaryRuntimeSourceRoot.trim() : '';
133
+ if (!sourceRoot) throw providerError('LOCAL_RECOVERY_SOURCE_ROOT_UNAVAILABLE', 'Installed Recovery config does not identify the primary Runtime source root.');
134
+ const repository = findRepository(sourceRoot, controllerHome);
135
+ if (!repository?.repoId) throw providerError('LOCAL_RECOVERY_SOURCE_REPOSITORY_UNRESOLVED', 'Configured primary Runtime source root is not owned by one registered repository.');
136
+ return persistConfig(controllerHome, {
137
+ primaryRuntimeSourceRoot: sourceRoot,
138
+ primaryRuntimeSourceRepositoryId: repository.repoId,
139
+ });
140
+ }
141
+
142
+ export async function executeAction(actionId, input, providerConfig, injected = {}) {
143
+ const config = validateProviderConfig(providerConfig);
144
+ if (!ACTIONS.includes(actionId)) throw providerError('LOCAL_RECOVERY_ACTION_UNSUPPORTED', 'Unsupported Local Recovery action.');
145
+ assertEmptyInput(input);
146
+ const callTool = injected.callRecoveryTool ?? callRecoveryTool;
147
+ if (actionId === 'stage_and_activate_runtime_release') ensureSourceRepositoryProvenance(config.controllerHome, injected);
148
+ const args = MUTATING_ACTIONS.has(actionId) ? { request_id: mutationRequestId(injected.requestId ?? actionId) } : {};
149
+ return await callTool(config.controllerHome, actionId, args, injected);
150
+ }
151
+
152
+ function manifest() {
153
+ return {
154
+ id: PLUGIN_ID,
155
+ name: 'Forge Local Recovery Transport',
156
+ version: PLUGIN_VERSION,
157
+ protocolVersion: '1.0',
158
+ mode: 'external',
159
+ scope: 'controller',
160
+ provider: 'local-recovery-gateway',
161
+ capabilities: CAPABILITIES,
162
+ actions: ACTIONS,
163
+ };
164
+ }
165
+
166
+ async function providerAction(request) {
167
+ const config = loadProviderConfig();
168
+ if (request.actionId === 'manifest') return manifest();
169
+ if (request.actionId === 'health') {
170
+ try {
171
+ const status = await executeAction('runtime_status', {}, config, { requestId: request.requestId });
172
+ return { state: 'ready', recovery: status };
173
+ } catch (error) {
174
+ return { state: 'degraded', warnings: [error?.code || 'LOCAL_RECOVERY_UNAVAILABLE'] };
175
+ }
176
+ }
177
+ return await executeAction(request.actionId, request.input, config, { requestId: request.requestId });
178
+ }
179
+
180
+ export async function runManagedHelper() {
181
+ process.stdout.write(`${JSON.stringify({ schemaVersion: 1, type: 'handshake', protocolVersion: PROTOCOL_VERSION, pluginId: PLUGIN_ID, helperVersion: PLUGIN_VERSION, capabilities: CAPABILITIES })}\n`);
182
+ let raw = '';
183
+ for await (const chunk of process.stdin) raw += chunk;
184
+ const line = raw.split(/\r?\n/).find((entry) => entry.trim());
185
+ if (!line) throw providerError('LOCAL_RECOVERY_REQUEST_MISSING', 'Managed plugin request is missing.');
186
+ const request = parseJson(line, 'LOCAL_RECOVERY_REQUEST_INVALID');
187
+ if (request.schemaVersion !== 1 || request.type !== 'execute' || typeof request.requestId !== 'string' || typeof request.actionId !== 'string' || !request.input || typeof request.input !== 'object' || Array.isArray(request.input)) {
188
+ throw providerError('LOCAL_RECOVERY_REQUEST_INVALID', 'Managed plugin request envelope is invalid.');
189
+ }
190
+ try {
191
+ const result = await providerAction(request);
192
+ process.stdout.write(`${JSON.stringify({ schemaVersion: 1, type: 'result', requestId: request.requestId, ok: true, result })}\n`);
193
+ } catch (error) {
194
+ process.stdout.write(`${JSON.stringify({ schemaVersion: 1, type: 'result', requestId: request.requestId, ok: false, error: { code: error?.code || 'LOCAL_RECOVERY_FAILED', message: String(error?.message || 'Local Recovery provider failed.').replace(/(token|secret|password|authorization)\s*[=:]\s*\S+/gi, '$1=[redacted]').slice(0, 1000), retryable: error?.retryable === true, ...(error?.details ? { details: error.details } : {}) } })}\n`);
195
+ }
196
+ }
197
+
198
+ const invokedDirectly = process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href;
199
+ if (invokedDirectly) {
200
+ runManagedHelper().catch((error) => {
201
+ process.stderr.write(`LOCAL_RECOVERY_HELPER_FATAL: ${String(error?.message || error).replace(/(token|secret|password|authorization)\s*[=:]\s*\S+/gi, '$1=[redacted]').slice(0, 1000)}\n`);
202
+ process.exitCode = 1;
203
+ });
204
+ }
@@ -0,0 +1,31 @@
1
+ export interface UuRemoteRescueConfig {
2
+ schemaVersion: 1;
3
+ device: {
4
+ id: string;
5
+ name: string;
6
+ platform: 'windows';
7
+ };
8
+ wsl: {
9
+ distro: string;
10
+ controllerHome: string;
11
+ };
12
+ uuycCliPath: string;
13
+ desktopOperatorSocketPath: string;
14
+ uuBundleId: string;
15
+ }
16
+
17
+ export function validateConfig(value: unknown): UuRemoteRescueConfig;
18
+
19
+ export function serviceUnits(controllerHome: string): {
20
+ runtime: string;
21
+ connector: string;
22
+ recoveryGateway: string;
23
+ recoveryWatchdog: string;
24
+ };
25
+
26
+ export function executeAction(
27
+ actionId: string,
28
+ input: Record<string, unknown>,
29
+ configInput: unknown,
30
+ injected?: Record<string, unknown>,
31
+ ): Promise<Record<string, unknown>>;