@moretea-labs/forge 1.8.0 → 1.8.2

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 (695) hide show
  1. package/AGENTS.md +73 -7
  2. package/CHANGELOG.md +34 -0
  3. package/CLAUDE.md +17 -2
  4. package/CONTRIBUTING.md +3 -2
  5. package/README.en.md +24 -3
  6. package/README.md +10 -6
  7. package/README.zh-CN.md +5 -3
  8. package/THIRD_PARTY_NOTICES.md +1 -2
  9. package/adapters/chatgpt/browser-delivery-host.ts +7 -1
  10. package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
  11. package/adapters/chatgpt/controller-binding-store.ts +101 -22
  12. package/adapters/chatgpt/controller-round-host.ts +15 -25
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
  14. package/adapters/chatgpt/provider-delivery.ts +229 -2
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
  16. package/adapters/computer/chatgpt-extension-target.ts +708 -0
  17. package/adapters/computer/chrome-extension/background.js +541 -0
  18. package/adapters/computer/chrome-extension/content.js +402 -0
  19. package/adapters/computer/chrome-extension/core.js +24 -0
  20. package/adapters/computer/chrome-extension/manifest.json +32 -0
  21. package/adapters/computer/desktop-operator-discovery.ts +11 -31
  22. package/adapters/computer/desktop-operator-provider.ts +18 -6
  23. package/adapters/computer/interaction-target-authority.ts +178 -24
  24. package/adapters/mcp/access-mode.ts +18 -39
  25. package/adapters/mcp/auth.ts +2 -7
  26. package/adapters/mcp/instructions.ts +6 -5
  27. package/adapters/mcp/multi-repository.ts +10 -47
  28. package/adapters/mcp/oauth.ts +73 -0
  29. package/adapters/mcp/paths.ts +4 -1
  30. package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
  31. package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
  32. package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
  33. package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
  34. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
  35. package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
  36. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
  37. package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
  38. package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
  39. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
  40. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
  41. package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
  42. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
  43. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
  44. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
  45. package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
  46. package/adapters/mcp/runtime-gateway/router.ts +19 -507
  47. package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
  48. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
  49. package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
  50. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
  51. package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
  52. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
  53. package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
  54. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
  55. package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
  56. package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
  57. package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
  58. package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
  59. package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
  60. package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
  61. package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
  62. package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
  63. package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
  64. package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
  65. package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
  66. package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
  67. package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
  68. package/adapters/mcp/server.ts +91 -26
  69. package/adapters/mcp/setup.ts +5 -13
  70. package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
  71. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
  72. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
  73. package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
  74. package/adapters/mcp/toolset-names.ts +11 -37
  75. package/adapters/mcp/toolset.ts +19 -92
  76. package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
  77. package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
  78. package/adapters/mcp/transports/http-observation.ts +377 -0
  79. package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
  80. package/adapters/mcp/transports/http.ts +200 -683
  81. package/adapters/mcp/transports/oauth-http.ts +322 -0
  82. package/adapters/mcp/transports/session-registry.ts +6 -0
  83. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
  84. package/adapters/mcp/types.ts +0 -6
  85. package/assets/hooks/lib/session-state.sh +0 -38
  86. package/assets/hooks/post-bash.sh +1 -1
  87. package/assets/hooks/post-tool-observer.sh +0 -5
  88. package/assets/hooks/prompt-guard.sh +0 -55
  89. package/assets/partials/04-project-structure.partial.md +1 -1
  90. package/assets/partials/07-footer.partial.md +1 -1
  91. package/assets/partials-agents/02-operating-mode.partial.md +1 -1
  92. package/assets/partials-agents/08-deep-docs.partial.md +1 -1
  93. package/assets/plugin-registry.v1.json +6 -4
  94. package/assets/reference-configs/agentic-development-flow.md +26 -1
  95. package/assets/reference-configs/external-tooling.md +0 -76
  96. package/assets/reference-configs/global-working-rules.md +19 -0
  97. package/assets/reference-configs/release-deploy.md +1 -1
  98. package/assets/templates/helpers/architecture-queue.sh +1 -1
  99. package/assets/templates/helpers/check-agent-tooling.sh +1 -327
  100. package/assets/templates/helpers/check-task-workflow.sh +1 -1
  101. package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
  102. package/assets/templates/helpers/migrate-project-template.sh +2 -2
  103. package/assets/workflow-contract.v1.json +0 -2
  104. package/docs/README.md +5 -2
  105. package/docs/architecture/CURRENT.md +205 -51
  106. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
  107. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
  108. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
  109. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
  110. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
  111. package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
  112. package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
  113. package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
  114. package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
  115. package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
  116. package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
  117. package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
  118. package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
  119. package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
  120. package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
  121. package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
  122. package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
  123. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
  124. package/docs/architecture/domains/public-surface.md +3 -5
  125. package/docs/architecture/domains/verification.md +6 -5
  126. package/docs/architecture/domains/workflow-engine.md +6 -0
  127. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
  128. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
  129. package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
  130. package/docs/forge-plugin-management.md +16 -4
  131. package/docs/operations/controller-browser-plugin.md +23 -0
  132. package/docs/operations/controller-performance-and-502.md +17 -0
  133. package/docs/operations/controller-reliability-runbook.md +2 -2
  134. package/docs/operations/features.md +6 -7
  135. package/docs/operations/features.zh-CN.md +1 -1
  136. package/docs/operations/github-repository.md +4 -4
  137. package/docs/operations/github-semantic-release-projection.md +20 -0
  138. package/docs/operations/homebrew.md +2 -2
  139. package/docs/operations/mcp-tool-exposure.md +13 -52
  140. package/docs/operations/releasing.md +2 -0
  141. package/docs/operations/runtime-performance-diagnostics.md +8 -0
  142. package/docs/operations/standalone-disaster-recovery.md +15 -7
  143. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  144. package/docs/tutorials/03-first-repository-task.md +2 -0
  145. package/docs/wiki/Computer-and-Plugins.md +78 -0
  146. package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
  147. package/docs/wiki/Home.md +16 -2
  148. package/docs/wiki/Implementation.md +25 -13
  149. package/docs/wiki/Installation.md +28 -32
  150. package/docs/wiki/Integrations.md +4 -0
  151. package/docs/wiki/Quick-Start.md +35 -22
  152. package/docs/wiki/Releases-and-Upgrades.md +15 -25
  153. package/docs/wiki/_Sidebar.md +5 -1
  154. package/package.json +25 -25
  155. package/packages/kernel/cognition/api/index.ts +6 -0
  156. package/packages/kernel/cognition/application/activation-service.ts +451 -0
  157. package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
  158. package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
  159. package/packages/kernel/cognition/application/memory-service.ts +64 -0
  160. package/packages/kernel/cognition/domain/learning.ts +106 -0
  161. package/packages/kernel/cognition/domain/memory.ts +254 -0
  162. package/packages/kernel/controller/api/index.ts +1 -0
  163. package/packages/kernel/controller/application/continuation-service.ts +281 -0
  164. package/packages/kernel/controller/application/controller-round-service.ts +12 -0
  165. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
  166. package/packages/kernel/controller/domain/controller-round.ts +4 -1
  167. package/packages/kernel/controller/domain/execution-quality.ts +3 -1
  168. package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
  169. package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
  170. package/packages/kernel/controller/ports/controller-host.ts +2 -0
  171. package/packages/kernel/identity/api/index.ts +10 -0
  172. package/packages/kernel/identity/domain/activity-projection.ts +43 -0
  173. package/packages/kernel/identity/domain/capability-broker.ts +60 -0
  174. package/packages/kernel/identity/domain/grant.ts +72 -0
  175. package/packages/kernel/identity/domain/owned-resource.ts +116 -0
  176. package/packages/kernel/identity/domain/user-request.ts +93 -0
  177. package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
  178. package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
  179. package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
  180. package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
  181. package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
  182. package/packages/kernel/scheduler/api/index.ts +0 -2
  183. package/packages/kernel/scheduler/application/eligibility.ts +4 -1
  184. package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
  185. package/packages/kernel/scheduler/application/settlement.ts +0 -15
  186. package/packages/kernel/scheduler/domain/schedule.ts +87 -0
  187. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
  188. package/packages/kernel/work/api/index.ts +3 -2
  189. package/packages/kernel/work/application/work-service.ts +18 -42
  190. package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
  191. package/packages/kernel/work/domain/engineering-design.ts +10 -5
  192. package/packages/kernel/work/domain/engineering-profile.ts +8 -12
  193. package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
  194. package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
  195. package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
  196. package/packages/kernel/work/domain/implementation-review.ts +14 -331
  197. package/packages/kernel/work/domain/objective-graph.ts +119 -0
  198. package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
  199. package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
  200. package/packages/kernel/work/domain/state-machine.ts +34 -65
  201. package/packages/kernel/work/domain/types.ts +57 -51
  202. package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
  203. package/packages/kernel/work/ports/work-contract-store.ts +5 -2
  204. package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
  205. package/packages/plugin-runtime/browser/session-authority.ts +2 -1
  206. package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
  207. package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
  208. package/packages/plugin-runtime/computer/index.ts +2 -0
  209. package/packages/plugin-runtime/computer/target-authority.ts +26 -1
  210. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
  211. package/packages/protocols/computer/contract.ts +27 -1
  212. package/scripts/activate-source-baseline.ts +7 -9
  213. package/scripts/assemble-template.ts +11 -72
  214. package/scripts/canary-controller-semantic-wait.ts +12 -24
  215. package/scripts/check-mcp-compatibility.ts +94 -201
  216. package/scripts/check-package-identity.mjs +0 -5
  217. package/scripts/check-runtime-architecture.mjs +921 -239
  218. package/scripts/forge-local-recovery-helper.mjs +93 -15
  219. package/scripts/init-project.sh +0 -46
  220. package/scripts/install-ios-hid-toolchain.sh +60 -0
  221. package/scripts/install-standalone-recovery.ts +1 -1
  222. package/scripts/lib/project-init-lib.sh +6 -3
  223. package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
  224. package/scripts/open-source-audit-allowlist.txt +1 -3
  225. package/scripts/run-bounded-command.mjs +5 -0
  226. package/scripts/run-governed-gate.ts +2 -1
  227. package/scripts/run-mobile-monitor-bridge.ts +0 -1
  228. package/scripts/smoke-control-plane-failure-domain.ts +94 -0
  229. package/scripts/smoke-ios-physical-device.ts +38 -10
  230. package/scripts/smoke-mcp-http-runtime.ts +12 -8
  231. package/scripts/smoke-mcp-tool-surface.ts +27 -41
  232. package/scripts/smoke-runtime-recovery.ts +12 -43
  233. package/scripts/smoke-schedule-engine.ts +23 -15
  234. package/scripts/smoke-unattended-transport-recovery.ts +223 -0
  235. package/scripts/smoke-user-request-continuation-restart.ts +232 -0
  236. package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
  237. package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
  238. package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
  239. package/scripts/smoke-workflow-supervisor.ts +103 -0
  240. package/scripts/sync-generated-authority.mjs +0 -1
  241. package/scripts/verify-forge-runtime.sh +2 -1
  242. package/src/cli/agent-jobs/executor-health.ts +12 -35
  243. package/src/cli/agent-jobs/integration.ts +20 -51
  244. package/src/cli/agent-jobs/job-manager.ts +7 -3
  245. package/src/cli/chatgpt-browser/file-policy.ts +2 -2
  246. package/src/cli/commands/brain-assistant.ts +27 -13
  247. package/src/cli/commands/brain.ts +13 -15
  248. package/src/cli/commands/chatgpt.ts +1 -163
  249. package/src/cli/commands/doctor.ts +1 -143
  250. package/src/cli/commands/global-runtime.ts +3 -196
  251. package/src/cli/commands/init-hook.ts +6 -23
  252. package/src/cli/commands/init.ts +3 -252
  253. package/src/cli/commands/mcp.ts +0 -5
  254. package/src/cli/commands/prompt-guard-decision.ts +0 -2
  255. package/src/cli/commands/recovery.ts +137 -135
  256. package/src/cli/commands/repository.ts +17 -1
  257. package/src/cli/commands/runtime.ts +3 -3
  258. package/src/cli/commands/setup-execution.ts +41 -0
  259. package/src/cli/commands/setup-profile.ts +8 -0
  260. package/src/cli/controller/check-runner.ts +13 -2
  261. package/src/cli/controller/completion-backlog.ts +3 -3
  262. package/src/cli/controller/completion-orchestrator.ts +5 -44
  263. package/src/cli/controller/completion-target.ts +3 -72
  264. package/src/cli/controller/composite-operations.ts +1 -1
  265. package/src/cli/controller/context/instruction-context.ts +1 -1
  266. package/src/cli/controller/context/known-paths.ts +2 -2
  267. package/src/cli/controller/context/query-planning.ts +11 -4
  268. package/src/cli/controller/context/rule-resolution.ts +2 -2
  269. package/src/cli/controller/context/source-materializer.ts +83 -102
  270. package/src/cli/controller/context/structural-provider.ts +84 -0
  271. package/src/cli/controller/context/structural.ts +6 -6
  272. package/src/cli/controller/context/types.ts +8 -9
  273. package/src/cli/controller/context-pack.ts +107 -84
  274. package/src/cli/controller/execution-completion.ts +4 -7
  275. package/src/cli/controller/execution-policy.ts +36 -153
  276. package/src/cli/controller/governance.ts +2 -3
  277. package/src/cli/controller/issue-store.ts +4 -99
  278. package/src/cli/controller/launch-agents.ts +59 -18
  279. package/src/cli/controller/operational-plan.ts +25 -52
  280. package/src/cli/controller/runtime-config.ts +5 -1
  281. package/src/cli/controller/stuck-state-migration.ts +2 -3
  282. package/src/cli/controller/systemd-user.ts +42 -10
  283. package/src/cli/editing/edit-session.ts +18 -12
  284. package/src/cli/github/github.ts +4 -4
  285. package/src/cli/github/semantic-projection.ts +174 -0
  286. package/src/cli/hook/prompt-intents.ts +0 -9
  287. package/src/cli/index.ts +1 -43
  288. package/src/cli/local-bridge/connector-freshness.ts +1 -12
  289. package/src/cli/local-bridge/console-automations.ts +19 -14
  290. package/src/cli/local-bridge/console-view-models.ts +4 -13
  291. package/src/cli/local-bridge/facade-api.ts +64 -193
  292. package/src/cli/local-bridge/server.ts +24 -147
  293. package/src/cli/local-bridge/types.ts +0 -1
  294. package/src/cli/mcp/oauth-client-retirement.ts +74 -0
  295. package/src/cli/repositories/command-classifier.ts +0 -9
  296. package/src/cli/repositories/command-executor.ts +29 -23
  297. package/src/cli/repositories/command-scope.ts +37 -18
  298. package/src/cli/repositories/controller-home.ts +48 -0
  299. package/src/cli/repositories/ephemeral-workspace.ts +20 -30
  300. package/src/cli/repositories/git-command-executor.ts +2 -2
  301. package/src/cli/repositories/locks.ts +20 -0
  302. package/src/cli/repositories/registry.ts +79 -12
  303. package/src/cli/repositories/safe-patch.ts +2 -12
  304. package/src/cli/repositories/structured-git.ts +101 -5
  305. package/src/cli/repository/inspector.ts +185 -343
  306. package/src/cli/repository/session-cache.ts +92 -6
  307. package/src/effects/process-runner.ts +17 -1
  308. package/src/runtime/context/assistant-context.ts +20 -7
  309. package/src/runtime/context/assistant-work-context.ts +89 -27
  310. package/src/runtime/context/automatic-learning.ts +565 -0
  311. package/src/runtime/context/cognitive-attention.ts +173 -0
  312. package/src/runtime/context/cognitive-skill-canary.ts +158 -0
  313. package/src/runtime/context/context-closure.ts +46 -9
  314. package/src/runtime/context/context-pack-process.ts +103 -0
  315. package/src/runtime/context/context-plane.ts +1 -9
  316. package/src/runtime/context/direct-controller-learning.ts +298 -0
  317. package/src/runtime/context/generic-lsp-provider.ts +1 -1
  318. package/src/runtime/context/semantic-navigation-contract.ts +16 -0
  319. package/src/runtime/context/semantic-navigation.ts +7 -35
  320. package/src/runtime/context/typescript-navigation-process.ts +145 -0
  321. package/src/runtime/context/typescript-navigation.ts +89 -3
  322. package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
  323. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
  324. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
  325. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
  326. package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
  327. package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
  328. package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
  329. package/src/runtime/control-plane/execution/session-store.ts +31 -1
  330. package/src/runtime/control-plane/execution/validation.ts +6 -8
  331. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
  332. package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
  333. package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
  334. package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
  335. package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
  336. package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
  337. package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
  338. package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
  339. package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
  340. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
  341. package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
  342. package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
  343. package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
  344. package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
  345. package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
  346. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
  347. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
  348. package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
  349. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
  350. package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
  351. package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
  352. package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
  353. package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
  354. package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
  355. package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
  356. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
  357. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
  358. package/src/runtime/control-plane/facade/index.ts +0 -1
  359. package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
  360. package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
  361. package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
  362. package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
  363. package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
  364. package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
  365. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
  366. package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
  367. package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
  368. package/src/runtime/control-plane/facade/types.ts +49 -108
  369. package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
  370. package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
  371. package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
  372. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
  373. package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
  374. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
  375. package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
  376. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
  377. package/src/runtime/control-plane/governance/access-policy.ts +19 -2
  378. package/src/runtime/control-plane/governance/authorization.ts +20 -3
  379. package/src/runtime/control-plane/governance/external-effects.ts +1 -1
  380. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
  381. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
  382. package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
  383. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
  384. package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
  385. package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
  386. package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
  387. package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
  388. package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
  389. package/src/runtime/control-plane/release-retention.ts +135 -47
  390. package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
  391. package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
  392. package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
  393. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
  394. package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
  395. package/src/runtime/diagnostics/incident-repair.ts +313 -146
  396. package/src/runtime/diagnostics/mcp-timing.ts +114 -0
  397. package/src/runtime/evidence/artifact-store.ts +158 -40
  398. package/src/runtime/evidence/evidence-store.ts +112 -8
  399. package/src/runtime/evidence/output-handle-index.ts +225 -0
  400. package/src/runtime/evidence/result-store.ts +158 -44
  401. package/src/runtime/evidence/sensitive-output.ts +22 -2
  402. package/src/runtime/execution/jobs/child-reference.ts +11 -0
  403. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
  404. package/src/runtime/execution/jobs/store.ts +3 -4
  405. package/src/runtime/execution/managed-workspace.ts +57 -0
  406. package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
  407. package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
  408. package/src/runtime/execution/process-runtime/check-result.ts +105 -1
  409. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
  410. package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
  411. package/src/runtime/execution/process-runtime/gc.ts +15 -2
  412. package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
  413. package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
  414. package/src/runtime/execution/process-runtime/index.ts +3 -0
  415. package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
  416. package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
  417. package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
  418. package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
  419. package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
  420. package/src/runtime/execution/process-runtime/runtime.ts +55 -18
  421. package/src/runtime/execution/process-runtime/store.ts +30 -2
  422. package/src/runtime/execution/process-runtime/types.ts +6 -1
  423. package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
  424. package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
  425. package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
  426. package/src/runtime/execution/workers/executor.ts +3 -8
  427. package/src/runtime/maintenance/cleanup.ts +41 -5
  428. package/src/runtime/platform/service-inventory.ts +130 -0
  429. package/src/runtime/platform/service-manager.ts +8 -0
  430. package/src/runtime/plugins/action-application.ts +97 -29
  431. package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
  432. package/src/runtime/plugins/browser-adapter.ts +1124 -333
  433. package/src/runtime/plugins/browser-automation-service.ts +23 -3
  434. package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
  435. package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
  436. package/src/runtime/plugins/browser-native-session-service.ts +63 -13
  437. package/src/runtime/plugins/browser-registration.ts +18 -0
  438. package/src/runtime/plugins/browser-runtime.ts +40 -36
  439. package/src/runtime/plugins/browser-session-authority.ts +2 -2
  440. package/src/runtime/plugins/browser-session-store.ts +46 -76
  441. package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
  442. package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
  443. package/src/runtime/plugins/computer-registration.ts +298 -20
  444. package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
  445. package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
  446. package/src/runtime/plugins/external-adapter.ts +42 -6
  447. package/src/runtime/plugins/external-registration.ts +21 -1
  448. package/src/runtime/plugins/github-adapter.ts +30 -3
  449. package/src/runtime/plugins/gmail-adapter.ts +189 -3
  450. package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
  451. package/src/runtime/plugins/google-shared.ts +24 -12
  452. package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
  453. package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
  454. package/src/runtime/plugins/ios-adapter.ts +46 -41
  455. package/src/runtime/plugins/ios-agent-device.ts +54 -4
  456. package/src/runtime/plugins/ios-device-ownership.ts +103 -0
  457. package/src/runtime/plugins/ios-physical-device.ts +497 -79
  458. package/src/runtime/plugins/lightweight-action.ts +208 -2
  459. package/src/runtime/plugins/local-system-adapter.ts +12 -100
  460. package/src/runtime/plugins/managed-process-adapter.ts +12 -5
  461. package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
  462. package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
  463. package/src/runtime/plugins/store.ts +682 -435
  464. package/src/runtime/plugins/types.ts +24 -0
  465. package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
  466. package/src/runtime/projections/git-status-sampler.ts +2 -19
  467. package/src/runtime/projections/invalidation.ts +7 -3
  468. package/src/runtime/projections/materialized-view.ts +80 -36
  469. package/src/runtime/recovery/actions.ts +4 -4
  470. package/src/runtime/recovery/capability-action-application.ts +46 -45
  471. package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
  472. package/src/runtime/recovery/maintenance-executor.ts +374 -123
  473. package/src/runtime/recovery/probe.ts +2 -2
  474. package/src/runtime/recovery/store.ts +29 -11
  475. package/src/runtime/release/release-coordinator.ts +312 -0
  476. package/src/runtime/release/release-session.ts +716 -0
  477. package/src/runtime/release/release-state-migration.ts +25 -0
  478. package/src/runtime/resources/leases/store.ts +56 -25
  479. package/src/runtime/root/computer-composition.ts +191 -6
  480. package/src/runtime/root/controller-progression-composition.ts +254 -0
  481. package/src/runtime/root/controller-round-composition.ts +20 -1
  482. package/src/runtime/root/deployment-topology.ts +106 -0
  483. package/src/runtime/root/entry.ts +4 -3
  484. package/src/runtime/root/known-good-recovery.ts +184 -0
  485. package/src/runtime/root/local-bridge.ts +0 -1
  486. package/src/runtime/root/mcp-transport.ts +111 -18
  487. package/src/runtime/root/ownership.ts +261 -9
  488. package/src/runtime/root/package-connector-service.ts +227 -29
  489. package/src/runtime/root/package-runtime-release.ts +117 -30
  490. package/src/runtime/root/package-runtime-service.ts +24 -24
  491. package/src/runtime/root/release-execution-canary.ts +57 -12
  492. package/src/runtime/root/release-loader.ts +90 -8
  493. package/src/runtime/root/release-manifest.ts +80 -40
  494. package/src/runtime/root/release-materialize.ts +372 -106
  495. package/src/runtime/root/release-store.ts +395 -36
  496. package/src/runtime/root/runtime-lane.ts +191 -0
  497. package/src/runtime/root/runtime.ts +160 -29
  498. package/src/runtime/root/scheduled-controller-composition.ts +29 -3
  499. package/src/runtime/root/service-runner.ts +2 -2
  500. package/src/runtime/root/service.ts +126 -44
  501. package/src/runtime/root/status.ts +48 -0
  502. package/src/runtime/root/types.ts +32 -9
  503. package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
  504. package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
  505. package/src/runtime/root/write-fence.ts +50 -2
  506. package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
  507. package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
  508. package/src/runtime/safe-tooling/ios-development.ts +22 -8
  509. package/src/runtime/safe-tooling/job-summary.ts +1 -1
  510. package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
  511. package/src/runtime/shared/atomic-text-file.ts +21 -0
  512. package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
  513. package/src/runtime/shared/json-files.ts +8 -3
  514. package/src/runtime/shared/process-environment.ts +20 -9
  515. package/src/runtime/shared/response-budget.ts +1 -3
  516. package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
  517. package/src/runtime/standalone-recovery/core.ts +3792 -417
  518. package/src/runtime/standalone-recovery/entry.ts +507 -45
  519. package/src/runtime/standalone-recovery/installer.ts +262 -148
  520. package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
  521. package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
  522. package/src/runtime/standalone-recovery/performance.ts +54 -16
  523. package/src/runtime/standalone-recovery/release.ts +53 -5
  524. package/src/runtime/standalone-recovery/service-labels.ts +5 -2
  525. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
  526. package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
  527. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
  528. package/src/runtime/workflow/schedules/engine.ts +166 -178
  529. package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
  530. package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
  531. package/src/runtime/workflows/runtime.ts +15 -19
  532. package/src/testing/test-governance.ts +5 -1
  533. package/supervisor/chatgpt-conversation.ts +23 -0
  534. package/supervisor/client.ts +218 -0
  535. package/supervisor/control-plane.ts +963 -0
  536. package/supervisor/entry.ts +15 -0
  537. package/supervisor/forge-validators.ts +147 -0
  538. package/supervisor/index.ts +5 -0
  539. package/supervisor/native-browser-adapter.ts +1151 -0
  540. package/supervisor/native-messaging/host.ts +58 -0
  541. package/supervisor/native-messaging/manifest.ts +26 -0
  542. package/supervisor/native-messaging/protocol.ts +27 -0
  543. package/supervisor/paths.ts +18 -0
  544. package/supervisor/protocol.ts +250 -0
  545. package/supervisor/server.ts +412 -0
  546. package/supervisor/store.ts +1870 -0
  547. package/supervisor/tsconfig.json +8 -0
  548. package/supervisor/types.ts +261 -0
  549. package/SKILL.md +0 -427
  550. package/adapters/chatgpt/controller-host.ts +0 -119
  551. package/adapters/mcp/controller-round-compatibility.ts +0 -184
  552. package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
  553. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
  554. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
  555. package/adapters/mcp/toolset-selection.ts +0 -41
  556. package/agents/openai.yaml +0 -4
  557. package/assets/skill-hooks.json +0 -41
  558. package/assets/skill-version.json +0 -189
  559. package/assets/skills/claude-review/SKILL.md +0 -231
  560. package/assets/skills/codex-review/SKILL.md +0 -103
  561. package/assets/templates/helpers/check-skill-version.ts +0 -193
  562. package/packages/kernel/progression/api/index.ts +0 -2
  563. package/packages/kernel/progression/application/projector.ts +0 -211
  564. package/packages/kernel/progression/domain/types.ts +0 -116
  565. package/packages/kernel/progression/index.ts +0 -1
  566. package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
  567. package/packages/kernel/scheduler/domain/continuation.ts +0 -38
  568. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
  569. package/packages/kernel/work/domain/admission-policy.ts +0 -34
  570. package/scripts/benchmark-background-check-overlap.ts +0 -228
  571. package/scripts/benchmark-computer-hotpath.ts +0 -255
  572. package/scripts/benchmark-controller-hotpath.ts +0 -212
  573. package/scripts/benchmark-controller-round2.ts +0 -191
  574. package/scripts/benchmark-ios-agent-device.ts +0 -511
  575. package/scripts/benchmark-mcp-host.sh +0 -117
  576. package/scripts/benchmark-mcp-transport.ts +0 -169
  577. package/scripts/benchmark-operational-memory-activation.ts +0 -235
  578. package/scripts/benchmark-operational-shadow.ts +0 -28
  579. package/scripts/benchmark-quality-harness.ts +0 -146
  580. package/scripts/benchmark-route-session-concurrency.ts +0 -915
  581. package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
  582. package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
  583. package/scripts/benchmark-thin-harness.ts +0 -251
  584. package/scripts/benchmark-typescript-navigation.ts +0 -186
  585. package/scripts/benchmark-work-efficiency.ts +0 -334
  586. package/scripts/build-controller-ui.ts +0 -28
  587. package/scripts/check-npm-release.sh +0 -32
  588. package/scripts/check-public-release-surface.sh +0 -19
  589. package/scripts/check-release-published.sh +0 -57
  590. package/scripts/check-release-readiness.sh +0 -37
  591. package/scripts/check-release-version.mjs +0 -74
  592. package/scripts/check-skill-version.ts +0 -5
  593. package/scripts/check-tarball-install-smoke.sh +0 -150
  594. package/scripts/ensure-codegraph.sh +0 -16
  595. package/scripts/package-source-archive.sh +0 -147
  596. package/scripts/public-release-files.txt +0 -39
  597. package/scripts/public-release.ts +0 -174
  598. package/scripts/publish-release-tarball.sh +0 -27
  599. package/scripts/route-nl-vs-ts-eval.ts +0 -679
  600. package/scripts/run-skill-hook.ts +0 -244
  601. package/scripts/stage-runtime-release.ts +0 -44
  602. package/scripts/sync-codex-installed-copies.sh +0 -182
  603. package/src/cli/commands/tools.ts +0 -167
  604. package/src/cli/controller/progress.ts +0 -656
  605. package/src/cli/controller/work-mode.ts +0 -181
  606. package/src/cli/local-bridge/console-assets.ts +0 -17
  607. package/src/cli/local-bridge/dashboard.ts +0 -17
  608. package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
  609. package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
  610. package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
  611. package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
  612. package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
  613. package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
  614. package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
  615. package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
  616. package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
  617. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
  618. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
  619. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
  620. package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
  621. package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
  622. package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
  623. package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
  624. package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
  625. package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
  626. package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
  627. package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
  628. package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
  629. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
  630. package/src/cli/local-bridge/frontend/src/styles.css +0 -28
  631. package/src/cli/local-bridge/frontend/src/types.ts +0 -15
  632. package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
  633. package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
  634. package/src/cli/local-bridge/ui-dist/app.css +0 -1
  635. package/src/cli/local-bridge/ui-dist/app.js +0 -11228
  636. package/src/cli/mcp/access-mode.ts +0 -2
  637. package/src/cli/mcp/access-tools.ts +0 -2
  638. package/src/cli/mcp/audit.ts +0 -2
  639. package/src/cli/mcp/auth.ts +0 -2
  640. package/src/cli/mcp/instructions.ts +0 -2
  641. package/src/cli/mcp/legacy-context.ts +0 -2
  642. package/src/cli/mcp/legacy-tool-service.ts +0 -2
  643. package/src/cli/mcp/multi-repository.ts +0 -2
  644. package/src/cli/mcp/oauth.ts +0 -2
  645. package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
  646. package/src/cli/mcp/paths.ts +0 -2
  647. package/src/cli/mcp/policy.ts +0 -2
  648. package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
  649. package/src/cli/mcp/proxy-env.ts +0 -2
  650. package/src/cli/mcp/readiness-projection.ts +0 -2
  651. package/src/cli/mcp/redaction.ts +0 -2
  652. package/src/cli/mcp/repo.ts +0 -2
  653. package/src/cli/mcp/repository-tools.ts +0 -2
  654. package/src/cli/mcp/server.ts +0 -2
  655. package/src/cli/mcp/setup.ts +0 -2
  656. package/src/cli/mcp/tool-capability-cache.ts +0 -2
  657. package/src/cli/mcp/tool-contract.ts +0 -2
  658. package/src/cli/mcp/tools.ts +0 -2
  659. package/src/cli/mcp/toolset-names.ts +0 -2
  660. package/src/cli/mcp/toolset-selection.ts +0 -2
  661. package/src/cli/mcp/toolset.ts +0 -2
  662. package/src/cli/mcp/transports/http.ts +0 -2
  663. package/src/cli/mcp/transports/session-registry.ts +0 -2
  664. package/src/cli/mcp/transports/stdio.ts +0 -2
  665. package/src/cli/mcp/types.ts +0 -2
  666. package/src/cli/mcp/umbrella-tools.ts +0 -2
  667. package/src/cli/tools/codegraph.ts +0 -695
  668. package/src/core/adoption/helper-wrapper-plan.ts +0 -159
  669. package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
  670. package/src/runtime/context/codegraph-read-provider.ts +0 -611
  671. package/src/runtime/context/codegraph-sidecar.cjs +0 -248
  672. package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
  673. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
  674. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
  675. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
  676. package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
  677. package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
  678. package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
  679. package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
  680. package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
  681. package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
  682. package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
  683. package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
  684. package/src/runtime/control-plane/routing/index.ts +0 -1
  685. package/src/runtime/control-plane/routing/route-policy.ts +0 -401
  686. package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
  687. package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
  688. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
  689. package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
  690. package/src/runtime/gateway/mcp/process-tools.ts +0 -2
  691. package/src/runtime/gateway/mcp/router.ts +0 -2
  692. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
  693. package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
  694. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
  695. package/src/runtime/plugins/browser-provider-registry.ts +0 -2
