@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,26 +1,73 @@
|
|
|
1
1
|
import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
|
|
2
|
+
import { FORGE_INSTANCE_SCOPE_KEY } from '../../../src/cli/repositories/controller-home';
|
|
2
3
|
import type { MultiRepositoryMcpToolContext } from '../multi-repository';
|
|
3
4
|
import { buildWorkspaceAuthStatus, prepareWorkspaceAuthLogin, summarizePluginForLowInterception } from '../../../src/runtime/safe-tooling';
|
|
4
5
|
import {
|
|
5
6
|
assistantPluginScope,
|
|
6
|
-
controllerPluginRepository,
|
|
7
7
|
getAssistantPluginManifest,
|
|
8
|
+
getControllerPluginManifest,
|
|
8
9
|
listAssistantPluginManifests,
|
|
10
|
+
listControllerPluginManifests,
|
|
9
11
|
} from '../../../src/runtime/plugins/store';
|
|
10
12
|
import { executeAssistantPluginActionApplication } from '../../../src/runtime/plugins/action-application';
|
|
11
13
|
import { mcpPluginExecutionOrigin } from '../../../src/runtime/plugins/execution-origin';
|
|
12
14
|
import type { AssistantPluginManifest } from '../../../src/runtime/plugins/types';
|
|
13
15
|
import { result, resultWithPluginArtifactImages } from './result-adapter';
|
|
16
|
+
import { boundedRuntimeResult } from './bounded-result-runtime';
|
|
14
17
|
import { selected } from './shared-adapter';
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
type PluginTransportScope =
|
|
20
|
+
| { kind: 'controller' }
|
|
21
|
+
| { kind: 'repository'; repository: ReturnType<typeof selected> };
|
|
22
|
+
|
|
23
|
+
function explicitRepositoryContextRequested(args: Record<string, unknown>): boolean {
|
|
24
|
+
return (typeof args.repo_id === 'string' && Boolean(args.repo_id.trim()))
|
|
25
|
+
|| (typeof args.checkout_id === 'string' && Boolean(args.checkout_id.trim()));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function pluginTransportScope(
|
|
17
29
|
ctx: MultiRepositoryMcpToolContext,
|
|
18
30
|
args: Record<string, unknown>,
|
|
19
31
|
pluginId: string,
|
|
20
|
-
) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
32
|
+
): PluginTransportScope {
|
|
33
|
+
const explicitRepoId = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
|
|
34
|
+
if (explicitRepoId === '__controller__') {
|
|
35
|
+
throw new Error('PLUGIN_CONTROLLER_REPOSITORY_SENTINEL_RETIRED: controller-scoped plugins no longer use a synthetic repository id');
|
|
36
|
+
}
|
|
37
|
+
const scope = assistantPluginScope(pluginId, ctx.controllerHome);
|
|
38
|
+
if (scope === 'controller') return { kind: 'controller' };
|
|
39
|
+
if (scope === 'controller_with_repository_overlay') {
|
|
40
|
+
return explicitRepositoryContextRequested(args)
|
|
41
|
+
? { kind: 'repository', repository: selected(ctx, args) }
|
|
42
|
+
: { kind: 'controller' };
|
|
43
|
+
}
|
|
44
|
+
return { kind: 'repository', repository: selected(ctx, args) };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function pluginManifestForScope(
|
|
48
|
+
ctx: MultiRepositoryMcpToolContext,
|
|
49
|
+
scope: PluginTransportScope,
|
|
50
|
+
pluginId: string,
|
|
51
|
+
): AssistantPluginManifest {
|
|
52
|
+
return scope.kind === 'controller'
|
|
53
|
+
? getControllerPluginManifest(ctx.controllerHome, pluginId)
|
|
54
|
+
: getAssistantPluginManifest(ctx.controllerHome, scope.repository, pluginId);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function pluginScopeLabel(scope: PluginTransportScope): 'controller' | 'repository' {
|
|
58
|
+
return scope.kind;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function detailArgumentsForScope(
|
|
62
|
+
scope: PluginTransportScope,
|
|
63
|
+
pluginId: string,
|
|
64
|
+
actionId?: string,
|
|
65
|
+
): Record<string, unknown> {
|
|
66
|
+
return {
|
|
67
|
+
...(scope.kind === 'repository' ? { repo_id: scope.repository.repoId } : {}),
|
|
68
|
+
capability_id: actionId ? `plugin.${pluginId}.${actionId}` : `plugin.${pluginId}`,
|
|
69
|
+
detail_level: 'detail',
|
|
70
|
+
};
|
|
24
71
|
}
|
|
25
72
|
|
|
26
73
|
function summarizePlugin(manifest: AssistantPluginManifest): Record<string, unknown> {
|
|
@@ -93,20 +140,17 @@ export async function callPluginAdapter(
|
|
|
93
140
|
): Promise<CallToolResult | undefined> {
|
|
94
141
|
switch (name) {
|
|
95
142
|
case 'list_plugins': {
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
forceRefresh: true,
|
|
143
|
+
const controllerPlugins = listControllerPluginManifests(ctx.controllerHome, {
|
|
144
|
+
preferStored: true,
|
|
99
145
|
}).map(summarizePlugin);
|
|
100
146
|
let repositoryPlugins: ReturnType<typeof summarizePlugin>[] = [];
|
|
101
147
|
let repositoryId: string | undefined;
|
|
102
|
-
|
|
148
|
+
if (explicitRepositoryContextRequested(args) || typeof ctx.repoId === 'string' && ctx.repoId.trim()) {
|
|
103
149
|
const repository = selected(ctx, args);
|
|
104
150
|
repositoryId = repository.repoId;
|
|
105
151
|
repositoryPlugins = listAssistantPluginManifests(ctx.controllerHome, repository, {
|
|
106
|
-
|
|
152
|
+
preferStored: true,
|
|
107
153
|
}).map(summarizePlugin);
|
|
108
|
-
} catch (error) {
|
|
109
|
-
if (typeof args.repo_id === 'string' && args.repo_id.trim()) throw error;
|
|
110
154
|
}
|
|
111
155
|
return result({
|
|
112
156
|
scope: repositoryPlugins.length > 0 ? 'combined' : 'controller',
|
|
@@ -117,16 +161,16 @@ export async function callPluginAdapter(
|
|
|
117
161
|
}
|
|
118
162
|
case 'get_plugin': {
|
|
119
163
|
const pluginId = String(args.plugin_id ?? '').trim();
|
|
120
|
-
const
|
|
164
|
+
const scope = pluginTransportScope(ctx, args, pluginId);
|
|
121
165
|
return result({
|
|
122
|
-
scope:
|
|
123
|
-
plugin: summarizePlugin(
|
|
166
|
+
scope: pluginScopeLabel(scope),
|
|
167
|
+
plugin: summarizePlugin(pluginManifestForScope(ctx, scope, pluginId)),
|
|
124
168
|
});
|
|
125
169
|
}
|
|
126
170
|
case 'plugin_action_execute': {
|
|
127
171
|
const pluginId = String(args.plugin_id ?? '').trim();
|
|
128
172
|
const workId = typeof args.work_id === 'string' && args.work_id.trim() ? args.work_id.trim() : undefined;
|
|
129
|
-
const
|
|
173
|
+
const scope = pluginTransportScope(ctx, args, pluginId);
|
|
130
174
|
const workRepository = workId ? selected(ctx, args) : undefined;
|
|
131
175
|
const actionId = String(args.action_id ?? '').trim();
|
|
132
176
|
const requestId = String(args.request_id ?? '').trim();
|
|
@@ -148,14 +192,25 @@ export async function callPluginAdapter(
|
|
|
148
192
|
};
|
|
149
193
|
const application = await executeAssistantPluginActionApplication({
|
|
150
194
|
controllerHome: ctx.controllerHome,
|
|
151
|
-
|
|
195
|
+
scope: scope.kind === 'controller'
|
|
196
|
+
? { kind: 'controller' }
|
|
197
|
+
: { kind: 'repository', repository: scope.repository },
|
|
152
198
|
request,
|
|
153
|
-
interactiveWaitMs: typeof args.interactive_wait_ms === 'number' ? args.interactive_wait_ms : 750,
|
|
154
|
-
wait: args.wait === true,
|
|
199
|
+
interactiveWaitMs: args.apply_mode === 'async' ? 0 : (typeof args.interactive_wait_ms === 'number' ? args.interactive_wait_ms : 750),
|
|
200
|
+
wait: args.apply_mode === 'async' ? false : args.wait === true,
|
|
155
201
|
waitMs: typeof args.wait_ms === 'number' ? args.wait_ms : 15_000,
|
|
156
202
|
});
|
|
157
203
|
|
|
158
204
|
if (application.kind === 'direct_read') {
|
|
205
|
+
const resultScopeRepoId = scope.kind === 'repository' ? scope.repository.repoId : FORGE_INSTANCE_SCOPE_KEY;
|
|
206
|
+
const boundedPluginResult = boundedRuntimeResult({
|
|
207
|
+
controllerHome: ctx.controllerHome,
|
|
208
|
+
repoId: resultScopeRepoId,
|
|
209
|
+
sessionId: ctx.sessionId,
|
|
210
|
+
principalId: ctx.principalId,
|
|
211
|
+
controllerInstanceId: ctx.controllerInstanceId,
|
|
212
|
+
workId,
|
|
213
|
+
}, application.result);
|
|
159
214
|
const value = {
|
|
160
215
|
accepted: true,
|
|
161
216
|
direct: true,
|
|
@@ -166,22 +221,37 @@ export async function callPluginAdapter(
|
|
|
166
221
|
risk: application.action.risk,
|
|
167
222
|
confirmation: application.action.confirmation,
|
|
168
223
|
},
|
|
169
|
-
scope:
|
|
170
|
-
|
|
224
|
+
scope: pluginScopeLabel(scope),
|
|
225
|
+
requestId: application.receipt.requestId,
|
|
226
|
+
observationReceiptId: application.receipt.receiptId,
|
|
227
|
+
evidenceRef: application.receipt.receiptId,
|
|
228
|
+
resultDigest: application.receipt.resultDigest,
|
|
229
|
+
result: boundedPluginResult.value,
|
|
171
230
|
detail: {
|
|
172
231
|
tool: 'rh_context',
|
|
173
232
|
arguments: {
|
|
174
|
-
...(
|
|
175
|
-
capability_id: `plugin.${pluginId}.${actionId}`,
|
|
176
|
-
detail_level: 'detail',
|
|
233
|
+
...detailArgumentsForScope(scope, pluginId, actionId),
|
|
177
234
|
},
|
|
178
235
|
},
|
|
179
|
-
next: 'Continue with the returned bounded result; use rh_context capability detail only when the typed action schema/policy is needed.',
|
|
236
|
+
next: 'Continue with the returned bounded result. The compact observationReceiptId/evidenceRef may support model-selected learning without creating Work or effect replay state; use rh_context capability detail only when the typed action schema/policy is needed.',
|
|
180
237
|
};
|
|
181
|
-
return resultWithPluginArtifactImages(
|
|
238
|
+
return resultWithPluginArtifactImages(
|
|
239
|
+
value,
|
|
240
|
+
ctx.controllerHome,
|
|
241
|
+
resultScopeRepoId,
|
|
242
|
+
application.result,
|
|
243
|
+
);
|
|
182
244
|
}
|
|
183
245
|
|
|
184
246
|
if (application.kind === 'direct_non_persistent') {
|
|
247
|
+
const boundedPluginResult = boundedRuntimeResult({
|
|
248
|
+
controllerHome: ctx.controllerHome,
|
|
249
|
+
repoId: scope.kind === 'repository' ? scope.repository.repoId : FORGE_INSTANCE_SCOPE_KEY,
|
|
250
|
+
sessionId: ctx.sessionId,
|
|
251
|
+
principalId: ctx.principalId,
|
|
252
|
+
controllerInstanceId: ctx.controllerInstanceId,
|
|
253
|
+
workId,
|
|
254
|
+
}, application.result);
|
|
185
255
|
return result({
|
|
186
256
|
accepted: true,
|
|
187
257
|
direct: true,
|
|
@@ -194,27 +264,25 @@ export async function callPluginAdapter(
|
|
|
194
264
|
risk: application.action.risk,
|
|
195
265
|
confirmation: application.action.confirmation,
|
|
196
266
|
},
|
|
197
|
-
scope:
|
|
267
|
+
scope: pluginScopeLabel(scope),
|
|
198
268
|
requestId,
|
|
199
|
-
result:
|
|
269
|
+
result: boundedPluginResult.value,
|
|
200
270
|
detail: {
|
|
201
271
|
tool: 'rh_context',
|
|
202
272
|
arguments: {
|
|
203
|
-
...(
|
|
204
|
-
capability_id: `plugin.${pluginId}.${actionId}`,
|
|
205
|
-
detail_level: 'detail',
|
|
273
|
+
...detailArgumentsForScope(scope, pluginId, actionId),
|
|
206
274
|
},
|
|
207
275
|
},
|
|
208
276
|
next: 'This protected action completed inline without durable replay state. Use the returned result only for the immediate next protected action.',
|
|
209
277
|
});
|
|
210
278
|
}
|
|
211
279
|
|
|
212
|
-
if (application.kind === '
|
|
280
|
+
if (application.kind === 'managed_running') {
|
|
213
281
|
return result({
|
|
214
282
|
accepted: true,
|
|
215
283
|
direct: false,
|
|
216
|
-
durable:
|
|
217
|
-
mode: '
|
|
284
|
+
durable: true,
|
|
285
|
+
mode: 'process_managed',
|
|
218
286
|
plugin: summarizePluginActionReceipt(application.manifest),
|
|
219
287
|
action: application.action ? {
|
|
220
288
|
actionId: application.action.actionId,
|
|
@@ -222,21 +290,22 @@ export async function callPluginAdapter(
|
|
|
222
290
|
confirmation: application.action.confirmation,
|
|
223
291
|
requiredConfirmationText: application.action.requiredConfirmationText,
|
|
224
292
|
} : { actionId },
|
|
225
|
-
scope:
|
|
293
|
+
scope: pluginScopeLabel(scope),
|
|
226
294
|
requestId,
|
|
227
295
|
process: application.process,
|
|
228
296
|
resultRef: { kind: 'process_logs', processId: application.process.processId },
|
|
229
|
-
|
|
297
|
+
observation: { status: 'in_progress', outcome: 'unknown_until_process_terminal', retryPolicy: 'reattach_same_request_id' },
|
|
298
|
+
next: 'Execution is durably detached from this MCP stream. Observe processId/resultRef; after terminal completion, call plugin_action_execute with the same request_id to retrieve the deduplicated structured receipt. Never redispatch with a new request id because observation was interrupted.',
|
|
230
299
|
});
|
|
231
300
|
}
|
|
232
301
|
|
|
233
|
-
if (application.kind === '
|
|
302
|
+
if (application.kind === 'managed_failed') {
|
|
234
303
|
const handle = application.process;
|
|
235
304
|
return result({
|
|
236
305
|
accepted: true,
|
|
237
306
|
direct: false,
|
|
238
|
-
durable:
|
|
239
|
-
mode: '
|
|
307
|
+
durable: true,
|
|
308
|
+
mode: 'process_managed',
|
|
240
309
|
requestId,
|
|
241
310
|
process: handle,
|
|
242
311
|
error: {
|
|
@@ -247,6 +316,19 @@ export async function callPluginAdapter(
|
|
|
247
316
|
}
|
|
248
317
|
|
|
249
318
|
const submitted = application.submitted;
|
|
319
|
+
if (submitted.receipt.status === 'failed' && submitted.receipt.effectOutcome !== 'outcome_unknown') {
|
|
320
|
+
return result({
|
|
321
|
+
accepted: true,
|
|
322
|
+
deduplicated: submitted.deduplicated,
|
|
323
|
+
scope: pluginScopeLabel(scope),
|
|
324
|
+
plugin: summarizePluginActionReceipt(submitted.manifest),
|
|
325
|
+
action: { actionId: submitted.action.actionId },
|
|
326
|
+
requestId: submitted.receipt.requestId,
|
|
327
|
+
receiptId: submitted.receipt.receiptId,
|
|
328
|
+
effectOutcome: submitted.receipt.effectOutcome ?? 'failed',
|
|
329
|
+
error: submitted.receipt.error ?? { code: 'PLUGIN_ACTION_FAILED', message: 'Plugin action failed.' },
|
|
330
|
+
}, true);
|
|
331
|
+
}
|
|
250
332
|
const compactResult = compactSubmittedPluginActionResult(submitted.result);
|
|
251
333
|
const value = {
|
|
252
334
|
accepted: true,
|
|
@@ -260,7 +342,7 @@ export async function callPluginAdapter(
|
|
|
260
342
|
confirmation: submitted.action.confirmation,
|
|
261
343
|
requiredConfirmationText: submitted.action.requiredConfirmationText,
|
|
262
344
|
},
|
|
263
|
-
scope:
|
|
345
|
+
scope: pluginScopeLabel(scope),
|
|
264
346
|
receiptId: submitted.receipt.receiptId,
|
|
265
347
|
requestId: submitted.receipt.requestId,
|
|
266
348
|
...(submitted.receipt.workId ? { workId: submitted.receipt.workId } : {}),
|
|
@@ -269,14 +351,17 @@ export async function callPluginAdapter(
|
|
|
269
351
|
detail: {
|
|
270
352
|
tool: 'rh_context',
|
|
271
353
|
arguments: {
|
|
272
|
-
...(
|
|
273
|
-
capability_id: `plugin.${pluginId}.${actionId}`,
|
|
274
|
-
detail_level: 'detail',
|
|
354
|
+
...detailArgumentsForScope(scope, pluginId, actionId),
|
|
275
355
|
},
|
|
276
356
|
},
|
|
277
357
|
next: 'Continue with the returned bounded plugin result; use rh_context capability detail only when the typed action schema/policy is needed.',
|
|
278
358
|
};
|
|
279
|
-
return resultWithPluginArtifactImages(
|
|
359
|
+
return resultWithPluginArtifactImages(
|
|
360
|
+
value,
|
|
361
|
+
ctx.controllerHome,
|
|
362
|
+
scope.kind === 'repository' ? scope.repository.repoId : FORGE_INSTANCE_SCOPE_KEY,
|
|
363
|
+
compactResult,
|
|
364
|
+
);
|
|
280
365
|
}
|
|
281
366
|
case 'workspace_auth_status': {
|
|
282
367
|
const repository = selected(ctx, args);
|
|
@@ -292,8 +377,8 @@ export async function callPluginAdapter(
|
|
|
292
377
|
}
|
|
293
378
|
case 'toolchain_plugin_summary': {
|
|
294
379
|
const pluginId = String(args.plugin_id ?? '').trim();
|
|
295
|
-
const
|
|
296
|
-
const manifest =
|
|
380
|
+
const scope = pluginTransportScope(ctx, args, pluginId);
|
|
381
|
+
const manifest = pluginManifestForScope(ctx, scope, pluginId);
|
|
297
382
|
return result({
|
|
298
383
|
plugin: summarizePluginForLowInterception(manifest),
|
|
299
384
|
nonOpaque: true,
|
|
@@ -11,11 +11,20 @@ import type { McpToolDefinition, CallToolResult } from '../../../packages/protoc
|
|
|
11
11
|
import type { MultiRepositoryMcpToolContext } from '../multi-repository';
|
|
12
12
|
import {
|
|
13
13
|
cancelRepositoryCommandProcess,
|
|
14
|
+
executeHostCommand,
|
|
14
15
|
getRepositoryCommandProcess,
|
|
15
16
|
readRepositoryCommandProcessLogs,
|
|
16
17
|
waitRepositoryCommandProcess,
|
|
17
18
|
} from '../../../src/runtime/execution/process-runtime';
|
|
18
19
|
import { redactSensitiveText, redactSensitiveValue } from '../../../src/runtime/evidence/sensitive-output';
|
|
20
|
+
import { getProcessRecord } from '../../../src/runtime/execution/process-runtime/store';
|
|
21
|
+
import { forgeInstanceIdFor, readProcessHandleIndexEntry } from '../../../src/runtime/execution/process-runtime/handle-index';
|
|
22
|
+
import { isForgeInstanceProcessScopeKey, isRepositoryProcessScopeKey, processScopeKeyForHandle } from '../../../src/runtime/execution/process-runtime/process-scope';
|
|
23
|
+
import { reconcileTerminalWorkVerifications } from '../../../src/runtime/control-plane/execution/work-verification-service';
|
|
24
|
+
import type { WorkHandleState } from '../../../src/runtime/control-plane/execution/work-handle-store';
|
|
25
|
+
import { findControlPlaneRecordsByKey } from '../../../src/runtime/control-plane/persistence/sqlite-store';
|
|
26
|
+
import { sanitizeFileComponent } from '../../../src/runtime/shared/json-files';
|
|
27
|
+
import { selected, stringList } from './shared-adapter';
|
|
19
28
|
|
|
20
29
|
function definition(
|
|
21
30
|
name: string,
|
|
@@ -40,11 +49,11 @@ function definition(
|
|
|
40
49
|
|
|
41
50
|
const repoIdProp = {
|
|
42
51
|
type: 'string',
|
|
43
|
-
description: '
|
|
52
|
+
description: 'Optional repository or ephemeral workspace scope id returned by the originating command. When omitted, the process handle resolves its own recorded execution target.',
|
|
44
53
|
};
|
|
45
54
|
const processIdProp = {
|
|
46
55
|
type: 'string',
|
|
47
|
-
description: '
|
|
56
|
+
description: 'Process id returned by execute_command or run_check.',
|
|
48
57
|
};
|
|
49
58
|
|
|
50
59
|
export const processToolDefinitions: McpToolDefinition[] = [
|
|
@@ -74,7 +83,7 @@ export const processToolDefinitions: McpToolDefinition[] = [
|
|
|
74
83
|
repo_id: repoIdProp,
|
|
75
84
|
process_id: processIdProp,
|
|
76
85
|
},
|
|
77
|
-
['
|
|
86
|
+
['process_id'],
|
|
78
87
|
true,
|
|
79
88
|
),
|
|
80
89
|
definition(
|
|
@@ -85,7 +94,7 @@ export const processToolDefinitions: McpToolDefinition[] = [
|
|
|
85
94
|
process_id: processIdProp,
|
|
86
95
|
timeout_ms: { type: 'number', description: 'Max wait milliseconds (default 15000).' },
|
|
87
96
|
},
|
|
88
|
-
['
|
|
97
|
+
['process_id'],
|
|
89
98
|
true,
|
|
90
99
|
),
|
|
91
100
|
definition(
|
|
@@ -96,7 +105,7 @@ export const processToolDefinitions: McpToolDefinition[] = [
|
|
|
96
105
|
process_id: processIdProp,
|
|
97
106
|
max_bytes: { type: 'number', description: 'Max tail bytes per stream (default 32KiB).' },
|
|
98
107
|
},
|
|
99
|
-
['
|
|
108
|
+
['process_id'],
|
|
100
109
|
true,
|
|
101
110
|
),
|
|
102
111
|
definition(
|
|
@@ -106,7 +115,7 @@ export const processToolDefinitions: McpToolDefinition[] = [
|
|
|
106
115
|
repo_id: repoIdProp,
|
|
107
116
|
process_id: processIdProp,
|
|
108
117
|
},
|
|
109
|
-
['
|
|
118
|
+
['process_id'],
|
|
110
119
|
false,
|
|
111
120
|
true,
|
|
112
121
|
),
|
|
@@ -114,6 +123,33 @@ export const processToolDefinitions: McpToolDefinition[] = [
|
|
|
114
123
|
|
|
115
124
|
const processToolNames = new Set(processToolDefinitions.map((tool) => tool.name));
|
|
116
125
|
const processAttachmentToolNames = new Set(['process_get', 'process_wait', 'process_logs', 'process_cancel']);
|
|
126
|
+
|
|
127
|
+
function reconcileAttachedWorkVerification(
|
|
128
|
+
ctx: MultiRepositoryMcpToolContext,
|
|
129
|
+
repoId: string,
|
|
130
|
+
processId: string,
|
|
131
|
+
handle: { completed?: boolean; workId?: string },
|
|
132
|
+
): Record<string, unknown> | undefined {
|
|
133
|
+
if (handle.completed !== true || !handle.workId) return undefined;
|
|
134
|
+
const record = getProcessRecord(ctx.controllerHome, repoId, processId);
|
|
135
|
+
if (record?.origin?.workVerificationSnapshot !== true) return undefined;
|
|
136
|
+
try {
|
|
137
|
+
const repository = selected(ctx, { repo_id: repoId, checkout_id: record.checkoutId });
|
|
138
|
+
const reconciled = reconcileTerminalWorkVerifications({
|
|
139
|
+
controllerHome: ctx.controllerHome,
|
|
140
|
+
repository,
|
|
141
|
+
workId: handle.workId,
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
workId: handle.workId,
|
|
145
|
+
processId,
|
|
146
|
+
status: reconciled.reconciledProcessIds.includes(processId) ? 'reconciled' : 'already_current_or_non_authoritative',
|
|
147
|
+
reconciledProcessIds: reconciled.reconciledProcessIds,
|
|
148
|
+
};
|
|
149
|
+
} catch {
|
|
150
|
+
return { workId: handle.workId, processId, status: 'non_authoritative' };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
117
153
|
// A long-lived MCP wait can monopolize shared Runtime request/transport capacity
|
|
118
154
|
// even though the underlying Process wait is asynchronous. Keep public waits
|
|
119
155
|
// short and return a normal running snapshot; the Process continues unchanged
|
|
@@ -162,21 +198,58 @@ function failure(error: unknown): CallToolResult {
|
|
|
162
198
|
function requireRepoAndProcess(
|
|
163
199
|
ctx: MultiRepositoryMcpToolContext,
|
|
164
200
|
args: Record<string, unknown>,
|
|
165
|
-
): { repoId
|
|
201
|
+
): { repoId?: string; processId: string; handle: NonNullable<ReturnType<typeof getRepositoryCommandProcess>> } {
|
|
166
202
|
const repoId = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
|
|
167
203
|
const processId = typeof args.process_id === 'string' ? args.process_id.trim() : '';
|
|
168
|
-
if (!repoId) throw new Error('REPOSITORY_ID_REQUIRED: repo_id is required for process tools');
|
|
169
204
|
if (!processId) throw new Error('PROCESS_ID_REQUIRED: process_id is required for process tools');
|
|
205
|
+
assertProcessHandleAccess(ctx, processId);
|
|
170
206
|
|
|
171
|
-
// The Process handle is the scope authority.
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
|
|
207
|
+
// The Process handle is the scope authority. An explicit repo_id is validated
|
|
208
|
+
// against the handle's recorded target; when it is omitted the handle index
|
|
209
|
+
// resolves the target so attachment never needs placement replay. Ephemeral
|
|
210
|
+
// workspace targets are intentionally not registered in Repository Registry,
|
|
211
|
+
// so requiring a live repository record here would make their returned
|
|
212
|
+
// managed handles impossible to resume.
|
|
213
|
+
const recordedScopeKey = processScopeKeyForHandle(ctx.controllerHome, processId);
|
|
214
|
+
// A ForgeInstance-scoped handle keeps its instance target even when a client
|
|
215
|
+
// always sends repo_id; the index remains the target authority.
|
|
216
|
+
const effectiveScopeKey = recordedScopeKey && isForgeInstanceProcessScopeKey(recordedScopeKey)
|
|
217
|
+
? recordedScopeKey
|
|
218
|
+
: (repoId || recordedScopeKey);
|
|
219
|
+
const handle = getRepositoryCommandProcess(ctx.controllerHome, effectiveScopeKey, processId);
|
|
176
220
|
if (!handle) {
|
|
177
|
-
throw new Error(
|
|
221
|
+
throw new Error(repoId
|
|
222
|
+
? `PROCESS_NOT_FOUND: process ${processId} is not registered under repo ${repoId}`
|
|
223
|
+
: `PROCESS_NOT_FOUND: ${processId}`);
|
|
224
|
+
}
|
|
225
|
+
const resolvedScopeKey = recordedScopeKey && isForgeInstanceProcessScopeKey(recordedScopeKey) ? recordedScopeKey : (repoId || recordedScopeKey);
|
|
226
|
+
const resolvedRepoId = resolvedScopeKey && isRepositoryProcessScopeKey(resolvedScopeKey) ? resolvedScopeKey : undefined;
|
|
227
|
+
return { repoId: resolvedRepoId || undefined, processId, handle };
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* A process handle id locates a record; it never authorizes attachment by
|
|
232
|
+
* itself. Instance-level handles are principal-bound and ForgeInstance-bound,
|
|
233
|
+
* and a recorded repository principal is enforced when the caller presents one.
|
|
234
|
+
*/
|
|
235
|
+
function assertProcessHandleAccess(ctx: MultiRepositoryMcpToolContext, processId: string): void {
|
|
236
|
+
const entry = readProcessHandleIndexEntry(ctx.controllerHome, processId);
|
|
237
|
+
if (!entry) return;
|
|
238
|
+
const caller = ctx.principalId?.trim();
|
|
239
|
+
const recorded = entry.principalId?.trim();
|
|
240
|
+
if (entry.target.scope === 'forge_instance') {
|
|
241
|
+
const servingInstance = forgeInstanceIdFor(ctx.controllerHome);
|
|
242
|
+
if (entry.target.forgeInstanceId && servingInstance && entry.target.forgeInstanceId !== servingInstance) {
|
|
243
|
+
throw new Error(`PROCESS_HANDLE_INSTANCE_MISMATCH: process ${processId} belongs to ForgeInstance ${entry.target.forgeInstanceId}`);
|
|
244
|
+
}
|
|
245
|
+
if (!recorded) throw new Error(`PROCESS_HANDLE_PRINCIPAL_UNBOUND: process ${processId} has no recorded principal`);
|
|
246
|
+
if (!caller) throw new Error(`PROCESS_HANDLE_PRINCIPAL_REQUIRED: process ${processId} requires an authenticated principal`);
|
|
247
|
+
if (recorded !== caller) throw new Error(`PROCESS_HANDLE_PRINCIPAL_MISMATCH: process ${processId} is owned by another principal`);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (recorded && caller && recorded !== caller) {
|
|
251
|
+
throw new Error(`PROCESS_HANDLE_PRINCIPAL_MISMATCH: process ${processId} is owned by another principal`);
|
|
178
252
|
}
|
|
179
|
-
return { repoId, processId };
|
|
180
253
|
}
|
|
181
254
|
|
|
182
255
|
function handleToPayload(handle: NonNullable<ReturnType<typeof getRepositoryCommandProcess>>): Record<string, unknown> {
|
|
@@ -219,14 +292,17 @@ export async function callProcessTool(
|
|
|
219
292
|
// consume an existing process_id here.
|
|
220
293
|
if (!processAttachmentToolNames.has(name)) return undefined;
|
|
221
294
|
try {
|
|
222
|
-
const { repoId, processId } = requireRepoAndProcess(ctx, args);
|
|
295
|
+
const { repoId, processId, handle: attachedHandle } = requireRepoAndProcess(ctx, args);
|
|
296
|
+
const scopePayload = repoId ? { repoId } : {};
|
|
223
297
|
switch (name) {
|
|
224
298
|
case 'process_get': {
|
|
225
|
-
const
|
|
226
|
-
|
|
299
|
+
const workVerificationReconciliation = repoId
|
|
300
|
+
? reconcileAttachedWorkVerification(ctx, repoId, processId, attachedHandle)
|
|
301
|
+
: undefined;
|
|
227
302
|
return result({
|
|
228
|
-
|
|
229
|
-
process: handleToPayload(
|
|
303
|
+
...scopePayload,
|
|
304
|
+
process: handleToPayload(attachedHandle),
|
|
305
|
+
...(workVerificationReconciliation ? { workVerificationReconciliation } : {}),
|
|
230
306
|
});
|
|
231
307
|
}
|
|
232
308
|
case 'process_wait': {
|
|
@@ -241,9 +317,13 @@ export async function callProcessTool(
|
|
|
241
317
|
const handle = await waitRepositoryCommandProcess(ctx.controllerHome, repoId, processId, {
|
|
242
318
|
timeoutMs: Math.min(requestedWaitMs, attachBudgetMs),
|
|
243
319
|
});
|
|
320
|
+
const workVerificationReconciliation = repoId
|
|
321
|
+
? reconcileAttachedWorkVerification(ctx, repoId, processId, handle)
|
|
322
|
+
: undefined;
|
|
244
323
|
return result({
|
|
245
|
-
|
|
324
|
+
...scopePayload,
|
|
246
325
|
process: handleToPayload(handle),
|
|
326
|
+
...(workVerificationReconciliation ? { workVerificationReconciliation } : {}),
|
|
247
327
|
synchronization: handle.completed === true ? 'terminal_result_available' : 'continue_independent_work',
|
|
248
328
|
waitedMs: Date.now() - startedAt,
|
|
249
329
|
requestedWaitMs,
|
|
@@ -258,7 +338,7 @@ export async function callProcessTool(
|
|
|
258
338
|
const logs = readRepositoryCommandProcessLogs(ctx.controllerHome, repoId, processId, maxBytes);
|
|
259
339
|
if (!logs) throw new Error(`PROCESS_NOT_FOUND: ${processId}`);
|
|
260
340
|
return result({
|
|
261
|
-
|
|
341
|
+
...scopePayload,
|
|
262
342
|
processId,
|
|
263
343
|
stdout: logs.stdout,
|
|
264
344
|
stderr: logs.stderr,
|
|
@@ -271,7 +351,7 @@ export async function callProcessTool(
|
|
|
271
351
|
case 'process_cancel': {
|
|
272
352
|
const handle = await cancelRepositoryCommandProcess(ctx.controllerHome, repoId, processId);
|
|
273
353
|
return result({
|
|
274
|
-
|
|
354
|
+
...scopePayload,
|
|
275
355
|
process: handleToPayload(handle),
|
|
276
356
|
cancelled: handle.cancelled === true || handle.status === 'cancelled' || handle.status === 'completed_unknown',
|
|
277
357
|
});
|
|
@@ -284,6 +364,76 @@ export async function callProcessTool(
|
|
|
284
364
|
}
|
|
285
365
|
}
|
|
286
366
|
|
|
367
|
+
/**
|
|
368
|
+
* Host target of the single execute_command entry: canonical process:exec Grant.
|
|
369
|
+
*
|
|
370
|
+
* Repo-less by construction: the Forge instance is the target and `cwd` is an
|
|
371
|
+
* execution argument. Authorization is one explicit canonical `process:exec`
|
|
372
|
+
* Grant for this instance, enforced in the lane before any spawn.
|
|
373
|
+
*/
|
|
374
|
+
function workDefaultCommandCwd(ctx: MultiRepositoryMcpToolContext, workId: string): string | undefined {
|
|
375
|
+
if (!workId) return undefined;
|
|
376
|
+
const matches = findControlPlaneRecordsByKey<WorkHandleState>(ctx.controllerHome, {
|
|
377
|
+
namespace: 'execution_work_handle',
|
|
378
|
+
key: sanitizeFileComponent(workId),
|
|
379
|
+
limit: 2,
|
|
380
|
+
});
|
|
381
|
+
if (matches.length > 1) {
|
|
382
|
+
throw new Error(`WORK_EXECUTION_PLACEMENT_AMBIGUOUS: ${workId} resolves to multiple execution handles`);
|
|
383
|
+
}
|
|
384
|
+
const handle = matches[0]?.value;
|
|
385
|
+
if (!handle) return undefined;
|
|
386
|
+
if (handle.workId !== workId) throw new Error(`WORK_EXECUTION_PLACEMENT_IDENTITY_MISMATCH: ${workId}`);
|
|
387
|
+
const workspace = handle.worktreePath?.trim();
|
|
388
|
+
return workspace || undefined;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
export async function executeAuthorizedHostCommand(
|
|
392
|
+
ctx: MultiRepositoryMcpToolContext,
|
|
393
|
+
args: Record<string, unknown>,
|
|
394
|
+
): Promise<CallToolResult> {
|
|
395
|
+
try {
|
|
396
|
+
const command = stringList(args.command);
|
|
397
|
+
const shellCommand = typeof args.shell_command === 'string' && args.shell_command.trim()
|
|
398
|
+
? args.shell_command
|
|
399
|
+
: undefined;
|
|
400
|
+
if (command.length > 0 && shellCommand) {
|
|
401
|
+
throw new Error('HOST_COMMAND_AMBIGUOUS: provide exactly one of command or shell_command');
|
|
402
|
+
}
|
|
403
|
+
if (command.length === 0 && !shellCommand) {
|
|
404
|
+
throw new Error('HOST_COMMAND_REQUIRED: provide command (argv) or shell_command');
|
|
405
|
+
}
|
|
406
|
+
const requestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
|
|
407
|
+
const workId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
|
|
408
|
+
const explicitCwd = typeof args.cwd === 'string' ? args.cwd.trim() : '';
|
|
409
|
+
const cwd = explicitCwd || workDefaultCommandCwd(ctx, workId) || '';
|
|
410
|
+
const executed = await executeHostCommand({
|
|
411
|
+
controllerHome: ctx.controllerHome,
|
|
412
|
+
principalId: ctx.principalId ?? '',
|
|
413
|
+
...(command.length > 0 ? { command } : {}),
|
|
414
|
+
...(shellCommand ? { shellCommand } : {}),
|
|
415
|
+
cwd,
|
|
416
|
+
...(typeof args.timeout_ms === 'number' ? { timeoutMs: args.timeout_ms } : {}),
|
|
417
|
+
...(typeof args.interactive_wait_ms === 'number' ? { interactiveWaitMs: args.interactive_wait_ms } : {}),
|
|
418
|
+
...(typeof args.max_output_bytes === 'number' ? { maxOutputBytes: args.max_output_bytes } : {}),
|
|
419
|
+
...(requestId ? { commandId: requestId } : {}),
|
|
420
|
+
...(workId ? { workId } : {}),
|
|
421
|
+
});
|
|
422
|
+
return result({
|
|
423
|
+
process: handleToPayload(executed.handle),
|
|
424
|
+
target: {
|
|
425
|
+
scope: 'forge_instance',
|
|
426
|
+
forgeInstanceId: executed.target.forgeInstanceId,
|
|
427
|
+
cwd: executed.target.cwd,
|
|
428
|
+
},
|
|
429
|
+
authorization: { capability: 'process:exec', grantId: executed.target.grantId },
|
|
430
|
+
executionMetrics: executed.metrics,
|
|
431
|
+
});
|
|
432
|
+
} catch (error) {
|
|
433
|
+
return failure(error);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
287
437
|
export function isProcessTool(name: string): boolean {
|
|
288
438
|
return processToolNames.has(name);
|
|
289
439
|
}
|