@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,9 +0,0 @@
1
- # Forge Goal Loop
2
-
3
- Forge supports bounded goal progression through durable Goal, Work, Process, evidence, policy, and handoff records. The kernel does not recursively invent unlimited work, select arbitrary models, or bypass authorization. Semantic planning and provider selection belong to the external controller; deterministic repository and provider operations remain Forge-owned.
4
-
5
- Every continuation must have a finite objective, resource scope, budget, stop condition, and reviewable evidence. Remote or destructive effects stay separately authorized. A Schedule can wake an external Controller for an existing bounded Work; ChatGPT wakeups reuse a saved Forge browser session or explicit conversation URL when available, so conversation continuity is a transport concern rather than Kernel reasoning.
6
- The stable configuration path is `rh_work.schedule_*`: create one continuation policy for an already accepted Work, inspect it, pause/resume it, or trigger one bounded Occurrence. The engine re-checks Work terminality before launch and automatically disables the Schedule when the Work is complete, so users do not need to keep sending “continue” and Forge does not keep waking a model after acceptance is satisfied.
7
- A scheduled wake uses a short launch reservation rather than a fake Controller lease. The external model becomes owner only after its own authenticated MCP session calls `rh_work continue`; this is the identity handoff boundary between deterministic scheduling and semantic control.
8
-
9
- See [Dispatch and Agent Strategy](architecture/current/dispatch-and-agent-strategy.md), [Schedule Engine](architecture/current/automation-and-schedule-engine.md), and [Governance](architecture/current/governance.md).
@@ -1,7 +0,0 @@
1
- # Forge Provider Configuration
2
-
3
- Forge keeps provider selection separate from Runtime ownership. Codex, Claude, GitHub, browser, Google Workspace, Apple, iOS, Desktop, and other adapters execute bounded contracts through stable Forge policy, Process, receipt, and audit layers.
4
-
5
- Provider credentials are supplied through supported environment or OS credential mechanisms and are never copied into repository state or chat output. Provider availability does not change the one-Runtime topology.
6
-
7
- See [Provider configuration](operations/provider-configuration.md), [Plugin baseline](architecture/current/personal-assistant-plugin-baseline.md), and [Security Model](wiki/Security-Model.md).
@@ -1,83 +0,0 @@
1
- # ChatGPT-first Personal Assistant Runtime
2
-
3
- This runtime is designed for a local-first personal assistant where ChatGPT is the primary natural-language controller and Forge is the guarded local execution layer.
4
-
5
- ## Product boundary
6
-
7
- The Local Controller should not be the main task input surface. It stores routines, inbox items, memory, approvals, audit events, device tokens, and plugin state. ChatGPT, MCP, or a GPT Action should translate natural language into one of the high-level assistant APIs.
8
-
9
- ## High-level API surface
10
-
11
- Expose these endpoints to ChatGPT Actions instead of exposing every low-level plugin action:
12
-
13
- - `POST /api/assistant/intent` — submit a natural-language utterance or a ChatGPT-planned action list.
14
- - `GET /api/assistant/inbox` — read assistant outputs, routine results, and approval notes.
15
- - `GET /api/assistant/routines` — list saved routines.
16
- - `POST /api/assistant/routines` — create a routine from a natural-language goal.
17
- - `POST /api/assistant/routines/:routineId/run` — run one routine immediately.
18
- - `POST /api/assistant/routines/:routineId/pause` — pause a routine.
19
- - `POST /api/assistant/routines/:routineId/resume` — resume a routine.
20
- - `POST /api/assistant/routines/:routineId/delete` — soft-delete a routine.
21
- - `GET /api/assistant/memory` and `POST /api/assistant/memory` — read/write local preference memory.
22
- - `GET /api/assistant/openapi.json` — minimal OpenAPI schema for a Custom GPT Action.
23
-
24
- All `/api/*` routes still require the local controller token.
25
-
26
- ## Intent modes
27
-
28
- `/api/assistant/intent` supports three modes:
29
-
30
- - `plan_only`: return the interpreted plan without submitting execution jobs.
31
- - `plan_then_execute`: plan and submit safe steps; block high-risk steps.
32
- - `execute`: submit the supplied plan directly through the same policy gate.
33
-
34
- The preferred ChatGPT flow is:
35
-
36
- 1. ChatGPT understands the user request.
37
- 2. ChatGPT asks for missing information or confirmation when needed.
38
- 3. ChatGPT calls `/api/assistant/intent` with either the natural-language utterance or an explicit `plan`.
39
- 4. Forge validates policy, creates durable Execution Jobs, stores an Assistant Inbox item, and returns display text.
40
-
41
- ## Routine model
42
-
43
- A routine stores the user's natural-language goal rather than a traditional GUI rule form:
44
-
45
- ```json
46
- {
47
- "name": "每日邮件整理",
48
- "naturalLanguageGoal": "每天早上 9 点整理过去 24 小时重要邮件,重点关注工作、API、BA、Jira、PR,用中文输出摘要。",
49
- "scheduleText": "每天 09:00",
50
- "dataSources": ["gmail", "calendar", "tasks"],
51
- "output": "assistant_inbox",
52
- "allowedActions": ["gmail.list_messages", "gmail.get_message"],
53
- "forbiddenActions": ["gmail.send_message", "gmail.trash_message"]
54
- }
55
- ```
56
-
57
- The first version stores the routine and can run it on demand. Automatic time-based scheduling should attach this store to the existing schedule engine in a later iteration.
58
-
59
- ## Policy defaults
60
-
61
- Allowed without extra approval:
62
-
63
- - Read Gmail, Calendar, and Tasks.
64
- - Create a Google Task / reminder.
65
- - Create a Gmail draft.
66
- - Create a personal calendar event without attendees.
67
-
68
- Requires human approval:
69
-
70
- - Send email.
71
- - Trash email.
72
- - Cancel calendar event.
73
- - Reschedule calendar event.
74
- - Delete task.
75
- - Scheduled routine writes beyond explicitly allowed draft/reminder behavior.
76
-
77
- ## Assistant Inbox
78
-
79
- Assistant Inbox is the user-facing result surface for routine outputs and intent execution records. ChatGPT can read it and then present the result conversationally, for example: "今天助理整理了什么?"
80
-
81
- ## Current limitation
82
-
83
- The runtime does not embed a full NLP model. ChatGPT Actions should provide structure when precision matters. The local runtime includes conservative intent inference only for routine creation, reminders, and immediate mail-summary collection.
@@ -1,112 +0,0 @@
1
- # Controller Desktop Plugin
2
-
3
- The `desktop` plugin is a bundled first-party Forge capability for bounded
4
- macOS desktop observation and application launch. It is not downloaded from a
5
- marketplace and it does not require a user-configured socket, executable path, or
6
- registration descriptor.
7
-
8
- ## Architecture
9
-
10
- ```text
11
- ChatGPT / CLI / Local UI
12
- -> list_plugins / get_plugin / plugin_action_execute
13
- -> existing plugin policy, schema, receipt, and audit layers
14
- -> Desktop adapter (Controller process)
15
- -> one-shot managed child process
16
- -> JSON-lines stdio handshake and action
17
- -> bundled forge-desktop-helper.mjs
18
- ```
19
-
20
- The Controller starts the helper on demand for one action. The child performs a
21
- versioned handshake, executes one bounded request, returns one structured result,
22
- and exits. Forge enforces request and response size limits, timeout,
23
- cancellation, capability negotiation, bounded diagnostics, and process cleanup.
24
- The helper is launched directly without a shell.
25
-
26
- This initial implementation deliberately does not provide:
27
-
28
- - plugin search, download, installation, or a marketplace;
29
- - arbitrary commands or user-configured helper paths;
30
- - sockets, background registration files, or a second plugin registry;
31
- - screen capture, clicks, coordinates, keyboard input, or text entry;
32
- - dynamic MCP tool loading.
33
-
34
- The existing static MCP tools remain the public entry point, while action schemas,
35
- permissions, lifecycle, health, receipts, and audit events remain authoritative in
36
- the existing plugin runtime.
37
-
38
- ## Actions
39
-
40
- | Action | Effect | Policy |
41
- | --- | --- | --- |
42
- | `configure` | Enable or disable the bundled Desktop plugin. | Authorization required. |
43
- | `status` | Run a live helper handshake and return bounded readiness diagnostics. | Read-only. |
44
- | `observe` | Read the frontmost macOS application through `NSWorkspace`; no screen pixels are captured. | Read-only. |
45
- | `open_application` | Open one app by exact `app_name` or `bundle_id`. | Authorization required. |
46
-
47
- `open_application` accepts exactly one selector. It invokes `/usr/bin/open` with an
48
- argv array and never interpolates a shell command.
49
-
50
- ## Enable on this Mac
51
-
52
- Use the controller-scoped plugin action without a repository id:
53
-
54
- ```json
55
- {
56
- "plugin_id": "desktop",
57
- "action_id": "configure",
58
- "request_id": "desktop-enable-1",
59
- "confirm_authorization": true,
60
- "arguments": {
61
- "enabled": true
62
- }
63
- }
64
- ```
65
-
66
- Then call `get_plugin` for `desktop`, followed by `status` and `observe`.
67
- No ChatGPT reconnect is required because Forge reuses the existing
68
- `list_plugins`, `get_plugin`, and `plugin_action_execute` tool schemas. Loading a
69
- new Runtime revision may require the external lifecycle owner to restart the
70
- existing single Forge Runtime; it must not create a second Runtime or rollout slot.
71
-
72
- Configuration authority is stored under:
73
-
74
- ```text
75
- <controller-home>/system/desktop/config.json
76
- ```
77
-
78
- The derived manifest and registry remain Controller projections. The helper path
79
- is resolved from the active Forge installation and is not returned as
80
- user-facing configuration.
81
-
82
- ## Permissions
83
-
84
- The current version does not request Screen Recording permission because it does
85
- not capture screenshots. Read-only observation uses AppKit `NSWorkspace` through
86
- the system JavaScript bridge and does not intentionally trigger Accessibility
87
- consent prompts. Health reports Accessibility as `not_probed` rather than claiming
88
- permission that has not been verified.
89
-
90
- Future click, keyboard, screenshot, or accessibility-tree actions must be added as
91
- separate capabilities with explicit permission probes, stronger policy, redaction,
92
- and fault-injection coverage. They must not be inferred from this initial plugin.
93
-
94
- ## Failure behavior
95
-
96
- The plugin fails closed when:
97
-
98
- - it is disabled;
99
- - the platform is not macOS;
100
- - the bundled helper is missing;
101
- - the helper handshake or capability set is incompatible;
102
- - a response is malformed or exceeds the output bound;
103
- - the helper crashes, times out, or is cancelled;
104
- - `open_application` receives zero or multiple selectors.
105
-
106
- A helper failure is surfaced as a structured `PLUGIN_MANAGED_PROCESS_*` or
107
- `PLUGIN_DESKTOP_*` error through the existing plugin receipt and audit path.
108
-
109
-
110
- ## Immutable release packaging
111
-
112
- Whole-Runtime releases include `forge-desktop-helper.mjs` as a required, hashed sibling artifact. The Desktop adapter resolves it from the validated active Runtime release identity, then uses argv/source candidates only as development compatibility fallbacks. It launches the helper with the same trusted Node resolver used by the bounded Node bridge path; it does not execute the compiled Forge binary as a JavaScript interpreter. Release validation fails closed when the helper is missing or empty, and plugin health reports helper and trusted-runtime availability without returning either local path.
@@ -1,186 +0,0 @@
1
- # Durable Gmail Assistant Routines
2
-
3
- Gmail Assistant Routines use the existing Repository Schedule Engine and durable Execution Jobs. They do not introduce a second cron service.
4
-
5
- ## Execution flow
6
-
7
- 1. Creating a confirmed Assistant Routine persists the Routine and creates one Repository Schedule.
8
- 2. The Schedule stores an IANA timezone, a five-field local cron expression, and a bounded catch-up window.
9
- 3. A due occurrence creates one `assistant_routine_execute` Runtime Job with an exclusive Routine resource claim.
10
- 4. The Runtime Job reads Gmail incrementally, hydrates bounded message bodies, advances the per-Routine cursor, analyzes the bounded message set, creates structured action proposals, and writes a final Assistant Inbox report.
11
- 5. Proposals either remain pending for explicit approval or match a previously authorized Standing Grant.
12
- 6. Every approved or Standing-Grant action runs as a separate durable plugin Job. Schedule execution never becomes remote-write authorization.
13
- 7. Sending mail and moving mail to Trash retain their existing strong-confirmation requirements and are never Standing-Grant eligible.
14
-
15
- ## Google OAuth setup
16
-
17
- Create a Google OAuth client with this loopback redirect URI:
18
-
19
- ```text
20
- http://127.0.0.1:8766/oauth/google/callback
21
- ```
22
-
23
- Expose the client configuration only through the managed secret environment:
24
-
25
- - `FORGE_GOOGLE_CLIENT_ID`
26
- - `FORGE_GOOGLE_CLIENT_SECRET`
27
-
28
- The `FORGE_GOOGLE_WORKSPACE_CLIENT_ID` and `FORGE_GOOGLE_WORKSPACE_CLIENT_SECRET` aliases are also supported.
29
-
30
- Call `workspace_auth_login_prepare` for `gmail` or `google-workspace`, then open the returned authorization URL. The request uses OAuth Authorization Code flow with PKCE, a random one-time state, a ten-minute expiry, and a loopback-only callback. Redirect URIs outside `127.0.0.1` or `localhost`, unexpected callback paths, and scopes outside the Gmail/Calendar/Tasks allowlist are rejected.
31
-
32
- The callback exchanges the authorization code and stores only the refresh token in macOS Keychain. Access and refresh tokens are never returned through MCP, written to repository files, or written to normal Controller runtime state. The transient PKCE verifier is stored under Controller Home with restrictive permissions and is redacted after the callback is consumed.
33
-
34
- The current secure persistence backend is macOS Keychain. Non-macOS hosts must provide a supported credential-store adapter or use managed environment credentials.
35
-
36
- ## Credential refresh and readiness
37
-
38
- A configured access token is not considered provider-verified until a real Google API request succeeds. Before that first successful probe, health reports `live_token_unverified`.
39
-
40
- After OAuth setup, Controller restarts can reload the refresh token from Keychain. When no valid cached access token exists, or Gmail returns HTTP 401/403, the provider performs one refresh-token exchange and at most one request retry. A failed refresh is classified as `PLUGIN_AUTH_FAILED`; the Routine Run becomes `auth_required` and Assistant Inbox requests reauthorization.
41
-
42
- Managed environment credentials remain compatible:
43
-
44
- - `FORGE_GMAIL_ACCESS_TOKEN`
45
- - `FORGE_GMAIL_REFRESH_TOKEN`
46
- - `FORGE_GMAIL_CLIENT_ID`
47
- - `FORGE_GMAIL_CLIENT_SECRET`
48
- - `FORGE_GOOGLE_WORKSPACE_ACCESS_TOKEN`
49
- - `FORGE_GOOGLE_WORKSPACE_REFRESH_TOKEN`
50
- - `FORGE_GOOGLE_WORKSPACE_CLIENT_ID`
51
- - `FORGE_GOOGLE_WORKSPACE_CLIENT_SECRET`
52
-
53
- ## Scheduling semantics
54
-
55
- Routine schedule text is normalized when the Routine is created. The first implementation recognizes daily and weekday expressions with an optional `HH:mm` or Chinese `点/时` form. Examples:
56
-
57
- - `每天 09:00`
58
- - `每周一 08:30`
59
- - `Monday 07:00`
60
-
61
- The normalized Schedule preserves the IANA timezone, so daylight-saving transitions remain aligned to local wall-clock time. Missed runs catch up at most once inside the configured window because the occurrence key is derived from the local scheduled minute rather than the actual wake-up minute.
62
-
63
- ## Gmail History cursor
64
-
65
- Each Routine stores an independent cursor under `.forge/assistant/gmail-cursors.json`:
66
-
67
- - last successful collection time
68
- - bounded processed-message ID set
69
- - Gmail `historyId`
70
- - a bounded History or query continuation token while a backlog is still being drained
71
-
72
- After the initial query, Gmail History is the primary incremental source. An expired History ID falls back to a five-minute-overlap Gmail query. Collection reads at most five pages, 100 IDs, and 50 full messages per run. If the page or hydration limit is reached, the history cursor does not advance; a continuation token or the original window is retained so the next run drains the remaining messages without loss.
73
-
74
- ## Optional model analysis
75
-
76
- The model layer is optional. When it is disabled, unavailable, times out, or returns malformed output, the Routine completes with the deterministic rules engine rather than failing.
77
-
78
- Configure an OpenAI-compatible endpoint with:
79
-
80
- - `FORGE_ASSISTANT_MODEL_PROVIDER=openai-compatible`
81
- - `FORGE_ASSISTANT_MODEL_ENDPOINT`
82
- - `FORGE_ASSISTANT_MODEL`
83
- - `FORGE_ASSISTANT_MODEL_API_KEY`
84
-
85
- For the exact official hosts, provider-specific keys are also supported:
86
-
87
- - `api.openai.com` may use `OPENAI_API_KEY`
88
- - `api.deepseek.com` may use `FORGE_DEEPSEEK_API_KEY` or `DEEPSEEK_API_KEY`
89
-
90
- A custom endpoint never receives `OPENAI_API_KEY` or a DeepSeek key. It must use the dedicated `FORGE_ASSISTANT_MODEL_API_KEY`. Endpoints must use HTTPS, except loopback HTTP used for a local model.
91
-
92
- Optional budgets:
93
-
94
- - `FORGE_ASSISTANT_MODEL_TIMEOUT_MS`
95
- - `FORGE_ASSISTANT_MODEL_MAX_MESSAGES`
96
- - `FORGE_ASSISTANT_MODEL_MAX_INPUT_CHARS`
97
- - `FORGE_ASSISTANT_MODEL_MAX_OUTPUT_TOKENS`
98
-
99
- The provider requests strict structured JSON, validates the result locally, and maps only these proposal types:
100
-
101
- - Gmail draft creation
102
- - Google Task creation
103
- - Gmail archive
104
- - Gmail mark read or unread
105
-
106
- Email contents are untrusted input. Instructions in an email, quoted thread, signature, link, or attachment description cannot expand the action allowlist or request tools, credentials, files, commands, or additional permissions. Security, authentication, billing, incident, production, quota, and repository-permission messages are protected from model-generated archive actions.
107
-
108
- The deterministic fallback also uses Gmail's `CATEGORY_PROMOTIONS` label as a high-confidence archive signal (`0.98`) for non-protected messages. Marketing/newsletter keyword matches remain a lower-confidence fallback (`0.7`). The protected-message veto wins over both signals, so a security, authentication, billing, production, incident, quota, or permission-related message is never proposed for automatic archive merely because Gmail classified it as Promotions.
109
-
110
- Use `assistant_model_readiness` or `GET /api/assistant/model` to inspect the redacted configuration and budgets. Model credentials and raw secrets are never returned.
111
-
112
- ## Action proposals and approval
113
-
114
- Routine analysis persists structured proposals under `.forge/assistant/action-proposals.json`. Each proposal records:
115
-
116
- - Routine and Run identity
117
- - target plugin/action and bounded arguments
118
- - supporting Gmail message IDs
119
- - sender/subject context and protected-message status
120
- - reason, confidence, risk, expiry, and execution status
121
- - the separate Execution Job created after approval
122
-
123
- Use `assistant_action_proposals` to list or inspect proposals. Use `assistant_action_proposal_resolve` with `decision=approve` or `decision=reject`. MCP approval requires `confirm_authorization=true`; strong-confirmation actions also require the action's exact confirmation text. Local Controller exposes equivalent authenticated proposal endpoints.
124
-
125
- Approval is idempotent. Repeating approval returns the same Execution Job rather than creating another remote write. Proposal audit records preserve whether approval came from MCP, Local UI, or a Standing Grant.
126
-
127
- ## Standing Grants
128
-
129
- A Standing Grant is an explicit, expiring pre-authorization for one hardcoded low-risk action. It is not a general plugin permission.
130
-
131
- Eligible actions are limited to:
132
-
133
- - `gmail.create_draft`
134
- - `gmail.archive_message`
135
- - `gmail.mark_message_read`
136
- - `gmail.mark_message_unread`
137
- - `google_tasks.create_task`
138
-
139
- A grant must include at least one constraint:
140
-
141
- - Routine ID allowlist
142
- - sender/domain allowlist
143
- - required subject fragment
144
-
145
- It also declares minimum proposal confidence, maximum executions per Routine Run, and expiry. Automatic draft grants additionally require a sender allowlist. Security-protected messages cannot be auto-archived.
146
-
147
- Create a grant through `assistant_standing_grant_create` or `POST /api/assistant/standing-grants` with explicit authorization. List it through `assistant_standing_grants`; revoke it through `assistant_standing_grant_revoke` or the Local Controller revoke endpoint.
148
-
149
- Example: automatically archive at most one high-confidence newsletter from a trusted sender per run:
150
-
151
- ```json
152
- {
153
- "plugin_id": "gmail",
154
- "action_id": "archive_message",
155
- "sender_allowlist": ["news@example.com"],
156
- "subject_contains": ["newsletter"],
157
- "min_confidence": 0.9,
158
- "max_per_run": 1,
159
- "expires_in_days": 30,
160
- "confirm_authorization": true
161
- }
162
- ```
163
-
164
- Standing-Grant executions use a dedicated `standing-grant` origin and a defense-in-depth plugin allowlist. Modifying the stored grant cannot enable send, Trash, permanent deletion, calendar cancellation/rescheduling, or task deletion. Multiple matching grants cannot submit the same proposal twice, and retries preserve each grant's per-run budget.
165
-
166
- ## Safety boundary
167
-
168
- Scheduled Routines may:
169
-
170
- - list and read Gmail messages
171
- - classify and summarize collected mail
172
- - create bounded draft, task, archive, and read/unread proposals
173
- - execute an eligible proposal only when a matching active Standing Grant already exists
174
- - write Assistant Inbox reports
175
-
176
- Scheduled Routines may not:
177
-
178
- - send mail
179
- - move mail to Trash
180
- - permanently delete mail
181
- - cancel or reschedule meetings
182
- - delete tasks
183
- - execute instructions embedded in mail
184
- - open arbitrary attachments or links
185
-
186
- A proposal is evidence for a later authorized action, not implicit authorization. A Standing Grant authorizes only its exact action and constraints. The Schedule origin never becomes authorization for a remote write.
@@ -1,61 +0,0 @@
1
- # Personal assistant operator guide
2
-
3
- This runtime is intended to be used with ChatGPT as the primary control plane. The Local Controller is the execution, policy, audit, and persistence layer.
4
-
5
- ## Recommended daily path
6
-
7
- 1. Ask ChatGPT for the goal in natural language.
8
- 2. ChatGPT calls the high-level assistant API or MCP tools.
9
- 3. The runtime plans safe plugin actions, submits durable jobs, and writes results into Assistant Inbox.
10
- 4. High-risk actions stay blocked until explicit human confirmation.
11
-
12
- ## Readiness check
13
-
14
- Use `assistant_readiness` or `GET /api/assistant/readiness` before relying on the assistant.
15
-
16
- The report separates:
17
-
18
- - live Google capability
19
- - mock-only capability
20
- - disabled plugins
21
- - routine, inbox, and memory state
22
- - recommended next actions
23
-
24
- Mock mode proves the execution path only. It does not read real Gmail, Calendar, or Tasks data.
25
-
26
- ## Gmail read self-test
27
-
28
- A low-risk Gmail read test can be submitted through either:
29
-
30
- - `plugin_action_execute` with `gmail.list_messages`
31
- - `POST /api/assistant/self-test/gmail-read`
32
- - `POST /api/assistant/intent` with an utterance such as `测试读取最近一周 Gmail`
33
-
34
- When Gmail is in mock mode, the test returns deterministic mock messages. For real Gmail, configure the plugin with provider `google-workspace` and set one of the supported token environment variables documented by the plugin health message.
35
-
36
- ## Cleanup workflow
37
-
38
- Use `runtime_cleanup_preview` or `POST /api/assistant/maintenance/cleanup-preview` first. It is non-destructive.
39
-
40
- Use cleanup apply only after reviewing the preview:
41
-
42
- - `runtime_cleanup_apply` with `confirm_cleanup=true`
43
- - `POST /api/assistant/maintenance/cleanup-apply` with `confirmCleanup=true`
44
-
45
- Cleanup is limited to explicit Forge candidates:
46
-
47
- - old `Forge-*` temp directories that are not referenced by running processes
48
- - terminal local jobs, when explicitly included
49
- - historical attention acknowledgements, when explicitly included
50
-
51
- Do not use cleanup apply as a substitute for reviewing active jobs, active leases, or running workers.
52
-
53
- ## What still needs real productization
54
-
55
- The current runtime can route assistant intents and run safe data collection jobs. A full personal-assistant product still needs:
56
-
57
- - real OAuth/token broker and refresh support
58
- - wall-clock routine scheduling
59
- - model-backed summarization of collected data
60
- - approval summaries for risky actions
61
- - cleanup apply integration in a dedicated maintenance UI
@@ -1,31 +0,0 @@
1
- # Provider configuration and routing
2
-
3
- Forge does not require or privilege a specific model vendor. A fresh installation builds neutral routing from provider kind, declared capabilities, health, and the configured provider priority. Providers with the same priority use the provider id only as a deterministic tie-breaker.
4
-
5
- ## Where configuration lives
6
-
7
- The Controller GUI and the JSON files below edit the same controller-scoped configuration:
8
-
9
- - `<controllerHome>/global/provider-config.json`: enable/disable providers, priority, model and non-secret API settings.
10
- - `<controllerHome>/global/executor-routing.json`: explicit provider order for each task intent.
11
- - `<controllerHome>/global/provider-secrets.json`: locally stored API credentials. This file is outside the repository and must never be committed.
12
-
13
- Opening the GUI or reading configuration does not rewrite these files. Existing routing and priority choices remain authoritative across upgrades.
14
-
15
- ## Precedence
16
-
17
- Provider selection applies these rules in order:
18
-
19
- 1. Per-request provider preferences and allow/deny constraints.
20
- 2. An explicit order or default in `executor-routing.json`, including changes made in the GUI routing editor.
21
- 3. Neutral generated defaults based on provider kind and `provider-config.json` priority.
22
- 4. Availability, enablement, authentication, live-call policy, safety gates, and required capabilities.
23
- 5. A ChatGPT handoff packet when no direct provider can safely run.
24
-
25
- An explicit routing order intentionally overrides the general provider priority. The GUI shows both controls so users can decide whether task types follow a specific route or the general provider preference. Use **Use automatic routing** in the routing panel to remove explicit overrides and resume generated priority-based routing; do not delete the whole controller configuration.
26
-
27
- ## Personal preferences
28
-
29
- Maintainers and users may place Grok, Codex, Claude, an API provider, or another registered provider first in their own Controller configuration. Those preferences belong under `controllerHome`; they are not open-source defaults and are not copied into the repository.
30
-
31
- Remote API calls remain double-gated: the provider must be enabled/configured in the GUI and `FORGE_ENABLE_LIVE_MODEL_PROVIDERS` must explicitly allow live calls. Without both, the API provider is proposal-only.
@@ -1,150 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
-
4
- usage() {
5
- cat <<'USAGE_EOF'
6
- Usage: scripts/harness-trace-grade.sh --run <trace.json> [--repo <repo>] [--strict]
7
- USAGE_EOF
8
- }
9
-
10
- run_file=""
11
- repo="."
12
- strict=0
13
-
14
- while [[ $# -gt 0 ]]; do
15
- case "$1" in
16
- --run)
17
- run_file="${2:-}"
18
- shift 2
19
- ;;
20
- --repo)
21
- repo="${2:-.}"
22
- shift 2
23
- ;;
24
- --strict)
25
- strict=1
26
- shift
27
- ;;
28
- --help|-h)
29
- usage
30
- exit 0
31
- ;;
32
- *)
33
- echo "Unknown argument: $1" >&2
34
- usage
35
- exit 1
36
- ;;
37
- esac
38
- done
39
-
40
- [[ -n "$run_file" ]] || { usage >&2; exit 1; }
41
- [[ -f "$run_file" ]] || { echo "Trace run file not found: $run_file" >&2; exit 1; }
42
- command -v jq >/dev/null 2>&1 || { echo "jq is required for harness trace grading" >&2; exit 1; }
43
-
44
- if REPO_ROOT="$(cd "$repo" && pwd -P 2>/dev/null)"; then
45
- :
46
- else
47
- echo "Repo path not found: $repo" >&2
48
- exit 1
49
- fi
50
-
51
- results_file="$(mktemp)"
52
- trap 'rm -f "$results_file"' EXIT
53
- : > "$results_file"
54
-
55
- record() {
56
- local id="$1"
57
- local passed="$2"
58
- local message="$3"
59
- jq -n \
60
- --arg id "$id" \
61
- --argjson passed "$passed" \
62
- --arg message "$message" \
63
- '{id: $id, passed: $passed, message: $message}' >> "$results_file"
64
- }
65
-
66
- trace_get() {
67
- local query="$1"
68
- jq -r "$query // empty" "$run_file"
69
- }
70
-
71
- schema="$(trace_get '.schema')"
72
- active_plan="$(trace_get '.active_plan')"
73
- task_profile="$(trace_get '.task_profile')"
74
- review_card_verdict="$(trace_get '.review.card.verdict')"
75
- review_card_change_type="$(trace_get '.review.card.change_type')"
76
- review_card_rollback="$(trace_get '.review.card.rollback')"
77
- commands_count="$(jq '.commands | if type == "array" then length else 0 end' "$run_file")"
78
- outside_count="$(jq '.allowed_paths_check.outside | if type == "array" then length else 0 end' "$run_file")"
79
- allowed_status="$(trace_get '.allowed_paths_check.status')"
80
-
81
- if [[ "$schema" == "forge-run-trace.v1" ]]; then
82
- record "schema.v1" true "trace schema is forge-run-trace.v1"
83
- else
84
- record "schema.v1" false "trace schema is ${schema:-missing}"
85
- fi
86
-
87
- if [[ -n "$active_plan" && -f "$REPO_ROOT/$active_plan" ]]; then
88
- record "active_plan.resolves" true "active plan resolves: $active_plan"
89
- else
90
- record "active_plan.resolves" false "active plan does not resolve: ${active_plan:-missing}"
91
- fi
92
-
93
- case "$task_profile" in
94
- code-change|docs-only|ledger-closeout|migration|eval-only|delegated-run)
95
- record "contract_profile.valid" true "contract profile is valid: $task_profile"
96
- ;;
97
- *)
98
- record "contract_profile.valid" false "contract profile is invalid: ${task_profile:-missing}"
99
- ;;
100
- esac
101
-
102
- if [[ "$review_card_verdict" == "pass" ]]; then
103
- record "review_card.pass" true "Human Review Card verdict is pass"
104
- else
105
- record "review_card.pass" false "Human Review Card verdict is ${review_card_verdict:-missing}"
106
- fi
107
-
108
- if [[ -n "$review_card_change_type" && "$review_card_change_type" == "$task_profile" ]]; then
109
- record "review_card.change_type" true "Human Review Card change type matches task profile"
110
- else
111
- record "review_card.change_type" false "Human Review Card change type ${review_card_change_type:-missing} does not match task profile ${task_profile:-missing}"
112
- fi
113
-
114
- rollback_token="$(printf '%s' "$review_card_rollback" | sed -E 's/[;,].*$//; s/[[:space:]].*$//; s/^[[:space:]]+//; s/[[:space:]]+$//' | tr '[:upper:]' '[:lower:]')"
115
- case "$rollback_token" in
116
- ""|tbd|todo|n/a|na|none|unknown|unavailable|pending|...)
117
- record "review_card.rollback" false "Human Review Card rollback is missing or not concrete"
118
- ;;
119
- *)
120
- record "review_card.rollback" true "Human Review Card rollback is concrete"
121
- ;;
122
- esac
123
-
124
- if [[ "$commands_count" -gt 0 ]] && jq -e '.commands[]? | select((.command // "") | length > 0)' "$run_file" >/dev/null; then
125
- record "commands.present" true "commands evidence is present"
126
- else
127
- record "commands.present" false "commands evidence is missing"
128
- fi
129
-
130
- if [[ "$outside_count" -eq 0 && "$allowed_status" == "pass" ]]; then
131
- record "allowed_paths.clean" true "no changed file is outside allowed paths"
132
- else
133
- record "allowed_paths.clean" false "allowed_paths status is ${allowed_status:-missing}; changed files outside allowed paths: $outside_count"
134
- fi
135
-
136
- failed="$(jq -s '[.[] | select(.passed == false)] | length' "$results_file")"
137
- total="$(jq -s 'length' "$results_file")"
138
- status="pass"
139
- [[ "$failed" -eq 0 ]] || status="fail"
140
-
141
- jq -s \
142
- --arg status "$status" \
143
- --arg run "$run_file" \
144
- --argjson total "$total" \
145
- --argjson failed "$failed" \
146
- '{status: $status, run: $run, total: $total, failed: $failed, graders: .}' "$results_file"
147
-
148
- if [[ "$strict" -eq 1 && "$failed" -ne 0 ]]; then
149
- exit 1
150
- fi