@moretea-labs/forge 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/CLAUDE.md +2 -0
  4. package/README.md +2 -2
  5. package/README.zh-CN.md +1 -1
  6. package/SKILL.md +2 -2
  7. package/THIRD_PARTY_NOTICES.md +1 -1
  8. package/agents/openai.yaml +1 -1
  9. package/assets/hooks/hook-input.sh +11 -8
  10. package/assets/hooks/lib/session-state.sh +10 -7
  11. package/assets/hooks/lib/workflow-state.sh +13 -177
  12. package/assets/hooks/post-tool-observer.sh +8 -2
  13. package/assets/hooks/prompt-guard.sh +5 -81
  14. package/assets/hooks/session-start-context.sh +56 -1
  15. package/assets/partials/05-workflow.partial.md +1 -1
  16. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  17. package/assets/plugin-registry.v1.json +1 -1
  18. package/assets/reference-configs/document-generation.md +1 -1
  19. package/assets/reference-configs/harness-overview.md +1 -1
  20. package/assets/reference-configs/sprint-contracts.md +3 -3
  21. package/assets/skill-version.json +2 -2
  22. package/assets/templates/contract.template.md +2 -7
  23. package/assets/templates/helpers/capture-plan.sh +2 -2
  24. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  25. package/assets/templates/helpers/contract-worktree.sh +1 -21
  26. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  27. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  28. package/assets/templates/helpers/new-plan.sh +1 -1
  29. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  30. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  31. package/assets/templates/helpers/verify-contract.sh +1 -111
  32. package/assets/templates/helpers/verify-sprint.sh +3 -180
  33. package/assets/templates/plan.template.md +1 -1
  34. package/assets/templates/review.template.md +9 -34
  35. package/assets/workflow-contract.v1.json +10 -19
  36. package/docs/README.md +10 -10
  37. package/docs/architecture/CURRENT.md +170 -0
  38. package/docs/architecture/EVOLUTION.md +42 -0
  39. package/docs/architecture/current/README.md +4 -156
  40. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  41. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  42. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  43. package/docs/architecture/history/README.md +7 -0
  44. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  45. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  46. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  47. package/docs/architecture/history.md +3 -34
  48. package/docs/architecture/index.md +15 -98
  49. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  50. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  51. package/docs/architecture/versions/1.6.md +38 -0
  52. package/docs/architecture/versions/1.7.md +41 -0
  53. package/docs/forge-chatgpt-browser-engine.md +2 -2
  54. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  55. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  56. package/docs/forge-github-issue-launcher.md +1 -1
  57. package/docs/forge-runtime-self-healing-loop.md +1 -1
  58. package/docs/operations/controller-browser-plugin.md +26 -6
  59. package/docs/operations/controller-performance-and-502.md +124 -0
  60. package/docs/operations/controller-reliability-runbook.md +1 -1
  61. package/docs/operations/features.md +2 -2
  62. package/docs/operations/github-repository.md +1 -1
  63. package/docs/operations/homebrew.md +2 -2
  64. package/docs/operations/mcp-tool-exposure.md +5 -3
  65. package/docs/wiki/Architecture.md +6 -6
  66. package/docs/wiki/Implementation.md +2 -2
  67. package/docs/wiki/Integrations.md +2 -2
  68. package/docs/wiki/Work-Lifecycle.md +1 -1
  69. package/package.json +29 -10
  70. package/scripts/activate-source-baseline.ts +17 -13
  71. package/scripts/benchmark-background-check-overlap.ts +228 -0
  72. package/scripts/benchmark-mcp-host.sh +117 -0
  73. package/scripts/benchmark-mcp-transport.ts +170 -0
  74. package/scripts/benchmark-quality-harness.ts +146 -0
  75. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  76. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  77. package/scripts/benchmark-typescript-navigation.ts +186 -0
  78. package/scripts/benchmark-work-efficiency.ts +334 -0
  79. package/scripts/capture-plan.sh +3 -3
  80. package/scripts/check-agent-tooling.sh +8 -35
  81. package/scripts/check-architecture-sync.sh +17 -86
  82. package/scripts/check-mcp-compatibility.ts +14 -0
  83. package/scripts/check-runtime-architecture.mjs +107 -64
  84. package/scripts/check-stable-baseline.ts +92 -0
  85. package/scripts/check-task-workflow.sh +4 -4
  86. package/scripts/contract-worktree.sh +1 -21
  87. package/scripts/ensure-task-workflow.sh +22 -55
  88. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  89. package/scripts/install-standalone-recovery.ts +24 -0
  90. package/scripts/lib/project-init-lib.sh +15 -44
  91. package/scripts/migrate-project-template.sh +23 -1179
  92. package/scripts/new-plan.sh +1 -1
  93. package/scripts/plan-to-todo.sh +11 -36
  94. package/scripts/run-governed-gate.ts +2 -1
  95. package/scripts/ship-worktrees.sh +2 -29
  96. package/scripts/smoke-ios-physical-device.ts +4 -2
  97. package/scripts/smoke-runtime-recovery.ts +1 -35
  98. package/scripts/smoke-schedule-engine.ts +1 -20
  99. package/scripts/verify-contract.sh +1 -111
  100. package/scripts/verify-forge-runtime.sh +0 -1
  101. package/scripts/verify-sprint.sh +3 -180
  102. package/scripts/workflow-contract.ts +1 -5
  103. package/src/cli/commands/init-hook.ts +3 -3
  104. package/src/cli/commands/mcp.ts +9 -5
  105. package/src/cli/commands/plugin.ts +1 -1
  106. package/src/cli/commands/recovery.ts +25 -3
  107. package/src/cli/commands/runtime.ts +55 -3
  108. package/src/cli/commands/security.ts +12 -1
  109. package/src/cli/commands/setup-profile.ts +31 -21
  110. package/src/cli/controller/check-runner.ts +106 -3
  111. package/src/cli/controller/composite-result.ts +1 -1
  112. package/src/cli/controller/context/focus.ts +51 -0
  113. package/src/cli/controller/context/instruction-context.ts +114 -0
  114. package/src/cli/controller/context/known-paths.ts +76 -0
  115. package/src/cli/controller/context/query-planning.ts +110 -0
  116. package/src/cli/controller/context/rule-resolution.ts +532 -0
  117. package/src/cli/controller/context/source-materializer.ts +278 -0
  118. package/src/cli/controller/context/structural.ts +16 -0
  119. package/src/cli/controller/context/types.ts +286 -0
  120. package/src/cli/controller/context-pack.ts +785 -469
  121. package/src/cli/controller/launch-agents.ts +77 -2
  122. package/src/cli/controller/operational-plan.ts +2 -2
  123. package/src/cli/controller/work-mode.ts +6 -4
  124. package/src/cli/editing/edit-session.ts +60 -7
  125. package/src/cli/github/github.ts +133 -0
  126. package/src/cli/installer/managed-entries.ts +15 -1
  127. package/src/cli/local-bridge/console-automations.ts +54 -78
  128. package/src/cli/local-bridge/console-view-models.ts +1 -35
  129. package/src/cli/local-bridge/facade-api.ts +0 -217
  130. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  131. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  132. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  133. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  134. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  135. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  136. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  137. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  138. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  139. package/src/cli/local-bridge/job-store.ts +1 -490
  140. package/src/cli/local-bridge/server.ts +0 -513
  141. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  142. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  143. package/src/cli/mcp/auth.ts +5 -5
  144. package/src/cli/mcp/instructions.ts +3 -2
  145. package/src/cli/mcp/legacy-tool-service.ts +0 -189
  146. package/src/cli/mcp/multi-repository.ts +16 -5
  147. package/src/cli/mcp/oauth.ts +175 -26
  148. package/src/cli/mcp/repository-tools.ts +247 -107
  149. package/src/cli/mcp/server.ts +537 -111
  150. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  151. package/src/cli/mcp/toolset-selection.ts +1 -1
  152. package/src/cli/mcp/toolset.ts +42 -5
  153. package/src/cli/mcp/transports/http.ts +101 -14
  154. package/src/cli/mcp/transports/session-registry.ts +43 -5
  155. package/src/cli/mcp/types.ts +3 -3
  156. package/src/cli/repositories/command-classifier.ts +101 -19
  157. package/src/cli/repositories/command-executor.ts +55 -521
  158. package/src/cli/repositories/command-process.ts +108 -0
  159. package/src/cli/repositories/command-scope.ts +99 -41
  160. package/src/cli/repositories/controller-home.ts +7 -8
  161. package/src/cli/repositories/git-command-executor.ts +2 -0
  162. package/src/cli/repositories/locks.ts +53 -16
  163. package/src/cli/repositories/repository-snapshot.ts +121 -0
  164. package/src/cli/repositories/selected-path-actions.ts +17 -9
  165. package/src/cli/repositories/structured-git.ts +61 -3
  166. package/src/cli/repository/inspector.ts +553 -63
  167. package/src/cli/repository/session-cache.ts +58 -17
  168. package/src/cli/v81-entry.ts +1 -4
  169. package/src/effects/fs-transaction.ts +85 -17
  170. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  171. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  172. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  173. package/src/runtime/context/lsp-client.ts +283 -0
  174. package/src/runtime/context/semantic-navigation.ts +275 -0
  175. package/src/runtime/context/swift-navigation.ts +565 -0
  176. package/src/runtime/context/typescript-navigation.ts +226 -0
  177. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  178. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +47 -8
  179. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  180. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  181. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  182. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  183. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  184. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  185. package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
  186. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +143 -8
  187. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  188. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +85 -8
  189. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  190. package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
  191. package/src/runtime/control-plane/facade/controller-session-store.ts +132 -1
  192. package/src/runtime/control-plane/facade/goal-workloop-access.ts +2 -0
  193. package/src/runtime/control-plane/facade/goal-workloop.ts +686 -129
  194. package/src/runtime/control-plane/facade/index.ts +1 -0
  195. package/src/runtime/control-plane/facade/plan-contract-store.ts +185 -20
  196. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  197. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  198. package/src/runtime/control-plane/facade/types.ts +22 -5
  199. package/src/runtime/control-plane/facade/work-contract-store.ts +175 -73
  200. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  201. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  202. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  203. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  204. package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
  205. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  206. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  207. package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
  208. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  209. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  210. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  211. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  212. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  213. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  214. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  215. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  216. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  217. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  218. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
  219. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +355 -116
  220. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
  221. package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
  222. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  223. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  224. package/src/runtime/control-plane/release-retention.ts +62 -2
  225. package/src/runtime/control-plane/routing/route-policy.ts +7 -16
  226. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  227. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  228. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  229. package/src/runtime/diagnostics/performance.ts +24 -1
  230. package/src/runtime/evidence/event-ledger.ts +1 -1
  231. package/src/runtime/execution/jobs/store.ts +58 -4
  232. package/src/runtime/execution/jobs/types.ts +1 -1
  233. package/src/runtime/execution/managed-workspace.ts +203 -1
  234. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  235. package/src/runtime/execution/process-runtime/check-result.ts +53 -0
  236. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  237. package/src/runtime/execution/process-runtime/command-facade.ts +345 -40
  238. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  239. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
  240. package/src/runtime/execution/process-runtime/persisted-check.ts +47 -4
  241. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  242. package/src/runtime/execution/process-runtime/runtime.ts +43 -3
  243. package/src/runtime/execution/process-runtime/store.ts +1 -0
  244. package/src/runtime/execution/process-runtime/types.ts +2 -0
  245. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  246. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  247. package/src/runtime/execution/workers/executor.ts +0 -48
  248. package/src/runtime/gateway/mcp/execution-tools.ts +1192 -114
  249. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  250. package/src/runtime/gateway/mcp/router.ts +184 -82
  251. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
  252. package/src/runtime/gateway/mcp/runtime-tools.ts +2224 -1589
  253. package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
  254. package/src/runtime/plugins/browser-adapter.ts +2901 -241
  255. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  256. package/src/runtime/plugins/browser-handoff.ts +92 -2
  257. package/src/runtime/plugins/browser-macos-bridge.ts +582 -49
  258. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  259. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  260. package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
  261. package/src/runtime/plugins/browser-runtime.ts +183 -0
  262. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  263. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  264. package/src/runtime/plugins/desktop-operator-registration.ts +8 -2
  265. package/src/runtime/plugins/external-adapter.ts +324 -3
  266. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  267. package/src/runtime/plugins/first-party-registry.ts +2 -0
  268. package/src/runtime/plugins/github-adapter.ts +125 -0
  269. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  270. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  271. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  272. package/src/runtime/plugins/ios-adapter.ts +106 -16
  273. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  274. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  275. package/src/runtime/plugins/lightweight-action.ts +153 -0
  276. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  277. package/src/runtime/plugins/macos-capability-broker.ts +55 -9
  278. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  279. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  280. package/src/runtime/plugins/resend-adapter.ts +1 -1
  281. package/src/runtime/plugins/store.ts +269 -29
  282. package/src/runtime/plugins/types.ts +35 -2
  283. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  284. package/src/runtime/projections/git-status-sampler.ts +16 -16
  285. package/src/runtime/projections/materialized-view.ts +28 -10
  286. package/src/runtime/recovery/maintenance-executor.ts +393 -28
  287. package/src/runtime/root/mcp-transport.ts +180 -10
  288. package/src/runtime/root/package-connector-service.ts +186 -8
  289. package/src/runtime/root/package-runtime-release.ts +143 -17
  290. package/src/runtime/root/package-runtime-service.ts +430 -22
  291. package/src/runtime/root/release-manifest.ts +7 -2
  292. package/src/runtime/root/release-materialize.ts +19 -0
  293. package/src/runtime/root/release-store.ts +48 -11
  294. package/src/runtime/root/runtime.ts +23 -5
  295. package/src/runtime/root/service.ts +100 -29
  296. package/src/runtime/root/types.ts +2 -0
  297. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  298. package/src/runtime/shared/trusted-executable.ts +62 -0
  299. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  300. package/src/runtime/standalone-recovery/core.ts +700 -92
  301. package/src/runtime/standalone-recovery/entry.ts +99 -23
  302. package/src/runtime/standalone-recovery/installer.ts +19 -3
  303. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  304. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  305. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  306. package/src/runtime/workflow/schedules/engine.ts +287 -151
  307. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  308. package/src/runtime/workflow/schedules/settlement.ts +48 -4
  309. package/src/runtime/workflow/schedules/store.ts +131 -10
  310. package/src/runtime/workflow/schedules/types.ts +2 -4
  311. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  312. package/src/testing/test-governance.ts +8 -40
  313. package/assets/reference-configs/heartbeat-triage.md +0 -57
  314. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  315. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  316. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  317. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  318. package/docs/architecture/current/architecture-invariants.md +0 -331
  319. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  320. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  321. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  322. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  323. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  324. package/docs/architecture/current/entity-model.md +0 -612
  325. package/docs/architecture/current/external-plugin-governance.md +0 -396
  326. package/docs/architecture/current/failure-recovery.md +0 -447
  327. package/docs/architecture/current/governance.md +0 -213
  328. package/docs/architecture/current/human-interaction-plane.md +0 -87
  329. package/docs/architecture/current/implementation-status.md +0 -128
  330. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  331. package/docs/architecture/current/legacy-governance.md +0 -58
  332. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  333. package/docs/architecture/current/migration-roadmap.md +0 -105
  334. package/docs/architecture/current/multi-repository-execution.md +0 -371
  335. package/docs/architecture/current/operations-runbook.md +0 -45
  336. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  337. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  338. package/docs/architecture/current/repository-access-modes.md +0 -102
  339. package/docs/architecture/current/route-policy.md +0 -15
  340. package/docs/architecture/current/route-session-concurrency.md +0 -85
  341. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  342. package/docs/architecture/current/runtime-directory-map.md +0 -49
  343. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  344. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  345. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  346. package/docs/architecture/current/system-overview.md +0 -169
  347. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  348. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  349. package/docs/architecture/current/thin-harness-v1.md +0 -321
  350. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  351. package/docs/forge-autonomous-goal-loop.md +0 -9
  352. package/docs/forge-provider-configuration.md +0 -7
  353. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  354. package/docs/operations/gmail-assistant-routines.md +0 -186
  355. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  356. package/docs/operations/provider-configuration.md +0 -31
  357. package/scripts/harness-trace-grade.sh +0 -150
  358. package/scripts/heartbeat-triage.sh +0 -361
  359. package/scripts/maintenance-triage.sh +0 -167
  360. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  361. package/src/cli/repositories/goal-registry.ts +0 -239
  362. package/src/runtime/assistant/action-proposals.ts +0 -279
  363. package/src/runtime/assistant/intent.ts +0 -395
  364. package/src/runtime/assistant/model-provider.ts +0 -460
  365. package/src/runtime/assistant/openapi.ts +0 -223
  366. package/src/runtime/assistant/policy.ts +0 -89
  367. package/src/runtime/assistant/readiness.ts +0 -258
  368. package/src/runtime/assistant/routine-runtime.ts +0 -477
  369. package/src/runtime/assistant/schedule-binding.ts +0 -171
  370. package/src/runtime/assistant/standing-grants.ts +0 -375
  371. package/src/runtime/assistant/store.ts +0 -243
  372. package/src/runtime/assistant/types.ts +0 -135
  373. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  374. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  375. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  376. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  377. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  378. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  379. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  380. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  381. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  382. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  383. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  384. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  385. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  386. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  387. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  388. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  389. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  390. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  391. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  392. package/src/runtime/workflow/findings/store.ts +0 -204
  393. package/src/runtime/workflow/findings/types.ts +0 -58
  394. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  395. package/src/runtime/workflow/portfolio/store.ts +0 -185
  396. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -1,748 +0,0 @@
