@moretea-labs/forge 1.5.1 → 1.7.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 (434) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +46 -0
  3. package/CLAUDE.md +2 -0
  4. package/DESIGN.md +7 -2
  5. package/README.md +4 -4
  6. package/README.zh-CN.md +2 -2
  7. package/SKILL.md +2 -2
  8. package/THIRD_PARTY_NOTICES.md +1 -1
  9. package/agents/openai.yaml +1 -1
  10. package/assets/hooks/hook-input.sh +11 -8
  11. package/assets/hooks/lib/session-state.sh +10 -7
  12. package/assets/hooks/lib/workflow-state.sh +13 -177
  13. package/assets/hooks/post-tool-observer.sh +8 -2
  14. package/assets/hooks/pre-edit-guard.sh +8 -39
  15. package/assets/hooks/prompt-guard.sh +7 -83
  16. package/assets/hooks/session-start-context.sh +56 -1
  17. package/assets/partials/05-workflow.partial.md +1 -1
  18. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  19. package/assets/plugin-registry.v1.json +54 -3
  20. package/assets/reference-configs/document-generation.md +1 -1
  21. package/assets/reference-configs/harness-overview.md +1 -1
  22. package/assets/reference-configs/hook-operations.md +1 -1
  23. package/assets/reference-configs/sprint-contracts.md +3 -3
  24. package/assets/skill-version.json +2 -2
  25. package/assets/templates/contract.template.md +2 -7
  26. package/assets/templates/helpers/capture-plan.sh +2 -2
  27. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  28. package/assets/templates/helpers/contract-worktree.sh +1 -21
  29. package/assets/templates/helpers/ensure-task-workflow.sh +13 -38
  30. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  31. package/assets/templates/helpers/new-plan.sh +1 -1
  32. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  33. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  34. package/assets/templates/helpers/sprint-backlog.sh +6 -6
  35. package/assets/templates/helpers/verify-contract.sh +1 -111
  36. package/assets/templates/helpers/verify-sprint.sh +3 -180
  37. package/assets/templates/plan.template.md +1 -1
  38. package/assets/templates/review.template.md +9 -34
  39. package/assets/workflow-contract.v1.json +10 -19
  40. package/docs/README.md +10 -10
  41. package/docs/architecture/CURRENT.md +170 -0
  42. package/docs/architecture/EVOLUTION.md +42 -0
  43. package/docs/architecture/current/README.md +4 -156
  44. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  45. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  46. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  47. package/docs/architecture/history/README.md +7 -0
  48. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  49. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  50. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  51. package/docs/architecture/history.md +3 -34
  52. package/docs/architecture/index.md +15 -98
  53. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  54. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  55. package/docs/architecture/versions/1.6.md +38 -0
  56. package/docs/architecture/versions/1.7.md +41 -0
  57. package/docs/forge-chatgpt-browser-engine.md +2 -2
  58. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  59. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  60. package/docs/forge-github-issue-launcher.md +1 -1
  61. package/docs/forge-runtime-self-healing-loop.md +1 -1
  62. package/docs/operations/controller-browser-plugin.md +38 -22
  63. package/docs/operations/controller-performance-and-502.md +124 -0
  64. package/docs/operations/controller-reliability-runbook.md +1 -1
  65. package/docs/operations/features.md +3 -3
  66. package/docs/operations/github-repository.md +1 -1
  67. package/docs/operations/homebrew.md +2 -2
  68. package/docs/operations/mcp-tool-exposure.md +5 -3
  69. package/docs/tutorials/01-install-and-start.md +1 -1
  70. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  71. package/docs/wiki/Architecture.md +6 -6
  72. package/docs/wiki/Implementation.md +2 -2
  73. package/docs/wiki/Installation.md +1 -1
  74. package/docs/wiki/Integrations.md +2 -2
  75. package/docs/wiki/Quick-Start.md +1 -1
  76. package/docs/wiki/Work-Lifecycle.md +1 -1
  77. package/package.json +29 -10
  78. package/scripts/activate-source-baseline.ts +17 -13
  79. package/scripts/benchmark-background-check-overlap.ts +228 -0
  80. package/scripts/benchmark-mcp-host.sh +117 -0
  81. package/scripts/benchmark-mcp-transport.ts +170 -0
  82. package/scripts/benchmark-quality-harness.ts +146 -0
  83. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  84. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  85. package/scripts/benchmark-typescript-navigation.ts +186 -0
  86. package/scripts/benchmark-work-efficiency.ts +334 -0
  87. package/scripts/capture-plan.sh +3 -3
  88. package/scripts/check-agent-tooling.sh +8 -35
  89. package/scripts/check-architecture-sync.sh +17 -86
  90. package/scripts/check-mcp-compatibility.ts +14 -0
  91. package/scripts/check-public-docs.sh +14 -1
  92. package/scripts/check-runtime-architecture.mjs +107 -64
  93. package/scripts/check-stable-baseline.ts +92 -0
  94. package/scripts/check-task-workflow.sh +4 -4
  95. package/scripts/contract-worktree.sh +1 -21
  96. package/scripts/ensure-task-workflow.sh +22 -55
  97. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  98. package/scripts/install-standalone-recovery.ts +24 -0
  99. package/scripts/lib/project-init-lib.sh +15 -44
  100. package/scripts/migrate-chatgpt-automation-schedules.ts +64 -0
  101. package/scripts/migrate-project-template.sh +23 -1179
  102. package/scripts/new-plan.sh +1 -1
  103. package/scripts/plan-to-todo.sh +11 -36
  104. package/scripts/run-governed-gate.ts +2 -1
  105. package/scripts/ship-worktrees.sh +2 -29
  106. package/scripts/smoke-ios-physical-device.ts +4 -2
  107. package/scripts/smoke-runtime-recovery.ts +1 -35
  108. package/scripts/smoke-schedule-engine.ts +1 -20
  109. package/scripts/sprint-backlog.sh +1 -1
  110. package/scripts/verify-contract.sh +1 -111
  111. package/scripts/verify-forge-runtime.sh +0 -1
  112. package/scripts/verify-sprint.sh +3 -180
  113. package/scripts/workflow-contract.ts +1 -5
  114. package/src/cli/commands/chatgpt.ts +31 -2
  115. package/src/cli/commands/init-hook.ts +3 -3
  116. package/src/cli/commands/mcp.ts +9 -5
  117. package/src/cli/commands/plugin.ts +37 -10
  118. package/src/cli/commands/recovery.ts +25 -3
  119. package/src/cli/commands/runtime.ts +55 -3
  120. package/src/cli/commands/security.ts +12 -1
  121. package/src/cli/commands/setup-profile.ts +31 -21
  122. package/src/cli/controller/check-runner.ts +106 -3
  123. package/src/cli/controller/composite-result.ts +1 -1
  124. package/src/cli/controller/context/focus.ts +51 -0
  125. package/src/cli/controller/context/instruction-context.ts +114 -0
  126. package/src/cli/controller/context/known-paths.ts +76 -0
  127. package/src/cli/controller/context/query-planning.ts +110 -0
  128. package/src/cli/controller/context/rule-resolution.ts +532 -0
  129. package/src/cli/controller/context/source-materializer.ts +278 -0
  130. package/src/cli/controller/context/structural.ts +16 -0
  131. package/src/cli/controller/context/types.ts +286 -0
  132. package/src/cli/controller/context-pack.ts +898 -430
  133. package/src/cli/controller/launch-agents.ts +77 -2
  134. package/src/cli/controller/operational-plan.ts +2 -2
  135. package/src/cli/controller/work-mode.ts +6 -4
  136. package/src/cli/editing/edit-session.ts +60 -7
  137. package/src/cli/github/github.ts +133 -0
  138. package/src/cli/hook/prompt-guard-decision.ts +17 -18
  139. package/src/cli/hook/prompt-intents.ts +1 -1
  140. package/src/cli/installer/managed-entries.ts +15 -1
  141. package/src/cli/local-bridge/console-automations.ts +225 -67
  142. package/src/cli/local-bridge/console-view-models.ts +3 -35
  143. package/src/cli/local-bridge/facade-api.ts +2 -217
  144. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  145. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +153 -3
  146. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  147. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +183 -3
  148. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +1 -1
  149. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +4 -3
  150. package/src/cli/local-bridge/frontend/src/lib/api.ts +18 -11
  151. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  152. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +1 -1
  153. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +4 -3
  154. package/src/cli/local-bridge/frontend/src/styles.css +27 -11
  155. package/src/cli/local-bridge/frontend/src/types.ts +8 -7
  156. package/src/cli/local-bridge/job-store.ts +1 -490
  157. package/src/cli/local-bridge/server.ts +29 -532
  158. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  159. package/src/cli/local-bridge/ui-dist/app.js +5101 -4967
  160. package/src/cli/mcp/auth.ts +5 -5
  161. package/src/cli/mcp/instructions.ts +3 -2
  162. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  163. package/src/cli/mcp/multi-repository.ts +16 -5
  164. package/src/cli/mcp/oauth.ts +175 -26
  165. package/src/cli/mcp/paths.ts +8 -2
  166. package/src/cli/mcp/repository-tools.ts +356 -101
  167. package/src/cli/mcp/server.ts +625 -54
  168. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  169. package/src/cli/mcp/toolset-selection.ts +1 -1
  170. package/src/cli/mcp/toolset.ts +42 -5
  171. package/src/cli/mcp/transports/http.ts +125 -15
  172. package/src/cli/mcp/transports/session-registry.ts +67 -5
  173. package/src/cli/mcp/types.ts +3 -3
  174. package/src/cli/repositories/command-classifier.ts +209 -14
  175. package/src/cli/repositories/command-executor.ts +55 -521
  176. package/src/cli/repositories/command-process.ts +108 -0
  177. package/src/cli/repositories/command-scope.ts +99 -41
  178. package/src/cli/repositories/controller-home.ts +7 -8
  179. package/src/cli/repositories/git-command-executor.ts +2 -0
  180. package/src/cli/repositories/locks.ts +53 -16
  181. package/src/cli/repositories/repository-snapshot.ts +121 -0
  182. package/src/cli/repositories/safe-patch.ts +6 -4
  183. package/src/cli/repositories/selected-path-actions.ts +17 -9
  184. package/src/cli/repositories/structured-git.ts +110 -10
  185. package/src/cli/repository/inspector.ts +565 -62
  186. package/src/cli/repository/session-cache.ts +58 -17
  187. package/src/cli/v81-entry.ts +1 -4
  188. package/src/effects/fs-transaction.ts +85 -17
  189. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  190. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  191. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  192. package/src/runtime/context/lsp-client.ts +283 -0
  193. package/src/runtime/context/semantic-navigation.ts +275 -0
  194. package/src/runtime/context/swift-navigation.ts +565 -0
  195. package/src/runtime/context/typescript-navigation.ts +226 -0
  196. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  197. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +196 -2
  198. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  199. package/src/runtime/control-plane/execution/execution-identity.ts +65 -14
  200. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  201. package/src/runtime/control-plane/execution/validation.ts +15 -2
  202. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  203. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  204. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  205. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  206. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  207. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +175 -8
  208. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -21
  209. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +87 -9
  210. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  211. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  212. package/src/runtime/control-plane/facade/controller-session-store.ts +144 -14
  213. package/src/runtime/control-plane/facade/goal-workloop-access.ts +9 -2
  214. package/src/runtime/control-plane/facade/goal-workloop.ts +885 -105
  215. package/src/runtime/control-plane/facade/index.ts +1 -0
  216. package/src/runtime/control-plane/facade/plan-contract-store.ts +211 -26
  217. package/src/runtime/control-plane/facade/requirement-board.ts +24 -8
  218. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  219. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  220. package/src/runtime/control-plane/facade/types.ts +55 -11
  221. package/src/runtime/control-plane/facade/work-contract-store.ts +204 -73
  222. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  223. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  224. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  225. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  226. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  227. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  228. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  229. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  230. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  231. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  232. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  233. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  234. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  235. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  236. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  237. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  238. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  239. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  240. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  241. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +642 -51
  242. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  243. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  244. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  245. package/src/runtime/control-plane/persistence/requirement-store.ts +15 -11
  246. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  247. package/src/runtime/control-plane/release-retention.ts +62 -2
  248. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  249. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  250. package/src/runtime/diagnostics/mcp-timing.ts +19 -0
  251. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  252. package/src/runtime/diagnostics/performance.ts +24 -1
  253. package/src/runtime/evidence/event-ledger.ts +1 -1
  254. package/src/runtime/execution/jobs/store.ts +58 -4
  255. package/src/runtime/execution/jobs/types.ts +1 -1
  256. package/src/runtime/execution/managed-workspace.ts +203 -1
  257. package/src/runtime/execution/process-runtime/check-facade.ts +52 -14
  258. package/src/runtime/execution/process-runtime/check-result.ts +63 -2
  259. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  260. package/src/runtime/execution/process-runtime/command-facade.ts +346 -40
  261. package/src/runtime/execution/process-runtime/gc.ts +98 -12
  262. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  263. package/src/runtime/execution/process-runtime/persisted-check.ts +57 -6
  264. package/src/runtime/execution/process-runtime/resource-claims.ts +97 -8
  265. package/src/runtime/execution/process-runtime/runtime.ts +59 -4
  266. package/src/runtime/execution/process-runtime/store.ts +7 -0
  267. package/src/runtime/execution/process-runtime/types.ts +2 -0
  268. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  269. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  270. package/src/runtime/execution/workers/executor.ts +0 -48
  271. package/src/runtime/gateway/mcp/execution-tools.ts +1219 -126
  272. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  273. package/src/runtime/gateway/mcp/router.ts +185 -83
  274. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  275. package/src/runtime/gateway/mcp/runtime-tools.ts +2555 -1616
  276. package/src/runtime/model-clients/deepseek-adapter.ts +0 -32
  277. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  278. package/src/runtime/plugins/browser-adapter.ts +2925 -318
  279. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  280. package/src/runtime/plugins/browser-handoff-host.ts +6 -31
  281. package/src/runtime/plugins/browser-handoff.ts +92 -5
  282. package/src/runtime/plugins/browser-macos-bridge.ts +586 -45
  283. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  284. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  285. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  286. package/src/runtime/plugins/browser-runtime.ts +183 -0
  287. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  288. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  289. package/src/runtime/plugins/desktop-operator-registration.ts +15 -12
  290. package/src/runtime/plugins/external-adapter.ts +324 -3
  291. package/src/runtime/plugins/external-registration.ts +84 -5
  292. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  293. package/src/runtime/plugins/first-party-registry.ts +4 -2
  294. package/src/runtime/plugins/github-adapter.ts +125 -0
  295. package/src/runtime/plugins/gmail-adapter.ts +28 -2
  296. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  297. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  298. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  299. package/src/runtime/plugins/ios-adapter.ts +106 -16
  300. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  301. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  302. package/src/runtime/plugins/lightweight-action.ts +153 -0
  303. package/src/runtime/plugins/local-system-adapter.ts +125 -8
  304. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  305. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  306. package/src/runtime/plugins/plugin-management-adapter.ts +181 -0
  307. package/src/runtime/plugins/resend-adapter.ts +1 -1
  308. package/src/runtime/plugins/store.ts +366 -24
  309. package/src/runtime/plugins/types.ts +39 -2
  310. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  311. package/src/runtime/projections/git-status-sampler.ts +16 -16
  312. package/src/runtime/projections/materialized-view.ts +28 -10
  313. package/src/runtime/recovery/actions.ts +0 -10
  314. package/src/runtime/recovery/classifier.ts +0 -9
  315. package/src/runtime/recovery/maintenance-executor.ts +415 -18
  316. package/src/runtime/recovery/probe.ts +0 -1
  317. package/src/runtime/recovery/types.ts +0 -1
  318. package/src/runtime/root/mcp-transport.ts +180 -10
  319. package/src/runtime/root/package-connector-service.ts +186 -8
  320. package/src/runtime/root/package-runtime-release.ts +143 -17
  321. package/src/runtime/root/package-runtime-service.ts +430 -22
  322. package/src/runtime/root/release-manifest.ts +7 -2
  323. package/src/runtime/root/release-materialize.ts +162 -19
  324. package/src/runtime/root/release-store.ts +48 -11
  325. package/src/runtime/root/runtime.ts +23 -5
  326. package/src/runtime/root/service.ts +100 -27
  327. package/src/runtime/root/types.ts +2 -0
  328. package/src/runtime/safe-tooling/index.ts +0 -1
  329. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  330. package/src/runtime/safe-tooling/types.ts +0 -30
  331. package/src/runtime/shared/trusted-executable.ts +62 -0
  332. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  333. package/src/runtime/standalone-recovery/core.ts +702 -94
  334. package/src/runtime/standalone-recovery/entry.ts +99 -23
  335. package/src/runtime/standalone-recovery/installer.ts +19 -3
  336. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  337. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  338. package/src/runtime/workflow/schedules/browser-probe.ts +258 -0
  339. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +40 -0
  340. package/src/runtime/workflow/schedules/engine.ts +509 -80
  341. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  342. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  343. package/src/runtime/workflow/schedules/store.ts +131 -10
  344. package/src/runtime/workflow/schedules/types.ts +6 -3
  345. package/src/runtime/workflow/schedules/work-continuation.ts +120 -34
  346. package/src/testing/test-governance.ts +8 -40
  347. package/assets/reference-configs/heartbeat-triage.md +0 -57
  348. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  349. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  350. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  351. package/bin/forge-desktop-helper.mjs +0 -204
  352. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  353. package/docs/architecture/current/architecture-invariants.md +0 -331
  354. package/docs/architecture/current/automation-and-schedule-engine.md +0 -453
  355. package/docs/architecture/current/codegraph-context-provider.md +0 -226
  356. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  357. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  358. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -354
  359. package/docs/architecture/current/entity-model.md +0 -592
  360. package/docs/architecture/current/external-plugin-governance.md +0 -396
  361. package/docs/architecture/current/failure-recovery.md +0 -447
  362. package/docs/architecture/current/governance.md +0 -213
  363. package/docs/architecture/current/human-interaction-plane.md +0 -87
  364. package/docs/architecture/current/implementation-status.md +0 -128
  365. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  366. package/docs/architecture/current/legacy-governance.md +0 -58
  367. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  368. package/docs/architecture/current/migration-roadmap.md +0 -105
  369. package/docs/architecture/current/multi-repository-execution.md +0 -371
  370. package/docs/architecture/current/operations-runbook.md +0 -45
  371. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  372. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  373. package/docs/architecture/current/repository-access-modes.md +0 -102
  374. package/docs/architecture/current/route-policy.md +0 -15
  375. package/docs/architecture/current/route-session-concurrency.md +0 -85
  376. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  377. package/docs/architecture/current/runtime-directory-map.md +0 -49
  378. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  379. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  380. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  381. package/docs/architecture/current/system-overview.md +0 -144
  382. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  383. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  384. package/docs/architecture/current/thin-harness-v1.md +0 -311
  385. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  386. package/docs/forge-autonomous-goal-loop.md +0 -9
  387. package/docs/forge-provider-configuration.md +0 -7
  388. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -83
  389. package/docs/operations/controller-desktop-plugin.md +0 -112
  390. package/docs/operations/gmail-assistant-routines.md +0 -186
  391. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  392. package/docs/operations/provider-configuration.md +0 -31
  393. package/scripts/harness-trace-grade.sh +0 -150
  394. package/scripts/heartbeat-triage.sh +0 -361
  395. package/scripts/maintenance-triage.sh +0 -167
  396. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  397. package/src/cli/repositories/goal-registry.ts +0 -239
  398. package/src/runtime/assistant/action-proposals.ts +0 -279
  399. package/src/runtime/assistant/intent.ts +0 -395
  400. package/src/runtime/assistant/model-provider.ts +0 -460
  401. package/src/runtime/assistant/openapi.ts +0 -223
  402. package/src/runtime/assistant/policy.ts +0 -89
  403. package/src/runtime/assistant/readiness.ts +0 -258
  404. package/src/runtime/assistant/routine-runtime.ts +0 -477
  405. package/src/runtime/assistant/schedule-binding.ts +0 -171
  406. package/src/runtime/assistant/standing-grants.ts +0 -375
  407. package/src/runtime/assistant/store.ts +0 -243
  408. package/src/runtime/assistant/types.ts +0 -135
  409. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  410. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  411. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  412. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  413. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  414. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  415. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  416. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  417. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  418. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  419. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  420. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  421. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  422. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  423. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  424. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  425. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  426. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  427. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  428. package/src/runtime/plugins/desktop-adapter.ts +0 -374
  429. package/src/runtime/safe-tooling/browser-safe.ts +0 -133
  430. package/src/runtime/workflow/findings/store.ts +0 -204
  431. package/src/runtime/workflow/findings/types.ts +0 -58
  432. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  433. package/src/runtime/workflow/portfolio/store.ts +0 -185
  434. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -7,6 +7,11 @@ import {
7
7
  refreshIssueWithGitHubPlugin,
8
8
  saveGitHubPluginConfig,
9
9
  } from '../../cli/github/plugin';
