@moretea-labs/forge 1.7.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/AGENTS.md +58 -62
  2. package/CHANGELOG.md +26 -0
  3. package/CLAUDE.md +42 -62
  4. package/README.md +2 -2
  5. package/SKILL.md +0 -1
  6. package/THIRD_PARTY_NOTICES.md +5 -2
  7. package/adapters/browser/index.ts +2 -0
  8. package/adapters/chatgpt/browser-delivery-host.ts +71 -0
  9. package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
  10. package/adapters/chatgpt/controller-binding-store.ts +55 -0
  11. package/adapters/chatgpt/controller-host.ts +119 -0
  12. package/adapters/chatgpt/controller-round-host.ts +78 -0
  13. package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
  14. package/adapters/chatgpt/provider-delivery.ts +113 -0
  15. package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
  16. package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
  17. package/adapters/computer/desktop-operator-contract.ts +7 -0
  18. package/adapters/computer/desktop-operator-discovery.ts +201 -0
  19. package/adapters/computer/desktop-operator-negotiation.ts +174 -0
  20. package/adapters/computer/desktop-operator-provider.ts +312 -0
  21. package/adapters/computer/index.ts +1 -0
  22. package/adapters/computer/interaction-target-authority.ts +944 -0
  23. package/adapters/controller-process/binding-store.ts +34 -0
  24. package/adapters/controller-process/controller-host.ts +26 -0
  25. package/adapters/mcp/access-mode.ts +132 -0
  26. package/adapters/mcp/audit.ts +32 -0
  27. package/adapters/mcp/auth.ts +407 -0
  28. package/adapters/mcp/controller-round-compatibility.ts +184 -0
  29. package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
  30. package/adapters/mcp/instructions.ts +36 -0
  31. package/adapters/mcp/legacy-context.ts +18 -0
  32. package/adapters/mcp/multi-repository.ts +437 -0
  33. package/adapters/mcp/oauth.ts +391 -0
  34. package/adapters/mcp/paths.ts +140 -0
  35. package/adapters/mcp/policy.ts +232 -0
  36. package/adapters/mcp/proxy-env.ts +62 -0
  37. package/adapters/mcp/readiness-projection.ts +24 -0
  38. package/adapters/mcp/redaction.ts +21 -0
  39. package/adapters/mcp/repo.ts +24 -0
  40. package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
  41. package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
  42. package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
  43. package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
  44. package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
  45. package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
  46. package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
  47. package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
  48. package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
  49. package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
  50. package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
  51. package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
  52. package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
  53. package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
  54. package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
  55. package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
  56. package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
  57. package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
  58. package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
  59. package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
  60. package/adapters/mcp/runtime-gateway/router.ts +728 -0
  61. package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
  62. package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
  63. package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
  64. package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
  65. package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
  66. package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
  67. package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
  68. package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
  69. package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
  70. package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
  71. package/adapters/mcp/server.ts +1048 -0
  72. package/adapters/mcp/setup.ts +791 -0
  73. package/adapters/mcp/tool-capability-cache.ts +87 -0
  74. package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
  75. package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
  76. package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
  77. package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
  78. package/adapters/mcp/tool-mapping/tools.ts +9 -0
  79. package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
  80. package/adapters/mcp/toolset-names.ts +74 -0
  81. package/adapters/mcp/toolset-selection.ts +41 -0
  82. package/adapters/mcp/toolset.ts +336 -0
  83. package/adapters/mcp/transports/http.ts +1456 -0
  84. package/adapters/mcp/transports/session-registry.ts +513 -0
  85. package/adapters/mcp/transports/stdio.ts +8 -0
  86. package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
  87. package/adapters/mcp/types.ts +41 -0
  88. package/assets/AGENTS.md +2 -16
  89. package/assets/CLAUDE.md +2 -16
  90. package/assets/hooks/AGENTS.md +3 -14
  91. package/assets/hooks/CLAUDE.md +3 -14
  92. package/assets/hooks/hook-input.sh +9 -2
  93. package/assets/hooks/lib/workflow-state.sh +28 -10
  94. package/assets/hooks/prompt-guard.sh +63 -37
  95. package/assets/hooks/security-sentinel.sh +2 -1
  96. package/assets/hooks/session-start-context.sh +7 -5
  97. package/assets/hooks/stop-orchestrator.sh +13 -3
  98. package/assets/initializer-question-pack.v4.json +11 -7
  99. package/assets/partials/05-workflow.partial.md +18 -73
  100. package/assets/partials/07-footer.partial.md +1 -1
  101. package/assets/partials-agents/02-operating-mode.partial.md +1 -2
  102. package/assets/partials-agents/04-task-protocol.partial.md +14 -59
  103. package/assets/partials-agents/06-quality-safety.partial.md +11 -16
  104. package/assets/partials-agents/08-deep-docs.partial.md +1 -2
  105. package/assets/plan-map.json +11 -11
  106. package/assets/plugin-registry.v1.json +9 -3
  107. package/assets/plugin-trust-policy.v1.json +6 -0
  108. package/assets/recovery/ForgeRecovery.ps1 +100 -0
  109. package/assets/recovery/forge-wsl-rescue +271 -0
  110. package/assets/reference-configs/development-protocol.md +11 -15
  111. package/assets/reference-configs/document-generation.md +1 -1
  112. package/assets/reference-configs/global-working-rules.md +9 -1
  113. package/assets/reference-configs/harness-overview.md +22 -112
  114. package/assets/reference-configs/hook-operations.md +1 -1
  115. package/assets/reference-configs/sprint-contracts.md +2 -2
  116. package/assets/skill-version.json +2 -2
  117. package/assets/templates/helpers/architecture-event.ts +3 -34
  118. package/assets/templates/helpers/architecture-queue.sh +61 -10
  119. package/assets/templates/helpers/archive-workflow.sh +90 -180
  120. package/assets/templates/helpers/capability-config.ts +8 -11
  121. package/assets/templates/helpers/capability-resolver.ts +37 -19
  122. package/assets/templates/helpers/capture-plan.sh +2 -2
  123. package/assets/templates/helpers/check-architecture-sync.sh +1 -9
  124. package/assets/templates/helpers/check-task-sync.sh +82 -11
  125. package/assets/templates/helpers/check-task-workflow.sh +1 -3
  126. package/assets/templates/helpers/context-contract-sync.sh +1 -12
  127. package/assets/templates/helpers/contract-worktree.sh +26 -24
  128. package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
  129. package/assets/templates/helpers/inspect-project-state.ts +1 -1
  130. package/assets/templates/helpers/migrate-project-template.sh +1 -1
  131. package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
  132. package/assets/templates/helpers/new-plan.sh +2 -2
  133. package/assets/templates/helpers/plan-to-todo.sh +3 -31
  134. package/assets/templates/helpers/sprint-backlog.sh +1 -1
  135. package/assets/templates/helpers/switch-plan.sh +1 -1
  136. package/assets/templates/helpers/workflow-contract.ts +1 -0
  137. package/assets/workflow-contract.v1.json +63 -171
  138. package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
  139. package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
  140. package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
  141. package/docs/architecture/CURRENT.md +148 -13
  142. package/docs/architecture/EVOLUTION.md +13 -0
  143. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
  144. package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
  145. package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
  146. package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
  147. package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
  148. package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
  149. package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
  150. package/docs/architecture/domains/verification.md +7 -0
  151. package/docs/architecture/domains/workflow-engine.md +1 -1
  152. package/docs/architecture/index.md +3 -3
  153. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
  154. package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
  155. package/docs/forge-chatgpt-mcp-setup.md +5 -3
  156. package/docs/forge-plugin-management.md +20 -4
  157. package/docs/forge-runtime-self-healing-loop.md +2 -0
  158. package/docs/operations/benchmark-cross-version-freeze.md +38 -0
  159. package/docs/operations/controller-browser-plugin.md +3 -1
  160. package/docs/operations/homebrew.md +2 -2
  161. package/docs/operations/platform-support.md +16 -8
  162. package/docs/operations/platform-support.zh-CN.md +2 -2
  163. package/docs/operations/standalone-disaster-recovery.md +26 -1
  164. package/docs/operations/uu-remote-rescue.md +41 -0
  165. package/docs/operations/windows-wsl-host-rescue.md +133 -0
  166. package/docs/public-usage-guide.md +1 -1
  167. package/docs/public-usage-guide.zh-CN.md +1 -1
  168. package/docs/tutorials/01-install-and-start.md +1 -1
  169. package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
  170. package/docs/tutorials/02-connect-chatgpt.md +4 -4
  171. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
  172. package/docs/wiki/Implementation.md +1 -1
  173. package/package.json +23 -14
  174. package/packages/kernel/controller/api/index.ts +2 -0
  175. package/packages/kernel/controller/application/controller-round-service.ts +29 -0
  176. package/packages/kernel/controller/application/controller-service.ts +30 -0
  177. package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
  178. package/packages/kernel/controller/domain/controller-round.ts +107 -0
  179. package/packages/kernel/controller/domain/execution-quality.ts +133 -0
  180. package/packages/kernel/controller/domain/types.ts +56 -0
  181. package/packages/kernel/controller/index.ts +1 -0
  182. package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
  183. package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
  184. package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
  185. package/packages/kernel/controller/ports/controller-host.ts +16 -0
  186. package/packages/kernel/goal/api/index.ts +1 -0
  187. package/packages/kernel/goal/domain/types.ts +40 -0
  188. package/packages/kernel/goal/index.ts +1 -0
  189. package/packages/kernel/identity/api/index.ts +5 -0
  190. package/packages/kernel/identity/application/identity-service.ts +67 -0
  191. package/packages/kernel/identity/domain/scope.ts +63 -0
  192. package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
  193. package/packages/kernel/identity/domain/types.ts +44 -0
  194. package/packages/kernel/identity/domain/workspace.ts +56 -0
  195. package/packages/kernel/identity/index.ts +1 -0
  196. package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
  197. package/packages/kernel/memory/api/index.ts +5 -0
  198. package/packages/kernel/memory/application/experience-service.ts +118 -0
  199. package/packages/kernel/memory/application/outcome-service.ts +77 -0
  200. package/packages/kernel/memory/domain/experience.ts +103 -0
  201. package/packages/kernel/memory/domain/operational-prior.ts +92 -0
  202. package/packages/kernel/memory/index.ts +1 -0
  203. package/packages/kernel/progression/api/index.ts +2 -0
  204. package/packages/kernel/progression/application/projector.ts +211 -0
  205. package/packages/kernel/progression/domain/types.ts +116 -0
  206. package/packages/kernel/progression/index.ts +1 -0
  207. package/packages/kernel/scheduler/api/index.ts +6 -0
  208. package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
  209. package/packages/kernel/scheduler/application/eligibility.ts +252 -0
  210. package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
  211. package/packages/kernel/scheduler/application/settlement.ts +197 -0
  212. package/packages/kernel/scheduler/domain/continuation.ts +38 -0
  213. package/packages/kernel/scheduler/domain/schedule.ts +149 -0
  214. package/packages/kernel/scheduler/index.ts +1 -0
  215. package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
  216. package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
  217. package/packages/kernel/work/api/index.ts +15 -0
  218. package/packages/kernel/work/application/work-service.ts +148 -0
  219. package/packages/kernel/work/domain/admission-policy.ts +34 -0
  220. package/packages/kernel/work/domain/check-receipt.ts +43 -0
  221. package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
  222. package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
  223. package/packages/kernel/work/domain/engineering-design.ts +281 -0
  224. package/packages/kernel/work/domain/engineering-profile.ts +242 -0
  225. package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
  226. package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
  227. package/packages/kernel/work/domain/implementation-review.ts +510 -0
  228. package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
  229. package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
  230. package/packages/kernel/work/domain/state-machine.ts +259 -0
  231. package/packages/kernel/work/domain/types.ts +528 -0
  232. package/packages/kernel/work/index.ts +1 -0
  233. package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
  234. package/packages/kernel/work/ports/work-contract-store.ts +18 -0
  235. package/packages/plugin-runtime/browser/index.ts +3 -0
  236. package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
  237. package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
  238. package/packages/plugin-runtime/browser/session-authority.ts +61 -0
  239. package/packages/plugin-runtime/computer/index.ts +6 -0
  240. package/packages/plugin-runtime/computer/provider-error.ts +26 -0
  241. package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
  242. package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
  243. package/packages/plugin-runtime/computer/provider.ts +19 -0
  244. package/packages/plugin-runtime/computer/target-authority.ts +190 -0
  245. package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
  246. package/packages/plugin-runtime/external/index.ts +1 -0
  247. package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
  248. package/packages/plugin-runtime/index.ts +3 -0
  249. package/packages/protocols/browser/index.ts +1 -0
  250. package/packages/protocols/browser/session.ts +98 -0
  251. package/packages/protocols/computer/contract.ts +199 -0
  252. package/packages/protocols/computer/index.ts +1 -0
  253. package/packages/protocols/failure/contract.ts +158 -0
  254. package/packages/protocols/failure/index.ts +1 -0
  255. package/packages/protocols/handoff/index.ts +1 -0
  256. package/packages/protocols/handoff/status.ts +22 -0
  257. package/packages/protocols/mcp/execution-context.ts +11 -0
  258. package/packages/protocols/mcp/index.ts +2 -0
  259. package/packages/protocols/mcp/tool-contract.ts +42 -0
  260. package/packages/workflow-runtime/api/index.ts +2 -0
  261. package/packages/workflow-runtime/application/interpreter.ts +342 -0
  262. package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
  263. package/packages/workflow-runtime/index.ts +1 -0
  264. package/scripts/assemble-template.ts +1 -1
  265. package/scripts/benchmark-computer-hotpath.ts +255 -0
  266. package/scripts/benchmark-controller-round2.ts +54 -2
  267. package/scripts/benchmark-ios-agent-device.ts +3 -6
  268. package/scripts/benchmark-mcp-transport.ts +3 -4
  269. package/scripts/benchmark-operational-memory-activation.ts +235 -0
  270. package/scripts/benchmark-operational-shadow.ts +28 -0
  271. package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
  272. package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
  273. package/scripts/canary-controller-semantic-wait.ts +195 -0
  274. package/scripts/canary-global-hook.sh +2 -2
  275. package/scripts/check-mcp-compatibility.ts +173 -7
  276. package/scripts/check-platform-support.mjs +28 -2
  277. package/scripts/check-public-docs.sh +1 -1
  278. package/scripts/check-release-readiness.sh +1 -1
  279. package/scripts/check-repository-hygiene.mjs +92 -0
  280. package/scripts/check-runtime-architecture.mjs +1206 -95
  281. package/scripts/check-source-duplication.mjs +9 -1
  282. package/scripts/check-tarball-install-smoke.sh +98 -15
  283. package/scripts/controller-ngrok-rotation.sh +5 -4
  284. package/scripts/create-project-dirs.sh +10 -74
  285. package/scripts/forge-local-recovery-helper.mjs +204 -0
  286. package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
  287. package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
  288. package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
  289. package/scripts/hook-shim.sh +2 -2
  290. package/scripts/init-project.sh +12 -70
  291. package/scripts/install-desktop-operator-registration.ts +4 -2
  292. package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
  293. package/scripts/install-standalone-recovery.ts +122 -10
  294. package/scripts/install-uu-remote-rescue-registration.ts +74 -0
  295. package/scripts/install-windows-host-recovery-registration.ts +22 -0
  296. package/scripts/lib/controller-home-env.sh +6 -3
  297. package/scripts/lib/project-init-lib.sh +39 -582
  298. package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
  299. package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
  300. package/scripts/open-source-audit-allowlist.txt +12 -1
  301. package/scripts/portability-bindings.mjs +70 -0
  302. package/scripts/run-bounded-command.mjs +55 -0
  303. package/scripts/run-bun-test-file.ts +22 -6
  304. package/scripts/run-governed-gate.ts +4 -1
  305. package/scripts/smoke-mcp-http-runtime.ts +1 -1
  306. package/scripts/smoke-runtime-recovery.ts +34 -1
  307. package/scripts/smoke-schedule-engine.ts +1 -1
  308. package/scripts/stage-runtime-release.ts +6 -1
  309. package/scripts/test-governance.ts +51 -2
  310. package/src/cli/agent-jobs/job-manager.ts +10 -1
  311. package/src/cli/chatgpt-browser/bind-server.ts +2 -1
  312. package/src/cli/chatgpt-browser/binding.ts +20 -10
  313. package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
  314. package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
  315. package/src/cli/chatgpt-browser/engine.ts +10 -11
  316. package/src/cli/chatgpt-browser/native-provider.ts +24 -83
  317. package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
  318. package/src/cli/chatgpt-browser/types.ts +1 -0
  319. package/src/cli/commands/bootstrap-control.ts +334 -0
  320. package/src/cli/commands/brain-assistant.ts +38 -0
  321. package/src/cli/commands/brain.ts +193 -40
  322. package/src/cli/commands/chatgpt.ts +127 -0
  323. package/src/cli/commands/computer.ts +437 -0
  324. package/src/cli/commands/doctor.ts +18 -1
  325. package/src/cli/commands/init-hook.ts +71 -61
  326. package/src/cli/commands/init.ts +3 -1
  327. package/src/cli/commands/mcp.ts +16 -10
  328. package/src/cli/commands/plugin.ts +38 -12
  329. package/src/cli/commands/recovery.ts +493 -80
  330. package/src/cli/commands/runtime.ts +9 -4
  331. package/src/cli/commands/setup-profile.ts +89 -39
  332. package/src/cli/commands/status.ts +2 -1
  333. package/src/cli/controller/check-runner.ts +487 -98
  334. package/src/cli/controller/context/types.ts +7 -1
  335. package/src/cli/controller/context-pack.ts +23 -3
  336. package/src/cli/controller/issue-store.ts +1 -1
  337. package/src/cli/controller/systemd-user.ts +110 -0
  338. package/src/cli/controller/types.ts +10 -70
  339. package/src/cli/controller/worklog.ts +67 -13
  340. package/src/cli/editing/edit-operation-contract.ts +92 -0
  341. package/src/cli/editing/edit-session.ts +289 -13
  342. package/src/cli/github/plugin.ts +17 -12
  343. package/src/cli/hook/route-registry.ts +3 -5
  344. package/src/cli/hook/runtime.ts +49 -3
  345. package/src/cli/index.ts +3 -0
  346. package/src/cli/local-bridge/connector-freshness.ts +2 -2
  347. package/src/cli/local-bridge/console-automations.ts +2 -2
  348. package/src/cli/local-bridge/facade-api.ts +41 -14
  349. package/src/cli/local-bridge/job-store.ts +1 -1
  350. package/src/cli/local-bridge/server.ts +24 -27
  351. package/src/cli/mcp/access-mode.ts +2 -132
  352. package/src/cli/mcp/access-tools.ts +2 -387
  353. package/src/cli/mcp/audit.ts +2 -32
  354. package/src/cli/mcp/auth.ts +2 -404
  355. package/src/cli/mcp/instructions.ts +2 -34
  356. package/src/cli/mcp/legacy-context.ts +2 -16
  357. package/src/cli/mcp/legacy-tool-service.ts +2 -5308
  358. package/src/cli/mcp/multi-repository.ts +2 -436
  359. package/src/cli/mcp/oauth.ts +2 -375
  360. package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
  361. package/src/cli/mcp/paths.ts +2 -140
  362. package/src/cli/mcp/policy.ts +2 -232
  363. package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
  364. package/src/cli/mcp/proxy-env.ts +2 -62
  365. package/src/cli/mcp/readiness-projection.ts +2 -24
  366. package/src/cli/mcp/redaction.ts +2 -21
  367. package/src/cli/mcp/repo.ts +2 -24
  368. package/src/cli/mcp/repository-tools.ts +2 -1613
  369. package/src/cli/mcp/server.ts +2 -951
  370. package/src/cli/mcp/setup.ts +2 -737
  371. package/src/cli/mcp/tool-capability-cache.ts +2 -87
  372. package/src/cli/mcp/tool-contract.ts +2 -14
  373. package/src/cli/mcp/tools.ts +2 -9
  374. package/src/cli/mcp/toolset-names.ts +2 -70
  375. package/src/cli/mcp/toolset-selection.ts +2 -41
  376. package/src/cli/mcp/toolset.ts +2 -336
  377. package/src/cli/mcp/transports/AGENTS.md +1 -10
  378. package/src/cli/mcp/transports/CLAUDE.md +1 -10
  379. package/src/cli/mcp/transports/http.ts +2 -1414
  380. package/src/cli/mcp/transports/session-registry.ts +2 -490
  381. package/src/cli/mcp/transports/stdio.ts +2 -8
  382. package/src/cli/mcp/types.ts +2 -41
  383. package/src/cli/mcp/umbrella-tools.ts +2 -117
  384. package/src/cli/repositories/command-executor.ts +64 -18
  385. package/src/cli/repositories/command-scope.ts +117 -1
  386. package/src/cli/repositories/controller-home.ts +119 -1
  387. package/src/cli/repositories/identity.ts +13 -0
  388. package/src/cli/repositories/registry.ts +68 -49
  389. package/src/cli/repositories/repository-snapshot.ts +53 -7
  390. package/src/cli/repositories/runtime-storage.ts +27 -2
  391. package/src/cli/repositories/safe-patch.ts +34 -38
  392. package/src/cli/repositories/selected-path-actions.ts +22 -2
  393. package/src/cli/repositories/structured-git.ts +105 -25
  394. package/src/cli/runtime/helper-runner.ts +7 -0
  395. package/src/cli/runtime-invocation.ts +8 -1
  396. package/src/cli/tools/codegraph.ts +44 -25
  397. package/src/core/adoption/manifest-templates.ts +1 -1
  398. package/src/core/adoption/plan.ts +3 -26
  399. package/src/core/adoption/workflow-contract-plan.ts +17 -9
  400. package/src/effects/process-runner.ts +8 -14
  401. package/src/runtime/context/assistant-context.ts +154 -0
  402. package/src/runtime/context/assistant-work-context.ts +147 -0
  403. package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
  404. package/src/runtime/context/codegraph-read-provider.ts +55 -22
  405. package/src/runtime/context/codegraph-sidecar.cjs +8 -1
  406. package/src/runtime/context/context-closure.ts +268 -0
  407. package/src/runtime/context/context-plane.ts +211 -0
  408. package/src/runtime/context/project-engineering-contract.ts +60 -0
  409. package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
  410. package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
  411. package/src/runtime/control-plane/bootstrap/index.ts +5 -0
  412. package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
  413. package/src/runtime/control-plane/bootstrap/store.ts +21 -0
  414. package/src/runtime/control-plane/bootstrap/types.ts +87 -0
  415. package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
  416. package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
  417. package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
  418. package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
  419. package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
  420. package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
  421. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +369 -99
  422. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
  423. package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
  424. package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
  425. package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
  426. package/src/runtime/control-plane/execution/validation.ts +28 -3
  427. package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
  428. package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
  429. package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
  430. package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
  431. package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
  432. package/src/runtime/control-plane/execution/work-handle-authority.ts +219 -22
  433. package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
  434. package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
  435. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
  436. package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
  437. package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
  438. package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
  439. package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
  440. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
  441. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
  442. package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
  443. package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
  444. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
  445. package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
  446. package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
  447. package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
  448. package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
  449. package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
  450. package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
  451. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
  452. package/src/runtime/control-plane/facade/index.ts +4 -2
  453. package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
  454. package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
  455. package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
  456. package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
  457. package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
  458. package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
  459. package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
  460. package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
  461. package/src/runtime/control-plane/facade/types.ts +189 -532
  462. package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
  463. package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
  464. package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
  465. package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
  466. package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
  467. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
  468. package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
  469. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
  470. package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
  471. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
  472. package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
  473. package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
  474. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
  475. package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
  476. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
  477. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
  478. package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
  479. package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
  480. package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
  481. package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
  482. package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
  483. package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
  484. package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
  485. package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
  486. package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
  487. package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
  488. package/src/runtime/control-plane/release-retention.ts +56 -16
  489. package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
  490. package/src/runtime/control-plane/routing/route-policy.ts +19 -0
  491. package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
  492. package/src/runtime/control-plane/runtime-generation.ts +6 -0
  493. package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
  494. package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
  495. package/src/runtime/diagnostics/incident-repair.ts +406 -0
  496. package/src/runtime/diagnostics/mcp-timing.ts +125 -6
  497. package/src/runtime/diagnostics/performance.ts +6 -14
  498. package/src/runtime/diagnostics/read-only-tool.ts +1 -1
  499. package/src/runtime/evidence/artifact-store.ts +65 -2
  500. package/src/runtime/evidence/operational-shadow.ts +38 -0
  501. package/src/runtime/evidence/process-check-receipt.ts +5 -43
  502. package/src/runtime/evidence/sensitive-output.ts +4 -4
  503. package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
  504. package/src/runtime/execution/jobs/store.ts +121 -2
  505. package/src/runtime/execution/managed-workspace.ts +55 -5
  506. package/src/runtime/execution/process-runtime/canary.ts +19 -5
  507. package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
  508. package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
  509. package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
  510. package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
  511. package/src/runtime/execution/process-runtime/check-result.ts +73 -2
  512. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
  513. package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
  514. package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
  515. package/src/runtime/execution/process-runtime/index.ts +1 -0
  516. package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
  517. package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
  518. package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
  519. package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
  520. package/src/runtime/execution/process-runtime/runtime.ts +132 -15
  521. package/src/runtime/execution/process-runtime/types.ts +22 -0
  522. package/src/runtime/execution/workers/executor.ts +16 -13
  523. package/src/runtime/execution/workers/worker-entry.ts +1 -1
  524. package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
  525. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
  526. package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
  527. package/src/runtime/gateway/mcp/process-tools.ts +2 -289
  528. package/src/runtime/gateway/mcp/router.ts +2 -1125
  529. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
  530. package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6655
  531. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
  532. package/src/runtime/maintenance/cleanup.ts +38 -24
  533. package/src/runtime/platform/browser-product-discovery.ts +174 -0
  534. package/src/runtime/platform/computer-platform.ts +14 -0
  535. package/src/runtime/platform/executable-discovery.ts +54 -0
  536. package/src/runtime/platform/fetch-http-server.ts +90 -0
  537. package/src/runtime/platform/service-manager.ts +138 -0
  538. package/src/runtime/platform/windows-host-discovery.ts +118 -0
  539. package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
  540. package/src/runtime/plugins/action-application.ts +135 -0
  541. package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
  542. package/src/runtime/plugins/browser-adapter.ts +140 -100
  543. package/src/runtime/plugins/browser-automation-service.ts +15 -36
  544. package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
  545. package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
  546. package/src/runtime/plugins/browser-native-session-service.ts +1 -1
  547. package/src/runtime/plugins/browser-provider-registry.ts +2 -109
  548. package/src/runtime/plugins/browser-registration.ts +16 -0
  549. package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
  550. package/src/runtime/plugins/browser-runtime.ts +41 -9
  551. package/src/runtime/plugins/browser-session-authority.ts +101 -291
  552. package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
  553. package/src/runtime/plugins/browser-session-store.ts +229 -36
  554. package/src/runtime/plugins/browser-session-types.ts +2 -98
  555. package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
  556. package/src/runtime/plugins/catalog-trust.ts +82 -0
  557. package/src/runtime/plugins/computer-registration.ts +839 -0
  558. package/src/runtime/plugins/config-store.ts +119 -0
  559. package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
  560. package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
  561. package/src/runtime/plugins/errors.ts +8 -1
  562. package/src/runtime/plugins/external-adapter.ts +45 -322
  563. package/src/runtime/plugins/external-provider-policy.ts +48 -0
  564. package/src/runtime/plugins/external-registration.ts +9 -1
  565. package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
  566. package/src/runtime/plugins/external-unix-socket.ts +64 -193
  567. package/src/runtime/plugins/first-party-external-registration.ts +163 -0
  568. package/src/runtime/plugins/first-party-registry.ts +3 -1
  569. package/src/runtime/plugins/github-adapter.ts +1 -2
  570. package/src/runtime/plugins/gmail-adapter.ts +6 -6
  571. package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
  572. package/src/runtime/plugins/google-shared.ts +31 -46
  573. package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
  574. package/src/runtime/plugins/ios-adapter.ts +1 -2
  575. package/src/runtime/plugins/local-system-adapter.ts +180 -0
  576. package/src/runtime/plugins/macos-capability-broker.ts +15 -105
  577. package/src/runtime/plugins/resend-adapter.ts +15 -24
  578. package/src/runtime/plugins/store.ts +493 -51
  579. package/src/runtime/plugins/types.ts +8 -1
  580. package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
  581. package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
  582. package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
  583. package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
  584. package/src/runtime/projections/controller-context.ts +12 -6
  585. package/src/runtime/projections/git-status-sampler.ts +73 -22
  586. package/src/runtime/projections/materialized-view.ts +14 -8
  587. package/src/runtime/recovery/capability-action-application.ts +228 -0
  588. package/src/runtime/recovery/index.ts +3 -0
  589. package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
  590. package/src/runtime/recovery/local-jobs-repair.ts +14 -14
  591. package/src/runtime/recovery/maintenance-executor.ts +358 -76
  592. package/src/runtime/recovery/quarantine-retention.ts +256 -0
  593. package/src/runtime/release/identity.ts +6 -0
  594. package/src/runtime/resources/leases/store.ts +1 -1
  595. package/src/runtime/root/active-execution-power-assertion.ts +139 -0
  596. package/src/runtime/root/assistant-learning-loop.ts +45 -0
  597. package/src/runtime/root/browser-session-composition.ts +59 -0
  598. package/src/runtime/root/computer-composition.ts +191 -0
  599. package/src/runtime/root/computer-target-composition.ts +16 -0
  600. package/src/runtime/root/computer-target-persistence.ts +39 -0
  601. package/src/runtime/root/controller-round-composition.ts +107 -0
  602. package/src/runtime/root/controller-services.ts +2 -0
  603. package/src/runtime/root/entry.ts +4 -3
  604. package/src/runtime/root/gateway-adapter.ts +3 -3
  605. package/src/runtime/root/local-bridge.ts +5 -2
  606. package/src/runtime/root/mcp-transport.ts +5 -5
  607. package/src/runtime/root/package-connector-service.ts +108 -56
  608. package/src/runtime/root/package-runtime-release.ts +85 -18
  609. package/src/runtime/root/package-runtime-service.ts +60 -97
  610. package/src/runtime/root/release-execution-canary.ts +71 -0
  611. package/src/runtime/root/release-loader.ts +68 -0
  612. package/src/runtime/root/release-manifest.ts +106 -2
  613. package/src/runtime/root/release-materialize.ts +103 -4
  614. package/src/runtime/root/release-store.ts +31 -2
  615. package/src/runtime/root/runtime.ts +240 -25
  616. package/src/runtime/root/scheduled-controller-composition.ts +51 -0
  617. package/src/runtime/root/scheduler.ts +12 -4
  618. package/src/runtime/root/service-runner.ts +1 -1
  619. package/src/runtime/root/service.ts +41 -16
  620. package/src/runtime/root/status.ts +1 -0
  621. package/src/runtime/root/types.ts +24 -1
  622. package/src/runtime/shared/local-bridge-surface.ts +1 -1
  623. package/src/runtime/shared/process-environment.ts +19 -4
  624. package/src/runtime/shared/storage-capacity.ts +68 -0
  625. package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
  626. package/src/runtime/standalone-recovery/core.ts +984 -230
  627. package/src/runtime/standalone-recovery/entry.ts +182 -51
  628. package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
  629. package/src/runtime/standalone-recovery/installer.ts +212 -104
  630. package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
  631. package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
  632. package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
  633. package/src/runtime/standalone-recovery/performance.ts +135 -0
  634. package/src/runtime/standalone-recovery/release.ts +5 -0
  635. package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
  636. package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
  637. package/src/runtime/workflow/schedules/engine.ts +191 -343
  638. package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
  639. package/src/runtime/workflow/schedules/settlement.ts +2 -191
  640. package/src/runtime/workflow/schedules/store.ts +2 -607
  641. package/src/runtime/workflow/schedules/types.ts +2 -127
  642. package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
  643. package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
  644. package/src/runtime/workflows/runtime.ts +486 -0
  645. package/src/testing/test-governance.ts +90 -29
  646. package/assets/templates/helpers/archive-architecture-request.sh +0 -244
  647. package/docs/architecture/history/README.md +0 -7
  648. package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
  649. package/docs/architecture/history/global-hook-runtime.md +0 -166
  650. package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
  651. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  652. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
  653. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
  654. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
  655. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
  656. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  657. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  658. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  659. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
  660. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
  661. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  662. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  663. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
  664. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  665. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  666. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  667. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  668. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
  669. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
  670. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
  671. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
  672. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
  673. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  674. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  675. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
  676. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
  677. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
  678. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
  679. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
  680. package/docs/architecture/requests/archive/2026/root.md +0 -68
  681. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
  682. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
  683. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
  684. package/scripts/archive-architecture-request.sh +0 -4
  685. package/scripts/run-skill-evals.ts +0 -1022
