@moretea-labs/forge 1.8.0 → 1.8.1

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 (528) hide show
  1. package/AGENTS.md +70 -7
  2. package/CHANGELOG.md +14 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/THIRD_PARTY_NOTICES.md +1 -1
  6. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  7. package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
  8. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  9. package/adapters/chatgpt/controller-round-host.ts +15 -25
  10. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  11. package/adapters/chatgpt/provider-delivery.ts +228 -1
  12. package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
  13. package/adapters/computer/chatgpt-extension-target.ts +463 -0
  14. package/adapters/computer/chatgpt-target-router.ts +103 -0
  15. package/adapters/computer/chrome-extension/background.js +385 -0
  16. package/adapters/computer/chrome-extension/content.js +378 -0
  17. package/adapters/computer/chrome-extension/core.js +24 -0
  18. package/adapters/computer/chrome-extension/manifest.json +30 -0
  19. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  20. package/adapters/computer/interaction-target-authority.ts +142 -18
  21. package/adapters/mcp/auth.ts +0 -1
  22. package/adapters/mcp/instructions.ts +5 -4
  23. package/adapters/mcp/multi-repository.ts +3 -19
  24. package/adapters/mcp/oauth.ts +73 -0
  25. package/adapters/mcp/paths.ts +4 -1
  26. package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
  27. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  28. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  29. package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
  30. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
  31. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  32. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  33. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  34. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  35. package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
  36. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  37. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
  38. package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
  39. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  40. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  41. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  42. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  43. package/adapters/mcp/runtime-gateway/router.ts +18 -504
  44. package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
  45. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
  46. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  47. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
  48. package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
  49. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
  50. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  51. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
  52. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
  53. package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
  54. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  55. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  56. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
  57. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  58. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  59. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  60. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  61. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  62. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
  63. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  64. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
  65. package/adapters/mcp/server.ts +67 -23
  66. package/adapters/mcp/setup.ts +1 -3
  67. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
  68. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
  69. package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
  70. package/adapters/mcp/toolset-names.ts +5 -0
  71. package/adapters/mcp/toolset.ts +6 -5
  72. package/adapters/mcp/transports/http-observation.ts +365 -0
  73. package/adapters/mcp/transports/http.ts +154 -677
  74. package/adapters/mcp/transports/oauth-http.ts +322 -0
  75. package/adapters/mcp/transports/session-registry.ts +6 -0
  76. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  77. package/assets/plugin-registry.v1.json +6 -4
  78. package/assets/reference-configs/agentic-development-flow.md +25 -0
  79. package/assets/reference-configs/global-working-rules.md +19 -0
  80. package/assets/skill-version.json +2 -2
  81. package/docs/architecture/CURRENT.md +111 -41
  82. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  83. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  84. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  85. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  86. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  87. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  88. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
  89. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  90. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
  91. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
  92. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  93. package/docs/architecture/domains/verification.md +1 -0
  94. package/docs/architecture/domains/workflow-engine.md +6 -0
  95. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  96. package/docs/forge-plugin-management.md +2 -2
  97. package/docs/operations/controller-performance-and-502.md +17 -0
  98. package/docs/operations/controller-reliability-runbook.md +2 -2
  99. package/docs/operations/features.md +1 -1
  100. package/docs/operations/features.zh-CN.md +1 -1
  101. package/docs/operations/homebrew.md +2 -2
  102. package/docs/operations/mcp-tool-exposure.md +2 -0
  103. package/docs/operations/releasing.md +2 -0
  104. package/docs/operations/standalone-disaster-recovery.md +14 -6
  105. package/docs/wiki/Implementation.md +1 -1
  106. package/package.json +25 -14
  107. package/packages/kernel/cognition/api/index.ts +6 -0
  108. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  109. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  110. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  111. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  112. package/packages/kernel/cognition/domain/learning.ts +106 -0
  113. package/packages/kernel/cognition/domain/memory.ts +254 -0
  114. package/packages/kernel/controller/api/index.ts +1 -0
  115. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  116. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  117. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  118. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  119. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  120. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  121. package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
  122. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  123. package/packages/kernel/identity/api/index.ts +10 -0
  124. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  125. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  126. package/packages/kernel/identity/domain/grant.ts +72 -0
  127. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  128. package/packages/kernel/identity/domain/user-request.ts +93 -0
  129. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
  130. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  131. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  132. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  133. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  134. package/packages/kernel/scheduler/api/index.ts +0 -2
  135. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  136. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  137. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  138. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
  139. package/packages/kernel/work/api/index.ts +3 -2
  140. package/packages/kernel/work/application/work-service.ts +17 -42
  141. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  142. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  143. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  144. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  145. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  146. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  147. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  148. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  149. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  150. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  151. package/packages/kernel/work/domain/state-machine.ts +25 -63
  152. package/packages/kernel/work/domain/types.ts +57 -51
  153. package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
  154. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  155. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  156. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  157. package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
  158. package/packages/plugin-runtime/computer/index.ts +2 -0
  159. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  160. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  161. package/packages/protocols/computer/contract.ts +27 -1
  162. package/scripts/activate-source-baseline.ts +7 -9
  163. package/scripts/canary-controller-semantic-wait.ts +12 -24
  164. package/scripts/check-mcp-compatibility.ts +48 -136
  165. package/scripts/check-runtime-architecture.mjs +622 -217
  166. package/scripts/forge-local-recovery-helper.mjs +93 -15
  167. package/scripts/lib/project-init-lib.sh +3 -0
  168. package/scripts/open-source-audit-allowlist.txt +1 -2
  169. package/scripts/run-bounded-command.mjs +5 -0
  170. package/scripts/run-governed-gate.ts +0 -1
  171. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  172. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  173. package/scripts/smoke-mcp-http-runtime.ts +5 -0
  174. package/scripts/smoke-runtime-recovery.ts +12 -43
  175. package/scripts/smoke-schedule-engine.ts +23 -15
  176. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  177. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  178. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
  179. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  180. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  181. package/scripts/smoke-workflow-supervisor.ts +103 -0
  182. package/scripts/verify-forge-runtime.sh +2 -1
  183. package/src/cli/agent-jobs/executor-health.ts +11 -34
  184. package/src/cli/agent-jobs/integration.ts +18 -49
  185. package/src/cli/agent-jobs/job-manager.ts +7 -3
  186. package/src/cli/commands/brain-assistant.ts +27 -13
  187. package/src/cli/commands/brain.ts +13 -15
  188. package/src/cli/commands/chatgpt.ts +1 -163
  189. package/src/cli/commands/recovery.ts +135 -121
  190. package/src/cli/commands/runtime.ts +3 -3
  191. package/src/cli/commands/setup-profile.ts +8 -0
  192. package/src/cli/controller/check-runner.ts +13 -2
  193. package/src/cli/controller/completion-backlog.ts +3 -3
  194. package/src/cli/controller/completion-orchestrator.ts +4 -43
  195. package/src/cli/controller/completion-target.ts +3 -72
  196. package/src/cli/controller/context/source-materializer.ts +81 -100
  197. package/src/cli/controller/context-pack.ts +10 -8
  198. package/src/cli/controller/execution-completion.ts +4 -7
  199. package/src/cli/controller/execution-policy.ts +36 -153
  200. package/src/cli/controller/governance.ts +2 -3
  201. package/src/cli/controller/issue-store.ts +4 -99
  202. package/src/cli/controller/launch-agents.ts +59 -18
  203. package/src/cli/controller/operational-plan.ts +24 -51
  204. package/src/cli/controller/runtime-config.ts +5 -1
  205. package/src/cli/controller/stuck-state-migration.ts +2 -3
  206. package/src/cli/controller/systemd-user.ts +39 -1
  207. package/src/cli/editing/edit-session.ts +1 -7
  208. package/src/cli/local-bridge/console-automations.ts +18 -13
  209. package/src/cli/local-bridge/console-view-models.ts +3 -12
  210. package/src/cli/local-bridge/facade-api.ts +64 -191
  211. package/src/cli/local-bridge/server.ts +24 -147
  212. package/src/cli/local-bridge/types.ts +0 -1
  213. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  214. package/src/cli/repositories/command-executor.ts +29 -23
  215. package/src/cli/repositories/command-scope.ts +35 -16
  216. package/src/cli/repositories/controller-home.ts +48 -0
  217. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  218. package/src/cli/repositories/git-command-executor.ts +2 -2
  219. package/src/cli/repositories/registry.ts +77 -11
  220. package/src/cli/repositories/structured-git.ts +62 -2
  221. package/src/cli/repository/session-cache.ts +92 -6
  222. package/src/runtime/context/assistant-context.ts +20 -7
  223. package/src/runtime/context/assistant-work-context.ts +89 -27
  224. package/src/runtime/context/automatic-learning.ts +565 -0
  225. package/src/runtime/context/cognitive-attention.ts +173 -0
  226. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  227. package/src/runtime/context/context-closure.ts +46 -9
  228. package/src/runtime/context/context-pack-process.ts +103 -0
  229. package/src/runtime/context/context-plane.ts +1 -9
  230. package/src/runtime/context/direct-controller-learning.ts +298 -0
  231. package/src/runtime/context/semantic-navigation-contract.ts +9 -0
  232. package/src/runtime/context/semantic-navigation.ts +6 -34
  233. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  234. package/src/runtime/context/typescript-navigation.ts +89 -3
  235. package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
  236. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  237. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  238. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  239. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  240. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  241. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  242. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  243. package/src/runtime/control-plane/execution/validation.ts +6 -8
  244. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  245. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  246. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  247. package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
  248. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  249. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  250. package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
  251. package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
  252. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  253. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  254. package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
  255. package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
  256. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  257. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  258. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
  259. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
  260. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  261. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
  262. package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
  263. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  264. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  265. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  266. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  267. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  268. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  269. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  270. package/src/runtime/control-plane/facade/index.ts +0 -1
  271. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  272. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  273. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  274. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  275. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  276. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  277. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  278. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  279. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  280. package/src/runtime/control-plane/facade/types.ts +49 -108
  281. package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
  282. package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
  283. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  284. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  285. package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
  286. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
  287. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  288. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  289. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  290. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  291. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  292. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
  293. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  294. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  295. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  296. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  297. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  298. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  299. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  300. package/src/runtime/control-plane/release-retention.ts +135 -47
  301. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  302. package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
  303. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  304. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  305. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  306. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  307. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  308. package/src/runtime/evidence/artifact-store.ts +158 -40
  309. package/src/runtime/evidence/evidence-store.ts +112 -8
  310. package/src/runtime/evidence/output-handle-index.ts +225 -0
  311. package/src/runtime/evidence/result-store.ts +158 -44
  312. package/src/runtime/execution/jobs/store.ts +3 -4
  313. package/src/runtime/execution/managed-workspace.ts +57 -0
  314. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  315. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  316. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  317. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  318. package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
  319. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  320. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  321. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  322. package/src/runtime/execution/process-runtime/index.ts +3 -0
  323. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  324. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  325. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  326. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  327. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  328. package/src/runtime/execution/process-runtime/runtime.ts +35 -2
  329. package/src/runtime/execution/process-runtime/store.ts +30 -2
  330. package/src/runtime/execution/process-runtime/types.ts +6 -1
  331. package/src/runtime/execution/workers/executor.ts +2 -6
  332. package/src/runtime/platform/service-inventory.ts +130 -0
  333. package/src/runtime/platform/service-manager.ts +8 -0
  334. package/src/runtime/plugins/action-application.ts +85 -28
  335. package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
  336. package/src/runtime/plugins/browser-adapter.ts +757 -34
  337. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  338. package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
  339. package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
  340. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  341. package/src/runtime/plugins/browser-registration.ts +16 -0
  342. package/src/runtime/plugins/browser-runtime.ts +14 -1
  343. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  344. package/src/runtime/plugins/browser-session-store.ts +46 -76
  345. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  346. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
  347. package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
  348. package/src/runtime/plugins/computer-registration.ts +222 -11
  349. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  350. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  351. package/src/runtime/plugins/external-adapter.ts +42 -6
  352. package/src/runtime/plugins/external-registration.ts +21 -1
  353. package/src/runtime/plugins/gmail-adapter.ts +23 -2
  354. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  355. package/src/runtime/plugins/google-shared.ts +14 -7
  356. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  357. package/src/runtime/plugins/ios-adapter.ts +1 -1
  358. package/src/runtime/plugins/lightweight-action.ts +208 -2
  359. package/src/runtime/plugins/local-system-adapter.ts +12 -2
  360. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  361. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  362. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  363. package/src/runtime/plugins/store.ts +602 -428
  364. package/src/runtime/plugins/types.ts +20 -0
  365. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  366. package/src/runtime/projections/invalidation.ts +7 -3
  367. package/src/runtime/projections/materialized-view.ts +80 -36
  368. package/src/runtime/recovery/actions.ts +3 -3
  369. package/src/runtime/recovery/capability-action-application.ts +46 -45
  370. package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
  371. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  372. package/src/runtime/recovery/store.ts +29 -11
  373. package/src/runtime/release/release-coordinator.ts +296 -0
  374. package/src/runtime/release/release-session.ts +716 -0
  375. package/src/runtime/release/release-state-migration.ts +25 -0
  376. package/src/runtime/resources/leases/store.ts +56 -25
  377. package/src/runtime/root/computer-composition.ts +191 -6
  378. package/src/runtime/root/controller-progression-composition.ts +192 -0
  379. package/src/runtime/root/controller-round-composition.ts +20 -1
  380. package/src/runtime/root/deployment-topology.ts +106 -0
  381. package/src/runtime/root/entry.ts +4 -3
  382. package/src/runtime/root/known-good-recovery.ts +184 -0
  383. package/src/runtime/root/local-bridge.ts +0 -1
  384. package/src/runtime/root/mcp-transport.ts +111 -18
  385. package/src/runtime/root/ownership.ts +261 -9
  386. package/src/runtime/root/package-connector-service.ts +105 -19
  387. package/src/runtime/root/package-runtime-release.ts +117 -18
  388. package/src/runtime/root/package-runtime-service.ts +17 -11
  389. package/src/runtime/root/release-execution-canary.ts +44 -12
  390. package/src/runtime/root/release-loader.ts +90 -8
  391. package/src/runtime/root/release-manifest.ts +80 -6
  392. package/src/runtime/root/release-materialize.ts +372 -28
  393. package/src/runtime/root/release-store.ts +395 -36
  394. package/src/runtime/root/runtime-lane.ts +191 -0
  395. package/src/runtime/root/runtime.ts +159 -27
  396. package/src/runtime/root/scheduled-controller-composition.ts +28 -3
  397. package/src/runtime/root/service-runner.ts +2 -2
  398. package/src/runtime/root/service.ts +36 -33
  399. package/src/runtime/root/status.ts +48 -0
  400. package/src/runtime/root/types.ts +32 -3
  401. package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
  402. package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
  403. package/src/runtime/root/write-fence.ts +50 -2
  404. package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
  405. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  406. package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
  407. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  408. package/src/runtime/shared/process-environment.ts +20 -9
  409. package/src/runtime/shared/response-budget.ts +1 -3
  410. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  411. package/src/runtime/standalone-recovery/core.ts +3702 -342
  412. package/src/runtime/standalone-recovery/entry.ts +469 -39
  413. package/src/runtime/standalone-recovery/installer.ts +262 -148
  414. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  415. package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
  416. package/src/runtime/standalone-recovery/performance.ts +54 -16
  417. package/src/runtime/standalone-recovery/release.ts +53 -5
  418. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  419. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  420. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  421. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
  422. package/src/runtime/workflow/schedules/engine.ts +138 -172
  423. package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
  424. package/src/runtime/workflows/runtime.ts +15 -19
  425. package/src/testing/test-governance.ts +5 -1
  426. package/supervisor/chatgpt-conversation.ts +23 -0
  427. package/supervisor/client.ts +201 -0
  428. package/supervisor/control-plane.ts +868 -0
  429. package/supervisor/entry.ts +15 -0
  430. package/supervisor/forge-validators.ts +80 -0
  431. package/supervisor/index.ts +5 -0
  432. package/supervisor/native-browser-adapter.ts +786 -0
  433. package/supervisor/native-messaging/host.ts +39 -0
  434. package/supervisor/native-messaging/manifest.ts +26 -0
  435. package/supervisor/native-messaging/protocol.ts +27 -0
  436. package/supervisor/paths.ts +18 -0
  437. package/supervisor/protocol.ts +202 -0
  438. package/supervisor/server.ts +404 -0
  439. package/supervisor/store.ts +1451 -0
  440. package/supervisor/tsconfig.json +8 -0
  441. package/supervisor/types.ts +255 -0
  442. package/adapters/chatgpt/controller-host.ts +0 -119
  443. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  444. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  445. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  446. package/packages/kernel/progression/api/index.ts +0 -2
  447. package/packages/kernel/progression/application/projector.ts +0 -211
  448. package/packages/kernel/progression/domain/types.ts +0 -116
  449. package/packages/kernel/progression/index.ts +0 -1
  450. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  451. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  452. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  453. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  454. package/scripts/benchmark-background-check-overlap.ts +0 -228
  455. package/scripts/benchmark-computer-hotpath.ts +0 -255
  456. package/scripts/benchmark-controller-hotpath.ts +0 -212
  457. package/scripts/benchmark-controller-round2.ts +0 -191
  458. package/scripts/benchmark-ios-agent-device.ts +0 -511
  459. package/scripts/benchmark-mcp-host.sh +0 -117
  460. package/scripts/benchmark-mcp-transport.ts +0 -169
  461. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  462. package/scripts/benchmark-operational-shadow.ts +0 -28
  463. package/scripts/benchmark-quality-harness.ts +0 -146
  464. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  465. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  466. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  467. package/scripts/benchmark-thin-harness.ts +0 -251
  468. package/scripts/benchmark-typescript-navigation.ts +0 -186
  469. package/scripts/benchmark-work-efficiency.ts +0 -334
  470. package/scripts/build-controller-ui.ts +0 -28
  471. package/scripts/check-npm-release.sh +0 -32
  472. package/scripts/check-public-release-surface.sh +0 -19
  473. package/scripts/check-release-published.sh +0 -57
  474. package/scripts/check-release-readiness.sh +0 -37
  475. package/scripts/check-release-version.mjs +0 -74
  476. package/scripts/check-tarball-install-smoke.sh +0 -150
  477. package/scripts/package-source-archive.sh +0 -147
  478. package/scripts/public-release-files.txt +0 -39
  479. package/scripts/public-release.ts +0 -174
  480. package/scripts/publish-release-tarball.sh +0 -27
  481. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  482. package/scripts/stage-runtime-release.ts +0 -44
  483. package/src/cli/controller/progress.ts +0 -656
  484. package/src/cli/controller/work-mode.ts +0 -181
  485. package/src/cli/local-bridge/console-assets.ts +0 -17
  486. package/src/cli/local-bridge/dashboard.ts +0 -17
  487. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  488. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  489. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  490. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  491. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  492. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  493. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  494. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  495. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  496. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  497. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  498. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  499. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  500. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  501. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  502. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  503. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  504. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  505. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  506. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  507. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  508. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  509. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  510. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  511. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  512. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  513. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  514. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  515. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  516. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  517. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  518. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  519. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  520. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  521. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  522. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  523. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  524. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  525. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  526. package/src/runtime/control-plane/routing/index.ts +0 -1
  527. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  528. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
