@moretea-labs/forge 1.6.0 → 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 (396) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/CLAUDE.md +2 -0
  4. package/README.md +2 -2
  5. package/README.zh-CN.md +1 -1
  6. package/SKILL.md +2 -2
  7. package/THIRD_PARTY_NOTICES.md +1 -1
  8. package/agents/openai.yaml +1 -1
  9. package/assets/hooks/hook-input.sh +11 -8
  10. package/assets/hooks/lib/session-state.sh +10 -7
  11. package/assets/hooks/lib/workflow-state.sh +13 -177
  12. package/assets/hooks/post-tool-observer.sh +8 -2
  13. package/assets/hooks/prompt-guard.sh +5 -81
  14. package/assets/hooks/session-start-context.sh +56 -1
  15. package/assets/partials/05-workflow.partial.md +1 -1
  16. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  17. package/assets/plugin-registry.v1.json +1 -1
  18. package/assets/reference-configs/document-generation.md +1 -1
  19. package/assets/reference-configs/harness-overview.md +1 -1
  20. package/assets/reference-configs/sprint-contracts.md +3 -3
  21. package/assets/skill-version.json +2 -2
  22. package/assets/templates/contract.template.md +2 -7
  23. package/assets/templates/helpers/capture-plan.sh +2 -2
  24. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  25. package/assets/templates/helpers/contract-worktree.sh +1 -21
  26. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  27. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  28. package/assets/templates/helpers/new-plan.sh +1 -1
  29. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  30. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  31. package/assets/templates/helpers/verify-contract.sh +1 -111
  32. package/assets/templates/helpers/verify-sprint.sh +3 -180
  33. package/assets/templates/plan.template.md +1 -1
  34. package/assets/templates/review.template.md +9 -34
  35. package/assets/workflow-contract.v1.json +10 -19
  36. package/docs/README.md +10 -10
  37. package/docs/architecture/CURRENT.md +170 -0
  38. package/docs/architecture/EVOLUTION.md +42 -0
  39. package/docs/architecture/current/README.md +4 -156
  40. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  41. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  42. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  43. package/docs/architecture/history/README.md +7 -0
  44. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  45. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  46. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  47. package/docs/architecture/history.md +3 -34
  48. package/docs/architecture/index.md +15 -98
  49. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  50. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  51. package/docs/architecture/versions/1.6.md +38 -0
  52. package/docs/architecture/versions/1.7.md +41 -0
  53. package/docs/forge-chatgpt-browser-engine.md +2 -2
  54. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  55. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  56. package/docs/forge-github-issue-launcher.md +1 -1
  57. package/docs/forge-runtime-self-healing-loop.md +1 -1
  58. package/docs/operations/controller-browser-plugin.md +26 -6
  59. package/docs/operations/controller-performance-and-502.md +124 -0
  60. package/docs/operations/controller-reliability-runbook.md +1 -1
  61. package/docs/operations/features.md +2 -2
  62. package/docs/operations/github-repository.md +1 -1
  63. package/docs/operations/homebrew.md +2 -2
  64. package/docs/operations/mcp-tool-exposure.md +5 -3
  65. package/docs/wiki/Architecture.md +6 -6
  66. package/docs/wiki/Implementation.md +2 -2
  67. package/docs/wiki/Integrations.md +2 -2
  68. package/docs/wiki/Work-Lifecycle.md +1 -1
  69. package/package.json +29 -10
  70. package/scripts/activate-source-baseline.ts +17 -13
  71. package/scripts/benchmark-background-check-overlap.ts +228 -0
  72. package/scripts/benchmark-mcp-host.sh +117 -0
  73. package/scripts/benchmark-mcp-transport.ts +170 -0
  74. package/scripts/benchmark-quality-harness.ts +146 -0
  75. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  76. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  77. package/scripts/benchmark-typescript-navigation.ts +186 -0
  78. package/scripts/benchmark-work-efficiency.ts +334 -0
  79. package/scripts/capture-plan.sh +3 -3
  80. package/scripts/check-agent-tooling.sh +8 -35
  81. package/scripts/check-architecture-sync.sh +17 -86
  82. package/scripts/check-mcp-compatibility.ts +14 -0
  83. package/scripts/check-runtime-architecture.mjs +107 -64
  84. package/scripts/check-stable-baseline.ts +92 -0
  85. package/scripts/check-task-workflow.sh +4 -4
  86. package/scripts/contract-worktree.sh +1 -21
  87. package/scripts/ensure-task-workflow.sh +22 -55
  88. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  89. package/scripts/install-standalone-recovery.ts +24 -0
  90. package/scripts/lib/project-init-lib.sh +15 -44
  91. package/scripts/migrate-project-template.sh +23 -1179
  92. package/scripts/new-plan.sh +1 -1
  93. package/scripts/plan-to-todo.sh +11 -36
  94. package/scripts/run-governed-gate.ts +2 -1
  95. package/scripts/ship-worktrees.sh +2 -29
  96. package/scripts/smoke-ios-physical-device.ts +4 -2
  97. package/scripts/smoke-runtime-recovery.ts +1 -35
  98. package/scripts/smoke-schedule-engine.ts +1 -20
  99. package/scripts/verify-contract.sh +1 -111
  100. package/scripts/verify-forge-runtime.sh +0 -1
  101. package/scripts/verify-sprint.sh +3 -180
  102. package/scripts/workflow-contract.ts +1 -5
  103. package/src/cli/commands/init-hook.ts +3 -3
  104. package/src/cli/commands/mcp.ts +9 -5
  105. package/src/cli/commands/plugin.ts +1 -1
  106. package/src/cli/commands/recovery.ts +25 -3
  107. package/src/cli/commands/runtime.ts +55 -3
  108. package/src/cli/commands/security.ts +12 -1
  109. package/src/cli/commands/setup-profile.ts +31 -21
  110. package/src/cli/controller/check-runner.ts +106 -3
  111. package/src/cli/controller/composite-result.ts +1 -1
  112. package/src/cli/controller/context/focus.ts +51 -0
  113. package/src/cli/controller/context/instruction-context.ts +114 -0
  114. package/src/cli/controller/context/known-paths.ts +76 -0
  115. package/src/cli/controller/context/query-planning.ts +110 -0
  116. package/src/cli/controller/context/rule-resolution.ts +532 -0
  117. package/src/cli/controller/context/source-materializer.ts +278 -0
  118. package/src/cli/controller/context/structural.ts +16 -0
  119. package/src/cli/controller/context/types.ts +286 -0
  120. package/src/cli/controller/context-pack.ts +785 -469
  121. package/src/cli/controller/launch-agents.ts +77 -2
  122. package/src/cli/controller/operational-plan.ts +2 -2
  123. package/src/cli/controller/work-mode.ts +6 -4
  124. package/src/cli/editing/edit-session.ts +60 -7
  125. package/src/cli/github/github.ts +133 -0
  126. package/src/cli/installer/managed-entries.ts +15 -1
  127. package/src/cli/local-bridge/console-automations.ts +54 -78
  128. package/src/cli/local-bridge/console-view-models.ts +1 -35
  129. package/src/cli/local-bridge/facade-api.ts +0 -217
  130. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  131. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  132. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  133. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  134. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  135. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  136. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  137. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  138. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  139. package/src/cli/local-bridge/job-store.ts +1 -490
  140. package/src/cli/local-bridge/server.ts +0 -513
  141. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  142. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  143. package/src/cli/mcp/auth.ts +5 -5
  144. package/src/cli/mcp/instructions.ts +3 -2
  145. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  146. package/src/cli/mcp/multi-repository.ts +16 -5
  147. package/src/cli/mcp/oauth.ts +175 -26
  148. package/src/cli/mcp/repository-tools.ts +247 -107
  149. package/src/cli/mcp/server.ts +537 -111
  150. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  151. package/src/cli/mcp/toolset-selection.ts +1 -1
  152. package/src/cli/mcp/toolset.ts +42 -5
  153. package/src/cli/mcp/transports/http.ts +101 -14
  154. package/src/cli/mcp/transports/session-registry.ts +43 -5
  155. package/src/cli/mcp/types.ts +3 -3
  156. package/src/cli/repositories/command-classifier.ts +101 -19
  157. package/src/cli/repositories/command-executor.ts +55 -521
  158. package/src/cli/repositories/command-process.ts +108 -0
  159. package/src/cli/repositories/command-scope.ts +99 -41
  160. package/src/cli/repositories/controller-home.ts +7 -8
  161. package/src/cli/repositories/git-command-executor.ts +2 -0
  162. package/src/cli/repositories/locks.ts +53 -16
  163. package/src/cli/repositories/repository-snapshot.ts +121 -0
  164. package/src/cli/repositories/selected-path-actions.ts +17 -9
  165. package/src/cli/repositories/structured-git.ts +61 -3
  166. package/src/cli/repository/inspector.ts +553 -63
  167. package/src/cli/repository/session-cache.ts +58 -17
  168. package/src/cli/v81-entry.ts +1 -4
  169. package/src/effects/fs-transaction.ts +85 -17
  170. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  171. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  172. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  173. package/src/runtime/context/lsp-client.ts +283 -0
  174. package/src/runtime/context/semantic-navigation.ts +275 -0
  175. package/src/runtime/context/swift-navigation.ts +565 -0
  176. package/src/runtime/context/typescript-navigation.ts +226 -0
  177. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  178. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +47 -8
  179. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  180. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  181. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  182. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  183. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  184. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  185. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  186. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +143 -8
  187. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  188. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +85 -8
  189. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  190. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  191. package/src/runtime/control-plane/facade/controller-session-store.ts +132 -1
  192. package/src/runtime/control-plane/facade/goal-workloop-access.ts +2 -0
  193. package/src/runtime/control-plane/facade/goal-workloop.ts +686 -129
  194. package/src/runtime/control-plane/facade/index.ts +1 -0
  195. package/src/runtime/control-plane/facade/plan-contract-store.ts +185 -20
  196. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  197. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  198. package/src/runtime/control-plane/facade/types.ts +22 -5
  199. package/src/runtime/control-plane/facade/work-contract-store.ts +175 -73
  200. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  201. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  202. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  203. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  204. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  205. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  206. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  207. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  208. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  209. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  210. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  211. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  212. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  213. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  214. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  215. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  216. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  217. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  218. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  219. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +355 -116
  220. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  221. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  222. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  223. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  224. package/src/runtime/control-plane/release-retention.ts +62 -2
  225. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  226. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  227. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  228. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  229. package/src/runtime/diagnostics/performance.ts +24 -1
  230. package/src/runtime/evidence/event-ledger.ts +1 -1
  231. package/src/runtime/execution/jobs/store.ts +58 -4
  232. package/src/runtime/execution/jobs/types.ts +1 -1
  233. package/src/runtime/execution/managed-workspace.ts +203 -1
  234. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  235. package/src/runtime/execution/process-runtime/check-result.ts +53 -0
  236. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  237. package/src/runtime/execution/process-runtime/command-facade.ts +345 -40
  238. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  239. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  240. package/src/runtime/execution/process-runtime/persisted-check.ts +47 -4
  241. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  242. package/src/runtime/execution/process-runtime/runtime.ts +43 -3
  243. package/src/runtime/execution/process-runtime/store.ts +1 -0
  244. package/src/runtime/execution/process-runtime/types.ts +2 -0
  245. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  246. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  247. package/src/runtime/execution/workers/executor.ts +0 -48
  248. package/src/runtime/gateway/mcp/execution-tools.ts +1192 -114
  249. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  250. package/src/runtime/gateway/mcp/router.ts +184 -82
  251. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  252. package/src/runtime/gateway/mcp/runtime-tools.ts +2224 -1589
  253. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  254. package/src/runtime/plugins/browser-adapter.ts +2901 -241
  255. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  256. package/src/runtime/plugins/browser-handoff.ts +92 -2
  257. package/src/runtime/plugins/browser-macos-bridge.ts +582 -49
  258. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  259. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  260. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  261. package/src/runtime/plugins/browser-runtime.ts +183 -0
  262. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  263. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  264. package/src/runtime/plugins/desktop-operator-registration.ts +8 -2
  265. package/src/runtime/plugins/external-adapter.ts +324 -3
  266. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  267. package/src/runtime/plugins/first-party-registry.ts +2 -0
  268. package/src/runtime/plugins/github-adapter.ts +125 -0
  269. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  270. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  271. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  272. package/src/runtime/plugins/ios-adapter.ts +106 -16
  273. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  274. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  275. package/src/runtime/plugins/lightweight-action.ts +153 -0
  276. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  277. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  278. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  279. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  280. package/src/runtime/plugins/resend-adapter.ts +1 -1
  281. package/src/runtime/plugins/store.ts +269 -29
  282. package/src/runtime/plugins/types.ts +35 -2
  283. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  284. package/src/runtime/projections/git-status-sampler.ts +16 -16
  285. package/src/runtime/projections/materialized-view.ts +28 -10
  286. package/src/runtime/recovery/maintenance-executor.ts +393 -28
  287. package/src/runtime/root/mcp-transport.ts +180 -10
  288. package/src/runtime/root/package-connector-service.ts +186 -8
  289. package/src/runtime/root/package-runtime-release.ts +143 -17
  290. package/src/runtime/root/package-runtime-service.ts +430 -22
  291. package/src/runtime/root/release-manifest.ts +7 -2
  292. package/src/runtime/root/release-materialize.ts +19 -0
  293. package/src/runtime/root/release-store.ts +48 -11
  294. package/src/runtime/root/runtime.ts +23 -5
  295. package/src/runtime/root/service.ts +100 -29
  296. package/src/runtime/root/types.ts +2 -0
  297. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  298. package/src/runtime/shared/trusted-executable.ts +62 -0
  299. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  300. package/src/runtime/standalone-recovery/core.ts +700 -92
  301. package/src/runtime/standalone-recovery/entry.ts +99 -23
  302. package/src/runtime/standalone-recovery/installer.ts +19 -3
  303. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  304. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  305. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  306. package/src/runtime/workflow/schedules/engine.ts +287 -151
  307. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  308. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  309. package/src/runtime/workflow/schedules/store.ts +131 -10
  310. package/src/runtime/workflow/schedules/types.ts +2 -4
  311. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  312. package/src/testing/test-governance.ts +8 -40
  313. package/assets/reference-configs/heartbeat-triage.md +0 -57
  314. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  315. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  316. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  317. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  318. package/docs/architecture/current/architecture-invariants.md +0 -331
  319. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  320. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  321. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  322. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  323. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  324. package/docs/architecture/current/entity-model.md +0 -612
  325. package/docs/architecture/current/external-plugin-governance.md +0 -396
  326. package/docs/architecture/current/failure-recovery.md +0 -447
  327. package/docs/architecture/current/governance.md +0 -213
  328. package/docs/architecture/current/human-interaction-plane.md +0 -87
  329. package/docs/architecture/current/implementation-status.md +0 -128
  330. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  331. package/docs/architecture/current/legacy-governance.md +0 -58
  332. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  333. package/docs/architecture/current/migration-roadmap.md +0 -105
  334. package/docs/architecture/current/multi-repository-execution.md +0 -371
  335. package/docs/architecture/current/operations-runbook.md +0 -45
  336. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  337. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  338. package/docs/architecture/current/repository-access-modes.md +0 -102
  339. package/docs/architecture/current/route-policy.md +0 -15
  340. package/docs/architecture/current/route-session-concurrency.md +0 -85
  341. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  342. package/docs/architecture/current/runtime-directory-map.md +0 -49
  343. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  344. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  345. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  346. package/docs/architecture/current/system-overview.md +0 -169
  347. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  348. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  349. package/docs/architecture/current/thin-harness-v1.md +0 -321
  350. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  351. package/docs/forge-autonomous-goal-loop.md +0 -9
  352. package/docs/forge-provider-configuration.md +0 -7
  353. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  354. package/docs/operations/gmail-assistant-routines.md +0 -186
  355. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  356. package/docs/operations/provider-configuration.md +0 -31
  357. package/scripts/harness-trace-grade.sh +0 -150
  358. package/scripts/heartbeat-triage.sh +0 -361
  359. package/scripts/maintenance-triage.sh +0 -167
  360. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  361. package/src/cli/repositories/goal-registry.ts +0 -239
  362. package/src/runtime/assistant/action-proposals.ts +0 -279
  363. package/src/runtime/assistant/intent.ts +0 -395
  364. package/src/runtime/assistant/model-provider.ts +0 -460
  365. package/src/runtime/assistant/openapi.ts +0 -223
  366. package/src/runtime/assistant/policy.ts +0 -89
  367. package/src/runtime/assistant/readiness.ts +0 -258
  368. package/src/runtime/assistant/routine-runtime.ts +0 -477
  369. package/src/runtime/assistant/schedule-binding.ts +0 -171
  370. package/src/runtime/assistant/standing-grants.ts +0 -375
  371. package/src/runtime/assistant/store.ts +0 -243
  372. package/src/runtime/assistant/types.ts +0 -135
  373. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  374. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  375. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  376. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  377. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  378. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  379. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  380. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  381. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  382. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  383. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  384. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  385. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  386. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  387. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  388. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  389. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  390. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  391. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  392. package/src/runtime/workflow/findings/store.ts +0 -204
  393. package/src/runtime/workflow/findings/types.ts +0 -58
  394. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  395. package/src/runtime/workflow/portfolio/store.ts +0 -185
  396. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -1,13 +1,10 @@