1
- export type AssistantSource =
2
- | "gmail"
3
- | "calendar"
4
- | "github"
5
- | "slack"
6
- | "notion"
7
- | "browser"
8
- | "repository"
9
- | "system"
10
- | "unknown";
11
-
12
- export type AssistantItemKind =
13
- | "email"
14
- | "calendar_event"
15
- | "issue"
16
- | "pull_request"
17
- | "message"
18
- | "web_page"
19
- | "notification"
20
- | "repository_event"
21
- | "unknown";
22
-
23
- export type TriageCategory =
24
- | "security"
25
- | "billing"
26
- | "quota"
27
- | "devops"
28
- | "calendar"
29
- | "job"
30
- | "newsletter"
31
- | "marketing"
32
- | "personal"
33
- | "repository"
34
- | "unknown";
35
-
36
- export type TriagePriority = "P0" | "P1" | "P2" | "P3";
37
-
38
- export type AssistantActionRisk =
39
- | "readonly"
40
- | "workspace_write"
41
- | "remote_write"
42
- | "destructive";
43
-
44
- export type AssistantActionType =
45
- | "open_url"
46
- | "mark_read"
47
- | "archive"
48
- | "label"
49
- | "draft_reply"
50
- | "create_task"
51
- | "create_calendar_event"
52
- | "verify_account_activity"
53
- | "inspect_billing_or_quota"
54
- | "inspect_devops_configuration"
55
- | "summarize"
56
- | "ignore";
57
-
58
- export interface AssistantAttachmentRef {
59
- id?: string;
60
- name?: string;
61
- mime_type?: string;
62
- size_bytes?: number;
63
- }
64
-
65
- export interface AssistantItem {
66
- source: AssistantSource;
67
- source_id: string;
68
- kind: AssistantItemKind;
69
- title: string;
70
- body?: string;
71
- actor?: string;
72
- timestamp?: string;
73
- labels?: string[];
74
- urls?: string[];
75
- attachments?: AssistantAttachmentRef[];
76
- metadata?: Record<string, unknown>;
77
- }
78
-
79
- export interface TriageEvidenceRef {
80
- source_id: string;
81
- field: "title" | "body" | "actor" | "label" | "url" | "metadata" | "rule";
82
- excerpt: string;
83
- }
84
-
85
- export interface ActionProposal {
86
- id: string;
87
- type: AssistantActionType;
88
- target_source_id: string;
89
- summary: string;
90
- risk: AssistantActionRisk;
91
- requires_confirmation: boolean;
92
- arguments?: Record<string, unknown>;
93
- }
94
-
95
- export interface TriageDecision {
96
- source_id: string;
97
- category: TriageCategory;
98
- priority: TriagePriority;
99
- confidence: number;
100
- reason: string;
101
- evidence: TriageEvidenceRef[];
102
- suggested_actions: ActionProposal[];
103
- matched_rule_ids: string[];
104
- requires_user_input: boolean;
105
- }
106
-
107
- export interface TriageRuleMatch {
108
- sources?: AssistantSource[];
109
- kinds?: AssistantItemKind[];
110
- actor_includes?: string[];
111
- title_includes?: string[];
112
- body_includes?: string[];
113
- label_includes?: string[];
114
- url_host_includes?: string[];
115
- metadata_equals?: Record<string, string | number | boolean>;
116
- }
117
-
118
- export interface TriageRuleDecision {
119
- category?: TriageCategory;
120
- priority?: TriagePriority;
121
- confidence?: number;
122
- reason?: string;
123
- requires_user_input?: boolean;
124
- suggested_actions?: Omit<ActionProposal, "id" | "target_source_id">[];
125
- }
126
-
127
- export interface TriageRule {
128
- id: string;
129
- enabled?: boolean;
130
- order?: number;
131
- match: TriageRuleMatch;
132
- decision: TriageRuleDecision;
133
- }
134
-
135
- export interface TriageRuntimeOptions {
136
- rules?: TriageRule[];
137
- default_priority?: TriagePriority;
138
- low_value_action_mode?: "ignore" | "archive_candidate";
139
- }
140
-
141
- interface HeuristicSignal {
142
- category: TriageCategory;
143
- priority: TriagePriority;
144
- confidence: number;
145
- reason: string;
146
- evidence: TriageEvidenceRef[];
147
- actionTypes: AssistantActionType[];
148
- requiresUserInput: boolean;
149
- }
150
-
151
- const SECURITY_TERMS = [
152
- "new device",
153
- "logged into",
154
- "login",
155
- "password",
156
- "mfa",
157
- "multi-factor",
158
- "2fa",
159
- "permission",
160
- "permissions",
161
- "authorized",
162
- "re-authorized",
163
- "third-party",
164
- "security alert",
165
- "suspicious",
166
- ];
167
-
168
- const BILLING_TERMS = [
169
- "storage",
170
- "quota",
171
- "usage",
172
- "minutes",
173
- "billing",
174
- "invoice",
175
- "budget",
176
- "credits",
177
- "balance",
178
- "额度",
179
- "余额",
180
- "即将用尽",
181
- "用尽",
182
- "充值",
183
- ];
184
-
185
- const DEVOPS_TERMS = [
186
- "misconfigured",
187
- "configuration",
188
- "domain",
189
- "dns",
190
- "deploy",
191
- "deployment",
192
- "build failed",
193
- "pipeline",
194
- "actions minutes",
195
- "workflow",
196
- "certificate",
197
- ];
198
-
199
- const CALENDAR_TERMS = ["lesson", "meeting", "calendar", "event", "appointment", "class", "课程", "会议"];
200
- const JOB_TERMS = ["job", "hiring", "engineer", "recruiter", "interview", "career", "招聘", "面试"];
201
- const MARKETING_TERMS = ["premium", "survey", "webinar", "newsletter", "promo", "promotion", "discount", "优惠"];
202
- const REPOSITORY_TERMS = [
203
- "dependabot",
204
- "vulnerability",
205
- "vulnerabilities",
206
- "critical severity",
207
- "high severity",
208
- "security advisory",
209
- "security updates",
210
- "cve-",
211
- "npm audit",
212
- "dependency",
213
- "dependencies",
214
- ];
215
-
216
- export function normalizeAssistantItem(input: AssistantItem): AssistantItem {
217
- if (!input.source_id || !input.source_id.trim()) {
218
- throw new Error("AssistantItem.source_id is required");
219
- }
220
- if (!input.title || !input.title.trim()) {
221
- throw new Error(`AssistantItem.title is required for ${input.source}:${input.source_id}`);
222
- }
223
-
224
- return {
225
- source: input.source ?? "unknown",
226
- source_id: input.source_id.trim(),
227
- kind: input.kind ?? "unknown",
228
- title: input.title.trim(),
229
- body: normalizeOptionalText(input.body),
230
- actor: normalizeOptionalText(input.actor),
231
- timestamp: normalizeOptionalText(input.timestamp),
232
- labels: dedupeStrings(input.labels),
233
- urls: dedupeStrings(input.urls),
234
- attachments: input.attachments ?? [],
235
- metadata: input.metadata ?? {},
236
- };
237
- }
238
-
239
- export function triageItems(items: AssistantItem[], options: TriageRuntimeOptions = {}): TriageDecision[] {
240
- const normalized = items.map(normalizeAssistantItem);
241
- const rules = [...(options.rules ?? [])]
242
- .filter((rule) => rule.enabled !== false)
243
- .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
244
-
245
- return normalized.map((item) => triageItem(item, rules, options));
246
- }
247
-
248
- export function triageItem(
249
- item: AssistantItem,
250
- rules: TriageRule[] = [],
251
- options: TriageRuntimeOptions = {},
252
- ): TriageDecision {
253
- const normalized = normalizeAssistantItem(item);
254
- const matchedRules = rules.filter((rule) => ruleMatches(normalized, rule.match));
255
- const heuristic = classifyByHeuristics(normalized, options);
256
-
257
- const decision = matchedRules.reduce<TriageDecision>(
258
- (current, rule) => mergeRuleDecision(current, normalized, rule),
259
- signalToDecision(normalized, heuristic),
260
- );
261
-
262
- return {
263
- ...decision,
264
- confidence: clampConfidence(decision.confidence),
265
- evidence: compactEvidence(decision.evidence),
266
- suggested_actions: dedupeActions(decision.suggested_actions),
267
- matched_rule_ids: matchedRules.map((rule) => rule.id),
268
- };
269
- }
270
-
271
- export function ruleMatches(item: AssistantItem, match: TriageRuleMatch): boolean {
272
- if (match.sources?.length && !match.sources.includes(item.source)) return false;
273
- if (match.kinds?.length && !match.kinds.includes(item.kind)) return false;
274
- if (match.actor_includes?.length && !containsAny(item.actor, match.actor_includes)) return false;
275
- if (match.title_includes?.length && !containsAny(item.title, match.title_includes)) return false;
276
- if (match.body_includes?.length && !containsAny(item.body, match.body_includes)) return false;
277
- if (match.label_includes?.length && !arrayContainsAny(item.labels, match.label_includes)) return false;
278
- if (match.url_host_includes?.length && !urlHostsContainAny(item.urls, match.url_host_includes)) return false;
279
-
280
- if (match.metadata_equals) {
281
- for (const [key, expected] of Object.entries(match.metadata_equals)) {
282
- if (item.metadata?.[key] !== expected) return false;
283
- }
284
- }
285
-
286
- return true;
287
- }
288
-
289
- export function defaultTriageRules(): TriageRule[] {
290
- return [
291
- {
292
- id: "github-third-party-permissions",
293
- order: 10,
294
- match: {
295
- sources: ["gmail"],
296
- actor_includes: ["github"],
297
- title_includes: ["third-party", "permissions"],
298
- },
299
- decision: {
300
- category: "security",
301
- priority: "P0",
302
- confidence: 0.96,
303
- reason: "GitHub third-party application permission changes require explicit account-owner review.",
304
- requires_user_input: true,
305
- suggested_actions: [
306
- {
307
- type: "verify_account_activity",
308
- summary: "Open GitHub authorized applications and verify the permission change.",
309
- risk: "readonly",
310
- requires_confirmation: false,
311
- },
312
- ],
313
- },
314
- },
315
- {
316
- id: "new-device-login-alert",
317
- order: 20,
318
- match: {
319
- title_includes: ["new device", "logged into"],
320
- },
321
- decision: {
322
- category: "security",
323
- priority: "P0",
324
- confidence: 0.95,
325
- reason: "New-device login alerts are high-priority until the user confirms the login was expected.",
326
- requires_user_input: true,
327
- suggested_actions: [
328
- {
329
- type: "verify_account_activity",
330
- summary: "Review recent account activity and confirm the login was expected.",
331
- risk: "readonly",
332
- requires_confirmation: false,
333
- },
334
- ],
335
- },
336
- },
337
- {
338
- id: "quota-or-storage-warning",
339
- order: 30,
340
- match: {
341
- title_includes: ["storage", "quota", "usage", "额度", "用尽"],
342
- },
343
- decision: {
344
- category: "quota",
345
- priority: "P1",
346
- confidence: 0.9,
347
- reason: "Quota and storage warnings can block future automated workflows.",
348
- requires_user_input: false,
349
- suggested_actions: [
350
- {
351
- type: "inspect_billing_or_quota",
352
- summary: "Inspect the current usage or balance before it blocks workflows.",
353
- risk: "readonly",
354
- requires_confirmation: false,
355
- },
356
- ],
357
- },
358
- },
359
- {
360
- id: "domain-configuration-warning",
361
- order: 40,
362
- match: {
363
- title_includes: ["domain", "configuration", "misconfigured"],
364
- body_includes: ["domain"],
365
- },
366
- decision: {
367
- category: "devops",
368
- priority: "P1",
369
- confidence: 0.91,
370
- reason: "Domain configuration warnings can indicate broken production or preview routing.",
371
- requires_user_input: false,
372
- suggested_actions: [
373
- {
374
- type: "inspect_devops_configuration",
375
- summary: "Inspect the referenced domain or deployment configuration.",
376
- risk: "readonly",
377
- requires_confirmation: false,
378
- },
379
- ],
380
- },
381
- },
382
- {
383
- id: "low-value-marketing",
384
- order: 90,
385
- match: {
386
- title_includes: ["premium", "survey", "webinar", "newsletter"],
387
- },
388
- decision: {
389
- category: "marketing",
390
- priority: "P3",
391
- confidence: 0.78,
392
- reason: "Marketing and newsletter content is low priority unless the user has a saved interest rule.",
393
- requires_user_input: false,
394
- suggested_actions: [
395
- {
396
- type: "ignore",
397
- summary: "Keep out of the main action list.",
398
- risk: "readonly",
399
- requires_confirmation: false,
400
- },
401
- ],
402
- },
403
- },
404
- ];
405
- }
406
-
407
- function classifyByHeuristics(item: AssistantItem, options: TriageRuntimeOptions): HeuristicSignal {
408
- const corpus = [item.title, item.body, item.actor, ...(item.labels ?? []), ...(item.urls ?? [])]
409
- .filter(Boolean)
410
- .join("\n");
411
-
412
- const securityEvidence = evidenceForTerms(item, SECURITY_TERMS);
413
- if (securityEvidence.length > 0) {
414
- return {
415
- category: "security",
416
- priority: "P0",
417
- confidence: 0.88,
418
- reason: "The item contains account-security or authorization signals.",
419
- evidence: securityEvidence,
420
- actionTypes: ["verify_account_activity", "open_url"],
421
- requiresUserInput: true,
422
- };
423
- }
424
-
425
- const billingEvidence = evidenceForTerms(item, BILLING_TERMS);
426
- if (billingEvidence.length > 0) {
427
- return {
428
- category: corpus.toLowerCase().includes("quota") || corpus.includes("额度") ? "quota" : "billing",
429
- priority: "P1",
430
- confidence: 0.82,
431
- reason: "The item contains quota, balance, storage, billing, or usage signals.",
432
- evidence: billingEvidence,
433
- actionTypes: ["inspect_billing_or_quota", "open_url"],
434
- requiresUserInput: false,
435
- };
436
- }
437
-
438
- const devopsEvidence = evidenceForTerms(item, DEVOPS_TERMS);
439
- if (devopsEvidence.length > 0) {
440
- return {
441
- category: "devops",
442
- priority: "P1",
443
- confidence: 0.8,
444
- reason: "The item contains deployment, domain, workflow, or configuration signals.",
445
- evidence: devopsEvidence,
446
- actionTypes: ["inspect_devops_configuration", "open_url"],
447
- requiresUserInput: false,
448
- };
449
- }
450
-
451
- const repositoryEvidence = evidenceForTerms(item, REPOSITORY_TERMS);
452
- if (repositoryEvidence.length > 0) {
453
- return {
454
- category: "repository",
455
- priority: "P1",
456
- confidence: 0.84,
457
- reason: "The item contains repository security, Dependabot, dependency, or vulnerability signals.",
458
- evidence: repositoryEvidence,
459
- actionTypes: ["create_task", "open_url"],
460
- requiresUserInput: false,
461
- };
462
- }
463
-
464
- const calendarEvidence = evidenceForTerms(item, CALENDAR_TERMS);
465
- if (calendarEvidence.length > 0 || item.kind === "calendar_event") {
466
- return {
467
- category: "calendar",
468
- priority: "P2",
469
- confidence: item.kind === "calendar_event" ? 0.86 : 0.72,
470
- reason: "The item appears to be a scheduled event or reminder.",
471
- evidence: calendarEvidence.length ? calendarEvidence : fallbackEvidence(item, "metadata", item.kind),
472
- actionTypes: ["create_task", "summarize"],
473
- requiresUserInput: false,
474
- };
475
- }
476
-
477
- const jobEvidence = evidenceForTerms(item, JOB_TERMS);
478
- if (jobEvidence.length > 0) {
479
- return {
480
- category: "job",
481
- priority: "P2",
482
- confidence: 0.7,
483
- reason: "The item appears to be a recruiting, job, or interview signal.",
484
- evidence: jobEvidence,
485
- actionTypes: ["summarize"],
486
- requiresUserInput: false,
487
- };
488
- }
489
-
490
- const marketingEvidence = evidenceForTerms(item, MARKETING_TERMS);
491
- if (marketingEvidence.length > 0) {
492
- const actionType: AssistantActionType =
493
- options.low_value_action_mode === "archive_candidate" ? "archive" : "ignore";
494
- return {
495
- category: "marketing",
496
- priority: "P3",
497
- confidence: 0.68,
498
- reason: "The item appears to be marketing, newsletter, or survey content.",
499
- evidence: marketingEvidence,
500
- actionTypes: [actionType],
501
- requiresUserInput: false,
502
- };
503
- }
504
-
505
- if (item.source === "github" || item.kind === "issue" || item.kind === "pull_request") {
506
- return {
507
- category: "repository",
508
- priority: options.default_priority ?? "P2",
509
- confidence: 0.65,
510
- reason: "The item comes from a repository source and should enter the engineering triage lane.",
511
- evidence: fallbackEvidence(item, "metadata", item.source),
512
- actionTypes: ["create_task", "open_url"],
513
- requiresUserInput: false,
514
- };
515
- }
516
-
517
- return {
518
- category: "unknown",
519
- priority: options.default_priority ?? "P3",
520
- confidence: 0.45,
521
- reason: "No strong triage signal was found; keep it out of high-priority action lists.",
522
- evidence: fallbackEvidence(item, "title", item.title),
523
- actionTypes: ["summarize"],
524
- requiresUserInput: false,
525
- };
526
- }
527
-
528
- function signalToDecision(item: AssistantItem, signal: HeuristicSignal): TriageDecision {
529
- return {
530
- source_id: item.source_id,
531
- category: signal.category,
532
- priority: signal.priority,
533
- confidence: signal.confidence,
534
- reason: signal.reason,
535
- evidence: signal.evidence,
536
- suggested_actions: signal.actionTypes.map((type, index) => actionForType(item, type, index)),
537
- matched_rule_ids: [],
538
- requires_user_input: signal.requiresUserInput,
539
- };
540
- }
541
-
542
- function mergeRuleDecision(decision: TriageDecision, item: AssistantItem, rule: TriageRule): TriageDecision {
543
- const patch = rule.decision;
544
- const ruleEvidence: TriageEvidenceRef = {
545
- source_id: item.source_id,
546
- field: "rule",
547
- excerpt: `Matched triage rule: ${rule.id}`,
548
- };
549
-
550
- const actions = (patch.suggested_actions ?? []).map((action, index) => ({
551
- ...action,
552
- id: actionId(item.source_id, action.type, index + decision.suggested_actions.length),
553
- target_source_id: item.source_id,
554
- }));
555
-
556
- return {
557
- ...decision,
558
- category: patch.category ?? decision.category,
559
- priority: patch.priority ?? decision.priority,
560
- confidence: Math.max(decision.confidence, patch.confidence ?? decision.confidence),
561
- reason: patch.reason ?? decision.reason,
562
- requires_user_input: patch.requires_user_input ?? decision.requires_user_input,
563
- evidence: [...decision.evidence, ruleEvidence],
564
- suggested_actions: actions.length ? [...decision.suggested_actions, ...actions] : decision.suggested_actions,
565
- };
566
- }
567
-
568
- function actionForType(item: AssistantItem, type: AssistantActionType, index: number): ActionProposal {
569
- const risk: AssistantActionRisk = actionRisk(type);
570
- return {
571
- id: actionId(item.source_id, type, index),
572
- type,
573
- target_source_id: item.source_id,
574
- summary: summaryForAction(type, item),
575
- risk,
576
- requires_confirmation: risk !== "readonly",
577
- arguments: defaultArgumentsForAction(type, item),
578
- };
579
- }
580
-
581
- function actionRisk(type: AssistantActionType): AssistantActionRisk {
582
- switch (type) {
583
- case "mark_read":
584
- case "archive":
585
- case "label":
586
- case "draft_reply":
587
- case "create_task":
588
- case "create_calendar_event":
589
- return "remote_write";
590
- case "open_url":
591
- case "verify_account_activity":
592
- case "inspect_billing_or_quota":
593
- case "inspect_devops_configuration":
594
- case "summarize":
595
- case "ignore":
596
- default:
597
- return "readonly";
598
- }
599
- }
600
-
601
- function summaryForAction(type: AssistantActionType, item: AssistantItem): string {
602
- switch (type) {
603
- case "open_url":
604
- return "Open the referenced URL for read-only inspection.";
605
- case "verify_account_activity":
606
- return "Verify whether the account activity was expected.";
607
- case "inspect_billing_or_quota":
608
- return "Inspect usage, quota, balance, or billing state.";
609
- case "inspect_devops_configuration":
610
- return "Inspect the referenced deployment, domain, or configuration state.";
611
- case "archive":
612
- return "Archive this low-priority item after user authorization.";
613
- case "mark_read":
614
- return "Mark this item as read after user authorization.";
615
- case "label":
616
- return "Apply a triage label after user authorization.";
617
- case "draft_reply":
618
- return "Draft a reply without sending it.";
619
- case "create_task":
620
- return "Create a follow-up task from this item.";
621
- case "create_calendar_event":
622
- return "Create or update a calendar event from this item.";
623
- case "ignore":
624
- return "Do not include this item in the main action list.";
625
- case "summarize":
626
- default:
627
- return `Summarize ${item.title}.`;
628
- }
629
- }
630
-
631
- function defaultArgumentsForAction(type: AssistantActionType, item: AssistantItem): Record<string, unknown> | undefined {
632
- if (type === "open_url" && item.urls?.length) {
633
- return { url: item.urls[0] };
634
- }
635
- if (type === "label") {
636
- return { label: "assistant-triaged" };
637
- }
638
- if (type === "create_task") {
639
- return { title: item.title, source: item.source, source_id: item.source_id };
640
- }
641
- return undefined;
642
- }
643
-
644
- function evidenceForTerms(item: AssistantItem, terms: string[]): TriageEvidenceRef[] {
645
- const fields: Array<[TriageEvidenceRef["field"], string | undefined]> = [
646
- ["title", item.title],
647
- ["body", item.body],
648
- ["actor", item.actor],
649
- ["label", item.labels?.join(" ")],
650
- ["url", item.urls?.join(" ")],
651
- ];
652
-
653
- const evidence: TriageEvidenceRef[] = [];
654
- for (const [field, value] of fields) {
655
- if (!value) continue;
656
- const matched = terms.find((term) => includesNormalized(value, term));
657
- if (matched) {
658
- evidence.push({ source_id: item.source_id, field, excerpt: excerptAround(value, matched) });
659
- }
660
- }
661
- return evidence.slice(0, 4);
662
- }
663
-
664
- function fallbackEvidence(item: AssistantItem, field: TriageEvidenceRef["field"], value: string): TriageEvidenceRef[] {
665
- return [{ source_id: item.source_id, field, excerpt: value.slice(0, 160) }];
666
- }
667
-
668
- function containsAny(value: string | undefined, needles: string[]): boolean {
669
- return Boolean(value && needles.some((needle) => includesNormalized(value, needle)));
670
- }
671
-
672
- function arrayContainsAny(values: string[] | undefined, needles: string[]): boolean {
673
- if (!values?.length) return false;
674
- return needles.some((needle) => values.some((value) => includesNormalized(value, needle)));
675
- }
676
-
677
- function urlHostsContainAny(urls: string[] | undefined, needles: string[]): boolean {
678
- if (!urls?.length) return false;
679
- return urls.some((url) => {
680
- const host = safeHost(url);
681
- return needles.some((needle) => includesNormalized(host, needle));
682
- });
683
- }
684
-
685
- function safeHost(url: string): string {
686
- try {
687
- return new URL(url).host;
688
- } catch {
689
- return url;
690
- }
691
- }
692
-
693
- function includesNormalized(value: string, needle: string): boolean {
694
- return value.toLowerCase().includes(needle.toLowerCase());
695
- }
696
-
697
- function excerptAround(value: string, needle: string): string {
698
- const lower = value.toLowerCase();
699
- const index = lower.indexOf(needle.toLowerCase());
700
- if (index < 0) return value.slice(0, 160);
701
- const start = Math.max(0, index - 48);
702
- const end = Math.min(value.length, index + needle.length + 96);
703
- return value.slice(start, end).replace(/\s+/g, " ").trim();
704
- }
705
-
706
- function compactEvidence(evidence: TriageEvidenceRef[]): TriageEvidenceRef[] {
707
- const seen = new Set<string>();
708
- const compact: TriageEvidenceRef[] = [];
709
- for (const item of evidence) {
710
- const key = `${item.field}:${item.excerpt}`;
711
- if (seen.has(key)) continue;
712
- seen.add(key);
713
- compact.push(item);
714
- }
715
- return compact.slice(0, 8);
716
- }
717
-
718
- function dedupeActions(actions: ActionProposal[]): ActionProposal[] {
719
- const seen = new Set<string>();
720
- const result: ActionProposal[] = [];
721
- for (const action of actions) {
722
- const key = `${action.type}:${action.target_source_id}:${action.summary}`;
723
- if (seen.has(key)) continue;
724
- seen.add(key);
725
- result.push(action);
726
- }
727
- return result;
728
- }
729
-
730
- function actionId(sourceId: string, type: AssistantActionType, index: number): string {
731
- const safeSource = sourceId.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 48);
732
- return `${safeSource}_${type}_${index + 1}`;
733
- }
734
-
735
- function dedupeStrings(values: string[] | undefined): string[] {
736
- if (!values?.length) return [];
737
- return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
738
- }
739
-
740
- function normalizeOptionalText(value: string | undefined): string | undefined {
741
- const normalized = value?.trim();
742
- return normalized ? normalized : undefined;
743
- }
744
-
745
- function clampConfidence(confidence: number): number {
746
- if (Number.isNaN(confidence)) return 0.5;
747
- return Math.max(0, Math.min(1, Number(confidence.toFixed(3))));
748
- }