10
+ import {
11
+ dispatchGitHubWorkflow,
12
+ listGitHubWorkflowRuns,
13
+ listGitHubWorkflows,
14
+ } from '../../cli/github/github';
10
15
  import type {
11
16
  AssistantPluginActionDescriptor,
12
17
  AssistantPluginActionExecutionInput,
@@ -37,6 +42,20 @@ function githubPermissions(ready: boolean, projectConfigured: boolean): Assistan
37
42
  granted: ready && projectConfigured,
38
43
  required: projectConfigured,
39
44
  },
45
+ {
46
+ scope: 'github:actions:read',
47
+ mode: 'read',
48
+ description: 'List GitHub Actions workflows and recent workflow runs.',
49
+ granted: ready,
50
+ required: false,
51
+ },
52
+ {
53
+ scope: 'github:actions:write',
54
+ mode: 'write',
55
+ description: 'Dispatch an explicitly named workflow_dispatch workflow.',
56
+ granted: ready,
57
+ required: false,
58
+ },
40
59
  {
41
60
  scope: 'controller:issues:write',
42
61
  mode: 'write',
@@ -63,6 +82,13 @@ function githubCapabilities(): AssistantPluginCapability[] {
63
82
  scopes: ['github:projects:write'],
64
83
  actions: ['configure', 'publish_issue'],
65
84
  },
85
+ {
86
+ capabilityId: 'actions-ci',
87
+ title: 'GitHub Actions CI',
88
+ description: 'List workflow definitions and runs, and dispatch an explicitly named workflow_dispatch workflow.',
89
+ scopes: ['github:actions:read', 'github:actions:write'],
90
+ actions: ['list_workflows', 'list_workflow_runs', 'dispatch_workflow'],
91
+ },
66
92
  ];