@@ -1,5 +1,6 @@
1
1
  import { createHash, randomUUID } from 'crypto';
2
2
  import type {
3
+ ComputerApplicationLaunchProvenance,
3
4
  ComputerApplicationTarget,
4
5
  ComputerApplicationStableIdentity,
5
6
  ComputerApplicationTargetLease,
@@ -11,6 +12,7 @@ import {
11
12
  COMPUTER_ELEMENT_OBSERVE_CAPABILITY,
12
13
  COMPUTER_INPUT_CAPABILITY,
13
14
  COMPUTER_OBSERVE_CAPABILITY,
15
+ type ComputerConsoleUnlockCommandRequest,
14
16
  type ComputerConsoleUnlockPrepareRequest,
15
17
  type ComputerConsoleUnlockRequest,
16
18
  type ComputerElementSemanticAction,
@@ -29,6 +31,8 @@ import {
29
31
  import { desktopOperatorActions } from './desktop-operator-registration';
30
32
  import { getExternalPluginAdapter } from './external-adapter';
31
33
  import { AssistantPluginError } from './errors';
34
+ import { executeIosPhysicalDeviceAction, iosPhysicalDeviceActions, iosPhysicalDeviceCapabilities, iosPhysicalDeviceStatus, isIosPhysicalDeviceAction, resolveIosPhysicalDeviceAuthorizationContext } from './ios-physical-device';
35
+ import { remoteXpcHidCachedStatus } from './ios/remote-xpc-hid';
32
36
  import type {
33
37
  AssistantPluginActionDescriptor,
34
38
  AssistantPluginActionExecutionInput,
@@ -48,6 +52,10 @@ const DESKTOP_ELEMENT_OBSERVE_ACTION = 'desktop_element_observe';
48
52
  const DESKTOP_ELEMENT_ACTION_ACTION = 'desktop_element_action';
49
53
  export const COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION = 'console_unlock_prepare';
50
54
  export const COMPUTER_CONSOLE_UNLOCK_ACTION = 'console_unlock';
55
+ export const COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION = 'console_unlock_enroll';
56
+ export const COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION = 'console_unlock_status';
57
+ export const COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION = 'console_unlock_recover';
58
+ export const COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION = 'console_unlock_revoke';
51
59
  const DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS = 15_000;
52
60
  const MAX_CONSOLE_UNLOCK_TIMEOUT_MS = 30_000;
53
61
  const CONSOLE_CREDENTIAL_HANDLE_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
@@ -69,6 +77,10 @@ const DESKTOP_PRODUCT_ACTION_IDS = new Set([
69
77
  DESKTOP_ELEMENT_ACTION_ACTION,
70
78
  COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION,
71
79
  COMPUTER_CONSOLE_UNLOCK_ACTION,
80
+ COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION,
81
+ COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION,
82
+ COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION,
83
+ COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION,
72
84
  ]);
73
85
 
74
86
  function providerActionDescriptor(actionId: string): AssistantPluginActionDescriptor {
@@ -178,6 +190,31 @@ export async function executeProtectedConsoleUnlockInvocation(
178
190
  };
179
191
  }
180
192
 
193
+ export async function executeProtectedConsoleUnlockLifecycle(
194
+ action: 'console_unlock_enroll' | 'console_unlock_status' | 'console_unlock_recover' | 'console_unlock_revoke',
195
+ input: ProtectedConsoleUnlockPreparationInput,
196
+ controllerHome: string,
197
+ ): Promise<Record<string, unknown>> {
198
+ requireConsoleUnlockAuthorization(input.confirmAuthorization);
199
+ const invocationId = randomUUID();
200
+ const request: ComputerConsoleUnlockCommandRequest = {
201
+ capability: COMPUTER_CONSOLE_UNLOCK_CAPABILITY,
202
+ action,
203
+ };
204
+ const providerResult = await executeRuntimeComputerConsoleUnlock(
205
+ request,
206
+ { kind: 'explicit_single_use', confirmed: true, invocationId },
207
+ boundedConsoleUnlockTimeoutMs(input.timeoutMs),
208
+ controllerHome,
209
+ );
210
+ return {
211
+ capability: COMPUTER_CONSOLE_UNLOCK_CAPABILITY,
212
+ action,
213
+ invocationId,
214
+ ...providerResult,
215
+ };
216
+ }
217
+
181
218
  function desktopProductActions(): AssistantPluginActionDescriptor[] {
182
219
  const open = providerActionDescriptor('desktop_session_open');
183
220
  const close = providerActionDescriptor('desktop_session_close');
@@ -240,6 +277,70 @@ function desktopProductActions(): AssistantPluginActionDescriptor[] {
240
277
  additionalProperties: false,
241
278
  },
242
279
  },
280
+ {
281
+ actionId: COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION,
282
+ title: 'Enable unattended console recovery',
283
+ description: 'Enroll provider-local unattended console recovery. Credential collection and Keychain persistence remain entirely inside the native provider.',
284
+ readOnly: false,
285
+ risk: 'workspace_write',
286
+ confirmation: 'authorization',
287
+ defaultTimeoutMs: DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS,
288
+ cancellable: true,
289
+ idempotent: false,
290
+ executionMode: 'direct_non_persistent',
291
+ foregroundEffect: 'required',
292
+ scopes: ['console.unlock'],
293
+ resourceClaims: [],
294
+ argumentsSchema: { type: 'object', properties: {}, additionalProperties: false },
295
+ },
296
+ {
297
+ actionId: COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION,
298
+ title: 'Read unattended console recovery status',
299
+ description: 'Read whether provider-local unattended console recovery is enrolled and available without exposing credential material.',
300
+ readOnly: true,
301
+ risk: 'readonly',
302
+ confirmation: 'authorization',
303
+ defaultTimeoutMs: DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS,
304
+ cancellable: true,
305
+ idempotent: true,
306
+ executionMode: 'direct_non_persistent',
307
+ foregroundEffect: 'none',
308
+ scopes: ['console.unlock'],
309
+ resourceClaims: [],
310
+ argumentsSchema: { type: 'object', properties: {}, additionalProperties: false },
311
+ },
312
+ {
313
+ actionId: COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION,
314
+ title: 'Recover locked macOS console',
315
+ description: 'Recover an already-locked console using only the provider-local enrolled credential. No password or credential handle enters Forge.',
316
+ readOnly: false,
317
+ risk: 'workspace_write',
318
+ confirmation: 'authorization',
319
+ defaultTimeoutMs: DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS,
320
+ cancellable: true,
321
+ idempotent: false,
322
+ executionMode: 'direct_non_persistent',
323
+ foregroundEffect: 'required',
324
+ scopes: ['console.unlock'],
325
+ resourceClaims: [],
326
+ argumentsSchema: { type: 'object', properties: {}, additionalProperties: false },
327
+ },
328
+ {
329
+ actionId: COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION,
330
+ title: 'Disable unattended console recovery',
331
+ description: 'Delete the provider-local unattended console recovery credential and disable future recovery.',
332
+ readOnly: false,
333
+ risk: 'workspace_write',
334
+ confirmation: 'authorization',
335
+ defaultTimeoutMs: DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS,
336
+ cancellable: true,
337
+ idempotent: true,
338
+ executionMode: 'direct_non_persistent',
339
+ foregroundEffect: 'none',
340
+ scopes: ['console.unlock'],
341
+ resourceClaims: [],
342
+ argumentsSchema: { type: 'object', properties: {}, additionalProperties: false },
343
+ },
243
344
  {
244
345
  actionId: DESKTOP_ELEMENT_OBSERVE_ACTION,
245
346
  title: 'Observe Computer elements',
@@ -318,7 +419,7 @@ function desktopProductPermissions(ready: boolean): AssistantPluginPermissionSco
318
419
  { scope: 'desktop.observe', mode: 'read', description: 'Observe bounded desktop accessibility state.', granted: ready, required: false },
319
420
  { scope: 'desktop.interact', mode: 'write', description: 'Perform bounded semantic desktop interaction.', granted: ready, required: false },
320
421
  { scope: 'desktop.capture', mode: 'read', description: 'Capture an authorized desktop target.', granted: ready, required: false },
321
- { scope: 'console.unlock', mode: 'write', description: 'Prepare and consume a provider-local console unlock handle.', granted: ready, required: false },
422
+ { scope: 'console.unlock', mode: 'write', description: 'Use provider-local temporary unlock or explicitly enrolled unattended console recovery.', granted: ready, required: false },
322
423
  ];
323
424
  }
324
425
 
@@ -330,7 +431,7 @@ function desktopProductCapabilities(): AssistantPluginCapability[] {
330
431
  { capabilityId: 'computer.capture.v1', title: 'Computer capture', description: 'Capture authorized desktop state.', scopes: ['desktop.capture'], actions: ['desktop_screenshot'] },
331
432
  { capabilityId: COMPUTER_ELEMENT_OBSERVE_CAPABILITY, title: 'Computer element observation', description: 'Observe exact provider-neutral semantic element snapshots for a Forge-owned target.', scopes: ['desktop.observe'], actions: [DESKTOP_ELEMENT_OBSERVE_ACTION] },
332
433
  { capabilityId: COMPUTER_ELEMENT_ACTION_CAPABILITY, title: 'Computer element action', description: 'Act on exact observed element refs with observation-epoch fencing.', scopes: ['desktop.interact'], actions: [DESKTOP_ELEMENT_ACTION_ACTION] },
333
- { capabilityId: COMPUTER_CONSOLE_UNLOCK_CAPABILITY, title: 'Protected console unlock', description: 'Collect console credential material only inside the native provider and consume an opaque one-shot handle without durable replay state.', scopes: ['console.unlock'], actions: [COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION, COMPUTER_CONSOLE_UNLOCK_ACTION] },
434
+ { capabilityId: COMPUTER_CONSOLE_UNLOCK_CAPABILITY, title: 'Protected console unlock', description: 'Keep console credential material provider-local while supporting temporary one-shot unlock and opt-in unattended recovery.', scopes: ['console.unlock'], actions: [COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION, COMPUTER_CONSOLE_UNLOCK_ACTION, COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION, COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION, COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION, COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION] },
334
435
  ];
335
436
  }
336
437
 
@@ -346,14 +447,37 @@ function buildComputerManifest(
346
447
  repoRoot?: string,
347
448
  context?: AssistantPluginBuildContext,
348
449
  ): AssistantPluginManifest {
349
- const browser = buildBrowserPluginManifest(previousRevision, previousUpdatedAt, repoRoot, context);
450
+ const browser = buildBrowserPluginManifest(previousRevision, previousUpdatedAt, repoRoot, context, true);
451
+ const scriptedBrowserActions = new Set([
452
+ 'configure', 'install_unpacked_extension', 'list_unpacked_extensions', 'clear_session', 'reconcile_sessions',
453
+ ]);
454
+ const browserActions = browser.actions.filter((action) => !scriptedBrowserActions.has(action.actionId));
455
+ const browserCapabilities = browser.capabilities.map((capability) => ({
456
+ ...capability,
457
+ actions: capability.actions.filter((action) => !scriptedBrowserActions.has(action)),
458
+ ...(capability.capabilityId === 'browser-interaction'
459
+ ? { description: 'Interact with existing Chrome or Vivaldi through native Computer; scripted Playwright is a separate explicit capability.' }
460
+ : {}),
461
+ ...(capability.capabilityId === 'browser-session'
462
+ ? { description: 'Discover, bind and reuse tabs of the user’s existing browser.' }
463
+ : {}),
464
+ ...(capability.capabilityId === 'browser-human-handoff'
465
+ ? { description: 'Present the exact existing native browser tab for manual interaction.' }
466
+ : {}),
467
+ })).filter((capability) => capability.actions.length > 0);
350
468
  const desktop = desktopProviderManifest(context);
351
469
  const platform = currentComputerPlatform();
352
470
  const desktopSupported = platform === 'darwin';
353
471
  const browserReady = browser.enabled && browser.health.ready;
354
472
  const desktopReady = desktopSupported && desktop?.enabled === true && desktop.health.ready;
473
+ const physicalRepository = desktopSupported && context?.controllerScoped === false;
474
+ const physicalReady = physicalRepository && iosPhysicalDeviceStatus().coreDeviceReady;
475
+ // Passive manifest reads must never launch Python: input readiness is
476
+ // published only after an explicit HID action verified the exact toolchain.
477
+ const hidStatus = physicalReady && context ? remoteXpcHidCachedStatus(context.controllerHome) : undefined;
478
+ const physicalInputReady = physicalReady && hidStatus?.available === true;
355
479
  const ready = browserReady && desktopReady;
356
- const partial = browserReady || desktopReady;
480
+ const partial = browserReady || desktopReady || physicalReady;
357
481
  const checkedAt = new Date().toISOString();
358
482
  return {
359
483
  ...browser,
@@ -365,12 +489,14 @@ function buildComputerManifest(
365
489
  strategy: 'derived',
366
490
  duplicateStateAllowed: false,
367
491
  sourceOfTruth: [
368
- ...browser.authority.sourceOfTruth,
492
+ // Computer browser is built in and never reads a project's independent
493
+ // Browser-script configuration to decide activation or routing.
369
494
  'controllerHome:sqlite/computer_interaction_target',
370
- 'controllerHome:system/plugins/external/registrations/desktop_operator.json',
495
+ 'controller-home:repository browser artifacts',
496
+ 'controller-home:repository ios-device interactions and Controller-global UDID lock',
371
497
  ],
372
498
  },
373
- enabled: browser.enabled || desktop?.enabled === true,
499
+ enabled: browser.enabled || desktop?.enabled === true || physicalReady,
374
500
  lifecycle: {
375
501
  state: ready ? 'enabled' : partial ? 'degraded' : 'error',
376
502
  reason: ready
@@ -384,20 +510,39 @@ function buildComputerManifest(
384
510
  checkedAt,
385
511
  ready,
386
512
  probed: browser.health.probed || desktop?.health.probed === true,
387
- errors: ready ? [] : [...browser.health.errors, ...(desktopSupported ? (desktop?.health.errors ?? (desktop ? [] : ['Native Computer provider is not installed.'])) : [])],
513
+ errors: ready ? [] : [
514
+ ...browser.health.errors,
515
+ ...(desktopSupported && !desktopReady ? ['Native Computer capabilities are unavailable or not ready.'] : []),
516
+ ],
388
517
  warnings: [
389
518
  ...browser.health.warnings,
390
- ...(desktopSupported ? (desktop?.health.warnings ?? []) : [`Native Desktop Computer capabilities are unsupported on ${platform}.`]),
519
+ ...(physicalReady && !physicalInputReady ? [`Physical iPhone observation is ready, but RemoteXPC HID input requires Controller-owned pymobiledevice3 ${String(hidStatus?.toolchainVersion ?? 'toolchain')}.`] : []),
520
+ ...(desktopSupported
521
+ ? (desktopReady ? [] : ['Native Computer capability diagnostics are available through the internal platform provider.'])
522
+ : [`Native Desktop Computer capabilities are unsupported on ${platform}.`]),
391
523
  ],
392
524
  details: {
393
525
  partial: !ready && partial,
394
526
  browser: { ready: browserReady, state: browser.health.state },
395
- desktop: { supported: desktopSupported, ready: desktopReady, state: desktop?.health.state ?? (desktopSupported ? 'not_installed' : 'unsupported'), provider: DESKTOP_PROVIDER_ID },
527
+ desktop: { supported: desktopSupported, ready: desktopReady, state: desktop?.health.state ?? (desktopSupported ? 'not_installed' : 'unsupported') },
528
+ iphone: {
529
+ supported: desktopSupported, ready: physicalInputReady,
530
+ observationReady: physicalReady, inputReady: physicalInputReady,
531
+ toolchainVersion: hidStatus?.toolchainVersion,
532
+ provider: 'coredevice',
533
+ },
396
534
  },
397
535
  },
398
- permissions: [...browser.permissions, ...desktopProductPermissions(desktopReady)],
399
- capabilities: [...browser.capabilities, ...desktopProductCapabilities()],
400
- actions: [...browser.actions, ...desktopProductActions()],
536
+ permissions: [...browser.permissions.filter((permission) => permission.scope !== 'browser.extensions').map((permission) =>
537
+ permission.scope === 'browser.profile'
538
+ ? { ...permission, description: 'Bind and persist exact existing native browser tab identities.' }
539
+ : permission), ...desktopProductPermissions(desktopReady),
540
+ ...(physicalRepository ? [
541
+ { scope: 'ios.discover' as const, mode: 'read' as const, description: 'Discover paired physical iPhones through CoreDevice.', granted: physicalReady, required: false },
542
+ { scope: 'ios.device' as const, mode: 'write' as const, description: 'Use one exact iPhone through the existing CoreDevice/RemoteXPC owner.', granted: physicalReady, required: false },
543
+ ] : [])],
544
+ capabilities: [...browserCapabilities, ...desktopProductCapabilities(), ...(physicalRepository ? iosPhysicalDeviceCapabilities() : [])],
545
+ actions: [...browserActions, ...desktopProductActions(), ...(physicalRepository ? iosPhysicalDeviceActions() : [])],
401
546
  updatedAt: previousUpdatedAt ?? checkedAt,
402
547
  };
403
548
  }
@@ -618,10 +763,12 @@ async function rebindProviderSession(
618
763
  { retryable: false, details: { targetId: target.targetId, stableIdentity: target.stableIdentity } },
619
764
  );
620
765
  }
766
+ const processId = providerProcessId(rebound);
621
767
  lease.bind({
622
768
  providerId: DESKTOP_PROVIDER_ID,
623
769
  providerSessionId: interactionId,
624
770
  observedAt: new Date().toISOString(),
771
+ ...(processId !== undefined ? { processId } : {}),
625
772
  });
626
773
  return interactionId;
627
774
  }
@@ -638,6 +785,55 @@ async function ensureProviderBinding(
638
785
  return rebindProviderSession(input, lease, provider);
639
786
  }
640
787
 
788
+ function providerProcessId(result: Record<string, unknown>): number | undefined {
789
+ const value = result.pid ?? result.process_id;
790
+ if (value === undefined) return undefined;
791
+ if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0 || value > 2_147_483_647) {
792
+ throw new AssistantPluginError(
793
+ 'PLUGIN_COMPUTER_TARGET_PROCESS_ID_INVALID',
794
+ 'Native Computer provider returned an invalid application process identifier.',
795
+ { retryable: false, details: { processId: value } },
796
+ );
797
+ }
798
+ return value;
799
+ }
800
+
801
+ function explicitLaunchProvenanceFromProviderResult(
802
+ result: Record<string, unknown>,
803
+ processId: number | undefined,
804
+ ): ComputerApplicationLaunchProvenance | undefined {
805
+ const rawOwnership = result.applicationOwnership ?? result.application_ownership;
806
+ const rawOwnedPid = result.ownedProcessIdentifier ?? result.owned_process_identifier;
807
+ if (rawOwnership === undefined && rawOwnedPid === undefined) return undefined;
808
+ if (rawOwnership === 'preexisting' && rawOwnedPid === undefined) return { kind: 'preexisting' };
809
+ if (rawOwnership === 'provider_launched'
810
+ && typeof rawOwnedPid === 'number'
811
+ && Number.isInteger(rawOwnedPid)
812
+ && rawOwnedPid > 0
813
+ && rawOwnedPid <= 2_147_483_647
814
+ && processId === rawOwnedPid) {
815
+ return { kind: 'provider_launched', processId: rawOwnedPid };
816
+ }
817
+ throw new AssistantPluginError(
818
+ 'PLUGIN_COMPUTER_TARGET_LAUNCH_PROVENANCE_INVALID',
819
+ 'Native Computer provider returned inconsistent application launch provenance.',
820
+ { retryable: false, details: { applicationOwnership: rawOwnership, ownedProcessIdentifier: rawOwnedPid, processId } },
821
+ );
822
+ }
823
+
824
+ function inheritedLaunchProvenance(
825
+ controllerHome: string,
826
+ processId: number | undefined,
827
+ ): ComputerApplicationLaunchProvenance | undefined {
828
+ if (processId === undefined) return undefined;
829
+ const owner = computerTargetAuthority.listAllApplications(controllerHome).find((target) =>
830
+ target.launchProvenance?.kind === 'provider_launched'
831
+ && target.launchProvenance.processId === processId
832
+ && target.providerBinding?.processId === processId,
833
+ );
834
+ return owner ? { kind: 'provider_launched', processId } : undefined;
835
+ }
836
+
641
837
  function stableIdentityFromProviderResult(
642
838
  result: Record<string, unknown>,
643
839
  requested: ComputerApplicationStableIdentity,
@@ -689,10 +885,35 @@ async function openDesktopTarget(
689
885
  }
690
886
  throw error;
691
887
  }
