@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,5 +1,6 @@
|
|
|
1
1
|
import { createHash, randomUUID } from 'crypto';
|
|
2
2
|
import type {
|
|
3
|
+
ComputerApplicationLaunchProvenance,
|
|
3
4
|
ComputerApplicationTarget,
|
|
4
5
|
ComputerApplicationStableIdentity,
|
|
5
6
|
ComputerApplicationTargetLease,
|
|
@@ -11,6 +12,7 @@ import {
|
|
|
11
12
|
COMPUTER_ELEMENT_OBSERVE_CAPABILITY,
|
|
12
13
|
COMPUTER_INPUT_CAPABILITY,
|
|
13
14
|
COMPUTER_OBSERVE_CAPABILITY,
|
|
15
|
+
type ComputerConsoleUnlockCommandRequest,
|
|
14
16
|
type ComputerConsoleUnlockPrepareRequest,
|
|
15
17
|
type ComputerConsoleUnlockRequest,
|
|
16
18
|
type ComputerElementSemanticAction,
|
|
@@ -29,6 +31,8 @@ import {
|
|
|
29
31
|
import { desktopOperatorActions } from './desktop-operator-registration';
|
|
30
32
|
import { getExternalPluginAdapter } from './external-adapter';
|
|
31
33
|
import { AssistantPluginError } from './errors';
|
|
34
|
+
import { executeIosPhysicalDeviceAction, iosPhysicalDeviceActions, iosPhysicalDeviceCapabilities, iosPhysicalDeviceStatus, isIosPhysicalDeviceAction, resolveIosPhysicalDeviceAuthorizationContext } from './ios-physical-device';
|
|
35
|
+
import { remoteXpcHidCachedStatus } from './ios/remote-xpc-hid';
|
|
32
36
|
import type {
|
|
33
37
|
AssistantPluginActionDescriptor,
|
|
34
38
|
AssistantPluginActionExecutionInput,
|
|
@@ -48,6 +52,10 @@ const DESKTOP_ELEMENT_OBSERVE_ACTION = 'desktop_element_observe';
|
|
|
48
52
|
const DESKTOP_ELEMENT_ACTION_ACTION = 'desktop_element_action';
|
|
49
53
|
export const COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION = 'console_unlock_prepare';
|
|
50
54
|
export const COMPUTER_CONSOLE_UNLOCK_ACTION = 'console_unlock';
|
|
55
|
+
export const COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION = 'console_unlock_enroll';
|
|
56
|
+
export const COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION = 'console_unlock_status';
|
|
57
|
+
export const COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION = 'console_unlock_recover';
|
|
58
|
+
export const COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION = 'console_unlock_revoke';
|
|
51
59
|
const DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS = 15_000;
|
|
52
60
|
const MAX_CONSOLE_UNLOCK_TIMEOUT_MS = 30_000;
|
|
53
61
|
const CONSOLE_CREDENTIAL_HANDLE_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
@@ -69,6 +77,10 @@ const DESKTOP_PRODUCT_ACTION_IDS = new Set([
|
|
|
69
77
|
DESKTOP_ELEMENT_ACTION_ACTION,
|
|
70
78
|
COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION,
|
|
71
79
|
COMPUTER_CONSOLE_UNLOCK_ACTION,
|
|
80
|
+
COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION,
|
|
81
|
+
COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION,
|
|
82
|
+
COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION,
|
|
83
|
+
COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION,
|
|
72
84
|
]);
|
|
73
85
|
|
|
74
86
|
function providerActionDescriptor(actionId: string): AssistantPluginActionDescriptor {
|
|
@@ -178,6 +190,31 @@ export async function executeProtectedConsoleUnlockInvocation(
|
|
|
178
190
|
};
|
|
179
191
|
}
|
|
180
192
|
|
|
193
|
+
export async function executeProtectedConsoleUnlockLifecycle(
|
|
194
|
+
action: 'console_unlock_enroll' | 'console_unlock_status' | 'console_unlock_recover' | 'console_unlock_revoke',
|
|
195
|
+
input: ProtectedConsoleUnlockPreparationInput,
|
|
196
|
+
controllerHome: string,
|
|
197
|
+
): Promise<Record<string, unknown>> {
|
|
198
|
+
requireConsoleUnlockAuthorization(input.confirmAuthorization);
|
|
199
|
+
const invocationId = randomUUID();
|
|
200
|
+
const request: ComputerConsoleUnlockCommandRequest = {
|
|
201
|
+
capability: COMPUTER_CONSOLE_UNLOCK_CAPABILITY,
|
|
202
|
+
action,
|
|
203
|
+
};
|
|
204
|
+
const providerResult = await executeRuntimeComputerConsoleUnlock(
|
|
205
|
+
request,
|
|
206
|
+
{ kind: 'explicit_single_use', confirmed: true, invocationId },
|
|
207
|
+
boundedConsoleUnlockTimeoutMs(input.timeoutMs),
|
|
208
|
+
controllerHome,
|
|
209
|
+
);
|
|
210
|
+
return {
|
|
211
|
+
capability: COMPUTER_CONSOLE_UNLOCK_CAPABILITY,
|
|
212
|
+
action,
|
|
213
|
+
invocationId,
|
|
214
|
+
...providerResult,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
181
218
|
function desktopProductActions(): AssistantPluginActionDescriptor[] {
|
|
182
219
|
const open = providerActionDescriptor('desktop_session_open');
|
|
183
220
|
const close = providerActionDescriptor('desktop_session_close');
|
|
@@ -240,6 +277,70 @@ function desktopProductActions(): AssistantPluginActionDescriptor[] {
|
|
|
240
277
|
additionalProperties: false,
|
|
241
278
|
},
|
|
242
279
|
},
|
|
280
|
+
{
|
|
281
|
+
actionId: COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION,
|
|
282
|
+
title: 'Enable unattended console recovery',
|
|
283
|
+
description: 'Enroll provider-local unattended console recovery. Credential collection and Keychain persistence remain entirely inside the native provider.',
|
|
284
|
+
readOnly: false,
|
|
285
|
+
risk: 'workspace_write',
|
|
286
|
+
confirmation: 'authorization',
|
|
287
|
+
defaultTimeoutMs: DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS,
|
|
288
|
+
cancellable: true,
|
|
289
|
+
idempotent: false,
|
|
290
|
+
executionMode: 'direct_non_persistent',
|
|
291
|
+
foregroundEffect: 'required',
|
|
292
|
+
scopes: ['console.unlock'],
|
|
293
|
+
resourceClaims: [],
|
|
294
|
+
argumentsSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
actionId: COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION,
|
|
298
|
+
title: 'Read unattended console recovery status',
|
|
299
|
+
description: 'Read whether provider-local unattended console recovery is enrolled and available without exposing credential material.',
|
|
300
|
+
readOnly: true,
|
|
301
|
+
risk: 'readonly',
|
|
302
|
+
confirmation: 'authorization',
|
|
303
|
+
defaultTimeoutMs: DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS,
|
|
304
|
+
cancellable: true,
|
|
305
|
+
idempotent: true,
|
|
306
|
+
executionMode: 'direct_non_persistent',
|
|
307
|
+
foregroundEffect: 'none',
|
|
308
|
+
scopes: ['console.unlock'],
|
|
309
|
+
resourceClaims: [],
|
|
310
|
+
argumentsSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
actionId: COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION,
|
|
314
|
+
title: 'Recover locked macOS console',
|
|
315
|
+
description: 'Recover an already-locked console using only the provider-local enrolled credential. No password or credential handle enters Forge.',
|
|
316
|
+
readOnly: false,
|
|
317
|
+
risk: 'workspace_write',
|
|
318
|
+
confirmation: 'authorization',
|
|
319
|
+
defaultTimeoutMs: DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS,
|
|
320
|
+
cancellable: true,
|
|
321
|
+
idempotent: false,
|
|
322
|
+
executionMode: 'direct_non_persistent',
|
|
323
|
+
foregroundEffect: 'required',
|
|
324
|
+
scopes: ['console.unlock'],
|
|
325
|
+
resourceClaims: [],
|
|
326
|
+
argumentsSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
actionId: COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION,
|
|
330
|
+
title: 'Disable unattended console recovery',
|
|
331
|
+
description: 'Delete the provider-local unattended console recovery credential and disable future recovery.',
|
|
332
|
+
readOnly: false,
|
|
333
|
+
risk: 'workspace_write',
|
|
334
|
+
confirmation: 'authorization',
|
|
335
|
+
defaultTimeoutMs: DEFAULT_CONSOLE_UNLOCK_TIMEOUT_MS,
|
|
336
|
+
cancellable: true,
|
|
337
|
+
idempotent: true,
|
|
338
|
+
executionMode: 'direct_non_persistent',
|
|
339
|
+
foregroundEffect: 'none',
|
|
340
|
+
scopes: ['console.unlock'],
|
|
341
|
+
resourceClaims: [],
|
|
342
|
+
argumentsSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
343
|
+
},
|
|
243
344
|
{
|
|
244
345
|
actionId: DESKTOP_ELEMENT_OBSERVE_ACTION,
|
|
245
346
|
title: 'Observe Computer elements',
|
|
@@ -318,7 +419,7 @@ function desktopProductPermissions(ready: boolean): AssistantPluginPermissionSco
|
|
|
318
419
|
{ scope: 'desktop.observe', mode: 'read', description: 'Observe bounded desktop accessibility state.', granted: ready, required: false },
|
|
319
420
|
{ scope: 'desktop.interact', mode: 'write', description: 'Perform bounded semantic desktop interaction.', granted: ready, required: false },
|
|
320
421
|
{ scope: 'desktop.capture', mode: 'read', description: 'Capture an authorized desktop target.', granted: ready, required: false },
|
|
321
|
-
{ scope: 'console.unlock', mode: 'write', description: '
|
|
422
|
+
{ scope: 'console.unlock', mode: 'write', description: 'Use provider-local temporary unlock or explicitly enrolled unattended console recovery.', granted: ready, required: false },
|
|
322
423
|
];
|
|
323
424
|
}
|
|
324
425
|
|
|
@@ -330,7 +431,7 @@ function desktopProductCapabilities(): AssistantPluginCapability[] {
|
|
|
330
431
|
{ capabilityId: 'computer.capture.v1', title: 'Computer capture', description: 'Capture authorized desktop state.', scopes: ['desktop.capture'], actions: ['desktop_screenshot'] },
|
|
331
432
|
{ capabilityId: COMPUTER_ELEMENT_OBSERVE_CAPABILITY, title: 'Computer element observation', description: 'Observe exact provider-neutral semantic element snapshots for a Forge-owned target.', scopes: ['desktop.observe'], actions: [DESKTOP_ELEMENT_OBSERVE_ACTION] },
|
|
332
433
|
{ capabilityId: COMPUTER_ELEMENT_ACTION_CAPABILITY, title: 'Computer element action', description: 'Act on exact observed element refs with observation-epoch fencing.', scopes: ['desktop.interact'], actions: [DESKTOP_ELEMENT_ACTION_ACTION] },
|
|
333
|
-
{ capabilityId: COMPUTER_CONSOLE_UNLOCK_CAPABILITY, title: 'Protected console unlock', description: '
|
|
434
|
+
{ capabilityId: COMPUTER_CONSOLE_UNLOCK_CAPABILITY, title: 'Protected console unlock', description: 'Keep console credential material provider-local while supporting temporary one-shot unlock and opt-in unattended recovery.', scopes: ['console.unlock'], actions: [COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION, COMPUTER_CONSOLE_UNLOCK_ACTION, COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION, COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION, COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION, COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION] },
|
|
334
435
|
];
|
|
335
436
|
}
|
|
336
437
|
|
|
@@ -346,14 +447,37 @@ function buildComputerManifest(
|
|
|
346
447
|
repoRoot?: string,
|
|
347
448
|
context?: AssistantPluginBuildContext,
|
|
348
449
|
): AssistantPluginManifest {
|
|
349
|
-
const browser = buildBrowserPluginManifest(previousRevision, previousUpdatedAt, repoRoot, context);
|
|
450
|
+
const browser = buildBrowserPluginManifest(previousRevision, previousUpdatedAt, repoRoot, context, true);
|
|
451
|
+
const scriptedBrowserActions = new Set([
|
|
452
|
+
'configure', 'install_unpacked_extension', 'list_unpacked_extensions', 'clear_session', 'reconcile_sessions',
|
|
453
|
+
]);
|
|
454
|
+
const browserActions = browser.actions.filter((action) => !scriptedBrowserActions.has(action.actionId));
|
|
455
|
+
const browserCapabilities = browser.capabilities.map((capability) => ({
|
|
456
|
+
...capability,
|
|
457
|
+
actions: capability.actions.filter((action) => !scriptedBrowserActions.has(action)),
|
|
458
|
+
...(capability.capabilityId === 'browser-interaction'
|
|
459
|
+
? { description: 'Interact with existing Chrome or Vivaldi through native Computer; scripted Playwright is a separate explicit capability.' }
|
|
460
|
+
: {}),
|
|
461
|
+
...(capability.capabilityId === 'browser-session'
|
|
462
|
+
? { description: 'Discover, bind and reuse tabs of the user’s existing browser.' }
|
|
463
|
+
: {}),
|
|
464
|
+
...(capability.capabilityId === 'browser-human-handoff'
|
|
465
|
+
? { description: 'Present the exact existing native browser tab for manual interaction.' }
|
|
466
|
+
: {}),
|
|
467
|
+
})).filter((capability) => capability.actions.length > 0);
|
|
350
468
|
const desktop = desktopProviderManifest(context);
|
|
351
469
|
const platform = currentComputerPlatform();
|
|
352
470
|
const desktopSupported = platform === 'darwin';
|
|
353
471
|
const browserReady = browser.enabled && browser.health.ready;
|
|
354
472
|
const desktopReady = desktopSupported && desktop?.enabled === true && desktop.health.ready;
|
|
473
|
+
const physicalRepository = desktopSupported && context?.controllerScoped === false;
|
|
474
|
+
const physicalReady = physicalRepository && iosPhysicalDeviceStatus().coreDeviceReady;
|
|
475
|
+
// Passive manifest reads must never launch Python: input readiness is
|
|
476
|
+
// published only after an explicit HID action verified the exact toolchain.
|
|
477
|
+
const hidStatus = physicalReady && context ? remoteXpcHidCachedStatus(context.controllerHome) : undefined;
|
|
478
|
+
const physicalInputReady = physicalReady && hidStatus?.available === true;
|
|
355
479
|
const ready = browserReady && desktopReady;
|
|
356
|
-
const partial = browserReady || desktopReady;
|
|
480
|
+
const partial = browserReady || desktopReady || physicalReady;
|
|
357
481
|
const checkedAt = new Date().toISOString();
|
|
358
482
|
return {
|
|
359
483
|
...browser,
|
|
@@ -365,12 +489,14 @@ function buildComputerManifest(
|
|
|
365
489
|
strategy: 'derived',
|
|
366
490
|
duplicateStateAllowed: false,
|
|
367
491
|
sourceOfTruth: [
|
|
368
|
-
|
|
492
|
+
// Computer browser is built in and never reads a project's independent
|
|
493
|
+
// Browser-script configuration to decide activation or routing.
|
|
369
494
|
'controllerHome:sqlite/computer_interaction_target',
|
|
370
|
-
'
|
|
495
|
+
'controller-home:repository browser artifacts',
|
|
496
|
+
'controller-home:repository ios-device interactions and Controller-global UDID lock',
|
|
371
497
|
],
|
|
372
498
|
},
|
|
373
|
-
enabled: browser.enabled || desktop?.enabled === true,
|
|
499
|
+
enabled: browser.enabled || desktop?.enabled === true || physicalReady,
|
|
374
500
|
lifecycle: {
|
|
375
501
|
state: ready ? 'enabled' : partial ? 'degraded' : 'error',
|
|
376
502
|
reason: ready
|
|
@@ -384,20 +510,39 @@ function buildComputerManifest(
|
|
|
384
510
|
checkedAt,
|
|
385
511
|
ready,
|
|
386
512
|
probed: browser.health.probed || desktop?.health.probed === true,
|
|
387
|
-
errors: ready ? [] : [
|
|
513
|
+
errors: ready ? [] : [
|
|
514
|
+
...browser.health.errors,
|
|
515
|
+
...(desktopSupported && !desktopReady ? ['Native Computer capabilities are unavailable or not ready.'] : []),
|
|
516
|
+
],
|
|
388
517
|
warnings: [
|
|
389
518
|
...browser.health.warnings,
|
|
390
|
-
...(
|
|
519
|
+
...(physicalReady && !physicalInputReady ? [`Physical iPhone observation is ready, but RemoteXPC HID input requires Controller-owned pymobiledevice3 ${String(hidStatus?.toolchainVersion ?? 'toolchain')}.`] : []),
|
|
520
|
+
...(desktopSupported
|
|
521
|
+
? (desktopReady ? [] : ['Native Computer capability diagnostics are available through the internal platform provider.'])
|
|
522
|
+
: [`Native Desktop Computer capabilities are unsupported on ${platform}.`]),
|
|
391
523
|
],
|
|
392
524
|
details: {
|
|
393
525
|
partial: !ready && partial,
|
|
394
526
|
browser: { ready: browserReady, state: browser.health.state },
|
|
395
|
-
desktop: { supported: desktopSupported, ready: desktopReady, state: desktop?.health.state ?? (desktopSupported ? 'not_installed' : 'unsupported')
|
|
527
|
+
desktop: { supported: desktopSupported, ready: desktopReady, state: desktop?.health.state ?? (desktopSupported ? 'not_installed' : 'unsupported') },
|
|
528
|
+
iphone: {
|
|
529
|
+
supported: desktopSupported, ready: physicalInputReady,
|
|
530
|
+
observationReady: physicalReady, inputReady: physicalInputReady,
|
|
531
|
+
toolchainVersion: hidStatus?.toolchainVersion,
|
|
532
|
+
provider: 'coredevice',
|
|
533
|
+
},
|
|
396
534
|
},
|
|
397
535
|
},
|
|
398
|
-
permissions: [...browser.permissions
|
|
399
|
-
|
|
400
|
-
|
|
536
|
+
permissions: [...browser.permissions.filter((permission) => permission.scope !== 'browser.extensions').map((permission) =>
|
|
537
|
+
permission.scope === 'browser.profile'
|
|
538
|
+
? { ...permission, description: 'Bind and persist exact existing native browser tab identities.' }
|
|
539
|
+
: permission), ...desktopProductPermissions(desktopReady),
|
|
540
|
+
...(physicalRepository ? [
|
|
541
|
+
{ scope: 'ios.discover' as const, mode: 'read' as const, description: 'Discover paired physical iPhones through CoreDevice.', granted: physicalReady, required: false },
|
|
542
|
+
{ scope: 'ios.device' as const, mode: 'write' as const, description: 'Use one exact iPhone through the existing CoreDevice/RemoteXPC owner.', granted: physicalReady, required: false },
|
|
543
|
+
] : [])],
|
|
544
|
+
capabilities: [...browserCapabilities, ...desktopProductCapabilities(), ...(physicalRepository ? iosPhysicalDeviceCapabilities() : [])],
|
|
545
|
+
actions: [...browserActions, ...desktopProductActions(), ...(physicalRepository ? iosPhysicalDeviceActions() : [])],
|
|
401
546
|
updatedAt: previousUpdatedAt ?? checkedAt,
|
|
402
547
|
};
|
|
403
548
|
}
|
|
@@ -618,10 +763,12 @@ async function rebindProviderSession(
|
|
|
618
763
|
{ retryable: false, details: { targetId: target.targetId, stableIdentity: target.stableIdentity } },
|
|
619
764
|
);
|
|
620
765
|
}
|
|
766
|
+
const processId = providerProcessId(rebound);
|
|
621
767
|
lease.bind({
|
|
622
768
|
providerId: DESKTOP_PROVIDER_ID,
|
|
623
769
|
providerSessionId: interactionId,
|
|
624
770
|
observedAt: new Date().toISOString(),
|
|
771
|
+
...(processId !== undefined ? { processId } : {}),
|
|
625
772
|
});
|
|
626
773
|
return interactionId;
|
|
627
774
|
}
|
|
@@ -638,6 +785,55 @@ async function ensureProviderBinding(
|
|
|
638
785
|
return rebindProviderSession(input, lease, provider);
|
|
639
786
|
}
|
|
640
787
|
|
|
788
|
+
function providerProcessId(result: Record<string, unknown>): number | undefined {
|
|
789
|
+
const value = result.pid ?? result.process_id;
|
|
790
|
+
if (value === undefined) return undefined;
|
|
791
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0 || value > 2_147_483_647) {
|
|
792
|
+
throw new AssistantPluginError(
|
|
793
|
+
'PLUGIN_COMPUTER_TARGET_PROCESS_ID_INVALID',
|
|
794
|
+
'Native Computer provider returned an invalid application process identifier.',
|
|
795
|
+
{ retryable: false, details: { processId: value } },
|
|
796
|
+
);
|
|
797
|
+
}
|
|
798
|
+
return value;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
function explicitLaunchProvenanceFromProviderResult(
|
|
802
|
+
result: Record<string, unknown>,
|
|
803
|
+
processId: number | undefined,
|
|
804
|
+
): ComputerApplicationLaunchProvenance | undefined {
|
|
805
|
+
const rawOwnership = result.applicationOwnership ?? result.application_ownership;
|
|
806
|
+
const rawOwnedPid = result.ownedProcessIdentifier ?? result.owned_process_identifier;
|
|
807
|
+
if (rawOwnership === undefined && rawOwnedPid === undefined) return undefined;
|
|
808
|
+
if (rawOwnership === 'preexisting' && rawOwnedPid === undefined) return { kind: 'preexisting' };
|
|
809
|
+
if (rawOwnership === 'provider_launched'
|
|
810
|
+
&& typeof rawOwnedPid === 'number'
|
|
811
|
+
&& Number.isInteger(rawOwnedPid)
|
|
812
|
+
&& rawOwnedPid > 0
|
|
813
|
+
&& rawOwnedPid <= 2_147_483_647
|
|
814
|
+
&& processId === rawOwnedPid) {
|
|
815
|
+
return { kind: 'provider_launched', processId: rawOwnedPid };
|
|
816
|
+
}
|
|
817
|
+
throw new AssistantPluginError(
|
|
818
|
+
'PLUGIN_COMPUTER_TARGET_LAUNCH_PROVENANCE_INVALID',
|
|
819
|
+
'Native Computer provider returned inconsistent application launch provenance.',
|
|
820
|
+
{ retryable: false, details: { applicationOwnership: rawOwnership, ownedProcessIdentifier: rawOwnedPid, processId } },
|
|
821
|
+
);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
function inheritedLaunchProvenance(
|
|
825
|
+
controllerHome: string,
|
|
826
|
+
processId: number | undefined,
|
|
827
|
+
): ComputerApplicationLaunchProvenance | undefined {
|
|
828
|
+
if (processId === undefined) return undefined;
|
|
829
|
+
const owner = computerTargetAuthority.listAllApplications(controllerHome).find((target) =>
|
|
830
|
+
target.launchProvenance?.kind === 'provider_launched'
|
|
831
|
+
&& target.launchProvenance.processId === processId
|
|
832
|
+
&& target.providerBinding?.processId === processId,
|
|
833
|
+
);
|
|
834
|
+
return owner ? { kind: 'provider_launched', processId } : undefined;
|
|
835
|
+
}
|
|
836
|
+
|
|
641
837
|
function stableIdentityFromProviderResult(
|
|
642
838
|
result: Record<string, unknown>,
|
|
643
839
|
requested: ComputerApplicationStableIdentity,
|
|
@@ -689,10 +885,35 @@ async function openDesktopTarget(
|
|
|
689
885
|
}
|
|
690
886
|
throw error;
|
|
691
887
|
}
|
|
888
|
+
let processId: number | undefined;
|
|
889
|
+
let explicitProvenance: ComputerApplicationLaunchProvenance | undefined;
|
|
890
|
+
try {
|
|
891
|
+
processId = providerProcessId(opened);
|
|
892
|
+
explicitProvenance = explicitLaunchProvenanceFromProviderResult(opened, processId);
|
|
893
|
+
} catch (error) {
|
|
894
|
+
try {
|
|
895
|
+
await provider.executeAction(providerInput(input, 'desktop_session_close', { interaction_id: interactionId }, 'target-open-provenance-compensate'));
|
|
896
|
+
} catch (cleanupError) {
|
|
897
|
+
throw new AssistantPluginError('PLUGIN_COMPUTER_TARGET_LAUNCH_PROVENANCE_CLEANUP_UNKNOWN', 'Computer target launch provenance was invalid and provider-session cleanup could not be confirmed.', {
|
|
898
|
+
retryable: false,
|
|
899
|
+
details: { cause: error instanceof Error ? error.message : String(error), cleanupCause: cleanupError instanceof Error ? cleanupError.message : String(cleanupError) },
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
throw error;
|
|
903
|
+
}
|
|
692
904
|
try {
|
|
905
|
+
const launchProvenance = explicitProvenance?.kind === 'provider_launched'
|
|
906
|
+
? explicitProvenance
|
|
907
|
+
: inheritedLaunchProvenance(input.controllerHome, processId) ?? explicitProvenance;
|
|
693
908
|
const target = computerTargetAuthority.create(input.controllerHome, {
|
|
694
909
|
stableIdentity,
|
|
695
|
-
|
|
910
|
+
...(launchProvenance ? { launchProvenance } : {}),
|
|
911
|
+
providerBinding: {
|
|
912
|
+
providerId: DESKTOP_PROVIDER_ID,
|
|
913
|
+
providerSessionId: interactionId,
|
|
914
|
+
observedAt: new Date().toISOString(),
|
|
915
|
+
...(processId !== undefined ? { processId } : {}),
|
|
916
|
+
},
|
|
696
917
|
});
|
|
697
918
|
return {
|
|
698
919
|
targetId: target.targetId,
|
|
@@ -730,7 +951,27 @@ async function closeDesktopTarget(
|
|
|
730
951
|
);
|
|
731
952
|
}
|
|
732
953
|
if (provider) {
|
|
733
|
-
|
|
954
|
+
const activeTargets = computerTargetAuthority.listAllApplications(input.controllerHome);
|
|
955
|
+
const anotherActiveTargetUsesBinding = activeTargets.some((candidate) =>
|
|
956
|
+
candidate.targetId !== target.targetId
|
|
957
|
+
&& candidate.providerBinding?.providerId === target.providerBinding?.providerId
|
|
958
|
+
&& candidate.providerBinding?.providerSessionId === target.providerBinding?.providerSessionId,
|
|
959
|
+
);
|
|
960
|
+
if (!anotherActiveTargetUsesBinding) {
|
|
961
|
+
const ownedProcessId = target.launchProvenance?.kind === 'provider_launched'
|
|
962
|
+
? target.launchProvenance.processId
|
|
963
|
+
: undefined;
|
|
964
|
+
const anotherActiveTargetUsesOwnedProcess = ownedProcessId !== undefined
|
|
965
|
+
&& activeTargets.some((candidate) =>
|
|
966
|
+
candidate.targetId !== target.targetId && candidate.providerBinding?.processId === ownedProcessId,
|
|
967
|
+
);
|
|
968
|
+
await provider.executeAction(providerInput(input, 'desktop_session_close', {
|
|
969
|
+
interaction_id: target.providerBinding.providerSessionId,
|
|
970
|
+
...(ownedProcessId !== undefined && !anotherActiveTargetUsesOwnedProcess
|
|
971
|
+
? { terminate_owned_pid: ownedProcessId }
|
|
972
|
+
: {}),
|
|
973
|
+
}, 'target-close-provider'));
|
|
974
|
+
}
|
|
734
975
|
}
|
|
735
976
|
// A missing registration is authoritative absence only because provider uninstall
|
|
736
977
|
// must stop/remove its native lifecycle before the registration is deleted.
|
|
@@ -796,7 +1037,7 @@ function targetAuthorization(identity: ComputerApplicationStableIdentity): Assis
|
|
|
796
1037
|
}
|
|
797
1038
|
|
|
798
1039
|
async function resolveDesktopAuthorizationContext(input: AssistantPluginActionExecutionInput): Promise<AssistantPluginAuthorizationContext | undefined> {
|
|
799
|
-
if (
|
|
1040
|
+
if ([COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION, COMPUTER_CONSOLE_UNLOCK_ACTION, COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION, COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION, COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION, COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION].includes(input.actionId)) return undefined;
|
|
800
1041
|
if (input.actionId === DESKTOP_TARGET_OPEN_ACTION) return targetAuthorization(stableIdentityFromArgs(input.args));
|
|
801
1042
|
const targetId = typeof input.args.target_id === 'string' ? input.args.target_id.trim() : '';
|
|
802
1043
|
if (targetId) return targetAuthorization(computerTargetAuthority.require(input.controllerHome, targetId).stableIdentity);
|
|
@@ -804,30 +1045,67 @@ async function resolveDesktopAuthorizationContext(input: AssistantPluginActionEx
|
|
|
804
1045
|
return provider.resolveAuthorizationContext?.(providerInput(input, input.actionId, input.args));
|
|
805
1046
|
}
|
|
806
1047
|
|
|
1048
|
+
// Computer's browser subdomain always targets the user's real browser.
|
|
1049
|
+
// The independent Browser plugin retains explicit Playwright scripting modes,
|
|
1050
|
+
// but Computer must neither select nor silently fall back to those providers.
|
|
1051
|
+
function computerNativeBrowserInput(input: AssistantPluginActionExecutionInput): AssistantPluginActionExecutionInput {
|
|
1052
|
+
if (['configure', 'install_unpacked_extension', 'list_unpacked_extensions', 'clear_session', 'reconcile_sessions'].includes(input.actionId)) {
|
|
1053
|
+
throw new AssistantPluginError('PLUGIN_COMPUTER_BROWSER_SCRIPT_ACTION_SEPARATE',
|
|
1054
|
+
'Browser profile configuration and script-managed extensions belong to the independent Browser plugin.', { retryable: false });
|
|
1055
|
+
}
|
|
1056
|
+
if ((input.args.browser_mode !== undefined && input.args.browser_mode !== 'attach_preferred')
|
|
1057
|
+
|| (input.args.cdp_attach_fallback !== undefined && input.args.cdp_attach_fallback !== 'fail_closed')
|
|
1058
|
+
|| (input.args.native_attach_mode !== undefined && input.args.native_attach_mode !== 'auto')) {
|
|
1059
|
+
throw new AssistantPluginError('PLUGIN_COMPUTER_BROWSER_SCRIPT_MODE_SEPARATE',
|
|
1060
|
+
'Computer only operates the native browser; use the independent Browser plugin for scripted or isolated profiles.',
|
|
1061
|
+
{ retryable: false });
|
|
1062
|
+
}
|
|
1063
|
+
return { ...input, args: { ...input.args,
|
|
1064
|
+
browser_mode: 'attach_preferred',
|
|
1065
|
+
cdp_attach_fallback: 'fail_closed',
|
|
1066
|
+
native_attach_mode: 'auto',
|
|
1067
|
+
__forge_computer_native_only: true,
|
|
1068
|
+
} };
|
|
1069
|
+
}
|
|
1070
|
+
|
|
807
1071
|
export const computerPluginAdapter: AssistantPluginAdapter = {
|
|
808
1072
|
pluginId: 'computer',
|
|
809
1073
|
scope: 'controller_with_repository_overlay',
|
|
810
1074
|
buildManifest: buildComputerManifest,
|
|
811
1075
|
async resolveAuthorizationContext(input) {
|
|
1076
|
+
if (isIosPhysicalDeviceAction(input.actionId)) return resolveIosPhysicalDeviceAuthorizationContext(input);
|
|
812
1077
|
if (!isDesktopProductAction(input.actionId)) {
|
|
813
|
-
return resolveBrowserPluginAuthorizationContext(
|
|
1078
|
+
return resolveBrowserPluginAuthorizationContext(computerNativeBrowserInput(input));
|
|
814
1079
|
}
|
|
815
1080
|
return resolveDesktopAuthorizationContext(input);
|
|
816
1081
|
},
|
|
817
1082
|
async executeAction(input) {
|
|
1083
|
+
if (isIosPhysicalDeviceAction(input.actionId)) return executeIosPhysicalDeviceAction(input);
|
|
818
1084
|
if (!isDesktopProductAction(input.actionId)) {
|
|
819
|
-
return executeBrowserPluginAction(
|
|
1085
|
+
return executeBrowserPluginAction(computerNativeBrowserInput(input));
|
|
820
1086
|
}
|
|
821
1087
|
if (input.actionId === COMPUTER_CONSOLE_UNLOCK_PREPARE_ACTION) {
|
|
822
|
-
return executeProtectedConsoleUnlockPreparation({ confirmAuthorization: true, timeoutMs: input.timeoutMs }, input.controllerHome);
|
|
1088
|
+
return executeProtectedConsoleUnlockPreparation({ confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
|
|
823
1089
|
}
|
|
824
1090
|
if (input.actionId === COMPUTER_CONSOLE_UNLOCK_ACTION) {
|
|
825
1091
|
return executeProtectedConsoleUnlockInvocation({
|
|
826
1092
|
credentialHandle: typeof input.args.credential_handle === 'string' ? input.args.credential_handle : '',
|
|
827
|
-
confirmAuthorization: true,
|
|
1093
|
+
confirmAuthorization: input.confirmAuthorization === true,
|
|
828
1094
|
timeoutMs: input.timeoutMs,
|
|
829
1095
|
}, input.controllerHome);
|
|
830
1096
|
}
|
|
1097
|
+
if (input.actionId === COMPUTER_CONSOLE_UNLOCK_ENROLL_ACTION) {
|
|
1098
|
+
return executeProtectedConsoleUnlockLifecycle('console_unlock_enroll', { confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
|
|
1099
|
+
}
|
|
1100
|
+
if (input.actionId === COMPUTER_CONSOLE_UNLOCK_STATUS_ACTION) {
|
|
1101
|
+
return executeProtectedConsoleUnlockLifecycle('console_unlock_status', { confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
|
|
1102
|
+
}
|
|
1103
|
+
if (input.actionId === COMPUTER_CONSOLE_UNLOCK_RECOVER_ACTION) {
|
|
1104
|
+
return executeProtectedConsoleUnlockLifecycle('console_unlock_recover', { confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
|
|
1105
|
+
}
|
|
1106
|
+
if (input.actionId === COMPUTER_CONSOLE_UNLOCK_REVOKE_ACTION) {
|
|
1107
|
+
return executeProtectedConsoleUnlockLifecycle('console_unlock_revoke', { confirmAuthorization: input.confirmAuthorization === true, timeoutMs: input.timeoutMs }, input.controllerHome);
|
|
1108
|
+
}
|
|
831
1109
|
if (input.actionId === DESKTOP_TARGET_CLOSE_ACTION) return closeDesktopTarget(input, optionalDesktopProvider(input));
|
|
832
1110
|
const provider = desktopProvider(input);
|
|
833
1111
|
if (input.actionId === DESKTOP_TARGET_OPEN_ACTION) return openDesktopTarget(input, provider);
|
|
@@ -178,14 +178,46 @@ async function observeDesktopPointerTarget(
|
|
|
178
178
|
return { frame, point, ...(reboundSelector ? { reboundSelector } : {}) };
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
+
function focusedAxNodes(root: Record<string, unknown> | undefined): Record<string, unknown>[] {
|
|
182
|
+
if (!root) return [];
|
|
183
|
+
const focused: Record<string, unknown>[] = [];
|
|
184
|
+
const visit = (node: Record<string, unknown>): void => {
|
|
185
|
+
if (node.focused === true) focused.push(node);
|
|
186
|
+
for (const child of recordArray(node.children)) visit(child);
|
|
187
|
+
};
|
|
188
|
+
visit(root);
|
|
189
|
+
return focused;
|
|
190
|
+
}
|
|
191
|
+
|
|
181
192
|
function exactFocusedDesktopWindowId(observation: Record<string, unknown>): number | undefined {
|
|
182
193
|
const snapshot = recordValue(observation.snapshot);
|
|
183
194
|
const root = recordValue(snapshot?.root);
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
195
|
+
const axWindows = recordArray(root?.children).filter((window) => firstString(window, 'role') === 'AXWindow');
|
|
196
|
+
const explicitFocused = axWindows.filter((window) => window.focused === true);
|
|
197
|
+
let focusedAxWindow: Record<string, unknown> | undefined;
|
|
198
|
+
if (explicitFocused.length === 1) {
|
|
199
|
+
focusedAxWindow = explicitFocused[0];
|
|
200
|
+
} else if (explicitFocused.length > 1) {
|
|
201
|
+
return undefined;
|
|
202
|
+
} else {
|
|
203
|
+
// Chromium-family apps can expose the system-frontmost window with
|
|
204
|
+
// AXWindow.focused=false while a descendant/control in that window is the
|
|
205
|
+
// unique focused AX node. Recover the same window only from unique bounded
|
|
206
|
+
// geometry; any ambiguity still fails closed.
|
|
207
|
+
const focusedNodes = focusedAxNodes(root).filter((node) => firstString(node, 'role') !== 'AXApplication');
|
|
208
|
+
if (focusedNodes.length !== 1) return undefined;
|
|
209
|
+
const focusedFrame = desktopFrame(focusedNodes[0]?.frame);
|
|
210
|
+
if (!focusedFrame) return undefined;
|
|
211
|
+
const point = desktopFrameCenter(focusedFrame);
|
|
212
|
+
const containingWindows = axWindows.filter((window) => {
|
|
213
|
+
const frame = desktopFrame(window.frame);
|
|
214
|
+
return Boolean(frame && frameContainsPoint(frame, point.x, point.y));
|
|
215
|
+
});
|
|
216
|
+
if (containingWindows.length !== 1) return undefined;
|
|
217
|
+
focusedAxWindow = containingWindows[0];
|
|
218
|
+
}
|
|
187
219
|
|
|
188
|
-
const focusedTitle = firstString(
|
|
220
|
+
const focusedTitle = firstString(focusedAxWindow, 'title');
|
|
189
221
|
if (!focusedTitle) return undefined;
|
|
190
222
|
const matches = recordArray(observation.windows).filter((window) => {
|
|
191
223
|
const windowId = firstNumber(window, 'windowId', 'window_id');
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import type { ExternalPluginRegistrationInput } from './external-registration';
|
|
10
10
|
import type { AssistantPluginActionDescriptor } from './types';
|
|
11
11
|
|
|
12
|
-
const CONTROLLER_WRITE = [{ resource: '
|
|
12
|
+
const CONTROLLER_WRITE = [{ resource: 'provider-state' as const, mode: 'write' as const }];
|
|
13
13
|
const SELECTOR_SCHEMA = {
|
|
14
14
|
type: 'object',
|
|
15
15
|
properties: {
|
|
@@ -436,10 +436,10 @@ export function desktopOperatorActions(): AssistantPluginActionDescriptor[] {
|
|
|
436
436
|
{
|
|
437
437
|
actionId: 'desktop_session_close',
|
|
438
438
|
title: 'Close desktop session',
|
|
439
|
-
description: 'Close one Desktop Operator interaction session
|
|
439
|
+
description: 'Close one Desktop Operator interaction session. Application termination is disabled by default and requires an exact Controller-owned process id.',
|
|
440
440
|
readOnly: false,
|
|
441
441
|
risk: 'workspace_write',
|
|
442
|
-
confirmation: '
|
|
442
|
+
confirmation: 'authorization',
|
|
443
443
|
defaultTimeoutMs: 5_000,
|
|
444
444
|
cancellable: true,
|
|
445
445
|
idempotent: true,
|
|
@@ -447,7 +447,15 @@ export function desktopOperatorActions(): AssistantPluginActionDescriptor[] {
|
|
|
447
447
|
resourceClaims: CONTROLLER_WRITE,
|
|
448
448
|
argumentsSchema: {
|
|
449
449
|
type: 'object',
|
|
450
|
-
properties: {
|
|
450
|
+
properties: {
|
|
451
|
+
interaction_id: { type: 'string' },
|
|
452
|
+
terminate_owned_pid: {
|
|
453
|
+
type: 'integer',
|
|
454
|
+
minimum: 1,
|
|
455
|
+
maximum: 2_147_483_647,
|
|
456
|
+
description: 'Exact provider-launched process id that the durable Computer target authority has decided is no longer used by another active target.',
|
|
457
|
+
},
|
|
458
|
+
},
|
|
451
459
|
required: ['interaction_id'],
|
|
452
460
|
additionalProperties: false,
|
|
453
461
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AssistantPluginError } from './errors';
|
|
2
|
-
import {
|
|
2
|
+
import { externalPluginRegistrationSetIdentity, listExternalPluginRegistrations, type ExternalPluginRegistration } from './external-registration';
|
|
3
3
|
import { callExternalUnixSocket, probeExternalUnixSocketSync, type ExternalUnixSocketCallOptions } from './external-unix-socket';
|
|
4
4
|
import { executeManagedPluginProcess, executeManagedPluginProcessSync, type ManagedPluginProcessSpec } from './managed-process-adapter';
|
|
5
5
|
import { activateAndVerifyFrontmostApplication, restartVerifiedUserLaunchAgent, startVerifiedUserLaunchAgent, stopVerifiedUserLaunchAgent } from './local-system-adapter';
|
|
@@ -149,6 +149,17 @@ function managedSpec(registration: ExternalPluginRegistration): ManagedPluginPro
|
|
|
149
149
|
};
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
function providerActionTimeoutMs(
|
|
153
|
+
registration: ExternalPluginRegistration,
|
|
154
|
+
actionId: string,
|
|
155
|
+
explicitTimeoutMs: number | undefined,
|
|
156
|
+
): number | undefined {
|
|
157
|
+
if (explicitTimeoutMs !== undefined) return explicitTimeoutMs;
|
|
158
|
+
if (actionId === 'manifest' || actionId === 'health') return registration.transport.healthTimeoutMs;
|
|
159
|
+
return registration.actions.find((action) => action.actionId === actionId)?.defaultTimeoutMs
|
|
160
|
+
?? registration.transport.actionTimeoutMs;
|
|
161
|
+
}
|
|
162
|
+
|
|
152
163
|
function probeProvider(
|
|
153
164
|
registration: ExternalPluginRegistration,
|
|
154
165
|
requestId: string,
|
|
@@ -185,15 +196,17 @@ async function callProvider(
|
|
|
185
196
|
requestId,
|
|
186
197
|
method: isProviderMethod ? actionId : 'execute',
|
|
187
198
|
params: isProviderMethod ? undefined : { action: actionId, arguments: args },
|
|
188
|
-
timeoutMs:
|
|
199
|
+
timeoutMs: providerActionTimeoutMs(registration, actionId, timeoutMs),
|
|
189
200
|
signal,
|
|
190
201
|
}));
|
|
191
202
|
}
|
|
203
|
+
const descriptor = registration.actions.find((action) => action.actionId === actionId);
|
|
192
204
|
return await (dependencies.managedCall ?? executeManagedPluginProcess)(managedSpec(registration), {
|
|
193
205
|
requestId,
|
|
194
206
|
actionId,
|
|
195
207
|
input: args,
|
|
196
|
-
timeoutMs:
|
|
208
|
+
timeoutMs: providerActionTimeoutMs(registration, actionId, timeoutMs),
|
|
209
|
+
effectOutcomeOnTimeout: descriptor && !descriptor.readOnly ? 'outcome_unknown' : 'failed',
|
|
197
210
|
signal,
|
|
198
211
|
});
|
|
199
212
|
}
|
|
@@ -256,13 +269,36 @@ function externalProviderPolicyContext(
|
|
|
256
269
|
};
|
|
257
270
|
}
|
|
258
271
|
|
|
272
|
+
interface ExternalPluginAdapterSnapshot {
|
|
273
|
+
registrationSetIdentity: string;
|
|
274
|
+
adapters: readonly AssistantPluginAdapter[];
|
|
275
|
+
byPluginId: ReadonlyMap<string, AssistantPluginAdapter>;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const externalPluginAdapterSnapshots = new Map<string, ExternalPluginAdapterSnapshot>();
|
|
279
|
+
|
|
280
|
+
function externalPluginAdapterSnapshot(controllerHome: string): ExternalPluginAdapterSnapshot {
|
|
281
|
+
const registrationSetIdentity = externalPluginRegistrationSetIdentity(controllerHome);
|
|
282
|
+
const cached = externalPluginAdapterSnapshots.get(controllerHome);
|
|
283
|
+
if (cached?.registrationSetIdentity === registrationSetIdentity) return cached;
|
|
284
|
+
|
|
285
|
+
const adapters = listExternalPluginRegistrations(controllerHome)
|
|
286
|
+
.map((registration) => createExternalPluginAdapter(registration));
|
|
287
|
+
const snapshot: ExternalPluginAdapterSnapshot = {
|
|
288
|
+
registrationSetIdentity,
|
|
289
|
+
adapters,
|
|
290
|
+
byPluginId: new Map(adapters.map((adapter) => [adapter.pluginId, adapter])),
|
|
291
|
+
};
|
|
292
|
+
externalPluginAdapterSnapshots.set(controllerHome, snapshot);
|
|
293
|
+
return snapshot;
|
|
294
|
+
}
|
|
295
|
+
|
|
259
296
|
export function getExternalPluginAdapter(controllerHome: string, pluginId: string): AssistantPluginAdapter | undefined {
|
|
260
|
-
|
|
261
|
-
return registration ? createExternalPluginAdapter(registration) : undefined;
|
|
297
|
+
return externalPluginAdapterSnapshot(controllerHome).byPluginId.get(pluginId);
|
|
262
298
|
}
|
|
263
299
|
|
|
264
300
|
export function listExternalPluginAdapters(controllerHome: string): AssistantPluginAdapter[] {
|
|
265
|
-
return
|
|
301
|
+
return [...externalPluginAdapterSnapshot(controllerHome).adapters];
|
|
266
302
|
}
|
|
267
303
|
|
|
268
304
|
export function createExternalPluginAdapter(
|