@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
@@ -1,39 +1,81 @@
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';
2
+ import { getWorkContract } from '../../runtime/control-plane/facade';
5
3
  import { evaluateSchedule } from '../../runtime/workflow/schedules/engine';
6
4
  import { getSchedule, listOccurrences, listSchedules, saveSchedule } from '../../runtime/workflow/schedules/store';
7
5
  import type { RepositorySchedule, ScheduleOccurrence } from '../../runtime/workflow/schedules/types';
8
6
 
7
+ export type ConsoleAutomationMode = 'browser_watch' | 'browser_keepalive' | 'continuation' | 'schedule';
8
+
9
+ export interface ConsoleAutomationHistoryView {
10
+ id: string;
11
+ at: string;
12
+ result: string;
13
+ tone: 'green' | 'amber' | 'red' | 'blue' | 'gray';
14
+ reason?: string;
15
+ trigger?: string;
16
+ }
17
+
9
18
  export interface ConsoleAutomationView {
10
19
  id: string;
11
- source: 'schedule' | 'routine';
20
+ source: 'schedule';
12
21
  repoId: string;
13
22
  repositoryName: string;
14
23
  name: string;
15
24
  summary?: string;
16
- status: 'enabled' | 'paused' | 'attention' | 'disabled';
25
+ status: 'enabled' | 'paused' | 'attention' | 'completed' | 'disabled';
17
26
  schedule: string;
18
27
  timezone?: string;
19
28
  delivery?: string;
29
+ mode: ConsoleAutomationMode;
30
+ modeLabel: string;
31
+ live?: boolean;
32
+ targetLabel?: string;
33
+ boundWorkId?: string;
34
+ boundWorkObjective?: string;
35
+ observationStatus?: RepositorySchedule['lastObservationStatus'];
36
+ observationAt?: string;
37
+ failureCount?: number;
38
+ policySummary?: string;
39
+ agentModel?: string;
40
+ reasoningLevel?: string;
41
+ tabPolicy?: string;
20
42
  lastRunAt?: string;
21
43
  lastResult?: string;
22
44
  nextRunHint?: string;
23
45
  pausedReason?: string;
46
+ attentionMessage?: string;
47
+ history: ConsoleAutomationHistoryView[];
24
48
  actions: Array<'run' | 'pause' | 'resume'>;
25
49
  }
26
50
 
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;
67
+ }
68
+
27
69
  function triggerLabel(schedule: RepositorySchedule): string {
28
70
  const trigger = schedule.trigger;
29
71
  switch (trigger.type) {
30
- case 'interval': return `Every ${trigger.everyMinutes ?? '?'} min`;
31
- case 'cron': return `Cron ${trigger.cronExpression ?? '—'}`;
32
- case 'calendar': return trigger.calendarAt ? `At ${trigger.calendarAt}` : 'Calendar';
33
- case 'condition': return `Watch ${trigger.condition?.kind ?? 'condition'}`;
34
- case 'repository-event': return `On ${trigger.eventName ?? 'repository event'}`;
35
- case 'dependency-checkpoint': return 'Dependency checkpoint';
36
- case 'manual': return 'Manual';
72
+ case 'interval': return `每 ${trigger.everyMinutes ?? '?'} 分钟`;
73
+ case 'cron': return cronLabel(trigger.cronExpression) ?? '自定义时间计划';
74
+ case 'calendar': return trigger.calendarAt ? `单次 · ${trigger.calendarAt}` : '指定时间';
75
+ case 'condition': return `条件满足时 · ${trigger.condition?.kind ?? 'condition'}`;
76
+ case 'repository-event': return `仓库事件 · ${trigger.eventName ?? 'repository event'}`;
77
+ case 'dependency-checkpoint': return '依赖完成时';
78
+ case 'manual': return '仅手动运行';
37
79
  }
38
80
  }
39
81
 