@@ -9,7 +9,7 @@ import {
9
9
  type BrowserAutomationTrustedInput,
10
10
  } from './browser-automation-service';
11
11
  import { AssistantPluginError } from './errors';
12
- import type { BrowserNativeAttachAttempt, BrowserNativeProduct } from './browser-session-types';
12
+ import type { BrowserNativeAttachAttempt, BrowserNativeProduct } from '../../../packages/protocols/browser/index';
13
13
 
14
14
  const RECORD_SEPARATOR = String.fromCharCode(30);
15
15
  const DEFAULT_NATIVE_TIMEOUT_MS = 5_000;
@@ -267,7 +267,7 @@ async function sendBrowserTrustedInput(
267
267
  || /\bBROWSER_AUTOMATION_ACTION_UNSUPPORTED\b/.test(message)) {
268
268
  throw new AssistantPluginError(
269
269
  'PLUGIN_BROWSER_TRUSTED_INPUT_UNAVAILABLE',
270
- 'Installed Forge Desktop Operator does not support native browser trusted input. Keep the exact tab explicitly foregrounded and use a separately grounded Desktop Operator interaction, or upgrade the stable Desktop Operator provider.',
270
+ 'The configured Computer input provider does not support native browser trusted input. Keep the exact tab explicitly foregrounded and use a separately grounded Computer interaction, or upgrade the configured provider.',
271
271
  { retryable: false, details: { browserProduct: request.product, requiredProviderAction: 'trusted_input' } },
272
272
  );
273
273
  }