@@ -1,8 +1,4 @@
1
- import { realpathSync, statSync } from 'fs';
2
1
  import { spawnSync } from 'child_process';
3
- import { join } from 'path';
4
- import { resolveRepoPreferredControllerHome, resolveControllerHome } from '../repositories/controller-home';
5
- import { listRepositories } from '../repositories/registry';
6
2
 
7
3
  function gitText(repoRoot: string, args: string[]): string {
8
4
  const result = spawnSync('git', args, { cwd: repoRoot, encoding: 'utf-8' });
@@ -10,75 +6,10 @@ function gitText(repoRoot: string, args: string[]): string {
10
6
  return typeof result.stdout === 'string' ? result.stdout.trim() : '';
11
7
  }
12
8
 
13
- function canonical(path: string): string {
14
- try { return realpathSync(path); }
15
- catch (_error) { return path; }
16
- }
17
-
18
- interface TargetBranchCacheEntry {
19
- branch: string;
20
- registryMtimeMs: number;
21
- expiresAt: number;
22
- }
23
-
24
- /**
25
- * Short-lived cache: invalidated by registry mtime or 30s TTL.
26
- *
27
- * Policy (do not rewrite without explicit design change):
28
- * - registry mtime 变化时立即失效;
29
- * - 未检测到 mtime 变化时,defaultBranch 变更最多存在 30 秒可见延迟。
30
- * - Cache keys include controllerHome + canonical repo root (no cross-repo bleed).
31
- * - Registry unavailable → Git fallback (origin/HEAD, main/master, current branch).
32
- */
33
- const targetBranchCache = new Map<string, TargetBranchCacheEntry>();
34
- const TARGET_BRANCH_TTL_MS = 30_000;
35
-
36
- function registryMtimeMs(controllerHome: string): number {
37
- try {
38
- return statSync(join(resolveControllerHome(controllerHome), 'repositories.json')).mtimeMs;
39
- } catch {
40
- return 0;
41
- }
42
- }
43
-
44
- export function clearCompletionTargetCache(): void {
45
- targetBranchCache.clear();
46
- }
47
-
48
9
  export function resolveCompletionTargetBranch(repoRoot: string): string {
49
- const root = canonical(repoRoot);
50
- try {
51
- const home = resolveRepoPreferredControllerHome(repoRoot);
52
- const mtime = registryMtimeMs(home);
53
- const cacheKey = `${home}\0${root}`;
54
- const cached = targetBranchCache.get(cacheKey);
55
- const now = Date.now();
56
- if (cached && cached.registryMtimeMs === mtime && cached.expiresAt > now) {
57
- return cached.branch;
58
- }
59
- const registered = listRepositories(home, { includeRemoved: true }).find((record) => {
60
- if (canonical(record.canonicalRoot) === root || canonical(record.localRoot) === root) return true;
61
- return record.checkouts.some((checkout) => canonical(checkout.canonicalRoot) === root || canonical(checkout.localRoot) === root);
62
- });
63
- if (registered?.defaultBranch?.trim()) {
64
- const branch = registered.defaultBranch.trim();
65
- targetBranchCache.set(cacheKey, {
66
- branch,
67
- registryMtimeMs: mtime,
68
- expiresAt: now + TARGET_BRANCH_TTL_MS,
69
- });
70
- return branch;
71
- }
72
- } catch (_error) {
73
- // Temporary test repositories and unregistered clones fall through to Git discovery.
74
- }
75
-
76
- const remoteHead = gitText(repoRoot, ['symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD']);
77
- if (remoteHead.startsWith('origin/')) return remoteHead.slice('origin/'.length);
78
- for (const candidate of ['main', 'master']) {
79
- if (gitText(repoRoot, ['show-ref', '--verify', '--hash', `refs/heads/${candidate}`])) return candidate;
80
- }
81
- return gitText(repoRoot, ['branch', '--show-current']) || 'main';
10
+ const branch = gitText(repoRoot, ['branch', '--show-current']);
11
+ if (!branch) throw new Error('integration target must be an attached branch');
12
+ return branch;
82
13
  }
83
14
 
84
15
  export function currentCompletionTarget(repoRoot: string): {
@@ -1,5 +1,5 @@
1
- import ts from 'typescript';
2
1
  import type { McpPolicy } from '../../mcp/types';
2
+ import { extractTypeScriptSourceSymbolsInSidecar } from '../../../runtime/context/typescript-navigation-process';
3
3
  import { redactMcpText } from '../../mcp/redaction';
4
4
  import { readRepositoryRange, type RepositoryReadSession } from '../../repository/inspector';
5
5
 
@@ -46,16 +46,8 @@ interface SymbolRange {
46
46
  enclosing?: string;
47
47
  }
48
48
 
49
- interface IndexedDeclaration {
50
- node: ts.Node;
51
- kind: string;
52
- fullStart: number;
53
- end: number;
54
- }
55
-
56
49
  interface SourceSymbolIndex {
57
- sourceFile: ts.SourceFile;
58
- declarations: IndexedDeclaration[];
50
+ declarations: SymbolRange[];
59
51
  }
60
52
 
61
53
  const SOURCE_SYMBOL_INDEX_CACHE_MAX_ENTRIES = 32;
@@ -77,11 +69,6 @@ export function clearSourceSymbolIndexCacheForTest(): void {
77
69
  sourceSymbolIndexCacheMisses = 0;
78
70
  }
79
71
 
80
- function boundedContent(content: string, maxChars: number): { content: string; truncated: boolean } {
81
- if (content.length <= maxChars) return { content, truncated: false };
82
- return { content: `${content.slice(0, maxChars)}\n... <snippet truncated>`, truncated: true };
83
- }
84
-
85
72
  function plainSource(numbered: string): string {
86
73
  return numbered
87
74
  .split(/\r?\n/)
@@ -107,70 +94,13 @@ function mergeHitLines(lines: number[]): number[] {
107
94
  return merged;
108
95
  }
109
96
 
110
- function scriptKind(path: string): ts.ScriptKind | undefined {
111
- if (/\.tsx$/i.test(path)) return ts.ScriptKind.TSX;
112
- if (/\.jsx$/i.test(path)) return ts.ScriptKind.JSX;
113
- if (/\.(?:mts|cts|ts)$/i.test(path)) return ts.ScriptKind.TS;
114
- if (/\.(?:mjs|cjs|js)$/i.test(path)) return ts.ScriptKind.JS;
115
- return undefined;
116
- }
117
-
118
- function declarationName(node: ts.Node): string | undefined {
119
- const named = node as ts.Node & { name?: ts.Node };
120
- if (!named.name) return undefined;
121
- return named.name.getText().slice(0, 200);
122
- }
123
-
124
- function declarationKind(node: ts.Node): string | undefined {
125
- if (ts.isFunctionDeclaration(node)) return 'function';
126
- if (ts.isMethodDeclaration(node)) return 'method';
127
- if (ts.isConstructorDeclaration(node)) return 'constructor';
128
- if (ts.isGetAccessorDeclaration(node)) return 'getter';
129
- if (ts.isSetAccessorDeclaration(node)) return 'setter';
130
- if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) return 'class';
131
- if (ts.isInterfaceDeclaration(node)) return 'interface';
132
- if (ts.isTypeAliasDeclaration(node)) return 'type';
133
- if (ts.isEnumDeclaration(node)) return 'enum';
134
- if (ts.isModuleDeclaration(node)) return 'module';
135
- if (ts.isVariableStatement(node) && node.declarationList.declarations.some((declaration) =>
136
- declaration.initializer && (ts.isArrowFunction(declaration.initializer) || ts.isFunctionExpression(declaration.initializer)))) return 'function-variable';
137
- return undefined;
138
- }
139
-
140
- function enclosingName(node: ts.Node): string | undefined {
141
- let current = node.parent;
142
- while (current) {
143
- if (ts.isClassDeclaration(current) || ts.isClassExpression(current) || ts.isInterfaceDeclaration(current) || ts.isModuleDeclaration(current)) {
144
- const kind = declarationKind(current) ?? 'container';
145
- const name = declarationName(current);
146
- return name ? `${kind}:${name}` : kind;
147
- }
148
- current = current.parent;
149
- }
150
- return undefined;
151
- }
152
-
153
- function buildSourceSymbolIndex(path: string, source: string, kind: ts.ScriptKind): SourceSymbolIndex {
154
- const sourceFile = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, kind);
155
- const declarations: IndexedDeclaration[] = [];
156
- const visit = (node: ts.Node): void => {
157
- const candidateKind = declarationKind(node);
158
- if (candidateKind) {
159
- declarations.push({
160
- node,
161
- kind: candidateKind,
162
- fullStart: node.getFullStart(),
163
- end: node.end,
164
- });
165
- }
166
- ts.forEachChild(node, visit);
167
- };
168
- visit(sourceFile);
169
- return { sourceFile, declarations };
97
+ function sourceSyntaxKind(path: string): string | undefined {
98
+ const match = path.toLowerCase().match(/\.(tsx|jsx|mts|cts|ts|mjs|cjs|js)$/);
99
+ return match?.[1];
170
100
  }
171
101
 
172
102
  function cachedSourceSymbolIndex(path: string, fileSha: string, numberedSource: string): SourceSymbolIndex | undefined {
173
- const kind = scriptKind(path);
103
+ const kind = sourceSyntaxKind(path);
174
104
  if (kind === undefined) return undefined;
175
105
  const key = `${kind}:${fileSha}`;
176
106
  const cached = sourceSymbolIndexCache.get(key);
@@ -182,7 +112,9 @@ function cachedSourceSymbolIndex(path: string, fileSha: string, numberedSource:
182
112
  }
183
113
 
184
114
  sourceSymbolIndexCacheMisses += 1;
185
- const built = buildSourceSymbolIndex(path, plainSource(numberedSource), kind);
115
+ const built: SourceSymbolIndex = {
116
+ declarations: extractTypeScriptSourceSymbolsInSidecar(path, plainSource(numberedSource)),
117
+ };
186
118
  sourceSymbolIndexCache.set(key, built);
187
119
  while (sourceSymbolIndexCache.size > SOURCE_SYMBOL_INDEX_CACHE_MAX_ENTRIES) {
188
120
  const oldest = sourceSymbolIndexCache.keys().next().value as string | undefined;
@@ -194,22 +126,13 @@ function cachedSourceSymbolIndex(path: string, fileSha: string, numberedSource:
194
126
 
195
127
  function symbolAtLine(index: SourceSymbolIndex | undefined, line: number): SymbolRange | undefined {
196
128
  if (!index) return undefined;
197
- const { sourceFile, declarations } = index;
198
- const targetLine = Math.min(Math.max(1, line), sourceFile.getLineAndCharacterOfPosition(sourceFile.end).line + 1);
199
- const position = sourceFile.getPositionOfLineAndCharacter(targetLine - 1, 0);
200
- let selected: IndexedDeclaration | undefined;
201
- for (const candidate of declarations) {
202
- if (candidate.fullStart > position || candidate.end < position) continue;
203
- if (!selected || (candidate.end - candidate.fullStart) < (selected.end - selected.fullStart)) selected = candidate;
129
+ const targetLine = Math.max(1, line);
130
+ let selected: SymbolRange | undefined;
131
+ for (const candidate of index.declarations) {
132
+ if (candidate.startLine > targetLine || candidate.endLine < targetLine) continue;
133
+ if (!selected || (candidate.endLine - candidate.startLine) < (selected.endLine - selected.startLine)) selected = candidate;
204
134
  }
205
- if (!selected) return undefined;
206
- return {
207
- startLine: sourceFile.getLineAndCharacterOfPosition(selected.node.getStart(sourceFile)).line + 1,
208
- endLine: sourceFile.getLineAndCharacterOfPosition(selected.node.end).line + 1,
209
- kind: selected.kind,
210
- name: declarationName(selected.node),
211
- enclosing: enclosingName(selected.node),
212
- };
135
+ return selected;
213
136
  }
214
137
 
215
138
  function materializedSnippet(
@@ -219,18 +142,42 @@ function materializedSnippet(
219
142
  materialization: SourceMaterializationKind,
220
143
  symbol?: SymbolRange,
221
144
  ): MaterializedSourceSnippet {
222
- const numbered = sliceNumbered(full.content, range.startLine, range.endLine);
223
- const redacted = redactMcpText(numbered);
224
- const bounded = boundedContent(redacted.text, options.maxCharsPerSnippet);
145
+ let low = range.startLine;
146
+ let high = range.endLine;
147
+ let exactEndLine = range.startLine - 1;
148
+ let exactContent = '';
149
+ let exactRedactions: Array<{ type: string; count: number }> = [];
150
+ while (low <= high) {
151
+ const candidateEndLine = Math.floor((low + high) / 2);
152
+ const redacted = redactMcpText(sliceNumbered(full.content, range.startLine, candidateEndLine));
153
+ if (redacted.text.length <= options.maxCharsPerSnippet) {
154
+ exactEndLine = candidateEndLine;
155
+ exactContent = redacted.text;
156
+ exactRedactions = redacted.redactions;
157
+ low = candidateEndLine + 1;
158
+ } else {
159
+ high = candidateEndLine - 1;
160
+ }
161
+ }
162
+ // Source evidence is line-addressed. Never character-cut content while still
163
+ // reporting the original endLine. A single unusually long line stays intact
164
+ // so the reported source range remains truthful; outer response budgets remain
165
+ // the hard transport fence.
166
+ if (exactEndLine < range.startLine) {
167
+ const redacted = redactMcpText(sliceNumbered(full.content, range.startLine, range.startLine));
168
+ exactEndLine = range.startLine;
169
+ exactContent = redacted.text;
170
+ exactRedactions = redacted.redactions;
171
+ }
225
172
  return {
226
173
  path: full.path,
227
174
  startLine: range.startLine,
228
- endLine: range.endLine,
175
+ endLine: exactEndLine,
229
176
  totalLines: full.totalLines,
230
177
  sha256: full.sha256,
231
- content: bounded.content,
232
- truncated: bounded.truncated,
233
- redactions: redacted.redactions,
178
+ content: exactContent,
179
+ truncated: exactEndLine < range.endLine,
180
+ redactions: exactRedactions,
234
181
  reason: options.reasons.join(', '),
235
182
  cacheHit: full.cacheHit,
236
183
  materialization,
@@ -238,6 +185,33 @@ function materializedSnippet(
238
185
  };
239
186
  }
240
187
 
188
+ function materializedRange(
189
+ full: ReturnType<typeof readRepositoryRange>,
190
+ range: { startLine: number; endLine: number },
191
+ options: MaterializeSourceOptions,
192
+ materialization: SourceMaterializationKind,
193
+ maxSnippets: number,
194
+ symbol?: SymbolRange,
195
+ ): MaterializedSourceSnippet[] {
196
+ const snippets: MaterializedSourceSnippet[] = [];
197
+ let startLine = range.startLine;
198
+ while (startLine <= range.endLine && snippets.length < maxSnippets) {
199
+ const snippet = materializedSnippet(
200
+ full,
201
+ { startLine, endLine: range.endLine },
202
+ options,
203
+ materialization,
204
+ symbol,
205
+ );
206
+ snippets.push({ ...snippet, truncated: false });
207
+ startLine = snippet.endLine + 1;
208
+ }
209
+ if (startLine <= range.endLine && snippets.length > 0) {
210
+ snippets[snippets.length - 1] = { ...snippets[snippets.length - 1]!, truncated: true };
211
+ }
212
+ return snippets;
213
+ }
214
+
241
215
  /**
242
216
  * Materialize current source in semantic units. Complete small files and
243
217
  * complete TypeScript/JavaScript declarations win; a fixed line window is the
@@ -272,7 +246,14 @@ export function materializeSource(options: MaterializeSourceOptions): Materializ
272
246
  const key = `${range.startLine}:${range.endLine}`;
273
247
  if (seen.has(key)) continue;
274
248
  seen.add(key);
275
- snippets.push(materializedSnippet(full, range, options, symbol ? 'symbol' : 'line_window', symbol));
249
+ snippets.push(...materializedRange(
250
+ full,
251
+ range,
252
+ options,
253
+ symbol ? 'symbol' : 'line_window',
254
+ options.maxSnippets - snippets.length,
255
+ symbol,
256
+ ));
276
257
  }
277
258
  return snippets;
278
259
  }
@@ -381,7 +381,7 @@ export function buildControllerContextPack(
381
381
  // though inventory itself was cached.
382
382
  const lexicalStartedAt = performance.now();
383
383
  const requiredStructuralFallbackNeedsLexical = structuralMode === "required" && !structuralContext.requiredSatisfied;
384
- if (searchQueries.length > 0 && (requiredStructuralFallbackNeedsLexical || candidates.size < maxFiles * 3)) {
384
+ if (searchQueries.length > 0 && (requiredSearchQueries.length > 0 || requiredStructuralFallbackNeedsLexical || candidates.size < maxFiles * 3)) {
385
385
  const search = searchRepositoryMany(repoRoot, policy, {
386
386
  queries: searchQueries,
387
387
  files: scopedExactKnownFileSearch ? exactKnownFiles : undefined,
@@ -451,8 +451,7 @@ export function buildControllerContextPack(
451
451
  // implementation mode a permanent evidence-closure blind spot.
452
452
  const multiWaveEligible = retrievalMode !== "implementation"
453
453
  || structuralMode !== "off"
454
- || impactDomains.length > 0
455
- || explicitKnownPaths.length > 1;
454
+ || impactDomains.length > 0;
456
455
  timingsMs.expansionBudgetMax = multiWaveEligible ? Math.min(6, Math.max(2, Math.ceil(maxFiles / 2))) : 0;
457
456
  const rankedExactKnownCount = rankedCandidates.filter(isExactKnownCandidate).length;
458
457
  const initialCandidateLimit = multiWaveEligible
@@ -812,16 +811,19 @@ export function buildControllerContextPack(
812
811
  .map((file) => file.path);
813
812
  const materializedExactKnownSet = new Set(materializedExactKnownPaths);
814
813
  const omittedCandidateCount = rankedCandidates.filter((entry) => !inspectedSet.has(entry.path)).length;
815
- const exactKnownFilesFullyMaterialized = scopedExactKnownFileSearch
814
+ const exactKnownFilesLosslesslyMaterialized = scopedExactKnownFileSearch
816
815
  && exactKnownFiles.length > 0
817
816
  && exactKnownFiles.every((path) => files.some((file) => file.path === path
818
- && file.snippets.some((snippet) => snippet.materialization === "complete_file" && !snippet.truncated)));
817
+ && file.snippets.length > 0
818
+ && file.snippets.every((snippet) => !snippet.truncated)));
819
819
  // `search.truncated` records that lexical hit collection reached a result cap.
820
820
  // That is not automatically an evidence gap. For an exact-known implementation
821
- // scope, if every requested file is fully materialized and there are no omitted
822
- // or denied candidates, the cap only discarded redundant hit lines.
821
+ // scope, bounded symbol/window materialization is still authoritative raw-source
822
+ // evidence as long as every requested file was materialized without snippet loss
823
+ // and no candidate was omitted or denied. Actual raw snippet truncation remains a
824
+ // separate readiness failure through `rawSnippetTruncated`.
823
825
  const evidenceSearchTruncated = searchTruncated
824
- && !(exactKnownFilesFullyMaterialized
826
+ && !(exactKnownFilesLosslesslyMaterialized
825
827
  && omittedCandidateCount === 0
826
828
  && policyDeniedFiles === 0
827
829
  && deniedPaths.length === 0
@@ -3,7 +3,7 @@ import { existsSync, readFileSync } from 'fs';
3
3
  import { join } from 'path';
4
4
  import type { AgentJobMeta } from '../agent-jobs/types';
5
5
  import { runControllerCheck } from './check-runner';
6
- import { cleanupEvidenceResourceBlockers, completionEvidenceComplete, taskExecutionPolicy } from './execution-policy';
6
+ import { cleanupEvidenceResourceBlockers, completionEvidenceComplete } from './execution-policy';
7
7
  import { acceptVerifiedTask, getIssue, recordTaskVerification, updateTask } from './issue-store';
8
8
  import type { CompletionReceipt, CompletionReceiptSource, TaskCommandEvidence, TaskVerification } from './types';
9
9
  import { legacyIssueAuthorityRetired } from './legacy-issue-cutover';
@@ -92,9 +92,7 @@ export function continueTaskAfterSuccessfulRun(
92
92
  if (['done', 'cancelled', 'superseded'].includes(task.status)) {
93
93
  return { continued: false, status: task.status, reason: 'Task is already terminal.' };
94
94
  }
95
- const policy = taskExecutionPolicy(task);
96
- const checkResults = policy.autoRunDeclaredChecks
97
- ? task.checks.map((checkId) => {
95
+ const checkResults = task.checks.map((checkId) => {
98
96
  try {
99
97
  const result = runControllerCheck(repoRoot, checkId);
100
98
  return {
@@ -105,8 +103,7 @@ export function continueTaskAfterSuccessfulRun(
105
103
  } catch (error) {
106
104
  return { checkId, ok: false, summary: error instanceof Error ? error.message : String(error) };
107
105
  }
108
- })
109
- : [];
106
+ });
110
107
 
111
108
  const commandEvidence: TaskCommandEvidence[] = [{
112
109
  command: ['forge', 'agent-run', run.runId],
@@ -148,7 +145,7 @@ export function continueTaskAfterSuccessfulRun(
148
145
  });
149
146
  return { continued: true, status, checkCount: checkResults.length };
150
147
  }
151
- if (status === 'verified' && policy.autoCompleteAfterSuccessfulRun && !policy.requiresHumanAcceptance) {
148
+ if (status === 'verified' && task.acceptanceCriteria.length === 0) {
152
149
  const closureComplete = run.closureState === 'completed' && completionEvidenceComplete(verification, {
153
150
  issueId: run.issueId,
154
151
  taskId: run.taskId,