@@ -45,81 +87,200 @@ function nextScheduleHint(schedule: RepositorySchedule): string | undefined {
45
87
  const base = Date.parse(schedule.lastTriggeredAt ?? schedule.createdAt);
46
88
  if (Number.isFinite(base)) {
47
89
  const next = base + schedule.trigger.everyMinutes * 60_000;
48
- return next > Date.now() ? new Date(next).toISOString() : 'Due on next scheduler tick';
90
+ return next > Date.now() ? new Date(next).toISOString() : '下一次调度周期';
49
91
  }
50
92
  }
51
- if (schedule.trigger.type === 'cron') return 'Scheduler-calculated';
52
- if (schedule.trigger.type === 'condition') return 'When condition matches';
93
+ if (schedule.trigger.type === 'cron') return cronLabel(schedule.trigger.cronExpression) ?? '按自定义时间计划';
94
+ if (schedule.trigger.type === 'condition') return '等待条件满足';
53
95
  return undefined;
54
96
  }
55
97
 
56
- function safeBoundSchedule(controllerHome: string, repoId: string, scheduleId?: string): RepositorySchedule | undefined {
57
- if (!scheduleId) return undefined;
58
- try { return getSchedule(controllerHome, repoId, scheduleId); } catch { return undefined; }
59
- }
60
-
61
98
  function occurrenceResult(occurrence?: ScheduleOccurrence): string | undefined {
62
99
  if (!occurrence) return undefined;
63
- if (occurrence.decision === 'nothing_to_do') return 'No action needed';
64
- if (occurrence.status === 'failed') return 'Failed';
65
- if (occurrence.status === 'succeeded') return 'Succeeded';
66
- if (occurrence.status === 'running' || occurrence.status === 'queued' || occurrence.status === 'created') return 'Running';
100
+ if (occurrence.decision === 'nothing_to_do') return '无变化';
101
+ if (occurrence.decision === 'would_execute') return '预演完成';
102
+ if (occurrence.decision === 'stopped') return '已停止';
103
+ if (occurrence.status === 'failed') return '失败';
104
+ if (occurrence.status === 'succeeded') return '执行成功';
105
+ if (occurrence.status === 'running' || occurrence.status === 'queued' || occurrence.status === 'created') return '运行中';
106
+ if (occurrence.status === 'skipped') return '已跳过';
67
107
  return occurrence.status;
68
108
  }
69
109
 
