@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.
- package/AGENTS.md +73 -7
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/README.en.md +24 -3
- package/README.md +10 -6
- package/README.zh-CN.md +5 -3
- package/THIRD_PARTY_NOTICES.md +1 -2
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
- package/adapters/chatgpt/controller-binding-store.ts +101 -22
- package/adapters/chatgpt/controller-round-host.ts +15 -25
- package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
- package/adapters/chatgpt/provider-delivery.ts +229 -2
- package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
- package/adapters/computer/chatgpt-extension-target.ts +708 -0
- package/adapters/computer/chrome-extension/background.js +541 -0
- package/adapters/computer/chrome-extension/content.js +402 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +32 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/desktop-operator-provider.ts +18 -6
- package/adapters/computer/interaction-target-authority.ts +178 -24
- package/adapters/mcp/access-mode.ts +18 -39
- package/adapters/mcp/auth.ts +2 -7
- package/adapters/mcp/instructions.ts +6 -5
- package/adapters/mcp/multi-repository.ts +10 -47
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
- package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
- package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
- package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
- package/adapters/mcp/runtime-gateway/router.ts +19 -507
- package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
- package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
- package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
- package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
- package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
- package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
- package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
- package/adapters/mcp/server.ts +91 -26
- package/adapters/mcp/setup.ts +5 -13
- package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
- package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
- package/adapters/mcp/toolset-names.ts +11 -37
- package/adapters/mcp/toolset.ts +19 -92
- package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
- package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
- package/adapters/mcp/transports/http-observation.ts +377 -0
- package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
- package/adapters/mcp/transports/http.ts +200 -683
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +6 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
- package/adapters/mcp/types.ts +0 -6
- package/assets/hooks/lib/session-state.sh +0 -38
- package/assets/hooks/post-bash.sh +1 -1
- package/assets/hooks/post-tool-observer.sh +0 -5
- package/assets/hooks/prompt-guard.sh +0 -55
- package/assets/partials/04-project-structure.partial.md +1 -1
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -1
- package/assets/partials-agents/08-deep-docs.partial.md +1 -1
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +26 -1
- package/assets/reference-configs/external-tooling.md +0 -76
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/reference-configs/release-deploy.md +1 -1
- package/assets/templates/helpers/architecture-queue.sh +1 -1
- package/assets/templates/helpers/check-agent-tooling.sh +1 -327
- package/assets/templates/helpers/check-task-workflow.sh +1 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
- package/assets/templates/helpers/migrate-project-template.sh +2 -2
- package/assets/workflow-contract.v1.json +0 -2
- package/docs/README.md +5 -2
- package/docs/architecture/CURRENT.md +205 -51
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
- package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
- package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
- package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
- package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
- package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
- package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
- package/docs/architecture/domains/public-surface.md +3 -5
- package/docs/architecture/domains/verification.md +6 -5
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
- package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
- package/docs/forge-plugin-management.md +16 -4
- package/docs/operations/controller-browser-plugin.md +23 -0
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +6 -7
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/github-repository.md +4 -4
- package/docs/operations/github-semantic-release-projection.md +20 -0
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +13 -52
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/runtime-performance-diagnostics.md +8 -0
- package/docs/operations/standalone-disaster-recovery.md +15 -7
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/03-first-repository-task.md +2 -0
- package/docs/wiki/Computer-and-Plugins.md +78 -0
- package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
- package/docs/wiki/Home.md +16 -2
- package/docs/wiki/Implementation.md +25 -13
- package/docs/wiki/Installation.md +28 -32
- package/docs/wiki/Integrations.md +4 -0
- package/docs/wiki/Quick-Start.md +35 -22
- package/docs/wiki/Releases-and-Upgrades.md +15 -25
- package/docs/wiki/_Sidebar.md +5 -1
- package/package.json +25 -25
- package/packages/kernel/cognition/api/index.ts +6 -0
- package/packages/kernel/cognition/application/activation-service.ts +451 -0
- package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
- package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
- package/packages/kernel/cognition/application/memory-service.ts +64 -0
- package/packages/kernel/cognition/domain/learning.ts +106 -0
- package/packages/kernel/cognition/domain/memory.ts +254 -0
- package/packages/kernel/controller/api/index.ts +1 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +12 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
- package/packages/kernel/controller/domain/controller-round.ts +4 -1
- package/packages/kernel/controller/domain/execution-quality.ts +3 -1
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
- package/packages/kernel/controller/ports/controller-host.ts +2 -0
- package/packages/kernel/identity/api/index.ts +10 -0
- package/packages/kernel/identity/domain/activity-projection.ts +43 -0
- package/packages/kernel/identity/domain/capability-broker.ts +60 -0
- package/packages/kernel/identity/domain/grant.ts +72 -0
- package/packages/kernel/identity/domain/owned-resource.ts +116 -0
- package/packages/kernel/identity/domain/user-request.ts +93 -0
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
- package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
- package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
- package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/scheduler/api/index.ts +0 -2
- package/packages/kernel/scheduler/application/eligibility.ts +4 -1
- package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
- package/packages/kernel/scheduler/application/settlement.ts +0 -15
- package/packages/kernel/scheduler/domain/schedule.ts +87 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +18 -42
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-design.ts +10 -5
- package/packages/kernel/work/domain/engineering-profile.ts +8 -12
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
- package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
- package/packages/kernel/work/domain/implementation-review.ts +14 -331
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +34 -65
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
- package/packages/plugin-runtime/browser/session-authority.ts +2 -1
- package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
- package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
- package/packages/plugin-runtime/computer/index.ts +2 -0
- package/packages/plugin-runtime/computer/target-authority.ts +26 -1
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
- package/packages/protocols/computer/contract.ts +27 -1
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/assemble-template.ts +11 -72
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +94 -201
- package/scripts/check-package-identity.mjs +0 -5
- package/scripts/check-runtime-architecture.mjs +921 -239
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/init-project.sh +0 -46
- package/scripts/install-ios-hid-toolchain.sh +60 -0
- package/scripts/install-standalone-recovery.ts +1 -1
- package/scripts/lib/project-init-lib.sh +6 -3
- package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
- package/scripts/open-source-audit-allowlist.txt +1 -3
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-ios-physical-device.ts +38 -10
- package/scripts/smoke-mcp-http-runtime.ts +12 -8
- package/scripts/smoke-mcp-tool-surface.ts +27 -41
- package/scripts/smoke-runtime-recovery.ts +12 -43
- package/scripts/smoke-schedule-engine.ts +23 -15
- package/scripts/smoke-unattended-transport-recovery.ts +223 -0
- package/scripts/smoke-user-request-continuation-restart.ts +232 -0
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
- package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
- package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
- package/scripts/smoke-workflow-supervisor.ts +103 -0
- package/scripts/sync-generated-authority.mjs +0 -1
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +12 -35
- package/src/cli/agent-jobs/integration.ts +20 -51
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- package/src/cli/chatgpt-browser/file-policy.ts +2 -2
- package/src/cli/commands/brain-assistant.ts +27 -13
- package/src/cli/commands/brain.ts +13 -15
- package/src/cli/commands/chatgpt.ts +1 -163
- package/src/cli/commands/doctor.ts +1 -143
- package/src/cli/commands/global-runtime.ts +3 -196
- package/src/cli/commands/init-hook.ts +6 -23
- package/src/cli/commands/init.ts +3 -252
- package/src/cli/commands/mcp.ts +0 -5
- package/src/cli/commands/prompt-guard-decision.ts +0 -2
- package/src/cli/commands/recovery.ts +137 -135
- package/src/cli/commands/repository.ts +17 -1
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-execution.ts +41 -0
- package/src/cli/commands/setup-profile.ts +8 -0
- package/src/cli/controller/check-runner.ts +13 -2
- package/src/cli/controller/completion-backlog.ts +3 -3
- package/src/cli/controller/completion-orchestrator.ts +5 -44
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/composite-operations.ts +1 -1
- package/src/cli/controller/context/instruction-context.ts +1 -1
- package/src/cli/controller/context/known-paths.ts +2 -2
- package/src/cli/controller/context/query-planning.ts +11 -4
- package/src/cli/controller/context/rule-resolution.ts +2 -2
- package/src/cli/controller/context/source-materializer.ts +83 -102
- package/src/cli/controller/context/structural-provider.ts +84 -0
- package/src/cli/controller/context/structural.ts +6 -6
- package/src/cli/controller/context/types.ts +8 -9
- package/src/cli/controller/context-pack.ts +107 -84
- package/src/cli/controller/execution-completion.ts +4 -7
- package/src/cli/controller/execution-policy.ts +36 -153
- package/src/cli/controller/governance.ts +2 -3
- package/src/cli/controller/issue-store.ts +4 -99
- package/src/cli/controller/launch-agents.ts +59 -18
- package/src/cli/controller/operational-plan.ts +25 -52
- package/src/cli/controller/runtime-config.ts +5 -1
- package/src/cli/controller/stuck-state-migration.ts +2 -3
- package/src/cli/controller/systemd-user.ts +42 -10
- package/src/cli/editing/edit-session.ts +18 -12
- package/src/cli/github/github.ts +4 -4
- package/src/cli/github/semantic-projection.ts +174 -0
- package/src/cli/hook/prompt-intents.ts +0 -9
- package/src/cli/index.ts +1 -43
- package/src/cli/local-bridge/connector-freshness.ts +1 -12
- package/src/cli/local-bridge/console-automations.ts +19 -14
- package/src/cli/local-bridge/console-view-models.ts +4 -13
- package/src/cli/local-bridge/facade-api.ts +64 -193
- package/src/cli/local-bridge/server.ts +24 -147
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/repositories/command-classifier.ts +0 -9
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +37 -18
- package/src/cli/repositories/controller-home.ts +48 -0
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/locks.ts +20 -0
- package/src/cli/repositories/registry.ts +79 -12
- package/src/cli/repositories/safe-patch.ts +2 -12
- package/src/cli/repositories/structured-git.ts +101 -5
- package/src/cli/repository/inspector.ts +185 -343
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/effects/process-runner.ts +17 -1
- package/src/runtime/context/assistant-context.ts +20 -7
- package/src/runtime/context/assistant-work-context.ts +89 -27
- package/src/runtime/context/automatic-learning.ts +565 -0
- package/src/runtime/context/cognitive-attention.ts +173 -0
- package/src/runtime/context/cognitive-skill-canary.ts +158 -0
- package/src/runtime/context/context-closure.ts +46 -9
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +1 -9
- package/src/runtime/context/direct-controller-learning.ts +298 -0
- package/src/runtime/context/generic-lsp-provider.ts +1 -1
- package/src/runtime/context/semantic-navigation-contract.ts +16 -0
- package/src/runtime/context/semantic-navigation.ts +7 -35
- package/src/runtime/context/typescript-navigation-process.ts +145 -0
- package/src/runtime/context/typescript-navigation.ts +89 -3
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +6 -8
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
- package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
- package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
- package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
- package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
- package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
- package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
- package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
- package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
- package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
- package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
- package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
- package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
- package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
- package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
- package/src/runtime/control-plane/facade/index.ts +0 -1
- package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
- package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
- package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
- package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
- package/src/runtime/control-plane/facade/types.ts +49 -108
- package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
- package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- package/src/runtime/control-plane/governance/access-policy.ts +19 -2
- package/src/runtime/control-plane/governance/authorization.ts +20 -3
- package/src/runtime/control-plane/governance/external-effects.ts +1 -1
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
- package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
- package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
- package/src/runtime/control-plane/release-retention.ts +135 -47
- package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
- package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
- package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
- package/src/runtime/diagnostics/incident-repair.ts +313 -146
- package/src/runtime/diagnostics/mcp-timing.ts +114 -0
- package/src/runtime/evidence/artifact-store.ts +158 -40
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/evidence/sensitive-output.ts +22 -2
- package/src/runtime/execution/jobs/child-reference.ts +11 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
- package/src/runtime/execution/jobs/store.ts +3 -4
- package/src/runtime/execution/managed-workspace.ts +57 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
- package/src/runtime/execution/process-runtime/check-result.ts +105 -1
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
- package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
- package/src/runtime/execution/process-runtime/gc.ts +15 -2
- package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
- package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
- package/src/runtime/execution/process-runtime/index.ts +3 -0
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
- package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
- package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
- package/src/runtime/execution/process-runtime/runtime.ts +55 -18
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
- package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
- package/src/runtime/execution/workers/executor.ts +3 -8
- package/src/runtime/maintenance/cleanup.ts +41 -5
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +8 -0
- package/src/runtime/plugins/action-application.ts +97 -29
- package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
- package/src/runtime/plugins/browser-adapter.ts +1124 -333
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
- package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +18 -0
- package/src/runtime/plugins/browser-runtime.ts +40 -36
- package/src/runtime/plugins/browser-session-authority.ts +2 -2
- package/src/runtime/plugins/browser-session-store.ts +46 -76
- package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
- package/src/runtime/plugins/computer-registration.ts +298 -20
- package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
- package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
- package/src/runtime/plugins/external-adapter.ts +42 -6
- package/src/runtime/plugins/external-registration.ts +21 -1
- package/src/runtime/plugins/github-adapter.ts +30 -3
- package/src/runtime/plugins/gmail-adapter.ts +189 -3
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +24 -12
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
- package/src/runtime/plugins/ios-adapter.ts +46 -41
- package/src/runtime/plugins/ios-agent-device.ts +54 -4
- package/src/runtime/plugins/ios-device-ownership.ts +103 -0
- package/src/runtime/plugins/ios-physical-device.ts +497 -79
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -100
- package/src/runtime/plugins/managed-process-adapter.ts +12 -5
- package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
- package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +682 -435
- package/src/runtime/plugins/types.ts +24 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/git-status-sampler.ts +2 -19
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +4 -4
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/probe.ts +2 -2
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +312 -0
- package/src/runtime/release/release-session.ts +716 -0
- package/src/runtime/release/release-state-migration.ts +25 -0
- package/src/runtime/resources/leases/store.ts +56 -25
- package/src/runtime/root/computer-composition.ts +191 -6
- package/src/runtime/root/controller-progression-composition.ts +254 -0
- package/src/runtime/root/controller-round-composition.ts +20 -1
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +111 -18
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +227 -29
- package/src/runtime/root/package-runtime-release.ts +117 -30
- package/src/runtime/root/package-runtime-service.ts +24 -24
- package/src/runtime/root/release-execution-canary.ts +57 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -40
- package/src/runtime/root/release-materialize.ts +372 -106
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +160 -29
- package/src/runtime/root/scheduled-controller-composition.ts +29 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +126 -44
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -9
- package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/ios-development.ts +22 -8
- package/src/runtime/safe-tooling/job-summary.ts +1 -1
- package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
- package/src/runtime/shared/atomic-text-file.ts +21 -0
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/json-files.ts +8 -3
- package/src/runtime/shared/process-environment.ts +20 -9
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
- package/src/runtime/standalone-recovery/core.ts +3792 -417
- package/src/runtime/standalone-recovery/entry.ts +507 -45
- package/src/runtime/standalone-recovery/installer.ts +262 -148
- package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
- package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
- package/src/runtime/standalone-recovery/performance.ts +54 -16
- package/src/runtime/standalone-recovery/release.ts +53 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
- package/src/runtime/workflow/schedules/engine.ts +166 -178
- package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
- package/src/runtime/workflows/runtime.ts +15 -19
- package/src/testing/test-governance.ts +5 -1
- package/supervisor/chatgpt-conversation.ts +23 -0
- package/supervisor/client.ts +218 -0
- package/supervisor/control-plane.ts +963 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +147 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +1151 -0
- package/supervisor/native-messaging/host.ts +58 -0
- package/supervisor/native-messaging/manifest.ts +26 -0
- package/supervisor/native-messaging/protocol.ts +27 -0
- package/supervisor/paths.ts +18 -0
- package/supervisor/protocol.ts +250 -0
- package/supervisor/server.ts +412 -0
- package/supervisor/store.ts +1870 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +261 -0
- package/SKILL.md +0 -427
- package/adapters/chatgpt/controller-host.ts +0 -119
- package/adapters/mcp/controller-round-compatibility.ts +0 -184
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
- package/adapters/mcp/toolset-selection.ts +0 -41
- package/agents/openai.yaml +0 -4
- package/assets/skill-hooks.json +0 -41
- package/assets/skill-version.json +0 -189
- package/assets/skills/claude-review/SKILL.md +0 -231
- package/assets/skills/codex-review/SKILL.md +0 -103
- package/assets/templates/helpers/check-skill-version.ts +0 -193
- package/packages/kernel/progression/api/index.ts +0 -2
- package/packages/kernel/progression/application/projector.ts +0 -211
- package/packages/kernel/progression/domain/types.ts +0 -116
- package/packages/kernel/progression/index.ts +0 -1
- package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
- package/packages/kernel/scheduler/domain/continuation.ts +0 -38
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
- package/packages/kernel/work/domain/admission-policy.ts +0 -34
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-computer-hotpath.ts +0 -255
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -191
- package/scripts/benchmark-ios-agent-device.ts +0 -511
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -169
- package/scripts/benchmark-operational-memory-activation.ts +0 -235
- package/scripts/benchmark-operational-shadow.ts +0 -28
- package/scripts/benchmark-quality-harness.ts +0 -146
- package/scripts/benchmark-route-session-concurrency.ts +0 -915
- package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
- package/scripts/benchmark-thin-harness.ts +0 -251
- package/scripts/benchmark-typescript-navigation.ts +0 -186
- package/scripts/benchmark-work-efficiency.ts +0 -334
- package/scripts/build-controller-ui.ts +0 -28
- package/scripts/check-npm-release.sh +0 -32
- package/scripts/check-public-release-surface.sh +0 -19
- package/scripts/check-release-published.sh +0 -57
- package/scripts/check-release-readiness.sh +0 -37
- package/scripts/check-release-version.mjs +0 -74
- package/scripts/check-skill-version.ts +0 -5
- package/scripts/check-tarball-install-smoke.sh +0 -150
- package/scripts/ensure-codegraph.sh +0 -16
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/run-skill-hook.ts +0 -244
- package/scripts/stage-runtime-release.ts +0 -44
- package/scripts/sync-codex-installed-copies.sh +0 -182
- package/src/cli/commands/tools.ts +0 -167
- package/src/cli/controller/progress.ts +0 -656
- package/src/cli/controller/work-mode.ts +0 -181
- package/src/cli/local-bridge/console-assets.ts +0 -17
- package/src/cli/local-bridge/dashboard.ts +0 -17
- package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
- package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
- package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
- package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
- package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/styles.css +0 -28
- package/src/cli/local-bridge/frontend/src/types.ts +0 -15
- package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
- package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
- package/src/cli/local-bridge/ui-dist/app.css +0 -1
- package/src/cli/local-bridge/ui-dist/app.js +0 -11228
- package/src/cli/mcp/access-mode.ts +0 -2
- package/src/cli/mcp/access-tools.ts +0 -2
- package/src/cli/mcp/audit.ts +0 -2
- package/src/cli/mcp/auth.ts +0 -2
- package/src/cli/mcp/instructions.ts +0 -2
- package/src/cli/mcp/legacy-context.ts +0 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -2
- package/src/cli/mcp/multi-repository.ts +0 -2
- package/src/cli/mcp/oauth.ts +0 -2
- package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
- package/src/cli/mcp/paths.ts +0 -2
- package/src/cli/mcp/policy.ts +0 -2
- package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
- package/src/cli/mcp/proxy-env.ts +0 -2
- package/src/cli/mcp/readiness-projection.ts +0 -2
- package/src/cli/mcp/redaction.ts +0 -2
- package/src/cli/mcp/repo.ts +0 -2
- package/src/cli/mcp/repository-tools.ts +0 -2
- package/src/cli/mcp/server.ts +0 -2
- package/src/cli/mcp/setup.ts +0 -2
- package/src/cli/mcp/tool-capability-cache.ts +0 -2
- package/src/cli/mcp/tool-contract.ts +0 -2
- package/src/cli/mcp/tools.ts +0 -2
- package/src/cli/mcp/toolset-names.ts +0 -2
- package/src/cli/mcp/toolset-selection.ts +0 -2
- package/src/cli/mcp/toolset.ts +0 -2
- package/src/cli/mcp/transports/http.ts +0 -2
- package/src/cli/mcp/transports/session-registry.ts +0 -2
- package/src/cli/mcp/transports/stdio.ts +0 -2
- package/src/cli/mcp/types.ts +0 -2
- package/src/cli/mcp/umbrella-tools.ts +0 -2
- package/src/cli/tools/codegraph.ts +0 -695
- package/src/core/adoption/helper-wrapper-plan.ts +0 -159
- package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
- package/src/runtime/context/codegraph-read-provider.ts +0 -611
- package/src/runtime/context/codegraph-sidecar.cjs +0 -248
- package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
- package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
- package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
- package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
- package/src/runtime/control-plane/routing/index.ts +0 -1
- package/src/runtime/control-plane/routing/route-policy.ts +0 -401
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
- package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
- package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
- package/src/runtime/gateway/mcp/process-tools.ts +0 -2
- package/src/runtime/gateway/mcp/router.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
- package/src/runtime/plugins/browser-provider-registry.ts +0 -2
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import type { WorkContract, WorkContractStore
|
|
1
|
+
import type { SemanticWorkState, WorkContract, WorkContractStore } from '../domain/types';
|
|
2
2
|
|
|
3
3
|
export interface WorkContractStoreLocation {
|
|
4
4
|
controllerHome?: string;
|
|
5
|
+
/** Canonical storage scope. Semantic Work uses the portable semantic scope; repository Work may omit this and use repoId. */
|
|
6
|
+
scopeKey?: string;
|
|
7
|
+
/** Legacy/repository execution storage scope and optional placement context. */
|
|
5
8
|
repoId?: string;
|
|
6
9
|
root?: string;
|
|
7
10
|
}
|
|
@@ -14,5 +17,5 @@ export interface WorkContractStoreOptions extends WorkContractStoreLocation {
|
|
|
14
17
|
export interface WorkContractPersistencePort {
|
|
15
18
|
read(options: WorkContractStoreOptions): WorkContractStore;
|
|
16
19
|
get(options: WorkContractStoreOptions, workId: string): WorkContract | undefined;
|
|
17
|
-
list(options: WorkContractStoreOptions & {
|
|
20
|
+
list(options: WorkContractStoreOptions & { state?: SemanticWorkState | 'active' | 'all'; limit?: number }): WorkContract[];
|
|
18
21
|
}
|
|
@@ -6,8 +6,6 @@ import {
|
|
|
6
6
|
} from './runtime-contract';
|
|
7
7
|
|
|
8
8
|
export interface BrowserRuntimeProvider<TInput, TResult> extends BrowserProviderCapabilities {
|
|
9
|
-
/** Lower values are preferred when multiple providers satisfy the same capability contract. */
|
|
10
|
-
priority: number;
|
|
11
9
|
/** Availability is decided before execution; ordinary provider failures are never fallback signals. */
|
|
12
10
|
supportsInput(input: TInput): boolean;
|
|
13
11
|
execute(input: TInput): Promise<TResult>;
|
|
@@ -37,22 +35,6 @@ export class BrowserProviderSelectionError extends Error {
|
|
|
37
35
|
}
|
|
38
36
|
}
|
|
39
37
|
|
|
40
|
-
/**
|
|
41
|
-
* A typed pre-action rejection. Runtime may select another provider because this proves the action
|
|
42
|
-
* was not attempted. Arbitrary provider errors are intentionally not mapped to this signal.
|
|
43
|
-
*/
|
|
44
|
-
export class BrowserProviderUnavailableBeforeActionError extends Error {
|
|
45
|
-
readonly providerId: string;
|
|
46
|
-
readonly reason: string;
|
|
47
|
-
|
|
48
|
-
constructor(providerId: string, reason: string) {
|
|
49
|
-
super(`${providerId} unavailable before action: ${reason}`);
|
|
50
|
-
this.name = 'BrowserProviderUnavailableBeforeActionError';
|
|
51
|
-
this.providerId = providerId;
|
|
52
|
-
this.reason = reason;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
38
|
function foregroundCompatible(
|
|
57
39
|
provider: BrowserProviderCapabilities,
|
|
58
40
|
requested: BrowserForegroundRequirement,
|
|
@@ -61,24 +43,23 @@ function foregroundCompatible(
|
|
|
61
43
|
}
|
|
62
44
|
|
|
63
45
|
export class BrowserProviderRegistry<TInput, TResult> {
|
|
64
|
-
private
|
|
46
|
+
private state?: BrowserProviderState<TInput, TResult>;
|
|
65
47
|
|
|
66
48
|
register(provider: BrowserRuntimeProvider<TInput, TResult>): void {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
current.provider = provider;
|
|
49
|
+
if (this.state?.provider.providerId === provider.providerId) {
|
|
50
|
+
this.state.provider = provider;
|
|
70
51
|
return;
|
|
71
52
|
}
|
|
72
|
-
|
|
53
|
+
// A configuration change replaces the binding; it never accumulates candidates.
|
|
54
|
+
this.state = { provider, generation: 1 };
|
|
73
55
|
}
|
|
74
56
|
|
|
75
57
|
invalidate(providerId: string, reason: string): void {
|
|
76
|
-
|
|
77
|
-
if (state) state.invalidatedReason = reason;
|
|
58
|
+
if (this.state?.provider.providerId === providerId) this.state.invalidatedReason = reason;
|
|
78
59
|
}
|
|
79
60
|
|
|
80
61
|
invalidateAll(reason: string): void {
|
|
81
|
-
|
|
62
|
+
if (this.state) this.state.invalidatedReason = reason;
|
|
82
63
|
}
|
|
83
64
|
|
|
84
65
|
private async prepare(state: BrowserProviderState<TInput, TResult>): Promise<void> {
|
|
@@ -92,17 +73,12 @@ export class BrowserProviderRegistry<TInput, TResult> {
|
|
|
92
73
|
input: TInput;
|
|
93
74
|
requiredCapabilities: readonly BrowserProviderCapability[];
|
|
94
75
|
foreground: BrowserForegroundRequirement;
|
|
95
|
-
excludedProviderIds?: ReadonlySet<string>;
|
|
96
76
|
}): Promise<BrowserProviderSelection<TInput, TResult>> {
|
|
97
|
-
const
|
|
98
|
-
.
|
|
99
|
-
.
|
|
100
|
-
|
|
101
|
-
.
|
|
102
|
-
.sort((left, right) => left.provider.priority - right.provider.priority
|
|
103
|
-
|| left.provider.providerId.localeCompare(right.provider.providerId));
|
|
104
|
-
|
|
105
|
-
const selected = candidates[0];
|
|
77
|
+
const selected = this.state
|
|
78
|
+
&& this.state.provider.supportsInput(options.input)
|
|
79
|
+
&& providerSupports(this.state.provider, options.requiredCapabilities)
|
|
80
|
+
&& foregroundCompatible(this.state.provider, options.foreground)
|
|
81
|
+
? this.state : undefined;
|
|
106
82
|
if (!selected) throw new BrowserProviderSelectionError(options.requiredCapabilities);
|
|
107
83
|
await this.prepare(selected);
|
|
108
84
|
return { provider: selected.provider, generation: selected.generation };
|
|
@@ -4,7 +4,8 @@ export const MAX_BROWSER_SESSION_LIST_LIMIT = 200;
|
|
|
4
4
|
/** State-free Browser execution scope. Durable interaction identity belongs to Computer SurfaceTarget authority. */
|
|
5
5
|
export interface BrowserSessionExecutionContext {
|
|
6
6
|
controllerHome: string;
|
|
7
|
-
|
|
7
|
+
/** Optional repository visibility/migration context; never Browser session authority. */
|
|
8
|
+
repoId?: string;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
/** @deprecated Compatibility alias for frozen callers; this is context, not an authority capability. */
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const CHATGPT_HOSTS = new Set(['chatgpt.com', 'www.chatgpt.com', 'chat.openai.com']);
|
|
2
|
+
const MAX_CONVERSATION_ID_CHARS = 256;
|
|
3
|
+
|
|
4
|
+
export interface CanonicalChatgptConversationIdentity {
|
|
5
|
+
conversationUrl: string;
|
|
6
|
+
conversationId: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function parseCanonicalChatgptConversationIdentity(value: string): CanonicalChatgptConversationIdentity {
|
|
10
|
+
let url: URL;
|
|
11
|
+
try { url = new URL(value); } catch { throw new Error('CHATGPT_CONVERSATION_URL_INVALID'); }
|
|
12
|
+
if (url.protocol !== 'https:' || !CHATGPT_HOSTS.has(url.hostname)) throw new Error('CHATGPT_CONVERSATION_URL_INVALID');
|
|
13
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
14
|
+
const marker = parts.lastIndexOf('c');
|
|
15
|
+
if (marker < 0 || marker + 2 !== parts.length) throw new Error('CHATGPT_CONVERSATION_ID_MISSING');
|
|
16
|
+
const conversationId = parts[marker + 1]?.trim() ?? '';
|
|
17
|
+
if (!conversationId) throw new Error('CHATGPT_CONVERSATION_ID_MISSING');
|
|
18
|
+
if (conversationId.length > MAX_CONVERSATION_ID_CHARS) throw new Error('CHATGPT_CONVERSATION_ID_INVALID');
|
|
19
|
+
url.protocol = 'https:';
|
|
20
|
+
url.hostname = 'chatgpt.com';
|
|
21
|
+
url.search = '';
|
|
22
|
+
url.hash = '';
|
|
23
|
+
return { conversationUrl: url.toString(), conversationId };
|
|
24
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { ComputerSurfaceProviderBinding } from './target-authority';
|
|
2
|
+
|
|
3
|
+
export interface ComputerChatgptConversationIdentity {
|
|
4
|
+
namespace: 'chatgpt.conversation';
|
|
5
|
+
conversationId: string;
|
|
6
|
+
canonicalUrl: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ComputerChatgptBootstrapIdentity {
|
|
10
|
+
namespace: 'chatgpt.bootstrap';
|
|
11
|
+
bootstrapKey: string;
|
|
12
|
+
projectUrl: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type ComputerChatgptTargetIdentity = ComputerChatgptConversationIdentity | ComputerChatgptBootstrapIdentity;
|
|
16
|
+
|
|
17
|
+
export interface ComputerChatgptConversationObservation {
|
|
18
|
+
url: string;
|
|
19
|
+
title: string;
|
|
20
|
+
latestUserText: string;
|
|
21
|
+
latestAssistantResponse: string;
|
|
22
|
+
userMessages?: string[];
|
|
23
|
+
assistantMessages?: string[];
|
|
24
|
+
composerText?: string;
|
|
25
|
+
/** Read-only content-script selector attestation; undefined on older loaded scripts. */
|
|
26
|
+
composerSelectorVersion?: 'visible-single-v2';
|
|
27
|
+
/** Exact loaded content-script contract; file projection/version on disk is not a live browser attestation. */
|
|
28
|
+
composerReplacementContract?: 'exact-backed-up-project-draft-v1';
|
|
29
|
+
providerActivityText: string;
|
|
30
|
+
providerFailureText: string;
|
|
31
|
+
pageText?: string;
|
|
32
|
+
latestTurnRole?: 'user' | 'assistant';
|
|
33
|
+
isGenerating: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ComputerChatgptConversationObservationOptions {
|
|
37
|
+
includeUserHistory?: boolean;
|
|
38
|
+
includePageText?: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Opaque exact-conversation attachment. The targetId is durable Computer
|
|
43
|
+
* identity; provider ids and tab/window handles remain inside the Computer
|
|
44
|
+
* implementation and can be replaced without changing Supervisor authority.
|
|
45
|
+
*/
|
|
46
|
+
export interface ComputerChatgptConversationTarget {
|
|
47
|
+
targetId: string;
|
|
48
|
+
identity: ComputerChatgptTargetIdentity;
|
|
49
|
+
observe(options?: ComputerChatgptConversationObservationOptions): Promise<ComputerChatgptConversationObservation>;
|
|
50
|
+
/** UI-only preparation. Must never click Send or create a provider turn. */
|
|
51
|
+
prepare(prompt: string, options?: { mode?: 'send' | 'resume' | 'recover' }): Promise<{ ready: true } | { ready: false; reasonCode: string }>;
|
|
52
|
+
dispatch(
|
|
53
|
+
prompt: string,
|
|
54
|
+
options?: { mode?: 'send' | 'resume' | 'recover' },
|
|
55
|
+
): Promise<
|
|
56
|
+
| { mutation: 'not_attempted'; reasonCode: string }
|
|
57
|
+
| { mutation: 'attempted'; confirmed?: boolean }
|
|
58
|
+
>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type ComputerChatgptTargetFailure = {
|
|
62
|
+
code: string;
|
|
63
|
+
retryable: boolean;
|
|
64
|
+
/** Failover is legal only while provider mutation is mechanically impossible. */
|
|
65
|
+
phase: 'pre_mutation';
|
|
66
|
+
/** False when provider resource recovery is itself outcome-unknown. */
|
|
67
|
+
failoverSafe?: boolean;
|
|
68
|
+
humanAction?: 'login' | 'grant_permission';
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export type ComputerChatgptTargetResult =
|
|
72
|
+
| { state: 'ready'; target: ComputerChatgptConversationTarget; observation?: ComputerChatgptConversationObservation }
|
|
73
|
+
| { state: 'unavailable'; failure: ComputerChatgptTargetFailure };
|
|
74
|
+
|
|
75
|
+
export interface ComputerObservedChatgptConversation {
|
|
76
|
+
conversationId: string;
|
|
77
|
+
canonicalUrl: string;
|
|
78
|
+
title?: string;
|
|
79
|
+
projectTitle?: string;
|
|
80
|
+
projectUrl?: string;
|
|
81
|
+
isCurrent?: boolean;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface ComputerChatgptConversationInventory {
|
|
85
|
+
conversations: ComputerObservedChatgptConversation[];
|
|
86
|
+
/** Full coverage of all supported browser families, not only active providers. */
|
|
87
|
+
complete: boolean;
|
|
88
|
+
/** At least one provider completed its own inventory; not exact-target/send proof. */
|
|
89
|
+
providerInventoryReady?: boolean;
|
|
90
|
+
unavailableProviders: string[];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Browser/Computer-owned target boundary consumed by Workflow Supervisor.
|
|
95
|
+
* Implementations own discovery, exact target recovery, provider binding and
|
|
96
|
+
* transport replacement. They never decide effect admission or effect outcome.
|
|
97
|
+
*/
|
|
98
|
+
export type ComputerChatgptExtensionCommand =
|
|
99
|
+
| { commandId: string; kind: 'ensure'; identity: ComputerChatgptTargetIdentity; providerBinding?: ComputerSurfaceProviderBinding }
|
|
100
|
+
| { commandId: string; kind: 'observe'; identity: ComputerChatgptTargetIdentity; providerBinding?: ComputerSurfaceProviderBinding; options?: ComputerChatgptConversationObservationOptions }
|
|
101
|
+
| { commandId: string; kind: 'dispatch' | 'prepare'; identity: ComputerChatgptTargetIdentity; providerBinding?: ComputerSurfaceProviderBinding; prompt: string; mode?: 'send' | 'resume' | 'recover' }
|
|
102
|
+
| { commandId: string; kind: 'find_marker'; marker: string; bootstrapKey?: string }
|
|
103
|
+
| { commandId: string; kind: 'close'; identity: ComputerChatgptTargetIdentity; providerBinding?: ComputerSurfaceProviderBinding };
|
|
104
|
+
export type ComputerChatgptExtensionCommandInput = ComputerChatgptExtensionCommand extends infer Command
|
|
105
|
+
? Command extends { commandId: string }
|
|
106
|
+
? Omit<Command, 'commandId'>
|
|
107
|
+
: never
|
|
108
|
+
: never;
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
export type ComputerChatgptExtensionCommandResult =
|
|
112
|
+
| { kind: 'ensured'; providerBinding?: ComputerSurfaceProviderBinding; observation?: ComputerChatgptConversationObservation }
|
|
113
|
+
| { kind: 'observation'; providerBinding?: ComputerSurfaceProviderBinding; observation: ComputerChatgptConversationObservation }
|
|
114
|
+
| { kind: 'prepared'; ready: true }
|
|
115
|
+
| { kind: 'prepared'; ready: false; reasonCode: string }
|
|
116
|
+
| { kind: 'dispatch'; mutation: 'not_attempted'; reasonCode: string }
|
|
117
|
+
| { kind: 'dispatch'; mutation: 'attempted'; confirmed?: boolean; observation?: ComputerChatgptConversationObservation }
|
|
118
|
+
| { kind: 'marker_matches'; matches: Array<{ identity: ComputerChatgptConversationIdentity; providerBinding?: ComputerSurfaceProviderBinding; observation: ComputerChatgptConversationObservation }> }
|
|
119
|
+
| { kind: 'closed' }
|
|
120
|
+
| { kind: 'failed'; code: string; retryable?: boolean; failoverSafe?: boolean; humanAction?: 'login' | 'grant_permission';
|
|
121
|
+
/** Exact attachment retained after ensure hydration failed; never Send/readiness authority. */
|
|
122
|
+
providerBinding?: ComputerSurfaceProviderBinding };
|
|
123
|
+
|
|
124
|
+
export interface ComputerChatgptExtensionHeartbeat {
|
|
125
|
+
providerId: string;
|
|
126
|
+
/** Ephemeral browser/profile provider runtime identity; mechanical binding only. */
|
|
127
|
+
providerInstanceId: string;
|
|
128
|
+
observedAt: string;
|
|
129
|
+
conversations: Array<ComputerObservedChatgptConversation & { providerBinding?: ComputerSurfaceProviderBinding }>;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface ComputerChatgptExtensionBrokerRpc {
|
|
133
|
+
heartbeat(input: ComputerChatgptExtensionHeartbeat): void;
|
|
134
|
+
claim(providerInstanceId: string): ComputerChatgptExtensionCommand | undefined;
|
|
135
|
+
complete(providerInstanceId: string, commandId: string, result: ComputerChatgptExtensionCommandResult): boolean;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface ComputerChatgptConversationTargetPort {
|
|
139
|
+
inventory(): Promise<ComputerChatgptConversationInventory>;
|
|
140
|
+
/** Read-only reconciliation cannot create a missing tab. Only a separately authorized new send may opt in to exact conversation creation. */
|
|
141
|
+
ensureExact(identity: ComputerChatgptConversationIdentity, options?: { createIfMissing?: boolean }): Promise<ComputerChatgptTargetResult>;
|
|
142
|
+
openBootstrap(projectUrl: string, bootstrapKey: string): Promise<ComputerChatgptTargetResult>;
|
|
143
|
+
findBySubmittedMarker(
|
|
144
|
+
marker: string,
|
|
145
|
+
bootstrapKey?: string,
|
|
146
|
+
betweenObservations?: () => Promise<void>,
|
|
147
|
+
): Promise<ComputerChatgptTargetResult[]>;
|
|
148
|
+
promoteBootstrap(targetId: string, identity: ComputerChatgptConversationIdentity): Promise<ComputerChatgptTargetResult>;
|
|
149
|
+
/** Mechanical cleanup of provider-owned attachments; semantic target identity remains durable. */
|
|
150
|
+
cleanup(activeResourceKeys: readonly string[]): Promise<void>;
|
|
151
|
+
release(targetId: string): Promise<void>;
|
|
152
|
+
close(): Promise<void>;
|
|
153
|
+
}
|
|
@@ -8,8 +8,14 @@ export interface ComputerProviderTargetBinding {
|
|
|
8
8
|
providerId: string;
|
|
9
9
|
providerSessionId: string;
|
|
10
10
|
observedAt: string;
|
|
11
|
+
/** Rebuildable exact native process observation for cross-target lifecycle fencing. */
|
|
12
|
+
processId?: number;
|
|
11
13
|
}
|
|
12
14
|
|
|
15
|
+
export type ComputerApplicationLaunchProvenance =
|
|
16
|
+
| { kind: 'preexisting' }
|
|
17
|
+
| { kind: 'provider_launched'; processId: number };
|
|
18
|
+
|
|
13
19
|
export type ComputerSurfaceType = 'browser-tab' | 'browser-page';
|
|
14
20
|
export type ComputerSurfaceOwnership = 'plugin_owned' | 'user_owned' | 'provider_owned';
|
|
15
21
|
export type ComputerSurfaceVisibility = 'repositories' | 'controller';
|
|
@@ -18,10 +24,19 @@ export type ComputerSurfaceVisibility = 'repositories' | 'controller';
|
|
|
18
24
|
* Durable semantic description of a Computer surface. Mutable URL/title and
|
|
19
25
|
* provider-specific tab/window handles are deliberately excluded.
|
|
20
26
|
*/
|
|
27
|
+
export interface ComputerSurfaceResourceIdentity {
|
|
28
|
+
/** Stable semantic namespace, for example chatgpt.conversation. */
|
|
29
|
+
namespace: string;
|
|
30
|
+
/** Provider-independent durable resource key inside the namespace. */
|
|
31
|
+
key: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
21
34
|
export interface ComputerSurfaceStableIdentity {
|
|
22
35
|
surfaceType: ComputerSurfaceType;
|
|
23
36
|
ownership: ComputerSurfaceOwnership;
|
|
24
37
|
application?: ComputerApplicationStableIdentity;
|
|
38
|
+
/** Durable semantic identity. Provider tab/window/session ids never belong here. */
|
|
39
|
+
resource?: ComputerSurfaceResourceIdentity;
|
|
25
40
|
}
|
|
26
41
|
|
|
27
42
|
/**
|
|
@@ -52,6 +67,8 @@ export interface ComputerApplicationTarget {
|
|
|
52
67
|
targetId: string;
|
|
53
68
|
kind: 'application';
|
|
54
69
|
stableIdentity: ComputerApplicationStableIdentity;
|
|
70
|
+
/** Durable launch fact. Missing means a legacy provider supplied no trustworthy provenance. */
|
|
71
|
+
launchProvenance?: ComputerApplicationLaunchProvenance;
|
|
55
72
|
providerBinding?: ComputerProviderTargetBinding;
|
|
56
73
|
createdAt: string;
|
|
57
74
|
updatedAt: string;
|
|
@@ -93,6 +110,8 @@ export interface ComputerApplicationTargetLease {
|
|
|
93
110
|
export interface ComputerSurfaceTargetLease {
|
|
94
111
|
current(): ComputerSurfaceTarget;
|
|
95
112
|
bind(binding: ComputerSurfaceProviderBinding): ComputerSurfaceTarget;
|
|
113
|
+
/** Provider attachment is rebuildable and may be cleared without changing target identity. */
|
|
114
|
+
clearBinding(): ComputerSurfaceTarget;
|
|
96
115
|
mergeCompatibility(input: { compatibilityAliases?: string[]; repositoryIds?: string[] }): ComputerSurfaceTarget;
|
|
97
116
|
putCompatibility(record: ComputerSurfaceCompatibilityRecord): ComputerSurfaceTarget;
|
|
98
117
|
tombstone(): ComputerSurfaceTarget;
|
|
@@ -146,10 +165,15 @@ export interface ComputerInteractionTargetCleanupReport {
|
|
|
146
165
|
export interface ComputerInteractionTargetAuthorityPort {
|
|
147
166
|
create(
|
|
148
167
|
controllerHome: string,
|
|
149
|
-
input: {
|
|
168
|
+
input: {
|
|
169
|
+
stableIdentity: ComputerApplicationStableIdentity;
|
|
170
|
+
launchProvenance?: ComputerApplicationLaunchProvenance;
|
|
171
|
+
providerBinding?: ComputerProviderTargetBinding;
|
|
172
|
+
},
|
|
150
173
|
): ComputerApplicationTarget;
|
|
151
174
|
get(controllerHome: string, targetId: string): ComputerApplicationTarget | undefined;
|
|
152
175
|
require(controllerHome: string, targetId: string): ComputerApplicationTarget;
|
|
176
|
+
listAllApplications(controllerHome: string): ComputerApplicationTarget[];
|
|
153
177
|
withLease<T>(
|
|
154
178
|
controllerHome: string,
|
|
155
179
|
targetId: string,
|
|
@@ -171,6 +195,7 @@ export interface ComputerInteractionTargetAuthorityPort {
|
|
|
171
195
|
getSurface(controllerHome: string, targetId: string): ComputerSurfaceTarget | undefined;
|
|
172
196
|
requireSurface(controllerHome: string, targetId: string): ComputerSurfaceTarget;
|
|
173
197
|
findSurfaceByAlias(controllerHome: string, alias: string, repoId?: string): ComputerSurfaceTarget | undefined;
|
|
198
|
+
findSurfaceByStableIdentity(controllerHome: string, identity: ComputerSurfaceStableIdentity, repoId?: string): ComputerSurfaceTarget | undefined;
|
|
174
199
|
findSurfaceByProviderBinding(controllerHome: string, binding: ComputerSurfaceProviderBinding): ComputerSurfaceTarget | undefined;
|
|
175
200
|
listSurfaces(controllerHome: string, options?: { repoId?: string; limit?: number }): ComputerSurfaceTarget[];
|
|
176
201
|
listAllSurfaces(controllerHome: string, options?: { repoId?: string }): ComputerSurfaceTarget[];
|
|
@@ -5,7 +5,14 @@ const DEFAULT_TIMEOUT_MS = 30_000;
|
|
|
5
5
|
const DEFAULT_HEALTH_TIMEOUT_MS = 2_000;
|
|
6
6
|
const DEFAULT_MAX_REQUEST_BYTES = 1_048_576;
|
|
7
7
|
const DEFAULT_MAX_RESPONSE_BYTES = 1_048_576;
|
|
8
|
-
const
|
|
8
|
+
export const MAX_PLUGIN_ACTION_TIMEOUT_MS = 10 * 60_000;
|
|
9
|
+
/**
|
|
10
|
+
* How long an already-dispatched request keeps its connection open after the
|
|
11
|
+
* caller stopped waiting. Destroying that socket makes the provider's own write
|
|
12
|
+
* fail (SIGPIPE / EPIPE) and can terminate a long-running provider service that
|
|
13
|
+
* is still completing bounded work. Draining absorbs the late response instead.
|
|
14
|
+
*/
|
|
15
|
+
const UNANSWERED_DRAIN_TIMEOUT_MS = 15_000;
|
|
9
16
|
export const EXTERNAL_RPC_METHOD_PATTERN = /^[a-z][a-z0-9_]{0,127}$/;
|
|
10
17
|
|
|
11
18
|
export type ExternalUnixJsonlMethod = string;
|
|
@@ -98,6 +105,61 @@ function transportError(
|
|
|
98
105
|
return new ExternalUnixJsonlTransportError(code, message, options);
|
|
99
106
|
}
|
|
100
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Absorb a response that nobody is waiting for any more.
|
|
110
|
+
*
|
|
111
|
+
* A client that abandons a dispatched request must not tear the connection down
|
|
112
|
+
* underneath the provider: an in-flight provider write to a closed peer raises
|
|
113
|
+
* SIGPIPE and kills single-threaded provider services, which then restart into
|
|
114
|
+
* the same request forever. Keeping the connection open until the provider's
|
|
115
|
+
* own response arrives preserves the provider lifecycle while discarding the
|
|
116
|
+
* now-meaningless payload.
|
|
117
|
+
*/
|
|
118
|
+
function drainUnansweredResponse(options: {
|
|
119
|
+
socket: Socket;
|
|
120
|
+
maxResponseBytes: number;
|
|
121
|
+
onFinished: (socket: Socket) => void;
|
|
122
|
+
}): void {
|
|
123
|
+
const { socket, maxResponseBytes, onFinished } = options;
|
|
124
|
+
if (socket.destroyed) {
|
|
125
|
+
onFinished(socket);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
let buffer = Buffer.alloc(0);
|
|
129
|
+
let settled = false;
|
|
130
|
+
const settle = (destroy: boolean): void => {
|
|
131
|
+
if (settled) return;
|
|
132
|
+
settled = true;
|
|
133
|
+
clearTimeout(timer);
|
|
134
|
+
socket.removeListener('data', onData);
|
|
135
|
+
socket.removeListener('end', onEnd);
|
|
136
|
+
socket.removeListener('error', onEnd);
|
|
137
|
+
socket.removeListener('close', onEnd);
|
|
138
|
+
if (!socket.destroyed) {
|
|
139
|
+
// The provider finished writing its late response: a graceful half-close
|
|
140
|
+
// is enough, and it never turns into a provider-side write failure.
|
|
141
|
+
if (destroy) socket.destroy();
|
|
142
|
+
else socket.end();
|
|
143
|
+
}
|
|
144
|
+
onFinished(socket);
|
|
145
|
+
};
|
|
146
|
+
const onData = (chunk: Buffer): void => {
|
|
147
|
+
if (buffer.length + chunk.length > maxResponseBytes) {
|
|
148
|
+
settle(true);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
152
|
+
if (buffer.indexOf(0x0A) >= 0) settle(false);
|
|
153
|
+
};
|
|
154
|
+
const onEnd = (): void => settle(true);
|
|
155
|
+
const timer = setTimeout(() => settle(true), UNANSWERED_DRAIN_TIMEOUT_MS);
|
|
156
|
+
timer.unref?.();
|
|
157
|
+
socket.on('data', onData);
|
|
158
|
+
socket.once('end', onEnd);
|
|
159
|
+
socket.once('error', onEnd);
|
|
160
|
+
socket.once('close', onEnd);
|
|
161
|
+
}
|
|
162
|
+
|
|
101
163
|
function normalizeTransportError(error: unknown): ExternalUnixJsonlTransportError {
|
|
102
164
|
return error instanceof ExternalUnixJsonlTransportError
|
|
103
165
|
? error
|
|
@@ -152,7 +214,7 @@ export function normalizeExternalUnixJsonlCall(
|
|
|
152
214
|
const params = options.params ?? {};
|
|
153
215
|
const maxRequestBytes = boundedInteger(options.maxRequestBytes, DEFAULT_MAX_REQUEST_BYTES, 1_024, 4 * DEFAULT_MAX_REQUEST_BYTES);
|
|
154
216
|
const maxResponseBytes = boundedInteger(options.maxResponseBytes, DEFAULT_MAX_RESPONSE_BYTES, 1_024, 4 * DEFAULT_MAX_RESPONSE_BYTES);
|
|
155
|
-
const timeoutMs = boundedInteger(options.timeoutMs, health ? DEFAULT_HEALTH_TIMEOUT_MS : DEFAULT_TIMEOUT_MS, 100,
|
|
217
|
+
const timeoutMs = boundedInteger(options.timeoutMs, health ? DEFAULT_HEALTH_TIMEOUT_MS : DEFAULT_TIMEOUT_MS, 100, MAX_PLUGIN_ACTION_TIMEOUT_MS);
|
|
156
218
|
const envelope = `${JSON.stringify({ id: options.requestId, method, params })}\n`;
|
|
157
219
|
if (Buffer.byteLength(envelope, 'utf8') > maxRequestBytes) {
|
|
158
220
|
throw transportError('EXTERNAL_PLUGIN_REQUEST_TOO_LARGE', 'External provider request exceeded the bounded input limit.', { retryable: false });
|
|
@@ -200,6 +262,9 @@ export class ExternalUnixJsonlChannel {
|
|
|
200
262
|
private queue: Promise<void> = Promise.resolve();
|
|
201
263
|
private generationValue = 0;
|
|
202
264
|
private disposed = false;
|
|
265
|
+
private outstandingDispatched = 0;
|
|
266
|
+
private outstandingMaxResponseBytes = DEFAULT_MAX_RESPONSE_BYTES;
|
|
267
|
+
private readonly draining = new Set<Socket>();
|
|
203
268
|
|
|
204
269
|
constructor(readonly socketPath: string) {
|
|
205
270
|
validateSocketPath(socketPath);
|
|
@@ -235,6 +300,10 @@ export class ExternalUnixJsonlChannel {
|
|
|
235
300
|
|
|
236
301
|
close(): void {
|
|
237
302
|
this.disposed = true;
|
|
303
|
+
if (this.outstandingDispatched > 0 && this.socket) {
|
|
304
|
+
this.retireForDrain(this.socket, this.outstandingMaxResponseBytes);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
238
307
|
this.resetSocket();
|
|
239
308
|
}
|
|
240
309
|
|
|
@@ -245,6 +314,24 @@ export class ExternalUnixJsonlChannel {
|
|
|
245
314
|
this.buffer = Buffer.alloc(0);
|
|
246
315
|
}
|
|
247
316
|
|
|
317
|
+
/**
|
|
318
|
+
* Retire a connection whose request was abandoned by the caller. The socket
|
|
319
|
+
* leaves service immediately, but stays open until the provider's own
|
|
320
|
+
* response is absorbed so the provider is never killed by its late write.
|
|
321
|
+
*/
|
|
322
|
+
private retireForDrain(socket: Socket, maxResponseBytes: number): void {
|
|
323
|
+
if (this.socket === socket) this.socket = undefined;
|
|
324
|
+
this.connecting = undefined;
|
|
325
|
+
this.buffer = Buffer.alloc(0);
|
|
326
|
+
if (socket.destroyed) return;
|
|
327
|
+
this.draining.add(socket);
|
|
328
|
+
drainUnansweredResponse({
|
|
329
|
+
socket,
|
|
330
|
+
maxResponseBytes,
|
|
331
|
+
onFinished: (finished) => { this.draining.delete(finished); },
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
248
335
|
private async ensureConnected(): Promise<void> {
|
|
249
336
|
if (this.connected) return;
|
|
250
337
|
if (this.connecting) return await this.connecting;
|
|
@@ -299,7 +386,7 @@ export class ExternalUnixJsonlChannel {
|
|
|
299
386
|
let settled = false;
|
|
300
387
|
let dispatched = false;
|
|
301
388
|
let socket: Socket | undefined;
|
|
302
|
-
const finish = (callback: () => void, reset =
|
|
389
|
+
const finish = (callback: () => void, disposition: 'keep' | 'reset' | 'drain' = 'keep'): void => {
|
|
303
390
|
if (settled) return;
|
|
304
391
|
settled = true;
|
|
305
392
|
if (timer) clearTimeout(timer);
|
|
@@ -307,15 +394,20 @@ export class ExternalUnixJsonlChannel {
|
|
|
307
394
|
socket?.removeListener('data', onData);
|
|
308
395
|
socket?.removeListener('error', onError);
|
|
309
396
|
socket?.removeListener('end', onEnd);
|
|
310
|
-
if (
|
|
397
|
+
if (dispatched) this.outstandingDispatched = Math.max(0, this.outstandingDispatched - 1);
|
|
398
|
+
if (disposition === 'reset') this.resetSocket(socket);
|
|
399
|
+
else if (disposition === 'drain' && socket) this.retireForDrain(socket, normalized.maxResponseBytes);
|
|
311
400
|
callback();
|
|
312
401
|
};
|
|
313
|
-
const fail = (error: unknown, reset =
|
|
402
|
+
const fail = (error: unknown, disposition: 'keep' | 'reset' | 'drain' = 'reset'): void => {
|
|
314
403
|
const normalizedError = normalizeTransportError(error);
|
|
315
404
|
const classified = dispatched && mayHaveEffects ? markOutcomeUnknown(normalizedError) : normalizedError;
|
|
316
|
-
finish(() => reject(classified),
|
|
405
|
+
finish(() => reject(classified), disposition);
|
|
317
406
|
};
|
|
318
|
-
const onAbort = (): void => fail(
|
|
407
|
+
const onAbort = (): void => fail(
|
|
408
|
+
transportError('EXTERNAL_PLUGIN_ABORTED', 'External provider request was cancelled.'),
|
|
409
|
+
dispatched ? 'drain' : 'reset',
|
|
410
|
+
);
|
|
319
411
|
const onError = (error: Error): void => fail(transportError('EXTERNAL_PLUGIN_SOCKET_UNAVAILABLE', error.message));
|
|
320
412
|
const onEnd = (): void => fail(transportError('EXTERNAL_PLUGIN_PROTOCOL_ERROR', 'External provider closed the socket before returning a complete response.'));
|
|
321
413
|
const onData = (chunk: Buffer): void => {
|
|
@@ -338,14 +430,22 @@ export class ExternalUnixJsonlChannel {
|
|
|
338
430
|
finish(() => resolve(decoded));
|
|
339
431
|
} catch (error) {
|
|
340
432
|
if (error instanceof ExternalUnixJsonlTransportError && error.source === 'provider') {
|
|
341
|
-
fail(error,
|
|
433
|
+
fail(error, 'keep');
|
|
342
434
|
} else {
|
|
343
435
|
fail(error);
|
|
344
436
|
}
|
|
345
437
|
}
|
|
346
438
|
};
|
|
347
439
|
|
|
348
|
-
|
|
440
|
+
// A request the caller stopped waiting for is not a reason to kill the
|
|
441
|
+
// provider: retire the connection into a bounded drain instead.
|
|
442
|
+
timer = setTimeout(
|
|
443
|
+
() => fail(
|
|
444
|
+
transportError('EXTERNAL_PLUGIN_TIMEOUT', `External provider request timed out after ${normalized.timeoutMs}ms.`),
|
|
445
|
+
dispatched ? 'drain' : 'reset',
|
|
446
|
+
),
|
|
447
|
+
normalized.timeoutMs,
|
|
448
|
+
);
|
|
349
449
|
timer.unref?.();
|
|
350
450
|
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
351
451
|
|
|
@@ -361,7 +461,7 @@ export class ExternalUnixJsonlChannel {
|
|
|
361
461
|
'EXTERNAL_PLUGIN_CHANNEL_GENERATION_CHANGED',
|
|
362
462
|
`External provider connection changed from generation ${expectedGeneration} to ${this.generation}; renegotiate before executing the action.`,
|
|
363
463
|
{ retryable: true },
|
|
364
|
-
),
|
|
464
|
+
), 'keep');
|
|
365
465
|
return;
|
|
366
466
|
}
|
|
367
467
|
socket = this.socket;
|
|
@@ -373,6 +473,8 @@ export class ExternalUnixJsonlChannel {
|
|
|
373
473
|
socket.once('error', onError);
|
|
374
474
|
socket.once('end', onEnd);
|
|
375
475
|
dispatched = true;
|
|
476
|
+
this.outstandingDispatched += 1;
|
|
477
|
+
this.outstandingMaxResponseBytes = normalized.maxResponseBytes;
|
|
376
478
|
socket.write(normalized.envelope, (error) => {
|
|
377
479
|
if (error) fail(transportError('EXTERNAL_PLUGIN_TRANSPORT_FAILED', error.message));
|
|
378
480
|
});
|
|
@@ -399,21 +501,32 @@ export async function callExternalUnixJsonl(
|
|
|
399
501
|
let dispatched = false;
|
|
400
502
|
let buffer = Buffer.alloc(0);
|
|
401
503
|
|
|
402
|
-
const cleanup = (): void => {
|
|
504
|
+
const cleanup = (disposition: 'destroy' | 'drain'): void => {
|
|
403
505
|
if (timer) clearTimeout(timer);
|
|
404
506
|
options.signal?.removeEventListener('abort', onAbort);
|
|
405
|
-
if (socket
|
|
507
|
+
if (!socket || socket.destroyed) return;
|
|
508
|
+
if (disposition === 'drain') {
|
|
509
|
+
// The socket is dead to this one-shot caller, so only the drain reader
|
|
510
|
+
// may keep observing it.
|
|
511
|
+
socket.removeAllListeners('data');
|
|
512
|
+
socket.removeAllListeners('error');
|
|
513
|
+
socket.removeAllListeners('end');
|
|
514
|
+
socket.removeAllListeners('close');
|
|
515
|
+
drainUnansweredResponse({ socket, maxResponseBytes: normalized.maxResponseBytes, onFinished: () => undefined });
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
socket.destroy();
|
|
406
519
|
};
|
|
407
|
-
const finish = (callback: () => void): void => {
|
|
520
|
+
const finish = (callback: () => void, disposition: 'destroy' | 'drain' = 'destroy'): void => {
|
|
408
521
|
if (settled) return;
|
|
409
522
|
settled = true;
|
|
410
|
-
cleanup();
|
|
523
|
+
cleanup(disposition);
|
|
411
524
|
callback();
|
|
412
525
|
};
|
|
413
|
-
const fail = (error: unknown): void => {
|
|
526
|
+
const fail = (error: unknown, disposition: 'destroy' | 'drain' = 'destroy'): void => {
|
|
414
527
|
const normalizedError = normalizeTransportError(error);
|
|
415
528
|
const classified = dispatched && mayHaveEffects ? markOutcomeUnknown(normalizedError) : normalizedError;
|
|
416
|
-
finish(() => reject(classified));
|
|
529
|
+
finish(() => reject(classified), disposition);
|
|
417
530
|
};
|
|
418
531
|
const succeed = (raw: string): void => finish(() => {
|
|
419
532
|
try {
|
|
@@ -422,9 +535,20 @@ export async function callExternalUnixJsonl(
|
|
|
422
535
|
reject(error);
|
|
423
536
|
}
|
|
424
537
|
});
|
|
425
|
-
const onAbort = (): void => fail(
|
|
538
|
+
const onAbort = (): void => fail(
|
|
539
|
+
transportError('EXTERNAL_PLUGIN_ABORTED', 'External provider request was cancelled.'),
|
|
540
|
+
dispatched ? 'drain' : 'destroy',
|
|
541
|
+
);
|
|
426
542
|
|
|
427
|
-
|
|
543
|
+
// Preserve the provider lifecycle: an abandoned request is drained instead
|
|
544
|
+
// of being answered with a closed connection.
|
|
545
|
+
timer = setTimeout(
|
|
546
|
+
() => fail(
|
|
547
|
+
transportError('EXTERNAL_PLUGIN_TIMEOUT', `External provider request timed out after ${normalized.timeoutMs}ms.`),
|
|
548
|
+
dispatched ? 'drain' : 'destroy',
|
|
549
|
+
),
|
|
550
|
+
normalized.timeoutMs,
|
|
551
|
+
);
|
|
428
552
|
timer.unref?.();
|
|
429
553
|
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
430
554
|
|