888
+ let processId: number | undefined;
889
+ let explicitProvenance: ComputerApplicationLaunchProvenance | undefined;
890
+ try {
891
+ processId = providerProcessId(opened);
892
+ explicitProvenance = explicitLaunchProvenanceFromProviderResult(opened, processId);
893
+ } catch (error) {
894
+ try {
895
+ await provider.executeAction(providerInput(input, 'desktop_session_close', { interaction_id: interactionId }, 'target-open-provenance-compensate'));
896
+ } catch (cleanupError) {
897
+ throw new AssistantPluginError('PLUGIN_COMPUTER_TARGET_LAUNCH_PROVENANCE_CLEANUP_UNKNOWN', 'Computer target launch provenance was invalid and provider-session cleanup could not be confirmed.', {
898
+ retryable: false,
899
+ details: { cause: error instanceof Error ? error.message : String(error), cleanupCause: cleanupError instanceof Error ? cleanupError.message : String(cleanupError) },
900
+ });
901
+ }
902
+ throw error;
903
+ }
692
904
  try {
905
+ const launchProvenance = explicitProvenance?.kind === 'provider_launched'
906
+ ? explicitProvenance
907
+ : inheritedLaunchProvenance(input.controllerHome, processId) ?? explicitProvenance;
693
908
  const target = computerTargetAuthority.create(input.controllerHome, {
694
909
  stableIdentity,
695
- providerBinding: { providerId: DESKTOP_PROVIDER_ID, providerSessionId: interactionId, observedAt: new Date().toISOString() },
910
+ ...(launchProvenance ? { launchProvenance } : {}),
911
+ providerBinding: {
912
+ providerId: DESKTOP_PROVIDER_ID,
913
+ providerSessionId: interactionId,
914
+ observedAt: new Date().toISOString(),
915
+ ...(processId !== undefined ? { processId } : {}),
916
+ },
696
917
  });
697
918
  return {
698
919
  targetId: target.targetId,
@@ -730,7 +951,27 @@ async function closeDesktopTarget(
730
951
  );
731
952
  }
732
953
  if (provider) {
733
- await provider.executeAction(providerInput(input, 'desktop_session_close', { interaction_id: target.providerBinding.providerSessionId }, 'target-close-provider'));
954
+ const activeTargets = computerTargetAuthority.listAllApplications(input.controllerHome);
955
+ const anotherActiveTargetUsesBinding = activeTargets.some((candidate) =>
956
+ candidate.targetId !== target.targetId
957
+ && candidate.providerBinding?.providerId === target.providerBinding?.providerId
958
+ && candidate.providerBinding?.providerSessionId === target.providerBinding?.providerSessionId,
959
+ );
960
+ if (!anotherActiveTargetUsesBinding) {
961
+ const ownedProcessId = target.launchProvenance?.kind === 'provider_launched'
962
+ ? target.launchProvenance.processId
963
+ : undefined;
964
+ const anotherActiveTargetUsesOwnedProcess = ownedProcessId !== undefined
965
+ && activeTargets.some((candidate) =>
966
+ candidate.targetId !== target.targetId && candidate.providerBinding?.processId === ownedProcessId,
967
+ );
968
+ await provider.executeAction(providerInput(input, 'desktop_session_close', {
969
+ interaction_id: target.providerBinding.providerSessionId,
970
+ ...(ownedProcessId !== undefined && !anotherActiveTargetUsesOwnedProcess
971
+ ? { terminate_owned_pid: ownedProcessId }
972
+ : {}),
973
+ }, 'target-close-provider'));
974
+ }
734
975
  }
735
976
  // A missing registration is authoritative absence only because provider uninstall
736
977
  // must stop/remove its native lifecycle before the registration is deleted.
@@ -796,7 +1037,7 @@ function targetAuthorization(identity: ComputerApplicationStableIdentity): Assis
796
1037
  }