110
+ function occurrenceTone(occurrence: ScheduleOccurrence): ConsoleAutomationHistoryView['tone'] {
111
+ if (occurrence.status === 'failed' || occurrence.decision === 'operation_blocked') return 'red';
112
+ if (occurrence.decision === 'stopped' || occurrence.decision === 'budget_exhausted') return 'amber';
113
+ if (occurrence.status === 'succeeded') return 'green';
114
+ if (occurrence.status === 'running' || occurrence.status === 'queued' || occurrence.status === 'created') return 'blue';
115
+ return 'gray';
116
+ }
117
+
118
+ function displayOccurrenceReason(reason?: string): string | undefined {
119
+ const value = reason?.trim();
120
+ if (!value) return undefined;
121
+ if (value === 'Browser session keepalive refreshed successfully.') return '登录会话刷新成功,未发现认证问题。';
122
+ if (value === 'Browser watcher baseline recorded; no Controller wake was emitted.') return '已建立观察基线;没有唤醒 ChatGPT。';
123
+ if (value === 'Browser watcher observation is unchanged; no Controller wake was emitted.') return '页面没有变化;保持静默。';
124
+ if (value.startsWith('Browser watcher requires authentication:')) return '目标登录状态已失效,需要重新认证。';
125
+ if (value.startsWith('Work ') && value.includes(' is terminal')) return '绑定的 Work 已完成,自动任务已停止。';
126
+ return value;
127
+ }
128
+
129
+ function occurrenceHistory(occurrences: ScheduleOccurrence[]): ConsoleAutomationHistoryView[] {
130
+ return occurrences.slice(0, 8).map((occurrence) => ({
131
+ id: occurrence.occurrenceId,
132
+ at: occurrence.updatedAt,
133
+ result: occurrenceResult(occurrence) ?? '已记录',
134
+ tone: occurrenceTone(occurrence),
135
+ reason: displayOccurrenceReason(occurrence.reason),
136
+ trigger: occurrence.triggerContext?.source === 'manual' ? '手动' : occurrence.triggerContext?.source === 'timer' ? '定时' : occurrence.triggerContext?.source,
137
+ }));
138
+ }
139
+
140
+ function scheduleMode(schedule: RepositorySchedule): ConsoleAutomationMode {
141
+ if (schedule.action.operation === 'external_controller_wake') return 'continuation';
142
+ if (schedule.action.operation === 'browser_probe') return schedule.action.arguments?.keepalive_only === true ? 'browser_keepalive' : 'browser_watch';
143
+ return 'schedule';
144
+ }
145
+
146
+ function modeLabel(mode: ConsoleAutomationMode): string {
147
+ if (mode === 'browser_watch') return '网页变更监听';
148
+ if (mode === 'browser_keepalive') return '登录保活';
149
+ if (mode === 'continuation') return '自动继续 Work';
150
+ return '自动任务';
151
+ }
152
+
153
+ function scheduleSummary(mode: ConsoleAutomationMode): string {
154
+ if (mode === 'browser_watch') return '静默观察目标页面;只有内容发生变化时才恢复 ChatGPT。';
155
+ if (mode === 'browser_keepalive') return '静默刷新登录态;正常时不打扰,认证失效时再恢复 ChatGPT。';
156
+ if (mode === 'continuation') return '按计划恢复绑定的 Work,让外部 Controller 继续未完成目标。';
157
+ return '由 Forge Schedule Engine 管理的持久自动任务。';
158
+ }
159
+
160
+ function scheduleDelivery(schedule: RepositorySchedule, mode: ConsoleAutomationMode): string | undefined {
161
+ const controller = typeof schedule.action.arguments?.controller_type === 'string' ? schedule.action.arguments.controller_type : 'chatgpt';
162
+ if (mode === 'browser_watch') return `变化时唤醒 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
163
+ if (mode === 'browser_keepalive') return `登录失效时唤醒 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
164
+ if (mode === 'continuation') return `恢复 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
165
+ return undefined;
166
+ }
167
+
168
+ function chatgptExecutionProfile(schedule: RepositorySchedule, mode: ConsoleAutomationMode): { agentModel?: string; reasoningLevel?: string; tabPolicy?: string } {
169
+ if (mode !== 'continuation') return {};
170
+ const args = schedule.action.arguments ?? {};
171
+ const controller = typeof args.controller_type === 'string' ? args.controller_type : 'chatgpt';
172
+ if (mode === 'continuation' && controller !== 'chatgpt') return {};
173
+ return {
174
+ agentModel: typeof args.model === 'string' && args.model.trim() ? args.model.trim() : 'gpt-5.6',
175
+ reasoningLevel: typeof args.reasoning === 'string' && args.reasoning.trim() ? args.reasoning.trim() : 'high',
176
+ tabPolicy: typeof args.tab_policy === 'string' && args.tab_policy.trim() ? args.tab_policy.trim() : 'auto',
177
+ };
178
+ }
179
+
180
+ function scheduleTarget(schedule: RepositorySchedule, mode: ConsoleAutomationMode): string | undefined {
181
+ const args = schedule.action.arguments ?? {};
182
+ if (typeof args.probe_url === 'string') {
183
+ try { return new URL(args.probe_url).hostname; } catch { return '网页目标'; }
184
+ }
185
+ if (typeof args.probe_session_id === 'string') return mode === 'browser_keepalive' ? '已绑定登录会话' : '已绑定浏览器会话';
186
+ if (typeof args.browser_session_id === 'string') return '已绑定 ChatGPT 会话';
187
+ return undefined;
188
+ }
189
+
190
+ function observationResult(schedule: RepositorySchedule, fallback?: ScheduleOccurrence): string | undefined {
191
+ switch (schedule.lastObservationStatus) {
192
+ case 'baseline': return '已建立基线';
193
+ case 'unchanged': return '无变化';
194
+ case 'changed': return '检测到变化';
195
+ case 'keepalive': return '登录保持正常';
196
+ case 'auth_required': return '需要重新登录';
197
+ default: return occurrenceResult(fallback);
198
+ }
199
+ }
200
+
201
+ function scheduleNeedsAttention(schedule: RepositorySchedule): boolean {
202
+ if (schedule.lastObservationStatus === 'auth_required') return true;
203
+ if (schedule.consecutiveFailures >= schedule.policy.maxFailures) return true;
204
+ return Boolean(schedule.pausedReason && /(?:fail|error|auth|login|block|attention|maximum)/i.test(schedule.pausedReason));
205
+ }
206
+
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';
210
+ if (schedule.enabled) return scheduleNeedsAttention(schedule) ? 'attention' : 'enabled';
211
+ return scheduleNeedsAttention(schedule) ? 'attention' : 'paused';
212
+ }
213
+
214
+ function workBinding(controllerHome: string, repoId: string, schedule: RepositorySchedule): { id?: string; objective?: string; status?: string } {
215
+ const value = schedule.action.arguments?.work_id;
216
+ const workId = typeof value === 'string' && value.trim() ? value.trim() : undefined;
217
+ if (!workId) return {};
218
+ const work = getWorkContract({ controllerHome, repoId }, workId);
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;
235
+ }
236
+
237
+ function policySummary(schedule: RepositorySchedule): string {
238
+ return `连续失败 ${schedule.consecutiveFailures}/${schedule.policy.maxFailures} · 冷却 ${schedule.policy.cooldownMinutes} 分钟 · 每日预算 ${schedule.policy.dailyBudgetMinutes} 分钟`;
239
+ }
240
+
70
241
  export function listConsoleAutomations(controllerHome: string, repositories: RepositoryRecord[]): ConsoleAutomationView[] {
71
242
  const items: ConsoleAutomationView[] = [];
72
243
  for (const repository of repositories.filter((entry) => entry.enabled && !entry.removedAt)) {
73
- const routines = listAssistantRoutines(repository.canonicalRoot).routines;
74
- const bindings = new Map(routines.map((routine) => [routine.routineId, getAssistantRoutineScheduleBinding(repository.canonicalRoot, routine.routineId)]));
75
- const boundScheduleIds = new Set([...bindings.values()].flatMap((binding) => binding ? [binding.scheduleId] : []));
76
-
77
244
  for (const schedule of listSchedules(controllerHome, repository.repoId)) {
78
- if (boundScheduleIds.has(schedule.scheduleId)) continue;
79
- const last = listOccurrences(controllerHome, repository.repoId, schedule.scheduleId, 1)[0];
80
- const status: ConsoleAutomationView['status'] = schedule.enabled ? 'enabled' : schedule.pausedReason ? 'attention' : 'paused';
245
+ if (schedule.action.operation === 'chatgpt_browser_prompt') continue;
246
+ if (schedule.action.operation === 'assistant_routine_execute') continue;
247
+ const occurrences = listOccurrences(controllerHome, repository.repoId, schedule.scheduleId, 8);
248
+ const last = occurrences[0];
249
+ const mode = scheduleMode(schedule);
250
+ const work = workBinding(controllerHome, repository.repoId, schedule);
251
+ const executionProfile = chatgptExecutionProfile(schedule, mode);
81
252
  items.push({
82
253
  id: schedule.scheduleId,
83
254
  source: 'schedule',
84
255
  repoId: repository.repoId,
85
256
  repositoryName: repository.displayName,
86
257
  name: schedule.name,
87
- summary: schedule.action.operation,
88
- status,
258
+ summary: scheduleSummary(mode),
259
+ status: scheduleStatus(schedule, work.status),
89
260
  schedule: triggerLabel(schedule),
90
261
  timezone: schedule.trigger.timezone,
262
+ delivery: scheduleDelivery(schedule, mode),
263
+ mode,
264
+ modeLabel: modeLabel(mode),
265
+ live: !schedule.policy.shadowMode,
266
+ targetLabel: scheduleTarget(schedule, mode),
267
+ boundWorkId: work.id,
268
+ boundWorkObjective: work.objective,
269
+ observationStatus: schedule.lastObservationStatus,
270
+ observationAt: schedule.lastObservationAt,
271
+ failureCount: schedule.consecutiveFailures,
272
+ policySummary: policySummary(schedule),
273
+ ...executionProfile,
91
274
  lastRunAt: last?.updatedAt ?? schedule.lastTriggeredAt,
92
- lastResult: occurrenceResult(last),
275
+ lastResult: observationResult(schedule, last),
93
276
  nextRunHint: nextScheduleHint(schedule),
94
- pausedReason: schedule.pausedReason,
95
- actions: schedule.enabled ? ['run', 'pause'] : ['resume'],
277
+ pausedReason: displayPauseReason(schedule, work.status),
278
+ attentionMessage: attentionMessage(schedule, work.status),
279
+ history: occurrenceHistory(occurrences),
280
+ actions: scheduleStatus(schedule, work.status) === 'completed' ? [] : schedule.enabled ? ['run', 'pause'] : ['resume'],
96
281
  });
97
282
  }
98
283
 
99
- for (const routine of routines) {
100
- const binding = bindings.get(routine.routineId);
101
- const boundSchedule = safeBoundSchedule(controllerHome, repository.repoId, binding?.scheduleId);
102
- const last = boundSchedule ? listOccurrences(controllerHome, repository.repoId, boundSchedule.scheduleId, 1)[0] : undefined;
103
- const scheduleAttention = routine.status === 'enabled' && boundSchedule && !boundSchedule.enabled && Boolean(boundSchedule.pausedReason);
104
- const status: ConsoleAutomationView['status'] = scheduleAttention ? 'attention' : routine.status === 'enabled' ? 'enabled' : routine.status === 'paused' ? 'paused' : 'disabled';
105
- items.push({
106
- id: routine.routineId,
107
- source: 'routine',
108
- repoId: repository.repoId,
109
- repositoryName: repository.displayName,
110
- name: routine.name,
111
- summary: routine.naturalLanguageGoal,
112
- status,
113
- schedule: routine.scheduleText,
114
- timezone: routine.timezone,
115
- delivery: routine.output === 'assistant_inbox' ? 'Assistant inbox' : routine.output === 'gmail_draft' ? 'Gmail draft' : 'None',
116
- lastRunAt: last?.updatedAt ?? routine.lastRunAt,
117
- lastResult: occurrenceResult(last) ?? (routine.lastRunAt ? 'Triggered' : undefined),
118
- nextRunHint: boundSchedule ? nextScheduleHint(boundSchedule) : routine.nextRunHint,
119
- pausedReason: boundSchedule?.pausedReason,
120
- actions: scheduleAttention ? ['resume'] : routine.status === 'enabled' ? ['run', 'pause'] : routine.status === 'paused' ? ['resume'] : [],
121
- });
122
- }
123
284
  }
124
285
  return items.sort((a, b) => a.name.localeCompare(b.name));
125
286
  }
@@ -129,6 +290,7 @@ export function summarizeConsoleAutomations(items: ConsoleAutomationView[]) {
129
290
  total: items.length,
130
291
  enabled: items.filter((item) => item.status === 'enabled').length,
131
292
  paused: items.filter((item) => item.status === 'paused' || item.status === 'disabled').length,
293
+ completed: items.filter((item) => item.status === 'completed').length,
132
294
  needsAttention: items.filter((item) => item.status === 'attention').length,
133
295
  };
134
296
  }
@@ -143,16 +305,12 @@ export async function applyConsoleAutomationAction(
143
305
  ): Promise<unknown> {
144
306
  const repository = repositories.find((entry) => entry.repoId === repoId && entry.enabled && !entry.removedAt);
145
307
  if (!repository) throw new Error(`REPOSITORY_NOT_FOUND: ${repoId}`);
146
- if (source === 'routine') {
147
- if (action === 'run') return runAssistantRoutineNow(controllerHome, repository, id);
148
- if (action === 'pause') return updateAssistantRoutineLifecycle(controllerHome, repository, id, 'paused');
149
- if (action === 'resume') return updateAssistantRoutineLifecycle(controllerHome, repository, id, 'enabled');
150
- throw new Error(`AUTOMATION_ACTION_UNSUPPORTED: routine/${action}`);
151
- }
152
308
  if (source === 'schedule') {
153
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');
154
312
  if (action === 'pause') return saveSchedule(controllerHome, { ...schedule, enabled: false, pausedReason: undefined });
155
- 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 });
156
314
  if (action === 'run') return evaluateSchedule(controllerHome, schedule, true, { source: 'manual' });
157
315
  throw new Error(`AUTOMATION_ACTION_UNSUPPORTED: schedule/${action}`);
158
316
  }
@@ -100,6 +100,8 @@ export interface ConsoleErrorViewModel {
100
100
 
101
101
  export interface WorkSummaryViewModel {
102
102
  id: string;
103
+ repoId: string;
104
+ updatedAt: string;
103
105
  title: string;
104
106
  objective: string;
105
107
  modeLabel: string;
@@ -249,7 +251,7 @@ export interface AccessStateViewModel {
249
251
  configuredAccessModeLabel: string;
250
252
  effectiveAccessMode: 'request' | 'full_access';
251
253
  effectiveAccessModeLabel: string;
252
- effectiveToolset: 'core' | 'advanced' | 'full';
254
+ effectiveToolset: 'facade' | 'core' | 'advanced' | 'full';
253
255
  exposureRevision: number;
254
256
  lastAppliedAt?: string;
255
257
  source: string;
@@ -262,38 +264,6 @@ export interface AccessStateViewModel {
262
264
  toolGroups: string[];
263
265
  }
264
266
 
265
- /** Compact autonomous goal-loop status for console / local-bridge (no raw internal dumps). */
266
- export interface GoalLoopStatusViewModel {
267
- activeCount: number;
268
- goals: Array<{
269
- title: string;
270
- stage: string;
271
- currentStep: string;
272
- providerSelected?: string;
273
- waitingReason?: string;
274
- nextSafeAction?: string;
275
- handoffPacketAvailable: boolean;
276
- approvalRequired: boolean;
277
- whyThisProvider?: string;
278
- whatHappensNext?: string;
279
- whatIsBlocked?: string;
280
- }>;
281
- invokableProviders: string[];
282
- handoffOnlyProviders: string[];
283
- providerHealth: Array<{
284
- providerId: string;
285
- status: string;
286
- directDispatchAllowed: boolean;
287
- handoffOnly: boolean;
288
- summary: string;
289
- }>;
290
- /** Plain-language automation overview snippet. */
291
- automationSummary?: string;
292
- liveModelProvidersEffective?: boolean;
293
- settingsPathHint?: string;
294
- nextTickHint?: string;
295
- }
296
-
297
267
  export interface CommandCenterViewModel {
298
268
  schemaVersion: 1;
299
269
  generatedAt: string;
@@ -307,8 +277,6 @@ export interface CommandCenterViewModel {
307
277
  currentWork?: WorkSummaryViewModel;
308
278
  recentWork: WorkSummaryViewModel[];
309
279
  handoffs: HandoffCardViewModel[];
310
- /** Autonomous goal loop surface (daemon-owned, above Issue/Task). */
311
- goalLoop?: GoalLoopStatusViewModel;
312
280
  /** Assistant/plugin capabilities available to the controller (not the primary workflow). */
313
281
  pluginSummary: PluginSummaryViewModel;
314
282
  plugins: PluginCardViewModel[];