1
1
  import type { RepositoryRecord } from '../repositories/types';
2
- import { listAssistantRoutines } from '../../runtime/assistant/store';
3
- import { runAssistantRoutineNow } from '../../runtime/assistant/intent';
4
- import { getAssistantRoutineScheduleBinding, updateAssistantRoutineLifecycle } from '../../runtime/assistant/schedule-binding';
5
2
  import { getWorkContract } from '../../runtime/control-plane/facade';
6
3
  import { evaluateSchedule } from '../../runtime/workflow/schedules/engine';
7
4
  import { getSchedule, listOccurrences, listSchedules, saveSchedule } from '../../runtime/workflow/schedules/store';
8
5
  import type { RepositorySchedule, ScheduleOccurrence } from '../../runtime/workflow/schedules/types';
9
6
 
10
- export type ConsoleAutomationMode = 'browser_watch' | 'browser_keepalive' | 'continuation' | 'chatgpt_prompt' | 'routine' | 'schedule';
7
+ export type ConsoleAutomationMode = 'browser_watch' | 'browser_keepalive' | 'continuation' | 'schedule';
11
8
 
12
9
  export interface ConsoleAutomationHistoryView {
13
10
  id: string;
@@ -20,12 +17,12 @@ export interface ConsoleAutomationHistoryView {
20
17
 
21
18
  export interface ConsoleAutomationView {
22
19
  id: string;
23
- source: 'schedule' | 'routine';
20
+ source: 'schedule';
24
21
  repoId: string;
25
22
  repositoryName: string;
26
23
  name: string;
27
24
  summary?: string;
28
- status: 'enabled' | 'paused' | 'attention' | 'disabled';
25
+ status: 'enabled' | 'paused' | 'attention' | 'completed' | 'disabled';
29
26
  schedule: string;
30
27
  timezone?: string;
31
28
  delivery?: string;
@@ -46,24 +43,34 @@ export interface ConsoleAutomationView {
46
43
  lastResult?: string;
47
44
  nextRunHint?: string;
48
45
  pausedReason?: string;
46
+ attentionMessage?: string;
49
47
  history: ConsoleAutomationHistoryView[];
50
48
  actions: Array<'run' | 'pause' | 'resume'>;
51
49
  }
52
50
 
53
- function dailyCronLabel(expression?: string): string | undefined {
54
- const match = /^(\d{1,2})\s+(\d{1,2})\s+\*\s+\*\s+\*$/.exec(expression?.trim() ?? '');
55
- if (!match) return undefined;
56
- const minute = Number(match[1]);
57
- const hour = Number(match[2]);
58
- if (minute > 59 || hour > 23) return undefined;
59
- return `每天 ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;
51
+ function cronLabel(expression?: string): string | undefined {
52
+ const value = expression?.trim() ?? '';
53
+ const daily = /^(\d{1,2})\s+(\d{1,2})\s+\*\s+\*\s+\*$/.exec(value);
54
+ if (daily) {
55
+ const minute = Number(daily[1]);
56
+ const hour = Number(daily[2]);
57
+ if (minute <= 59 && hour <= 23) return `每天 ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;
58
+ }
59
+ const hourly = /^(\d{1,2})\s+\*\s+\*\s+\*\s+\*$/.exec(value);
60
+ if (hourly) {
61
+ const minute = Number(hourly[1]);
62
+ if (minute <= 59) return minute === 0 ? '每小时整点' : `每小时 ${String(minute).padStart(2, '0')} 分`;
63
+ }
64
+ const everyMinutes = /^\*\/(\d{1,2})\s+\*\s+\*\s+\*\s+\*$/.exec(value);
65
+ if (everyMinutes && Number(everyMinutes[1]) > 0) return `每 ${Number(everyMinutes[1])} 分钟`;
66
+ return undefined;
60
67
  }
61
68
 
62
69
  function triggerLabel(schedule: RepositorySchedule): string {
63
70
  const trigger = schedule.trigger;
64
71
  switch (trigger.type) {
65
72
  case 'interval': return `每 ${trigger.everyMinutes ?? '?'} 分钟`;
66
- case 'cron': return dailyCronLabel(trigger.cronExpression) ?? `Cron ${trigger.cronExpression ?? '—'}`;
73
+ case 'cron': return cronLabel(trigger.cronExpression) ?? '自定义时间计划';
67
74
  case 'calendar': return trigger.calendarAt ? `单次 · ${trigger.calendarAt}` : '指定时间';
68
75
  case 'condition': return `条件满足时 · ${trigger.condition?.kind ?? 'condition'}`;
69
76
  case 'repository-event': return `仓库事件 · ${trigger.eventName ?? 'repository event'}`;
@@ -83,16 +90,11 @@ function nextScheduleHint(schedule: RepositorySchedule): string | undefined {
83
90
  return next > Date.now() ? new Date(next).toISOString() : '下一次调度周期';
84
91
  }
85
92
  }
86
- if (schedule.trigger.type === 'cron') return dailyCronLabel(schedule.trigger.cronExpression) ?? '由 Scheduler 计算';
87
- if (schedule.trigger.type === 'condition') return '条件满足时';
93
+ if (schedule.trigger.type === 'cron') return cronLabel(schedule.trigger.cronExpression) ?? '按自定义时间计划';
94
+ if (schedule.trigger.type === 'condition') return '等待条件满足';
88
95
  return undefined;
89
96
  }
90
97
 
91
- function safeBoundSchedule(controllerHome: string, repoId: string, scheduleId?: string): RepositorySchedule | undefined {
92
- if (!scheduleId) return undefined;
93
- try { return getSchedule(controllerHome, repoId, scheduleId); } catch { return undefined; }
94
- }
95
-
96
98
  function occurrenceResult(occurrence?: ScheduleOccurrence): string | undefined {
97
99
  if (!occurrence) return undefined;
98
100
  if (occurrence.decision === 'nothing_to_do') return '无变化';
@@ -137,7 +139,6 @@ function occurrenceHistory(occurrences: ScheduleOccurrence[]): ConsoleAutomation
137
139
 
138
140
  function scheduleMode(schedule: RepositorySchedule): ConsoleAutomationMode {
139
141
  if (schedule.action.operation === 'external_controller_wake') return 'continuation';
140
- if (schedule.action.operation === 'chatgpt_browser_prompt') return 'chatgpt_prompt';
141
142
  if (schedule.action.operation === 'browser_probe') return schedule.action.arguments?.keepalive_only === true ? 'browser_keepalive' : 'browser_watch';
142
143
  return 'schedule';
143
144
  }
@@ -146,8 +147,6 @@ function modeLabel(mode: ConsoleAutomationMode): string {
146
147
  if (mode === 'browser_watch') return '网页变更监听';
147
148
  if (mode === 'browser_keepalive') return '登录保活';
148
149
  if (mode === 'continuation') return '自动继续 Work';
149
- if (mode === 'chatgpt_prompt') return 'ChatGPT 自动任务';
150
- if (mode === 'routine') return '助手例行任务';
151
150
  return '自动任务';
152
151
  }
153
152
 
@@ -155,7 +154,6 @@ function scheduleSummary(mode: ConsoleAutomationMode): string {
155
154
  if (mode === 'browser_watch') return '静默观察目标页面;只有内容发生变化时才恢复 ChatGPT。';
156
155
  if (mode === 'browser_keepalive') return '静默刷新登录态;正常时不打扰,认证失效时再恢复 ChatGPT。';
157
156
  if (mode === 'continuation') return '按计划恢复绑定的 Work,让外部 Controller 继续未完成目标。';
158
- if (mode === 'chatgpt_prompt') return '由 Forge 定时唤醒 ChatGPT 执行保存的任务提示,不占用 ChatGPT Schedule 名额。';
159
157
  return '由 Forge Schedule Engine 管理的持久自动任务。';
160
158
  }
161
159
 
@@ -164,12 +162,11 @@ function scheduleDelivery(schedule: RepositorySchedule, mode: ConsoleAutomationM
164
162
  if (mode === 'browser_watch') return `变化时唤醒 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
165
163
  if (mode === 'browser_keepalive') return `登录失效时唤醒 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
166
164
  if (mode === 'continuation') return `恢复 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
167
- if (mode === 'chatgpt_prompt') return '发送到 ChatGPT';
168
165
  return undefined;
169
166
  }
170
167
 
171
168
  function chatgptExecutionProfile(schedule: RepositorySchedule, mode: ConsoleAutomationMode): { agentModel?: string; reasoningLevel?: string; tabPolicy?: string } {
172
- if (mode !== 'continuation' && mode !== 'chatgpt_prompt') return {};
169
+ if (mode !== 'continuation') return {};
173
170
  const args = schedule.action.arguments ?? {};
174
171
  const controller = typeof args.controller_type === 'string' ? args.controller_type : 'chatgpt';
175
172
  if (mode === 'continuation' && controller !== 'chatgpt') return {};
@@ -207,17 +204,34 @@ function scheduleNeedsAttention(schedule: RepositorySchedule): boolean {
207
204
  return Boolean(schedule.pausedReason && /(?:fail|error|auth|login|block|attention|maximum)/i.test(schedule.pausedReason));
208
205
  }
209
206
 
210
- function scheduleStatus(schedule: RepositorySchedule): ConsoleAutomationView['status'] {
207
+ function scheduleStatus(schedule: RepositorySchedule, workStatus?: string): ConsoleAutomationView['status'] {
208
+ if (workStatus === 'completed' || /is terminal \(completed\)/i.test(schedule.pausedReason ?? '')) return 'completed';
209
+ if (workStatus === 'failed') return 'attention';
211
210
  if (schedule.enabled) return scheduleNeedsAttention(schedule) ? 'attention' : 'enabled';
212
211
  return scheduleNeedsAttention(schedule) ? 'attention' : 'paused';
213
212
  }
214
213
 
215
- function workBinding(controllerHome: string, repoId: string, schedule: RepositorySchedule): { id?: string; objective?: string } {
214
+ function workBinding(controllerHome: string, repoId: string, schedule: RepositorySchedule): { id?: string; objective?: string; status?: string } {
216
215
  const value = schedule.action.arguments?.work_id;
217
216
  const workId = typeof value === 'string' && value.trim() ? value.trim() : undefined;
218
217
  if (!workId) return {};
219
218
  const work = getWorkContract({ controllerHome, repoId }, workId);
220
- return { id: workId, objective: work?.objective };
219
+ return { id: workId, objective: work?.objective, status: work?.status };
220
+ }
221
+
222
+ function displayPauseReason(schedule: RepositorySchedule, workStatus?: string): string | undefined {
223
+ if (workStatus === 'completed' || /is terminal \(completed\)/i.test(schedule.pausedReason ?? '')) return '关联工作已经完成,这个自动任务不会再触发。';
224
+ if (schedule.lastObservationStatus === 'auth_required') return '目标登录状态已失效,完成重新登录后即可恢复。';
225
+ if (schedule.consecutiveFailures >= schedule.policy.maxFailures || /maximum consecutive failures/i.test(schedule.pausedReason ?? '')) return '连续执行失败达到上限,已自动暂停。修复问题后可以恢复任务。';
226
+ if (/canary completed/i.test(schedule.pausedReason ?? '')) return '验收任务已经完成。';
227
+ return schedule.pausedReason;
228
+ }
229
+
230
+ function attentionMessage(schedule: RepositorySchedule, workStatus?: string): string | undefined {
231
+ if (schedule.lastObservationStatus === 'auth_required') return '需要重新登录后才能继续自动执行。';
232
+ if (workStatus === 'failed') return '关联工作执行失败,需要检查失败原因后再恢复。';
233
+ if (schedule.consecutiveFailures >= schedule.policy.maxFailures) return '连续执行失败达到上限,任务已自动暂停。';
234
+ return undefined;
221
235
  }
222
236
 
223
237
  function policySummary(schedule: RepositorySchedule): string {
@@ -227,12 +241,9 @@ function policySummary(schedule: RepositorySchedule): string {
227
241
  export function listConsoleAutomations(controllerHome: string, repositories: RepositoryRecord[]): ConsoleAutomationView[] {
228
242
  const items: ConsoleAutomationView[] = [];
229
243
  for (const repository of repositories.filter((entry) => entry.enabled && !entry.removedAt)) {
230
- const routines = listAssistantRoutines(repository.canonicalRoot).routines;
231
- const bindings = new Map(routines.map((routine) => [routine.routineId, getAssistantRoutineScheduleBinding(repository.canonicalRoot, routine.routineId)]));
232
- const boundScheduleIds = new Set([...bindings.values()].flatMap((binding) => binding ? [binding.scheduleId] : []));
233
-
234
244
  for (const schedule of listSchedules(controllerHome, repository.repoId)) {
235
- if (boundScheduleIds.has(schedule.scheduleId)) continue;
245
+ if (schedule.action.operation === 'chatgpt_browser_prompt') continue;
246
+ if (schedule.action.operation === 'assistant_routine_execute') continue;
236
247
  const occurrences = listOccurrences(controllerHome, repository.repoId, schedule.scheduleId, 8);
237
248
  const last = occurrences[0];
238
249
  const mode = scheduleMode(schedule);
@@ -245,7 +256,7 @@ export function listConsoleAutomations(controllerHome: string, repositories: Rep
245
256
  repositoryName: repository.displayName,
246
257
  name: schedule.name,
247
258
  summary: scheduleSummary(mode),
248
- status: scheduleStatus(schedule),
259
+ status: scheduleStatus(schedule, work.status),
249
260
  schedule: triggerLabel(schedule),
250
261
  timezone: schedule.trigger.timezone,
251
262
  delivery: scheduleDelivery(schedule, mode),
@@ -263,45 +274,13 @@ export function listConsoleAutomations(controllerHome: string, repositories: Rep
263
274
  lastRunAt: last?.updatedAt ?? schedule.lastTriggeredAt,
264
275
  lastResult: observationResult(schedule, last),
265
276
  nextRunHint: nextScheduleHint(schedule),
266
- pausedReason: schedule.pausedReason,
277
+ pausedReason: displayPauseReason(schedule, work.status),
278
+ attentionMessage: attentionMessage(schedule, work.status),
267
279
  history: occurrenceHistory(occurrences),
268
- actions: schedule.enabled ? ['run', 'pause'] : ['resume'],
280
+ actions: scheduleStatus(schedule, work.status) === 'completed' ? [] : schedule.enabled ? ['run', 'pause'] : ['resume'],
269
281
  });
270
282
  }
271
283
 
272
- for (const routine of routines) {
273
- const binding = bindings.get(routine.routineId);
274
- const boundSchedule = safeBoundSchedule(controllerHome, repository.repoId, binding?.scheduleId);
275
- const occurrences = boundSchedule ? listOccurrences(controllerHome, repository.repoId, boundSchedule.scheduleId, 8) : [];
276
- const last = occurrences[0];
277
- const scheduleAttention = routine.status === 'enabled' && boundSchedule && scheduleNeedsAttention(boundSchedule);
278
- const status: ConsoleAutomationView['status'] = scheduleAttention ? 'attention' : routine.status === 'enabled' ? 'enabled' : routine.status === 'paused' ? 'paused' : 'disabled';
279
- items.push({
280
- id: routine.routineId,
281
- source: 'routine',
282
- repoId: repository.repoId,
283
- repositoryName: repository.displayName,
284
- name: routine.name,
285
- summary: routine.naturalLanguageGoal,
286
- status,
287
- schedule: routine.scheduleText,
288
- timezone: routine.timezone,
289
- delivery: routine.output === 'assistant_inbox' ? 'ChatGPT 助手收件箱' : routine.output === 'gmail_draft' ? 'Gmail 草稿' : '不外发',
290
- mode: 'routine',
291
- modeLabel: modeLabel('routine'),
292
- live: boundSchedule ? !boundSchedule.policy.shadowMode : undefined,
293
- observationStatus: boundSchedule?.lastObservationStatus,
294
- observationAt: boundSchedule?.lastObservationAt,
295
- failureCount: boundSchedule?.consecutiveFailures,
296
- policySummary: boundSchedule ? policySummary(boundSchedule) : undefined,
297
- lastRunAt: last?.updatedAt ?? routine.lastRunAt,
298
- lastResult: boundSchedule ? observationResult(boundSchedule, last) : occurrenceResult(last) ?? (routine.lastRunAt ? '已触发' : undefined),
299
- nextRunHint: boundSchedule ? nextScheduleHint(boundSchedule) : routine.nextRunHint,
300
- pausedReason: boundSchedule?.pausedReason,
301
- history: occurrenceHistory(occurrences),
302
- actions: scheduleAttention ? ['resume'] : routine.status === 'enabled' ? ['run', 'pause'] : routine.status === 'paused' ? ['resume'] : [],
303
- });
304
- }
305
284
  }
306
285
  return items.sort((a, b) => a.name.localeCompare(b.name));
307
286
  }
@@ -311,6 +290,7 @@ export function summarizeConsoleAutomations(items: ConsoleAutomationView[]) {
311
290
  total: items.length,
312
291
  enabled: items.filter((item) => item.status === 'enabled').length,
313
292
  paused: items.filter((item) => item.status === 'paused' || item.status === 'disabled').length,
293
+ completed: items.filter((item) => item.status === 'completed').length,
314
294
  needsAttention: items.filter((item) => item.status === 'attention').length,
315
295
  };
316
296
  }
@@ -325,16 +305,12 @@ export async function applyConsoleAutomationAction(
325
305
  ): Promise<unknown> {
326
306
  const repository = repositories.find((entry) => entry.repoId === repoId && entry.enabled && !entry.removedAt);
327
307
  if (!repository) throw new Error(`REPOSITORY_NOT_FOUND: ${repoId}`);
328
- if (source === 'routine') {
329
- if (action === 'run') return runAssistantRoutineNow(controllerHome, repository, id);
330
- if (action === 'pause') return updateAssistantRoutineLifecycle(controllerHome, repository, id, 'paused');
331
- if (action === 'resume') return updateAssistantRoutineLifecycle(controllerHome, repository, id, 'enabled');
332
- throw new Error(`AUTOMATION_ACTION_UNSUPPORTED: routine/${action}`);
333
- }
334
308
  if (source === 'schedule') {
335
309
  const schedule = getSchedule(controllerHome, repoId, id);
310
+ if (schedule.action.operation === 'chatgpt_browser_prompt') throw new Error('RETIRED_WORK_FREE_PROMPT_SCHEDULE');
311
+ if (schedule.action.operation === 'assistant_routine_execute') throw new Error('RETIRED_PERSONAL_ASSISTANT_SCHEDULE');
336
312
  if (action === 'pause') return saveSchedule(controllerHome, { ...schedule, enabled: false, pausedReason: undefined });
337
- if (action === 'resume') return saveSchedule(controllerHome, { ...schedule, enabled: true, pausedReason: undefined, consecutiveFailures: 0 });
313
+ if (action === 'resume') return saveSchedule(controllerHome, { ...schedule, enabled: true, pausedReason: undefined, consecutiveFailures: 0, consecutiveNoops: 0, nextEligibleAt: undefined });
338
314
  if (action === 'run') return evaluateSchedule(controllerHome, schedule, true, { source: 'manual' });
339
315
  throw new Error(`AUTOMATION_ACTION_UNSUPPORTED: schedule/${action}`);
340
316
  }
@@ -251,7 +251,7 @@ export interface AccessStateViewModel {
251
251
  configuredAccessModeLabel: string;
252
252
  effectiveAccessMode: 'request' | 'full_access';
253
253
  effectiveAccessModeLabel: string;
254
- effectiveToolset: 'core' | 'advanced' | 'full';
254
+ effectiveToolset: 'facade' | 'core' | 'advanced' | 'full';
255
255
  exposureRevision: number;
256
256
  lastAppliedAt?: string;
257
257
  source: string;
@@ -264,38 +264,6 @@ export interface AccessStateViewModel {
264
264
  toolGroups: string[];
265
265
  }
266
266
 
267
- /** Compact autonomous goal-loop status for console / local-bridge (no raw internal dumps). */
268
- export interface GoalLoopStatusViewModel {
269
- activeCount: number;
270
- goals: Array<{
271
- title: string;
272
- stage: string;
273
- currentStep: string;
274
- providerSelected?: string;
275
- waitingReason?: string;
276
- nextSafeAction?: string;
277
- handoffPacketAvailable: boolean;
278
- approvalRequired: boolean;
279
- whyThisProvider?: string;
280
- whatHappensNext?: string;
281
- whatIsBlocked?: string;
282
- }>;
283
- invokableProviders: string[];
284
- handoffOnlyProviders: string[];
285
- providerHealth: Array<{
286
- providerId: string;
287
- status: string;
288
- directDispatchAllowed: boolean;
289
- handoffOnly: boolean;
290
- summary: string;
291
- }>;
292
- /** Plain-language automation overview snippet. */
293
- automationSummary?: string;
294
- liveModelProvidersEffective?: boolean;
295
- settingsPathHint?: string;
296
- nextTickHint?: string;
297
- }
298
-
299
267
  export interface CommandCenterViewModel {
300
268
  schemaVersion: 1;
301
269
  generatedAt: string;
@@ -309,8 +277,6 @@ export interface CommandCenterViewModel {
309
277
  currentWork?: WorkSummaryViewModel;
310
278
  recentWork: WorkSummaryViewModel[];
311
279
  handoffs: HandoffCardViewModel[];
312
- /** Autonomous goal loop surface (daemon-owned, above Issue/Task). */
313
- goalLoop?: GoalLoopStatusViewModel;
314
280
  /** Assistant/plugin capabilities available to the controller (not the primary workflow). */
315
281
  pluginSummary: PluginSummaryViewModel;
316
282
  plugins: PluginCardViewModel[];
@@ -80,7 +80,6 @@ import type {
80
80
  CommandCenterViewModel,
81
81
  ConnectorFreshnessViewModel,
82
82
  ConsoleErrorViewModel,
83
- GoalLoopStatusViewModel,
84
83
  HandoffCardViewModel,
85
84
  ModePreviewViewModel,
86
85
  PlainStatusTone,
@@ -94,34 +93,6 @@ import type {
94
93
  VerificationViewModel,
95
94
  WorkSummaryViewModel,
96
95
  } from './console-view-models';
97
- import {
98
- buildAutomationSettingsView,
99
- executorRoutePreviewWithConfig,
100
- executorRoutingConfigGet,
101
- executorRoutingConfigReset,
102
- executorRoutingConfigUpdate,
103
- goalLoopPolicyGet,
104
- goalLoopPolicyUpdate,
105
- goalStatus as goalLoopStatusSnapshot,
106
- localToolDisable,
107
- localToolEnable,
108
- localToolHealthCheck,
109
- localToolList,
110
- localToolConfigGet,
111
- localToolConfigUpdate,
112
- providerApiSettingsGet,
113
- providerApiSettingsUpdate,
114
- providerConfigGet,
115
- providerConfigUpdate,
116
- providerCredentialsStatus,
117
- providerDisable,
118
- providerEnable,
119
- providerHealthCheck,
120
- providerPriorityUpdate,
121
- providerResetDefaults,
122
- type ConfigFacadeContext,
123
- type GoalLoopContext,
124
- } from '../../runtime/control-plane/goal-loop';
125
96
  import { listActiveOccurrences, listSchedules } from '../../runtime/workflow/schedules/store';
126
97
 
127
98
  export type ConsoleFacadeContext = {
@@ -995,7 +966,6 @@ export async function buildCommandCenter(
995
966
  const handoffs = listHandoffItems({ ...store(ctx), status: 'pending', limit: 20 }).map(mapHandoffCard);
996
967
  const plugins = listConsolePlugins(ctx);
997
968
  const pluginSummary = buildPluginSummary(plugins);
998
- const goalLoop = buildGoalLoopStatusView(ctx);
999
969
  const access = controllerAccessStateView(ctx);
1000
970
  const banner = readiness.connectorFreshness?.severity === 'warning' || readiness.connectorFreshness?.severity === 'error'
1001
971
  ? readiness.connectorFreshness.summary
@@ -1014,7 +984,6 @@ export async function buildCommandCenter(
1014
984
  currentWork: activeWork[0],
1015
985
  recentWork: allRecent,
1016
986
  handoffs,
1017
- goalLoop,
1018
987
  pluginSummary,
1019
988
  plugins,
1020
989
  modePreviewDefault: plainMode('direct_control'),
@@ -1031,192 +1000,6 @@ export async function buildCommandCenter(
1031
1000
  };
1032
1001
  }
1033
1002
 
1034
- function configCtx(ctx: ConsoleFacadeContext): ConfigFacadeContext {
1035
- return { controllerHome: ctx.controllerHome };
1036
- }
1037
-
1038
- export function buildGoalLoopStatusView(ctx: ConsoleFacadeContext): GoalLoopStatusViewModel {
1039
- const goalCtx: GoalLoopContext = {
1040
- goalStore: store(ctx),
1041
- packetStore: store(ctx),
1042
- repoId: ctx.repository.repoId,
1043
- configLocation: { controllerHome: ctx.controllerHome },
1044
- providerEnv: { configLocation: { controllerHome: ctx.controllerHome } },
1045
- };
1046
- const snapshot = goalLoopStatusSnapshot(goalCtx) as {
1047
- activeGoals?: Array<Record<string, unknown>>;
1048
- activeCount?: number;
1049
- invokableProviders?: string[];
1050
- handoffOnlyProviders?: string[];
1051
- providers?: Array<Record<string, unknown>>;
1052
- };
1053
- let automationSummary: string | undefined;
1054
- let liveEffective: boolean | undefined;
1055
- try {
1056
- const settings = buildAutomationSettingsView(configCtx(ctx));
1057
- automationSummary = settings.overview.plainLanguageSummary;
1058
- liveEffective = settings.overview.liveModelProvidersEffective;
1059
- } catch {
1060
- automationSummary = undefined;
1061
- }
1062
-
1063
- const goals = (snapshot.activeGoals ?? []).map((goal) => {
1064
- const stage = String(goal.stage ?? '');
1065
- const providerSelected = typeof goal.providerSelected === 'string' ? goal.providerSelected : undefined;
1066
- const waitingReason = typeof goal.waitingReason === 'string' ? goal.waitingReason : undefined;
1067
- const nextSafeAction = typeof goal.nextSafeAction === 'string' ? goal.nextSafeAction : undefined;
1068
- const handoffPacketAvailable = goal.handoffPacketAvailable === true;
1069
- return {
1070
- title: String(goal.title ?? ''),
1071
- stage,
1072
- currentStep: String(goal.currentStep ?? ''),
1073
- providerSelected,
1074
- waitingReason,
1075
- nextSafeAction,
1076
- handoffPacketAvailable,
1077
- approvalRequired: Boolean(waitingReason) || stage === 'waiting_for_user',
1078
- whyThisProvider: providerSelected
1079
- ? `Last selected provider: ${providerSelected}`
1080
- : 'No provider selected yet',
1081
- whatHappensNext: nextSafeAction
1082
- ?? (handoffPacketAvailable
1083
- ? 'Open handoff packet or configure a direct provider'
1084
- : 'Wait for next daemon tick or open Automation Settings'),
1085
- whatIsBlocked: waitingReason
1086
- ?? (stage === 'handoff_ready'
1087
- ? 'Waiting for handoff supervisor (ChatGPT is not auto-invokable)'
1088
- : undefined),
1089
- };
1090
- });
1091
- return {
1092
- activeCount: snapshot.activeCount ?? goals.length,
1093
- goals,
1094
- invokableProviders: snapshot.invokableProviders ?? [],
1095
- handoffOnlyProviders: snapshot.handoffOnlyProviders ?? [],
1096
- providerHealth: (snapshot.providers ?? []).map((provider) => ({
1097
- providerId: String(provider.providerId ?? ''),
1098
- status: String(provider.status ?? ''),
1099
- directDispatchAllowed: provider.directDispatchAllowed === true,
1100
- handoffOnly: provider.handoffOnly === true,
1101
- summary: String(provider.summary ?? ''),
1102
- })),
1103
- automationSummary,
1104
- liveModelProvidersEffective: liveEffective,
1105
- settingsPathHint: 'Model & Tool Providers',
1106
- nextTickHint: 'Daemon ticks active goals about every 5 seconds when the controller is running.',
1107
- };
1108
- }
1109
-
1110
- export function getAutomationSettings(ctx: ConsoleFacadeContext) {
1111
- return buildAutomationSettingsView(configCtx(ctx));
1112
- }
1113
-
1114
- export function consoleProviderConfigGet(ctx: ConsoleFacadeContext) {
1115
- return providerConfigGet(configCtx(ctx));
1116
- }
1117
-
1118
- export function consoleProviderConfigUpdate(ctx: ConsoleFacadeContext, body: Record<string, unknown>) {
1119
- return providerConfigUpdate(configCtx(ctx), body as unknown as Parameters<typeof providerConfigUpdate>[1]);
1120
- }
1121
-
1122
- export function consoleProviderEnable(ctx: ConsoleFacadeContext, providerId: string) {
1123
- return providerEnable(configCtx(ctx), providerId);
1124
- }
1125
-
1126
- export function consoleProviderDisable(ctx: ConsoleFacadeContext, providerId: string) {
1127
- return providerDisable(configCtx(ctx), providerId);
1128
- }
1129
-
1130
- export function consoleProviderPriority(ctx: ConsoleFacadeContext, providerId: string, direction: 'up' | 'down' | number) {
1131
- return providerPriorityUpdate(configCtx(ctx), providerId, direction);
1132
- }
1133
-
1134
- export function consoleProviderHealth(ctx: ConsoleFacadeContext, providerId?: string) {
1135
- return providerHealthCheck(configCtx(ctx), providerId);
1136
- }
1137
-
1138
- export function consoleProviderCredentials(ctx: ConsoleFacadeContext) {
1139
- return providerCredentialsStatus(configCtx(ctx));
1140
- }
1141
-
1142
- export function consoleProviderReset(ctx: ConsoleFacadeContext) {
1143
- return providerResetDefaults(configCtx(ctx));
1144
- }
1145
-
1146
- export function consoleProviderApiSettingsGet(ctx: ConsoleFacadeContext, providerId: string) {
1147
- return providerApiSettingsGet(configCtx(ctx), providerId);
1148
- }
1149
-
1150
- export function consoleProviderApiSettingsUpdate(
1151
- ctx: ConsoleFacadeContext,
1152
- providerId: string,
1153
- body: Record<string, unknown>,
1154
- ) {
1155
- return providerApiSettingsUpdate(configCtx(ctx), providerId, {
1156
- baseUrl: typeof body.baseUrl === 'string' ? body.baseUrl : typeof body.base_url === 'string' ? body.base_url : undefined,
1157
- model: typeof body.model === 'string' ? body.model : undefined,
1158
- apiKey: typeof body.apiKey === 'string'
1159
- ? body.apiKey
1160
- : typeof body.api_key === 'string'
1161
- ? body.api_key
1162
- : undefined,
1163
- clearApiKey: body.clearApiKey === true || body.clear_api_key === true,
1164
- });
1165
- }
1166
-
1167
- export function consoleLocalToolList(ctx: ConsoleFacadeContext) {
1168
- return localToolList(configCtx(ctx));
1169
- }
1170
-
1171
- export function consoleLocalToolEnable(ctx: ConsoleFacadeContext, toolId: string) {
1172
- return localToolEnable(configCtx(ctx), toolId);
1173
- }
1174
-
1175
- export function consoleLocalToolDisable(ctx: ConsoleFacadeContext, toolId: string) {
1176
- return localToolDisable(configCtx(ctx), toolId);
1177
- }
1178
-
1179
- export function consoleLocalToolHealth(ctx: ConsoleFacadeContext, toolId?: string) {
1180
- return localToolHealthCheck(configCtx(ctx), toolId);
1181
- }
1182
-
1183
- export function consoleLocalToolConfigGet(ctx: ConsoleFacadeContext) {
1184
- return localToolConfigGet(configCtx(ctx));
1185
- }
1186
-
1187
- export function consoleLocalToolConfigUpdate(ctx: ConsoleFacadeContext, body: Record<string, unknown>) {
1188
- return localToolConfigUpdate(configCtx(ctx), body as unknown as Parameters<typeof localToolConfigUpdate>[1]);
1189
- }
1190
-
1191
- export function consoleRoutingGet(ctx: ConsoleFacadeContext) {
1192
- return executorRoutingConfigGet(configCtx(ctx));
1193
- }
1194
-
1195
- export function consoleRoutingUpdate(ctx: ConsoleFacadeContext, body: Record<string, unknown>) {
1196
- return executorRoutingConfigUpdate(configCtx(ctx), body as unknown as Parameters<typeof executorRoutingConfigUpdate>[1]);
1197
- }
1198
-
1199
- export function consoleRoutingReset(ctx: ConsoleFacadeContext) {
1200
- return executorRoutingConfigReset(configCtx(ctx));
1201
- }
1202
-
1203
- export function consoleRoutePreview(ctx: ConsoleFacadeContext, body: Record<string, unknown> = {}) {
1204
- return executorRoutePreviewWithConfig(configCtx(ctx), {
1205
- taskIntent: typeof body.taskIntent === 'string' ? body.taskIntent as never : typeof body.task_intent === 'string' ? body.task_intent as never : undefined,
1206
- risk: typeof body.risk === 'string' ? body.risk as never : undefined,
1207
- objective: typeof body.objective === 'string' ? body.objective : undefined,
1208
- externalWrite: body.externalWrite === true || body.external_write === true,
1209
- });
1210
- }
1211
-
1212
- export function consoleGoalLoopPolicyGet(ctx: ConsoleFacadeContext) {
1213
- return goalLoopPolicyGet(configCtx(ctx));
1214
- }
1215
-
1216
- export function consoleGoalLoopPolicyUpdate(ctx: ConsoleFacadeContext, body: Record<string, unknown>) {
1217
- return goalLoopPolicyUpdate(configCtx(ctx), body as unknown as Parameters<typeof goalLoopPolicyUpdate>[1]);
1218
- }
1219
-
1220
1003
  export function getConsoleAccessPolicy(ctx: ConsoleFacadeContext) {
1221
1004
  const policy = readRepositoryAccessPolicy(ctx.controllerHome, ctx.repository.repoId);
1222
1005
  return {
@@ -1,10 +1,10 @@
1
- import{useCallback,useEffect,useState}from'react';import'./design/tokens.css';import'./styles.css';import type{AutomationView,ConsoleData,LocalToolView,ProviderView,RouteId}from'./types';import{api}from'./lib/api';import{routeFromHash}from'./lib/routes';import{AppShell}from'./shell/AppShell';import{OverviewView}from'./features/overview/OverviewView';import{AutomationsView}from'./features/automations/AutomationsView';import{WorkView}from'./features/work/WorkView';import{CapabilitiesView}from'./features/capabilities/CapabilitiesView';import{RepositoriesView}from'./features/repositories/RepositoriesView';import{SettingsView}from'./features/settings/SettingsView';import{SystemView}from'./features/system/SystemView';
2
- async function loadData():Promise<ConsoleData>{const[commandCenter,work,workPortfolio,automations,automationSettings,connector]=await Promise.all([api.commandCenter(),api.work(),api.workPortfolio(),api.automations(),api.automationSettings(),api.connector().catch(()=>undefined)]);return{commandCenter,work,workPortfolio,automations,automationSettings,connector,generatedAt:new Date().toISOString()}}
1
+ import{useCallback,useEffect,useState}from'react';import'./design/tokens.css';import'./styles.css';import type{AutomationView,ConsoleData,RouteId}from'./types';import{api}from'./lib/api';import{routeFromHash}from'./lib/routes';import{AppShell}from'./shell/AppShell';import{OverviewView}from'./features/overview/OverviewView';import{AutomationsView}from'./features/automations/AutomationsView';import{WorkView}from'./features/work/WorkView';import{CapabilitiesView}from'./features/capabilities/CapabilitiesView';import{RepositoriesView}from'./features/repositories/RepositoriesView';import{SystemView}from'./features/system/SystemView';
2
+ async function loadData():Promise<ConsoleData>{const[commandCenter,work,workPortfolio,automations,connector]=await Promise.all([api.commandCenter(),api.work(),api.workPortfolio(),api.automations(),api.connector().catch(()=>undefined)]);return{commandCenter,work,workPortfolio,automations,connector,generatedAt:new Date().toISOString()}}
3
3
  export default function App(){const[route,setRoute]=useState<RouteId>(routeFromHash());const[data,setData]=useState<ConsoleData>();const[busy,setBusy]=useState(false);const[error,setError]=useState('');
4
4
  const refresh=useCallback(async()=>{setBusy(true);setError('');try{setData(await loadData())}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}},[]);
5
5
  useEffect(()=>{void refresh();const onHash=()=>setRoute(routeFromHash());addEventListener('hashchange',onHash);return()=>removeEventListener('hashchange',onHash)},[refresh]);
6
6
  const mutate=useCallback(async(fn:()=>Promise<unknown>)=>{setBusy(true);try{await fn();setData(await loadData())}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}},[]);
7
7
  if(!data)return <div className="boot-state"><span className="brand-mark">F</span><strong>{error?'Forge console unavailable':'Loading Forge…'}</strong>{error&&<><p>{error}</p><button className="button" onClick={()=>void refresh()}>Retry</button></>}</div>;
8
8
  const common={data,busy,onRefresh:()=>void refresh()};let view;
9
- switch(route){case'automations':view=<AutomationsView {...common} onAction={(a:AutomationView,action:'run'|'pause'|'resume')=>mutate(()=>api.automationAction(a.source,a.repoId,a.id,action))}/>;break;case'work':view=<WorkView {...common}/>;break;case'capabilities':view=<CapabilitiesView {...common}/>;break;case'repositories':view=<RepositoriesView {...common} onRegister={(p,n)=>mutate(()=>api.registerRepository(p,n))} onRemove={id=>mutate(()=>api.removeRepository(id))}/>;break;case'settings':view=<SettingsView {...common} onProviderAction={(p:ProviderView,a:'enable'|'disable')=>mutate(()=>api.providerAction(p.providerId,a))} onProviderHealth={(p:ProviderView)=>mutate(()=>api.providerHealth(p.providerId))} onToolAction={(t:LocalToolView,a:'enable'|'disable')=>mutate(()=>api.localToolAction(t.toolId,a))} onToolHealth={(t:LocalToolView)=>mutate(()=>api.localToolHealth(t.toolId))}/>;break;case'system':view=<SystemView {...common}/>;break;default:view=<OverviewView {...common}/>}
9
+ switch(route){case'automations':view=<AutomationsView {...common} onAction={(a:AutomationView,action:'run'|'pause'|'resume')=>mutate(()=>api.automationAction(a.source,a.repoId,a.id,action))}/>;break;case'work':view=<WorkView {...common}/>;break;case'capabilities':view=<CapabilitiesView {...common}/>;break;case'repositories':view=<RepositoriesView {...common} onRegister={(p,n)=>mutate(()=>api.registerRepository(p,n))} onRemove={id=>mutate(()=>api.removeRepository(id))}/>;break;case'system':view=<SystemView {...common}/>;break;default:view=<OverviewView {...common}/>}
10
10
  return <AppShell route={route}>{error&&<div className="global-error"><strong>Last action failed</strong><span>{error}</span><button onClick={()=>setError('')}>×</button></div>}{view}</AppShell>}