67
93
  }
68
94
 
@@ -144,6 +170,74 @@ function githubActions(): AssistantPluginActionDescriptor[] {
144
170
  additionalProperties: false,
145
171
  },
146
172
  },
173
+ {
174
+ actionId: 'list_workflows',
175
+ title: 'List GitHub Actions workflows',
176
+ description: 'List workflow definitions for the configured GitHub repository.',
177
+ readOnly: true,
178
+ risk: 'readonly',
179
+ confirmation: 'none',
180
+ defaultTimeoutMs: 30_000,
181
+ cancellable: true,
182
+ idempotent: true,
183
+ scopes: ['github:actions:read'],
184
+ resourceClaims: [{ resource: 'remote', mode: 'read' }],
185
+ argumentsSchema: {
186
+ type: 'object',
187
+ properties: {
188
+ limit: { type: 'number', minimum: 1, maximum: 100 },
189
+ include_disabled: { type: 'boolean' },
190
+ },
191
+ additionalProperties: false,
192
+ },
193
+ },
194
+ {
195
+ actionId: 'list_workflow_runs',
196
+ title: 'List GitHub Actions runs',
197
+ description: 'List recent GitHub Actions workflow runs with optional workflow, branch, and status filters.',
198
+ readOnly: true,
199
+ risk: 'readonly',
200
+ confirmation: 'none',
201
+ defaultTimeoutMs: 30_000,
202
+ cancellable: true,
203
+ idempotent: true,
204
+ scopes: ['github:actions:read'],
205
+ resourceClaims: [{ resource: 'remote', mode: 'read' }],
206
+ argumentsSchema: {
207
+ type: 'object',
208
+ properties: {
209
+ workflow: { type: 'string' },
210
+ branch: { type: 'string' },
211
+ status: { type: 'string' },
212
+ limit: { type: 'number', minimum: 1, maximum: 100 },
213
+ include_disabled: { type: 'boolean' },
214
+ },
215
+ additionalProperties: false,
216
+ },
217
+ },
218
+ {
219
+ actionId: 'dispatch_workflow',
220
+ title: 'Dispatch GitHub Actions workflow',
221
+ description: 'Create a workflow_dispatch event for one explicitly named workflow.',
222
+ readOnly: false,
223
+ risk: 'remote_write',
224
+ confirmation: 'authorization',
225
+ defaultTimeoutMs: 60_000,
226
+ cancellable: true,
227
+ idempotent: false,
228
+ scopes: ['github:actions:write'],
229
+ resourceClaims: [{ resource: 'remote', mode: 'exclusive' }],
230
+ argumentsSchema: {
231
+ type: 'object',
232
+ properties: {
233
+ workflow: { type: 'string' },
234
+ ref: { type: 'string' },
235
+ inputs: { type: 'object', additionalProperties: { type: ['string', 'number', 'boolean'] } },
236
+ },
237
+ required: ['workflow'],
238
+ additionalProperties: false,
239
+ },
240
+ },
147
241
  {
148
242
  actionId: 'close_issue',
149
243
  title: 'Close linked GitHub issue',
@@ -252,6 +346,37 @@ export async function executeGitHubPluginAction(input: AssistantPluginActionExec
252
346
  return { issue: publishIssueWithGitHubPlugin(input.repoRoot, String(input.args.issue_id ?? '').trim()) };
253
347
  case 'refresh_issue':
254
348
  return refreshIssueWithGitHubPlugin(input.repoRoot, String(input.args.issue_id ?? '').trim()) as Record<string, unknown>;
349
+ case 'list_workflows': {
350
+ const config = loadGitHubPluginConfig(input.repoRoot);
351
+ return {
352
+ workflows: listGitHubWorkflows(input.repoRoot, config.repository, {
353
+ limit: typeof input.args.limit === 'number' ? input.args.limit : undefined,
354
+ includeDisabled: input.args.include_disabled === true,
355
+ }),
356
+ };
357
+ }
358
+ case 'list_workflow_runs': {
359
+ const config = loadGitHubPluginConfig(input.repoRoot);
360
+ return {
361
+ runs: listGitHubWorkflowRuns(input.repoRoot, config.repository, {
362
+ workflow: typeof input.args.workflow === 'string' ? input.args.workflow : undefined,
363
+ branch: typeof input.args.branch === 'string' ? input.args.branch : undefined,
364
+ status: typeof input.args.status === 'string' ? input.args.status : undefined,
365
+ limit: typeof input.args.limit === 'number' ? input.args.limit : undefined,
366
+ includeDisabled: input.args.include_disabled === true,
367
+ }),
368
+ };
369
+ }
370
+ case 'dispatch_workflow': {
371
+ const config = loadGitHubPluginConfig(input.repoRoot);
372
+ return dispatchGitHubWorkflow(input.repoRoot, config.repository, {
373
+ workflow: String(input.args.workflow ?? ''),
374
+ ref: typeof input.args.ref === 'string' ? input.args.ref : undefined,
375
+ inputs: input.args.inputs && typeof input.args.inputs === 'object' && !Array.isArray(input.args.inputs)
376
+ ? input.args.inputs as Record<string, string | number | boolean>
377
+ : undefined,
378
+ });
379
+ }
255
380
  case 'close_issue':
256
381
  return { issue: closeIssueWithGitHubPlugin(input.repoRoot, String(input.args.issue_id ?? '').trim()) };
257
382
  default:
@@ -364,7 +364,33 @@ function gmailActions(): AssistantPluginActionDescriptor[] {
364
364
  ];
365
365
  }
366
366
 
367
- function buildMimeMessage(args: Record<string, unknown>, config: GmailPluginConfig): string {
367
+ export function encodeMimeHeaderValue(value: string): string {
368
+ if (/[\r\n]/.test(value)) {
369
+ throw new AssistantPluginError('PLUGIN_ACTION_ARGUMENT_INVALID', 'MIME header values must not contain CR or LF.');
370
+ }
371
+ if (/^[\x00-\x7F]*$/.test(value)) return value;
372
+
373
+ // RFC 2047 encoded-words are limited to 75 characters including wrappers.
374
+ // 45 UTF-8 bytes encode to at most 60 Base64 characters, leaving room for
375
+ // the =?UTF-8?B?...?= wrapper. Split only at Unicode code-point boundaries.
376
+ const chunks: string[] = [];
377
+ let current = '';
378
+ for (const character of value) {
379
+ const candidate = `${current}${character}`;
380
+ if (current && Buffer.byteLength(candidate, 'utf8') > 45) {
381
+ chunks.push(current);
382
+ current = character;
383
+ } else {
384
+ current = candidate;
385
+ }
386
+ }
387
+ if (current) chunks.push(current);
388
+ return chunks
389
+ .map((chunk) => `=?UTF-8?B?${Buffer.from(chunk, 'utf8').toString('base64')}?=`)
390
+ .join('\r\n ');
391
+ }
392
+
393
+ export function buildMimeMessage(args: Record<string, unknown>, config: GmailPluginConfig): string {
368
394
  const to = stringArray(args.to);
369
395
  const cc = stringArray(args.cc);
370
396
  const bcc = stringArray(args.bcc);
@@ -378,7 +404,7 @@ function buildMimeMessage(args: Record<string, unknown>, config: GmailPluginConf
378
404
  ...(cc ? [`Cc: ${cc.join(', ')}`] : []),
379
405
  ...(bcc ? [`Bcc: ${bcc.join(', ')}`] : []),
380
406
  ...(config.accountEmail ? [`From: ${config.accountEmail}`] : []),
381
- `Subject: ${subject}`,
407
+ `Subject: ${encodeMimeHeaderValue(subject)}`,
382
408
  'Content-Type: text/plain; charset="UTF-8"',
383
409
  'MIME-Version: 1.0',
384
410
  '',
@@ -14,7 +14,7 @@ export interface AgentDeviceProviderIdentity {
14
14
  export interface AgentDeviceSessionContext {
15
15
  stateDir: string;
16
16
  session: string;
17
- device: string;
17
+ device?: string;
18
18
  platform: 'ios';
19
19
  requestId: string;
20
20
  cwd: string;
@@ -1,6 +1,7 @@
1
1
  import { existsSync, readFileSync, realpathSync } from 'fs';
2
2
  import { dirname, join } from 'path';
3
3
  import { createRequire } from 'module';
4
+ import { pathToFileURL } from 'url';
4
5
  import { AssistantPluginError } from '../errors';
5
6
  import type {
6
7
  AgentDeviceProviderIdentity,
@@ -26,8 +27,8 @@ interface TypedAgentDeviceModule {
26
27
  }
27
28
 
28
29
  interface TypedProviderHooks {
29
- loadModule: () => Promise<TypedAgentDeviceModule>;
30
- resolveModule: () => string | undefined;
30
+ loadModule: (resolvedModule?: string) => Promise<TypedAgentDeviceModule>;
31
+ resolveModule: (repoRoot?: string) => string | undefined;
31
32
  runtimeNodeVersion: () => string;
32
33
  }
33
34
 
@@ -76,7 +77,43 @@ function agentDevicePackageVersion(start: string): string | undefined {
76
77
  return undefined;
77
78
  }
78
79
 
79
- function defaultResolveModule(): string | undefined {
80
+ function repoLocalModuleEntry(repoRoot?: string): string | undefined {
81
+ if (!repoRoot) return undefined;
82
+ const packageRoot = join(repoRoot, 'node_modules', AGENT_DEVICE_MODULE_NAME);
83
+ const packageJsonPath = join(packageRoot, 'package.json');
84
+ if (!existsSync(packageJsonPath)) return undefined;
85
+ try {
86
+ const parsed = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {
87
+ name?: unknown;
88
+ main?: unknown;
89
+ exports?: unknown;
90
+ };
91
+ if (parsed.name !== AGENT_DEVICE_MODULE_NAME) return undefined;
92
+ const exportsRoot = parsed.exports && typeof parsed.exports === 'object' && !Array.isArray(parsed.exports)
93
+ ? (parsed.exports as Record<string, unknown>)['.']
94
+ : undefined;
95
+ const importEntry = exportsRoot && typeof exportsRoot === 'object' && !Array.isArray(exportsRoot)
96
+ ? (exportsRoot as Record<string, unknown>).import
97
+ : undefined;
98
+ const relativeEntry = typeof importEntry === 'string'
99
+ ? importEntry
100
+ : typeof exportsRoot === 'string'
101
+ ? exportsRoot
102
+ : typeof parsed.main === 'string'
103
+ ? parsed.main
104
+ : undefined;
105
+ if (!relativeEntry) return undefined;
106
+ const candidate = join(packageRoot, relativeEntry);
107
+ if (!existsSync(candidate)) return undefined;
108
+ try { return realpathSync(candidate); } catch { return candidate; }
109
+ } catch {
110
+ return undefined;
111
+ }
112
+ }
113
+
114
+ function defaultResolveModule(repoRoot?: string): string | undefined {
115
+ const local = repoLocalModuleEntry(repoRoot);
116
+ if (local) return local;
80
117
  try {
81
118
  return realpathSync(require.resolve(AGENT_DEVICE_MODULE_NAME));
82
119
  } catch {
@@ -84,8 +121,14 @@ function defaultResolveModule(): string | undefined {
84
121
  }
85
122
  }
86
123
 
124
+ async function defaultLoadModule(resolvedModule?: string): Promise<TypedAgentDeviceModule> {
125
+ return resolvedModule
126
+ ? import(pathToFileURL(resolvedModule).href) as Promise<TypedAgentDeviceModule>
127
+ : import(AGENT_DEVICE_MODULE_NAME) as unknown as Promise<TypedAgentDeviceModule>;
128
+ }
129
+
87
130
  let hooks: TypedProviderHooks = {
88
- loadModule: async () => import(AGENT_DEVICE_MODULE_NAME) as unknown as TypedAgentDeviceModule,
131
+ loadModule: defaultLoadModule,
89
132
  resolveModule: defaultResolveModule,
90
133
  runtimeNodeVersion: () => process.versions.node,
91
134
  };
@@ -98,13 +141,13 @@ export function setAgentDeviceTypedProviderHooksForTest(
98
141
 
99
142
  export function resetAgentDeviceTypedProviderHooksForTest(): void {
100
143
  hooks = {
101
- loadModule: async () => import(AGENT_DEVICE_MODULE_NAME) as unknown as TypedAgentDeviceModule,
144
+ loadModule: defaultLoadModule,
102
145
  resolveModule: defaultResolveModule,
103
146
  runtimeNodeVersion: () => process.versions.node,
104
147
  };
105
148
  }
106
149
 
107
- export function typedAgentDeviceIdentity(): AgentDeviceProviderIdentity {
150
+ export function typedAgentDeviceIdentity(options: { repoRoot?: string } = {}): AgentDeviceProviderIdentity {
108
151
  const runtimeVersion = hooks.runtimeNodeVersion();
109
152
  if (!versionAtLeast(runtimeVersion, MIN_TYPED_CLIENT_NODE_VERSION)) {
110
153
  return {
@@ -115,7 +158,7 @@ export function typedAgentDeviceIdentity(): AgentDeviceProviderIdentity {
115
158
  reason: `The optional agent-device typed client requires Node >=${MIN_TYPED_CLIENT_NODE_VERSION}; current runtime is ${runtimeVersion || 'unknown'}.`,
116
159
  };
117
160
  }
118
- const resolvedModule = hooks.resolveModule();
161
+ const resolvedModule = hooks.resolveModule(options.repoRoot);
119
162
  if (!resolvedModule) {
120
163
  return {
121
164
  kind: 'typed',
@@ -194,7 +237,7 @@ function snapshotOptions(
194
237
  ): Record<string, unknown> {
195
238
  return {
196
239
  platform: context.platform,
197
- device: context.device,
240
+ ...(context.device ? { device: context.device } : {}),
198
241
  session: context.session,
199
242
  requestId: context.requestId,
200
243
  interactiveOnly: request.interactiveOnly === true,
@@ -227,7 +270,7 @@ export class TypedAgentDeviceReadProvider implements AgentDeviceReadProvider {
227
270
  }
228
271
  let module: TypedAgentDeviceModule;
229
272
  try {
230
- module = await hooks.loadModule();
273
+ module = await hooks.loadModule(this.identity.resolvedModule);
231
274
  } catch (error) {
232
275
  throw new AssistantPluginError(
233
276
  'AGENT_DEVICE_TYPED_PROVIDER_UNAVAILABLE',