@@ -333,6 +333,15 @@ export function getMacOsBrowserAttachObservation(): MacOsBrowserAttachObservatio
333
333
  : undefined;
334
334
  }
335
335
 
336
+ function recordSuccessfulMacOsBrowserAttachment(attachment: MacOsBrowserAttachment): void {
337
+ lastAttachObservation = {
338
+ checkedAt: new Date().toISOString(),
339
+ ready: true,
340
+ selectedProduct: attachment.metadata.product,
341
+ attempts: attachment.attempts.map((attempt) => ({ ...attempt })),
342
+ };
343
+ }
344
+
336
345
  const BROWSERS: Record<MacOsBrowserProduct, MacOsBrowserDefinition> = {
337
346
  chrome: {
338
347
  product: 'chrome',
@@ -513,12 +522,17 @@ function createOwnedTabScript(browser: MacOsBrowserDefinition): string {
513
522
  return `on run argv
514
523
  set targetUrl to item 1 of argv
515
524
  ${browserTellScript(browser, `
516
- if (count of windows) is 0 then error "FORGE_NO_BROWSER_WINDOW"
517
- set targetWindow to front window
518
- set originalActiveIndex to active tab index of targetWindow
519
- set targetTab to make new tab at end of tabs of targetWindow with properties {URL:targetUrl}
525
+ if (count of windows) is 0 then
526
+ set targetWindow to make new window
527
+ set targetTab to active tab of targetWindow
528
+ set URL of targetTab to targetUrl
529
+ else
530
+ set targetWindow to front window
531
+ set originalActiveIndex to active tab index of targetWindow
532
+ set targetTab to make new tab at end of tabs of targetWindow with properties {URL:targetUrl}
533
+ set active tab index of targetWindow to originalActiveIndex
534
+ end if
520
535
  set targetTabId to id of targetTab
521
- set active tab index of targetWindow to originalActiveIndex
522
536
  set separator to ASCII character 30
523
537
  return ((id of targetWindow) as text) & separator & (targetTabId as text)
524
538
  `)}
@@ -674,18 +688,14 @@ export async function discoverMacOsBrowserAttachment(
674
688
  }
675
689
  const selectedAttempt = attempts.find((entry) => entry.product === selected.metadata.product);
676
690
  if (selectedAttempt) selectedAttempt.status = 'selected';
677
- lastAttachObservation = {
678
- checkedAt: new Date().toISOString(),
679
- ready: true,
680
- selectedProduct: selected.metadata.product,
681
- attempts: attempts.map((attempt) => ({ ...attempt })),
691
+ const attachment: MacOsBrowserAttachment = {
692
+ metadata: selected.metadata,
693
+ attempts,
682
694
  };
695
+ recordSuccessfulMacOsBrowserAttachment(attachment);
683
696
  return {
684
697
  attempts,
685
- attachment: {
686
- metadata: selected.metadata,
687
- attempts,
688
- },
698
+ attachment,
689
699
  };
690
700
  }
691
701
 
@@ -1230,10 +1240,13 @@ export class MacOsAppleEventsPage {
1230
1240
 
1231
1241
  private async setChecked(selector: string, checked: boolean): Promise<void> {
1232
1242
  await this.evaluate(selectorSource(selector, `
1233
- if (!('checked' in element)) throw new Error('Element is not checkable.');
1234
- element.checked = ${checked};
1235
- element.dispatchEvent(new Event('input', { bubbles: true }));
1236
- element.dispatchEvent(new Event('change', { bubbles: true }));
1243
+ if (!('checked' in element) || typeof element.click !== 'function') {
1244
+ throw new Error('Element is not checkable.');
1245
+ }
1246
+ if (element.checked !== ${checked}) element.click();
1247
+ if (element.checked !== ${checked}) {
1248
+ throw new Error('Requested checked state did not persist.');
1249
+ }
1237
1250
  return true;
1238
1251
  `));
1239
1252
  }
@@ -1341,7 +1354,7 @@ async function resolveCurrentMacOsBrowserTabRef(
1341
1354
  ): Promise<MacOsBrowserTabRef> {
1342
1355
  // Existing unit-level AppleScript hooks historically model one exact script at a time.
1343
1356
  // Preserve that narrow test seam unless a live inventory hook is explicitly supplied;
1344
- // production always resolves through the stable Desktop Operator broker inventory.
1357
+ // production always resolves through the configured Computer provider inventory.
1345
1358
  const inventory = runtimeHooks.tabInventory
1346
1359
  ? await runtimeHooks.tabInventory(product, timeoutMs)
1347
1360
  : runtimeHooks.runAppleScript
@@ -1464,6 +1477,40 @@ export async function createMacOsBrowserOwnedPage(
1464
1477
  return page;
1465
1478
  }
1466
1479
 
1480
+ export async function createMacOsBrowserOwnedPageForProduct(
1481
+ product: MacOsBrowserProduct,
1482
+ url: string,
1483
+ attempts: MacOsBrowserAttachAttempt[],
1484
+ timeoutMs = DEFAULT_NATIVE_TIMEOUT_MS,
1485
+ ): Promise<{ page: MacOsAppleEventsPage; attachment: MacOsBrowserAttachment }> {
1486
+ const browser = browserDefinition(product);
1487
+ const creationEvidence = await runCreateTabAutomation(
1488
+ { action: 'create_tab', product, url },
1489
+ createOwnedTabScript(browser),
1490
+ [url],
1491
+ timeoutMs,
1492
+ );
1493
+ const ref = creationEvidence.ref;
1494
+ const attachment: MacOsBrowserAttachment = {
1495
+ attempts: attempts.map((attempt) => ({ ...attempt })),
1496
+ metadata: {
1497
+ product,
1498
+ appName: browser.appName,
1499
+ bundleId: browser.bundleId,
1500
+ frontmost: false,
1501
+ url,
1502
+ title: '',
1503
+ bounds: { x: 0, y: 0, width: 0, height: 0 },
1504
+ windowId: ref.windowId,
1505
+ tabId: ref.tabId,
1506
+ active: false,
1507
+ },
1508
+ };
1509
+ const page = new MacOsAppleEventsPage(attachment, timeoutMs, ref, creationEvidence);
1510
+ rememberMacOsBrowserPageHandle(product, ref, page);
1511
+ return { page, attachment };
1512
+ }
1513
+
1467
1514
  export async function reattachMacOsBrowserOwnedPage(
1468
1515
  product: MacOsBrowserProduct,
1469
1516
  ref: MacOsBrowserTabRef,
@@ -1488,6 +1535,7 @@ export async function reattachMacOsBrowserOwnedPage(
1488
1535
  : ref;
1489
1536
  const page = new MacOsAppleEventsPage(attachment, timeoutMs, resolvedRef);
1490
1537
  rememberMacOsBrowserPageHandle(product, resolvedRef, page);
1538
+ recordSuccessfulMacOsBrowserAttachment(attachment);
1491
1539
  return { page, attachment };
1492
1540
  }
1493
1541
 
@@ -7,8 +7,8 @@ import type {
7
7
  import {
8
8
  DEFAULT_BROWSER_SESSION_LIST_LIMIT,
9
9
  MAX_BROWSER_SESSION_LIST_LIMIT,
10
- } from './browser-session-authority';
11
- import { MAX_BROWSER_CDP_ENDPOINT_CANDIDATES } from './browser-runtime-contract';
10
+ } from '../../../packages/plugin-runtime/browser/session-authority';
11
+ import { MAX_BROWSER_CDP_ENDPOINT_CANDIDATES } from '../../../packages/plugin-runtime/browser/runtime-contract';
12
12
 
13
13
  export function browserPermissions(ready: boolean): AssistantPluginPermissionScope[] {
14
14
  return [
@@ -59,7 +59,7 @@ export function browserCapabilities(): AssistantPluginCapability[] {
59
59
  scopes: ['browser.read', 'browser.profile'],
60
60
  actions: [
61
61
  'open_page', 'navigate', 'reload', 'go_back', 'wait_for_load_state',
62
- 'get_text', 'get_html', 'query_selector', 'query_all', 'get_attribute', 'list_frames', 'verify_state',
62
+ 'get_text', 'get_html', 'query_selector', 'query_all', 'get_attribute', 'list_frames', 'verify_state', 'reconcile_effect',
63
63
  'screenshot', 'extract_links', 'extract_tables', 'extract_forms', 'snapshot_interactive',
64
64
  'get_console_errors', 'get_failed_requests',
65
65
  ],
@@ -104,7 +104,7 @@ const frameScopeProperties = {
104
104
 
105
105
  function interactSchema(extra: Record<string, unknown>, required: string[]): Record<string, unknown> {
106
106
  return sessionTargetSchema({
107
- post_action_wait_ms: { type: 'number' },
107
+ post_action_wait_ms: { type: 'number', minimum: 0, description: 'Optional explicit compatibility settle delay after a semantic action. Omit for normal provider completion; native foreground activation retains its provider-specific verification budget.' },
108
108
  ...extra,
109
109
  }, required);
110
110
  }
@@ -318,7 +318,7 @@ export function browserActions(): AssistantPluginActionDescriptor[] {
318
318
  description: 'Return matching element summaries (bounded).',
319
319
  readOnly: true, risk: 'readonly', confirmation: 'none', defaultTimeoutMs: 60_000, cancellable: true, idempotent: true,
320
320
  scopes: ['browser.read'], resourceClaims: [{ resource: 'remote', mode: 'read' }],
321
- argumentsSchema: sessionTargetSchema({ selector: { type: 'string' }, limit: { type: 'number' }, ...frameScopeProperties }, ['selector']),
321
+ argumentsSchema: sessionTargetSchema({ selector: { type: 'string' }, limit: { type: 'number' }, from_end: { type: 'boolean' }, ...frameScopeProperties }, ['selector']),
322
322
  },
323
323
  {
324
324
  actionId: 'get_attribute',
@@ -345,13 +345,37 @@ export function browserActions(): AssistantPluginActionDescriptor[] {
345
345
  argumentsSchema: sessionTargetSchema({
346
346
  expected_url: { type: 'string' },
347
347
  url_contains: { type: 'string' },
348
+ url_contains_any: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 2000 } },
349
+ url_contains_none: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 2000 } },
348
350
  selector: { type: 'string' },
349
351
  require_visible: { type: 'boolean' },
350
352
  text_contains: { type: 'string', maxLength: 10000 },
353
+ text_contains_any: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 10000 } },
354
+ text_contains_none: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 10000 } },
351
355
  max_chars: { type: 'number', minimum: 1, maximum: 100000 },
352
356
  ...frameScopeProperties,
353
357
  }, ['session_id']),
354
358
  },
359
+ {
360
+ actionId: 'reconcile_effect',
361
+ title: 'Reconcile browser effect',
362
+ description: 'Read the already-bound browser session and classify one exact prior effect request as applied, not_applied, or unknown from declared observation criteria. Never navigates or replays the effect.',
363
+ readOnly: true, risk: 'readonly', confirmation: 'none', defaultTimeoutMs: 60_000, cancellable: true, idempotent: true,
364
+ scopes: ['browser.read'], resourceClaims: [{ resource: 'remote', mode: 'read' }],
365
+ argumentsSchema: sessionTargetSchema({
366
+ effect_request_id: { type: 'string' },
367
+ applied_url_contains_any: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 2000 } },
368
+ applied_url_contains_none: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 2000 } },
369
+ applied_text_contains_any: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 10000 } },
370
+ applied_text_contains_none: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 10000 } },
371
+ applied_selector: { type: 'string' },
372
+ not_applied_url_contains_any: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 2000 } },
373
+ not_applied_text_contains_any: { type: 'array', minItems: 1, maxItems: 16, items: { type: 'string', maxLength: 10000 } },
374
+ not_applied_selector: { type: 'string' },
375
+ max_chars: { type: 'number', minimum: 1, maximum: 100000 },
376
+ ...frameScopeProperties,
377
+ }, ['session_id', 'effect_request_id']),
378
+ },
355
379
  {
356
380
  actionId: 'screenshot',
357
381
  title: 'Screenshot',
@@ -515,7 +539,7 @@ export function browserActions(): AssistantPluginActionDescriptor[] {
515
539
  {
516
540
  actionId: 'trusted_input',
517
541
  title: 'Trusted browser input',
518
- description: 'Send bounded mouse, wheel, drag, key, or text input after authorization. Playwright/CDP uses page input primitives; native macOS sessions require the exact saved tab to already be foreground/active and use the stable Desktop Operator input broker without activating another tab.',
542
+ description: 'Send bounded mouse, wheel, drag, key, or text input after authorization. Playwright/CDP uses page input primitives; native sessions require the exact saved tab to already be foreground/active and use the configured Computer input provider without activating another tab.',
519
543
  readOnly: false, risk: 'remote_write', confirmation: 'authorization', defaultTimeoutMs: 60_000, cancellable: true, idempotent: false,
520
544
  scopes: ['browser.interact', 'browser.profile'], resourceClaims: writeRemote,
521
545
  argumentsSchema: interactSchema({
@@ -7,7 +7,7 @@ import {
7
7
  type MacOsBrowserProduct,
8
8
  } from './browser-macos-bridge';
9
9
  import { listSavedBrowserSessions, removeBrowserSession } from './browser-session-store';
10
- import type { BrowserSessionInventoryItem, BrowserSessionState } from './browser-session-types';
10
+ import type { BrowserSessionInventoryItem, BrowserSessionState } from '../../../packages/protocols/browser/index';
11
11
 
12
12
  export interface NativeOwnedSessionInspection {
13
13
  items: Map<string, BrowserSessionInventoryItem>;
@@ -1,109 +1,2 @@
1
- import { AssistantPluginError } from './errors';
2
- import {
3
- providerSupports,
4
- type BrowserForegroundRequirement,
5
- type BrowserProviderCapabilities,
6
- type BrowserProviderCapability,
7
- } from './browser-runtime-contract';
8
-
9
- export interface BrowserRuntimeProvider<TInput, TResult> extends BrowserProviderCapabilities {
10
- /** Lower values are preferred when multiple providers satisfy the same capability contract. */
11
- priority: number;
12
- /** Availability is decided before execution; ordinary provider failures are never fallback signals. */
13
- supportsInput(input: TInput): boolean;
14
- execute(input: TInput): Promise<TResult>;
15
- /** Runs only after an explicit stale/restart/configuration boundary. */
16
- revalidate?: () => Promise<void> | void;
17
- }
18
-
19
- interface BrowserProviderState<TInput, TResult> {
20
- provider: BrowserRuntimeProvider<TInput, TResult>;
21
- generation: number;
22
- invalidatedReason?: string;
23
- }
24
-
25
- export interface BrowserProviderSelection<TInput, TResult> {
26
- provider: BrowserRuntimeProvider<TInput, TResult>;
27
- generation: number;
28
- }
29
-
30
- /**
31
- * A typed pre-action rejection. Runtime may select another provider because this proves the action
32
- * was not attempted. Arbitrary provider errors are intentionally not mapped to this signal.
33
- */
34
- export class BrowserProviderUnavailableBeforeActionError extends Error {
35
- readonly providerId: string;
36
- readonly reason: string;
37
-
38
- constructor(providerId: string, reason: string) {
39
- super(`${providerId} unavailable before action: ${reason}`);
40
- this.name = 'BrowserProviderUnavailableBeforeActionError';
41
- this.providerId = providerId;
42
- this.reason = reason;
43
- }
44
- }
45
-
46
- function foregroundCompatible(
47
- provider: BrowserProviderCapabilities,
48
- requested: BrowserForegroundRequirement,
49
- ): boolean {
50
- // Background-safe providers may execute explicit foreground transactions; foreground-only
51
- // providers may not satisfy a background-safe transaction.
52
- return requested === 'explicit_required' || provider.foreground === 'none';
53
- }
54
-
55
- export class BrowserProviderRegistry<TInput, TResult> {
56
- private readonly providers = new Map<string, BrowserProviderState<TInput, TResult>>();
57
-
58
- register(provider: BrowserRuntimeProvider<TInput, TResult>): void {
59
- const current = this.providers.get(provider.providerId);
60
- if (current) {
61
- // Refresh call-local closures without discarding the warm provider generation.
62
- current.provider = provider;
63
- return;
64
- }
65
- this.providers.set(provider.providerId, { provider, generation: 1 });
66
- }
67
-
68
- invalidate(providerId: string, reason: string): void {
69
- const state = this.providers.get(providerId);
70
- if (state) state.invalidatedReason = reason;
71
- }
72
-
73
- invalidateAll(reason: string): void {
74
- for (const state of this.providers.values()) state.invalidatedReason = reason;
75
- }
76
-
77
- private async prepare(state: BrowserProviderState<TInput, TResult>): Promise<void> {
78
- if (!state.invalidatedReason) return;
79
- await state.provider.revalidate?.();
80
- state.invalidatedReason = undefined;
81
- state.generation += 1;
82
- }
83
-
84
- async select(options: {
85
- input: TInput;
86
- requiredCapabilities: readonly BrowserProviderCapability[];
87
- foreground: BrowserForegroundRequirement;
88
- excludedProviderIds?: ReadonlySet<string>;
89
- }): Promise<BrowserProviderSelection<TInput, TResult>> {
90
- const candidates = [...this.providers.values()]
91
- .filter(({ provider }) => !options.excludedProviderIds?.has(provider.providerId))
92
- .filter(({ provider }) => provider.supportsInput(options.input))
93
- .filter(({ provider }) => providerSupports(provider, options.requiredCapabilities))
94
- .filter(({ provider }) => foregroundCompatible(provider, options.foreground))
95
- .sort((left, right) => left.provider.priority - right.provider.priority
96
- || left.provider.providerId.localeCompare(right.provider.providerId));
97
-
98
- const selected = candidates[0];
99
- if (!selected) {
100
- throw new AssistantPluginError(
101
- 'PLUGIN_BROWSER_PROVIDER_UNAVAILABLE',
102
- `No Browser provider satisfies required capabilities: ${options.requiredCapabilities.join(', ') || 'browser.transaction'}.`,
103
- { retryable: true },
104
- );
105
- }
106
- await this.prepare(selected);
107
- return { provider: selected.provider, generation: selected.generation };
108
- }
109
- }
1
+ /** @deprecated C0 compatibility shim. Browser provider selection lives in packages/plugin-runtime/browser. */
2
+ export * from '../../../packages/plugin-runtime/browser/provider-registry';
@@ -0,0 +1,16 @@
1
+ import {
2
+ buildBrowserPluginManifest,
3
+ executeBrowserPluginAction,
4
+ resolveBrowserPluginAuthorizationContext,
5
+ } from './browser-adapter';
6
+ import type { AssistantPluginAdapter } from './types';
7
+
8
+ /** Thin first-party registration. Browser execution remains an adapter implementation detail. */
9
+ export const browserPluginAdapter: AssistantPluginAdapter = {
10
+ pluginId: 'browser',
11
+ scope: 'controller_with_repository_overlay',
12
+ exposure: 'internal',
13
+ buildManifest: buildBrowserPluginManifest,
14
+ executeAction: executeBrowserPluginAction,
15
+ resolveAuthorizationContext: resolveBrowserPluginAuthorizationContext,
16
+ };
@@ -1,154 +1,2 @@
1
- export const MAX_BROWSER_CDP_ENDPOINT_CANDIDATES = 5;
2
-
3
- export type BrowserProviderCapability =
4
- | 'dom.read'
5
- | 'dom.interact'
6
- | 'browser.internal_resources'
7
- | 'browser.screenshot'
8
- | 'browser.trusted_input'
9
- | 'browser.foreground'
10
- | 'browser.transaction'
11
- | 'browser.persistent_handle';
12
-
13
- export type BrowserTargetOwnership = 'plugin_owned' | 'user_owned' | 'provider_owned';
14
- export type BrowserTargetKind = 'page' | 'tab' | 'browser_internal_resource';
15
- export type BrowserForegroundRequirement = 'none' | 'explicit_required';
16
- export type BrowserActionReplaySafety = 'read_only' | 'idempotent' | 'non_idempotent';
17
-
18
- /** Stable resource identity. URL/title are deliberately excluded because they are mutable observations. */
19
- export interface BrowserTargetIdentity {
20
- providerId: string;
21
- resourceKind: BrowserTargetKind;
22
- resourceId: string;
23
- browserProduct?: string;
24
- ownership: BrowserTargetOwnership;
25
- }
26
-
27
- export interface BrowserObservedState {
28
- url: string;
29
- title?: string;
30
- observedAt: string;
31
- providerRevision?: string;
32
- }
33
-
34
- export interface BrowserProviderCapabilities {
35
- providerId: string;
36
- capabilities: readonly BrowserProviderCapability[];
37
- foreground: BrowserForegroundRequirement;
38
- /** True only when the provider can verify postconditions in the same provider call that performs the action. */
39
- verifiesPostconditions: boolean;
40
- /** True only when an already-bound provider handle can be reused across bounded consecutive actions. */
41
- persistentHandle: boolean;
42
- }
43
-
44
- export type BrowserCondition =
45
- | { kind: 'target_identity'; target: BrowserTargetIdentity }
46
- | { kind: 'url_equals'; url: string }
47
- | { kind: 'url_matches'; pattern: string }
48
- | { kind: 'selector_exists'; selector: string }
49
- | { kind: 'selector_visible'; selector: string }
50
- | { kind: 'text_contains'; text: string; selector?: string }
51
- | { kind: 'attribute_equals'; selector: string; attribute: string; value: string }
52
- | { kind: 'provider_assertion'; assertion: string; expected: string | number | boolean };
53
-
54
- export type BrowserTransactionAction =
55
- | { kind: 'read'; operation: string; arguments?: Record<string, unknown> }
56
- | { kind: 'dom'; operation: string; arguments?: Record<string, unknown> }
57
- | { kind: 'internal_resource'; operation: string; arguments?: Record<string, unknown> }
58
- | { kind: 'trusted_input'; operation: string; arguments?: Record<string, unknown> };
59
-
60
- export interface BrowserTransaction {
61
- transactionId: string;
62
- target: BrowserTargetIdentity;
63
- requiredCapabilities: readonly BrowserProviderCapability[];
64
- foreground: BrowserForegroundRequirement;
65
- replaySafety: BrowserActionReplaySafety;
66
- preconditions?: readonly BrowserCondition[];
67
- action: BrowserTransactionAction;
68
- /** Writes/interactions require at least one postcondition unless the action itself returns a typed read result. */
69
- postconditions?: readonly BrowserCondition[];
70
- timeoutMs: number;
71
- }
72
-
73
- export interface BrowserConditionEvidence {
74
- condition: BrowserCondition;
75
- satisfied: boolean;
76
- observed?: unknown;
77
- reason?: string;
78
- }
79
-
80
- export interface BrowserTransactionTiming {
81
- providerCalls: number;
82
- providerDurationMs: number;
83
- totalDurationMs: number;
84
- }
85
-
86
- export interface BrowserTransactionResult<T = unknown> {
87
- transactionId: string;
88
- target: BrowserTargetIdentity;
89
- transportSucceeded: boolean;
90
- actionPerformed: boolean;
91
- /** Authoritative success bit. AX/transport success alone must never set this true. */
92
- verified: boolean;
93
- result?: T;
94
- observedState?: BrowserObservedState;
95
- preconditionEvidence: readonly BrowserConditionEvidence[];
96
- postconditionEvidence: readonly BrowserConditionEvidence[];
97
- timing: BrowserTransactionTiming;
98
- }
99
-
100
- export interface BrowserRuntimeBudget {
101
- p95Ms: number;
102
- maxProviderCallsWarm: number;
103
- maxProviderCallsCold: number;
104
- foregroundAllowed: boolean;
105
- }
106
-
107
- /**
108
- * Architecture targets, not per-host promises. Live V2 gates report p50/p95 and fail when a
109
- * regression materially exceeds these budgets without attributable provider evidence.
110
- */
111
- export const BROWSER_RUNTIME_V2_BUDGETS = {
112
- read: { p95Ms: 350, maxProviderCallsWarm: 1, maxProviderCallsCold: 2, foregroundAllowed: false },
113
- domInteraction: { p95Ms: 600, maxProviderCallsWarm: 1, maxProviderCallsCold: 2, foregroundAllowed: false },
114
- internalResource: { p95Ms: 700, maxProviderCallsWarm: 1, maxProviderCallsCold: 2, foregroundAllowed: false },
115
- physicalInput: { p95Ms: 1_500, maxProviderCallsWarm: 1, maxProviderCallsCold: 2, foregroundAllowed: true },
116
- } as const satisfies Record<string, BrowserRuntimeBudget>;
117
-
118
- export function browserTargetKey(target: BrowserTargetIdentity): string {
119
- return [target.providerId, target.browserProduct ?? '', target.resourceKind, target.resourceId, target.ownership].join(':');
120
- }
121
-
122
- export function providerSupports(
123
- provider: BrowserProviderCapabilities,
124
- required: readonly BrowserProviderCapability[],
125
- ): boolean {
126
- const available = new Set(provider.capabilities);
127
- return required.every((capability) => available.has(capability));
128
- }
129
-
130
- export function browserTransactionVerified(result: BrowserTransactionResult): boolean {
131
- return result.transportSucceeded
132
- && result.actionPerformed
133
- && result.verified
134
- && result.preconditionEvidence.every((entry) => entry.satisfied)
135
- && result.postconditionEvidence.every((entry) => entry.satisfied);
136
- }
137
-
138
- export function browserTransactionRequiresPostcondition(transaction: BrowserTransaction): boolean {
139
- return transaction.replaySafety !== 'read_only';
140
- }
141
-
142
- export function validateBrowserTransaction(transaction: BrowserTransaction): string[] {
143
- const errors: string[] = [];
144
- if (!transaction.transactionId.trim()) errors.push('transactionId is required');
145
- if (!transaction.target.providerId.trim() || !transaction.target.resourceId.trim()) errors.push('stable target identity is incomplete');
146
- if (!Number.isFinite(transaction.timeoutMs) || transaction.timeoutMs <= 0) errors.push('timeoutMs must be positive');
147
- if (transaction.foreground === 'none' && transaction.requiredCapabilities.includes('browser.foreground')) {
148
- errors.push('foreground capability cannot be required by a foreground-free transaction');
149
- }
150
- if (browserTransactionRequiresPostcondition(transaction) && (transaction.postconditions?.length ?? 0) === 0) {
151
- errors.push('interactive transactions require at least one postcondition');
152
- }
153
- return errors;
154
- }
1
+ /** @deprecated C0 compatibility shim. Browser runtime contracts live in packages/plugin-runtime/browser. */
2
+ export * from '../../../packages/plugin-runtime/browser/runtime-contract';
@@ -7,12 +7,13 @@ import {
7
7
  type BrowserProviderCapability,
8
8
  type BrowserTargetIdentity,
9
9
  type BrowserTransaction,
10
- } from './browser-runtime-contract';
10
+ } from '../../../packages/plugin-runtime/browser/runtime-contract';
11
11
  import {
12
12
  BrowserProviderRegistry,
13
+ BrowserProviderSelectionError,
13
14
  BrowserProviderUnavailableBeforeActionError,
14
15
  type BrowserRuntimeProvider,
15
- } from './browser-provider-registry';
16
+ } from '../../../packages/plugin-runtime/browser/provider-registry';
16
17
 
17
18
  export const ALL_BROWSER_PROVIDER_CAPABILITIES = [
18
19
  'dom.read',
@@ -25,9 +26,32 @@ export const ALL_BROWSER_PROVIDER_CAPABILITIES = [
25
26
  'browser.persistent_handle',
26
27
  ] as const satisfies readonly BrowserProviderCapability[];
27
28
 
29
+ export const DEFAULT_NATIVE_FOREGROUND_VERIFICATION_WAIT_MS = 750;
30
+
31
+ /**
32
+ * Normal Browser semantic actions already await the provider primitive and return
33
+ * bounded post-action evidence. A caller may request an additional compatibility
34
+ * settle delay explicitly, but omission never creates a hidden fixed sleep.
35
+ */
36
+ export function browserExplicitPostActionWaitMs(value: unknown): number {
37
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0;
38
+ }
39
+
40
+ /**
41
+ * Native foreground activation is different from ordinary semantic mutation: it
42
+ * must observe system foreground authority after an Apple Events/Computer action.
43
+ * Keep its provider-specific verification budget unless the caller explicitly
44
+ * supplies a non-negative compatibility value.
45
+ */
46
+ export function browserNativeForegroundVerificationWaitMs(value: unknown): number {
47
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0
48
+ ? Math.trunc(value)
49
+ : DEFAULT_NATIVE_FOREGROUND_VERIFICATION_WAIT_MS;
50
+ }
51
+
28
52
  const READ_ACTIONS = new Set([
29
53
  'list_sessions', 'reconcile_sessions', 'get_handoff_status',
30
- 'get_text', 'get_html', 'query_selector', 'query_all', 'get_attribute', 'list_frames', 'verify_state',
54
+ 'get_text', 'get_html', 'query_selector', 'query_all', 'get_attribute', 'list_frames', 'verify_state', 'reconcile_effect',
31
55
  'extract_links', 'extract_tables', 'extract_forms', 'snapshot_interactive', 'get_console_errors', 'get_failed_requests',
32
56
  'wait_for_load_state', 'wait_for_selector', 'await_file_transfer',
33
57
  ]);
@@ -166,12 +190,20 @@ export async function executeBrowserRuntimeAction(options: {
166
190
  const policy = browserRuntimeActionPolicy(options.input.actionId);
167
191
  const excluded = new Set<string>();
168
192
  while (true) {
169
- const selection = await registry.select({
170
- input: options.input,
171
- requiredCapabilities: policy.requiredCapabilities,
172
- foreground: policy.foreground,
173
- excludedProviderIds: excluded,
174
- });
193
+ let selection;
194
+ try {
195
+ selection = await registry.select({
196
+ input: options.input,
197
+ requiredCapabilities: policy.requiredCapabilities,
198
+ foreground: policy.foreground,
199
+ excludedProviderIds: excluded,
200
+ });
201
+ } catch (error) {
202
+ if (error instanceof BrowserProviderSelectionError) {
203
+ throw new AssistantPluginError(error.code, error.message, { retryable: error.retryable });
204
+ }
205
+ throw error;
206
+ }
175
207
  const transaction = transactionFor(options.input, selection.provider.providerId, policy);
176
208
  const validationErrors = validateBrowserTransaction(transaction);
177
209
  if (validationErrors.length > 0) {