797
1038
 
798
1039
  async function resolveDesktopAuthorizationContext(input: AssistantPluginActionExecutionInput): Promise<AssistantPluginAuthorizationContext | undefined> {
799
- if (input.actionId === COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION || input.actionId === COMPUTER_CONSOLE_UNLOCK_ACTION) return undefined;
1040
+ if ([COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION, COMPUTER_CONSOLE_UNLOCK_ACTION, COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION, COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION, COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION, COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION].includes(input.actionId)) return undefined;
800
1041
  if (input.actionId === DESKTOP_TARGET_OPEN_ACTION) return targetAuthorization(stableIdentityFromArgs(input.args));
801
1042
  const targetId = typeof input.args.target_id === 'string' ? input.args.target_id.trim() : '';
802
1043
  if (targetId) return targetAuthorization(computerTargetAuthority.require(input.controllerHome, targetId).stableIdentity);
@@ -804,30 +1045,67 @@ async function resolveDesktopAuthorizationContext(input: AssistantPluginActionEx
804
1045
  return provider.resolveAuthorizationContext?.(providerInput(input, input.actionId, input.args));
805
1046
  }
806
1047
 
1048
+ // Computer's browser subdomain always targets the user's real browser.
1049
+ // The independent Browser plugin retains explicit Playwright scripting modes,
1050
+ // but Computer must neither select nor silently fall back to those providers.
1051
+ function computerNativeBrowserInput(input: AssistantPluginActionExecutionInput): AssistantPluginActionExecutionInput {
1052
+ if (['configure', 'install_unpacked_extension', 'list_unpacked_extensions', 'clear_session', 'reconcile_sessions'].includes(input.actionId)) {
1053
+ throw new AssistantPluginError('PLUGIN_COMPUTER_BROWSER_SCRIPT_ACTION_SEPARATE',
1054
+ 'Browser profile configuration and script-managed extensions belong to the independent Browser plugin.', { retryable: false });
1055
+ }
1056
+ if ((input.args.browser_mode !== undefined && input.args.browser_mode !== 'attach_preferred')
1057
+ || (input.args.cdp_attach_fallback !== undefined && input.args.cdp_attach_fallback !== 'fail_closed')
1058
+ || (input.args.native_attach_mode !== undefined && input.args.native_attach_mode !== 'auto')) {
1059
+ throw new AssistantPluginError('PLUGIN_COMPUTER_BROWSER_SCRIPT_MODE_SEPARATE',
1060
+ 'Computer only operates the native browser; use the independent Browser plugin for scripted or isolated profiles.',
1061
+ { retryable: false });
1062
+ }
1063
+ return { ...input, args: { ...input.args,
1064
+ browser_mode: 'attach_preferred',
1065
+ cdp_attach_fallback: 'fail_closed',
1066
+ native_attach_mode: 'auto',
1067
+ __forge_computer_native_only: true,
1068
+ } };
1069
+ }
1070
+
807
1071
  export const computerPluginAdapter: AssistantPluginAdapter = {
808
1072
  pluginId: 'computer',
809
1073
  scope: 'controller_with_repository_overlay',
810
1074
  buildManifest: buildComputerManifest,
811
1075
  async resolveAuthorizationContext(input) {
1076
+ if (isIosPhysicalDeviceAction(input.actionId)) return resolveIosPhysicalDeviceAuthorizationContext(input);
812
1077
  if (!isDesktopProductAction(input.actionId)) {
813
- return resolveBrowserPluginAuthorizationContext({ ...input, pluginId: 'browser' });
1078
+ return resolveBrowserPluginAuthorizationContext(computerNativeBrowserInput(input));
814
1079
  }
815
1080
  return resolveDesktopAuthorizationContext(input);
816
1081
  },
817
1082
  async executeAction(input) {
1083
+ if (isIosPhysicalDeviceAction(input.actionId)) return executeIosPhysicalDeviceAction(input);
818
1084
  if (!isDesktopProductAction(input.actionId)) {
819
- return executeBrowserPluginAction({ ...input, pluginId: 'browser' });
1085
+ return executeBrowserPluginAction(computerNativeBrowserInput(input));
820
1086
  }
821
1087
  if (input.actionId === COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION) {
822
- return executeProtectedConsoleUnlockPreparation({ confirmAuthorization: true, timeoutMs: input.timeoutMs }, input.controllerHome);
1088
+ return executeProtectedConsoleUnlockPreparation({ confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
823
1089
  }
824
1090
  if (input.actionId === COMPUTER_CONSOLE_UNLOCK_ACTION) {
825
1091
  return executeProtectedConsoleUnlockInvocation({
826
1092
  credentialHandle: typeof input.args.credential_handle === 'string' ? input.args.credential_handle : '',
827
- confirmAuthorization: true,
1093
+ confirmAuthorization: input.confirmAuthorization === true,
828
1094
  timeoutMs: input.timeoutMs,
829
1095
  }, input.controllerHome);
830
1096
  }
1097
+ if (input.actionId === COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION) {
1098
+ return executeProtectedConsoleUnlockLifecycle('console_unlock_enroll', { confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
1099
+ }
1100
+ if (input.actionId === COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION) {
1101
+ return executeProtectedConsoleUnlockLifecycle('console_unlock_status', { confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
1102
+ }
1103
+ if (input.actionId === COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION) {
1104
+ return executeProtectedConsoleUnlockLifecycle('console_unlock_recover', { confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
1105
+ }
1106
+ if (input.actionId === COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION) {
1107
+ return executeProtectedConsoleUnlockLifecycle('console_unlock_revoke', { confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
1108
+ }
831
1109
  if (input.actionId === DESKTOP_TARGET_CLOSE_ACTION) return closeDesktopTarget(input, optionalDesktopProvider(input));
832
1110
  const provider = desktopProvider(input);
833
1111
  if (input.actionId === DESKTOP_TARGET_OPEN_ACTION) return openDesktopTarget(input, provider);
@@ -178,14 +178,46 @@ async function observeDesktopPointerTarget(
178
178
  return { frame, point, ...(reboundSelector ? { reboundSelector } : {}) };
179
179
  }
180
180
 
181
+ function focusedAxNodes(root: Record<string, unknown> | undefined): Record<string, unknown>[] {
182
+ if (!root) return [];
183
+ const focused: Record<string, unknown>[] = [];
184
+ const visit = (node: Record<string, unknown>): void => {
185
+ if (node.focused === true) focused.push(node);
186
+ for (const child of recordArray(node.children)) visit(child);
187
+ };
188
+ visit(root);
189
+ return focused;
190
+ }
191
+
181
192
  function exactFocusedDesktopWindowId(observation: Record<string, unknown>): number | undefined {
182
193
  const snapshot = recordValue(observation.snapshot);
183
194
  const root = recordValue(snapshot?.root);
184
- const focusedAxWindows = recordArray(root?.children).filter((window) =>
185
- firstString(window, 'role') === 'AXWindow' && window.focused === true);
186
- if (focusedAxWindows.length !== 1) return undefined;
195
+ const axWindows = recordArray(root?.children).filter((window) => firstString(window, 'role') === 'AXWindow');
196
+ const explicitFocused = axWindows.filter((window) => window.focused === true);
197
+ let focusedAxWindow: Record<string, unknown> | undefined;
198
+ if (explicitFocused.length === 1) {
199
+ focusedAxWindow = explicitFocused[0];
200
+ } else if (explicitFocused.length > 1) {
201
+ return undefined;
202
+ } else {
203
+ // Chromium-family apps can expose the system-frontmost window with
204
+ // AXWindow.focused=false while a descendant/control in that window is the
205
+ // unique focused AX node. Recover the same window only from unique bounded
206
+ // geometry; any ambiguity still fails closed.
207
+ const focusedNodes = focusedAxNodes(root).filter((node) => firstString(node, 'role') !== 'AXApplication');
208
+ if (focusedNodes.length !== 1) return undefined;
209
+ const focusedFrame = desktopFrame(focusedNodes[0]?.frame);
210
+ if (!focusedFrame) return undefined;
211
+ const point = desktopFrameCenter(focusedFrame);
212
+ const containingWindows = axWindows.filter((window) => {
213
+ const frame = desktopFrame(window.frame);
214
+ return Boolean(frame && frameContainsPoint(frame, point.x, point.y));
215
+ });
216
+ if (containingWindows.length !== 1) return undefined;
217
+ focusedAxWindow = containingWindows[0];
218
+ }
187
219
 
188
- const focusedTitle = firstString(focusedAxWindows[0]!, 'title');
220
+ const focusedTitle = firstString(focusedAxWindow, 'title');
189
221
  if (!focusedTitle) return undefined;
190
222
  const matches = recordArray(observation.windows).filter((window) => {
191
223
  const windowId = firstNumber(window, 'windowId', 'window_id');
@@ -9,7 +9,7 @@ import {
9
9
  import type { ExternalPluginRegistrationInput } from './external-registration';
10
10
  import type { AssistantPluginActionDescriptor } from './types';
11
11
 
12
- const CONTROLLER_WRITE = [{ resource: 'repo-state' as const, mode: 'write' as const }];
12
+ const CONTROLLER_WRITE = [{ resource: 'provider-state' as const, mode: 'write' as const }];
13
13
  const SELECTOR_SCHEMA = {
14
14
  type: 'object',
15
15
  properties: {
@@ -436,10 +436,10 @@ export function desktopOperatorActions(): AssistantPluginActionDescriptor[] {
436
436
  {
437
437
  actionId: 'desktop_session_close',
438
438
  title: 'Close desktop session',
439
- description: 'Close one Desktop Operator interaction session without terminating the target application.',
439
+ description: 'Close one Desktop Operator interaction session. Application termination is disabled by default and requires an exact Controller-owned process id.',
440
440
  readOnly: false,
441
441
  risk: 'workspace_write',
442
- confirmation: 'none',
442
+ confirmation: 'authorization',
443
443
  defaultTimeoutMs: 5_000,
444
444
  cancellable: true,
445
445
  idempotent: true,
@@ -447,7 +447,15 @@ export function desktopOperatorActions(): AssistantPluginActionDescriptor[] {
447
447
  resourceClaims: CONTROLLER_WRITE,
448
448
  argumentsSchema: {
449
449
  type: 'object',
450
- properties: { interaction_id: { type: 'string' } },
450
+ properties: {
451
+ interaction_id: { type: 'string' },
452
+ terminate_owned_pid: {
453
+ type: 'integer',
454
+ minimum: 1,
455
+ maximum: 2_147_483_647,
456
+ description: 'Exact provider-launched process id that the durable Computer target authority has decided is no longer used by another active target.',
457
+ },
458
+ },
451
459
  required: ['interaction_id'],
452
460
  additionalProperties: false,
453
461
  },
@@ -1,5 +1,5 @@
1
1
  import { AssistantPluginError } from './errors';
2
- import { getExternalPluginRegistration, listExternalPluginRegistrations, type ExternalPluginRegistration } from './external-registration';
2
+ import { externalPluginRegistrationSetIdentity, listExternalPluginRegistrations, type ExternalPluginRegistration } from './external-registration';
3
3
  import { callExternalUnixSocket, probeExternalUnixSocketSync, type ExternalUnixSocketCallOptions } from './external-unix-socket';
4
4
  import { executeManagedPluginProcess, executeManagedPluginProcessSync, type ManagedPluginProcessSpec } from './managed-process-adapter';
5
5
  import { activateAndVerifyFrontmostApplication, restartVerifiedUserLaunchAgent, startVerifiedUserLaunchAgent, stopVerifiedUserLaunchAgent } from './local-system-adapter';
@@ -149,6 +149,17 @@ function managedSpec(registration: ExternalPluginRegistration): ManagedPluginPro
149
149
  };
150
150
  }
151
151
 
152
+ function providerActionTimeoutMs(
153
+ registration: ExternalPluginRegistration,
154
+ actionId: string,
155
+ explicitTimeoutMs: number | undefined,
156
+ ): number | undefined {
157
+ if (explicitTimeoutMs !== undefined) return explicitTimeoutMs;
158
+ if (actionId === 'manifest' || actionId === 'health') return registration.transport.healthTimeoutMs;
159
+ return registration.actions.find((action) => action.actionId === actionId)?.defaultTimeoutMs
160
+ ?? registration.transport.actionTimeoutMs;
161
+ }
162
+
152
163
  function probeProvider(
153
164
  registration: ExternalPluginRegistration,
154
165
  requestId: string,
@@ -185,15 +196,17 @@ async function callProvider(
185
196
  requestId,
186
197
  method: isProviderMethod ? actionId : 'execute',
187
198
  params: isProviderMethod ? undefined : { action: actionId, arguments: args },
188
- timeoutMs: timeoutMs ?? (isProviderMethod ? registration.transport.healthTimeoutMs : registration.transport.actionTimeoutMs),
199
+ timeoutMs: providerActionTimeoutMs(registration, actionId, timeoutMs),
189
200
  signal,
190
201
  }));
191
202
  }
203
+ const descriptor = registration.actions.find((action) => action.actionId === actionId);
192
204
  return await (dependencies.managedCall ?? executeManagedPluginProcess)(managedSpec(registration), {
193
205
  requestId,
194
206
  actionId,
195
207
  input: args,
196
- timeoutMs: timeoutMs ?? (actionId === 'manifest' || actionId === 'health' ? registration.transport.healthTimeoutMs : registration.transport.actionTimeoutMs),
208
+ timeoutMs: providerActionTimeoutMs(registration, actionId, timeoutMs),
209
+ effectOutcomeOnTimeout: descriptor && !descriptor.readOnly ? 'outcome_unknown' : 'failed',
197
210
  signal,
198
211
  });
199
212
  }
@@ -256,13 +269,36 @@ function externalProviderPolicyContext(
256
269
  };
257
270
  }
258
271
 
272
+ interface ExternalPluginAdapterSnapshot {
273
+ registrationSetIdentity: string;
274
+ adapters: readonly AssistantPluginAdapter[];
275
+ byPluginId: ReadonlyMap<string, AssistantPluginAdapter>;
276
+ }
277
+
278
+ const externalPluginAdapterSnapshots = new Map<string, ExternalPluginAdapterSnapshot>();
279
+
280
+ function externalPluginAdapterSnapshot(controllerHome: string): ExternalPluginAdapterSnapshot {
281
+ const registrationSetIdentity = externalPluginRegistrationSetIdentity(controllerHome);
282
+ const cached = externalPluginAdapterSnapshots.get(controllerHome);
283
+ if (cached?.registrationSetIdentity === registrationSetIdentity) return cached;
284
+
285
+ const adapters = listExternalPluginRegistrations(controllerHome)
286
+ .map((registration) => createExternalPluginAdapter(registration));
287
+ const snapshot: ExternalPluginAdapterSnapshot = {
288
+ registrationSetIdentity,
289
+ adapters,
290
+ byPluginId: new Map(adapters.map((adapter) => [adapter.pluginId, adapter])),
291
+ };
292
+ externalPluginAdapterSnapshots.set(controllerHome, snapshot);
293
+ return snapshot;
294
+ }
295
+
259
296
  export function getExternalPluginAdapter(controllerHome: string, pluginId: string): AssistantPluginAdapter | undefined {
260
- const registration = getExternalPluginRegistration(controllerHome, pluginId);
261
- return registration ? createExternalPluginAdapter(registration) : undefined;
297
+ return externalPluginAdapterSnapshot(controllerHome).byPluginId.get(pluginId);
262
298
  }
263
299
 
264
300
  export function listExternalPluginAdapters(controllerHome: string): AssistantPluginAdapter[] {
265
- return listExternalPluginRegistrations(controllerHome).map((registration) => createExternalPluginAdapter(registration));
301
+ return [...externalPluginAdapterSnapshot(controllerHome).adapters];
266
302
  }
267
303
 
268
304
  export function createExternalPluginAdapter(