@moretea-labs/forge 1.8.0 → 1.8.1
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 +70 -7
- package/CHANGELOG.md +14 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +529 -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 +228 -1
- package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
- package/adapters/computer/chatgpt-extension-target.ts +463 -0
- package/adapters/computer/chatgpt-target-router.ts +103 -0
- package/adapters/computer/chrome-extension/background.js +385 -0
- package/adapters/computer/chrome-extension/content.js +378 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +30 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/interaction-target-authority.ts +142 -18
- package/adapters/mcp/auth.ts +0 -1
- package/adapters/mcp/instructions.ts +5 -4
- package/adapters/mcp/multi-repository.ts +3 -19
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
- 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 +411 -73
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -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 +8 -42
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
- package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
- 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 +18 -504
- package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
- 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 +246 -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 +263 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
- package/adapters/mcp/server.ts +67 -23
- package/adapters/mcp/setup.ts +1 -3
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
- package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
- package/adapters/mcp/toolset-names.ts +5 -0
- package/adapters/mcp/toolset.ts +6 -5
- package/adapters/mcp/transports/http-observation.ts +365 -0
- package/adapters/mcp/transports/http.ts +154 -677
- 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/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +25 -0
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/skill-version.json +2 -2
- package/docs/architecture/CURRENT.md +111 -41
- 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/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 +221 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/domains/verification.md +1 -0
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
- package/docs/forge-plugin-management.md +2 -2
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +1 -1
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +2 -0
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/standalone-disaster-recovery.md +14 -6
- package/docs/wiki/Implementation.md +1 -1
- package/package.json +25 -14
- 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 +297 -71
- 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 +77 -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/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 +153 -133
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +17 -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 +25 -63
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- 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 +143 -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/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +48 -136
- package/scripts/check-runtime-architecture.mjs +622 -217
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/lib/project-init-lib.sh +3 -0
- package/scripts/open-source-audit-allowlist.txt +1 -2
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +0 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-mcp-http-runtime.ts +5 -0
- 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 +92 -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/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +11 -34
- package/src/cli/agent-jobs/integration.ts +18 -49
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- 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/recovery.ts +135 -121
- package/src/cli/commands/runtime.ts +3 -3
- 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 +4 -43
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/context/source-materializer.ts +81 -100
- package/src/cli/controller/context-pack.ts +10 -8
- 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 +24 -51
- 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 +39 -1
- package/src/cli/editing/edit-session.ts +1 -7
- package/src/cli/local-bridge/console-automations.ts +18 -13
- package/src/cli/local-bridge/console-view-models.ts +3 -12
- package/src/cli/local-bridge/facade-api.ts +64 -191
- 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-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +35 -16
- 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/registry.ts +77 -11
- package/src/cli/repositories/structured-git.ts +62 -2
- package/src/cli/repository/session-cache.ts +92 -6
- 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/semantic-navigation-contract.ts +9 -0
- package/src/runtime/context/semantic-navigation.ts +6 -34
- 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 +212 -9
- 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 +497 -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 +188 -109
- package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
- 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 +43 -27
- package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
- 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 +173 -186
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
- package/src/runtime/control-plane/facade/capability-registry.ts +362 -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 +8 -8
- package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
- 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 +239 -112
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
- 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/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -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 +290 -21
- 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/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 +79 -27
- 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 +35 -2
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/workers/executor.ts +2 -6
- 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 +85 -28
- package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
- package/src/runtime/plugins/browser-adapter.ts +757 -34
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
- package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +16 -0
- package/src/runtime/plugins/browser-runtime.ts +14 -1
- 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 +219 -0
- package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
- package/src/runtime/plugins/computer-registration.ts +222 -11
- 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/gmail-adapter.ts +23 -2
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +14 -7
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios-adapter.ts +1 -1
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -2
- 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 +602 -428
- package/src/runtime/plugins/types.ts +20 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +3 -3
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +296 -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 +192 -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 +105 -19
- package/src/runtime/root/package-runtime-release.ts +117 -18
- package/src/runtime/root/package-runtime-service.ts +17 -11
- package/src/runtime/root/release-execution-canary.ts +44 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -6
- package/src/runtime/root/release-materialize.ts +372 -28
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +159 -27
- package/src/runtime/root/scheduled-controller-composition.ts +28 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +36 -33
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -3
- package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- 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 +3702 -342
- package/src/runtime/standalone-recovery/entry.ts +469 -39
- 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 +1 -1
- 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 +10 -3
- package/src/runtime/workflow/schedules/engine.ts +138 -172
- package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
- 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 +201 -0
- package/supervisor/control-plane.ts +868 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +80 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +786 -0
- package/supervisor/native-messaging/host.ts +39 -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 +202 -0
- package/supervisor/server.ts +404 -0
- package/supervisor/store.ts +1451 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +255 -0
- 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/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-tarball-install-smoke.sh +0 -150
- 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/stage-runtime-release.ts +0 -44
- 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/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
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { bindRepositoryEntities } from '../../../src/cli/repositories/entity-migration';
|
|
2
2
|
import { bootstrapLocalProject, diagnoseLatestLocalProjectSource } from '../../../src/cli/repositories/local-project-onboarding';
|
|
3
3
|
import { resolveEphemeralWorkspaceTarget } from '../../../src/cli/repositories/ephemeral-workspace';
|
|
4
|
-
import type
|
|
4
|
+
import { commandExecutionScopeKey, type RepositoryCommandScopeTarget } from '../../../src/cli/repositories/command-scope';
|
|
5
|
+
import { executionIdentityForWork, type ResolvedExecutionIdentity } from '../../../src/runtime/control-plane/execution/execution-identity';
|
|
5
6
|
import { assertNoBoundExecutionSessionMutation, resolveClaimedRepositoryWorkId, resolveExplicitClaimedRepositoryWork, type RepositoryWorkAttributionCaller } from '../../../src/runtime/control-plane/execution/repository-work-attribution';
|
|
6
|
-
import { getWorkContract } from '../../../packages/kernel/work/api';
|
|
7
|
-
import { assertWorkPathsWithinScope } from '../../../src/runtime/control-plane/execution/work-path-scope';
|
|
7
|
+
import { getWorkContract, promoteWorkToRepositoryChange, semanticWorkState, type WorkContract } from '../../../packages/kernel/work/api';
|
|
8
8
|
import { assertCanonicalRepositoryMutationWorkHandleAvailable, ensureRepositoryMutationWorkHandle, markRepositoryMutationStarted } from '../../../src/runtime/control-plane/execution/work-handle-authority';
|
|
9
|
-
import {
|
|
9
|
+
import { readWorkHandle } from '../../../src/runtime/control-plane/execution/work-handle-store';
|
|
10
|
+
import { ensureRunningRepositoryWorkCheckout } from '../../../src/runtime/control-plane/execution/retained-work-resume';
|
|
10
11
|
import { executeRepositoryCommand, previewRepositoryCommandExecution } from '../../../src/cli/repositories/command-executor';
|
|
11
12
|
import { withControllerLock } from '../../../src/cli/repositories/locks';
|
|
12
13
|
import {
|
|
@@ -37,7 +38,6 @@ import {
|
|
|
37
38
|
repositoryGitMergeBranch,
|
|
38
39
|
repositoryGitStatus,
|
|
39
40
|
repositoryGitSwitchBranch,
|
|
40
|
-
resolveRepositoryGitCommitScope,
|
|
41
41
|
} from '../../../src/cli/repositories/structured-git';
|
|
42
42
|
import {
|
|
43
43
|
readRepositoryGitStatusSample,
|
|
@@ -56,7 +56,6 @@ import {
|
|
|
56
56
|
classifyRepositoryCommandRoute,
|
|
57
57
|
executeRepositoryCommandViaProcessRuntime,
|
|
58
58
|
} from '../../../src/runtime/execution/process-runtime/command-facade';
|
|
59
|
-
import { assessWorkMode, parseExplicitTaskMode } from '../../../src/cli/controller/work-mode';
|
|
60
59
|
import { classifyRepositoryCommand } from '../../../src/cli/repositories/command-classifier';
|
|
61
60
|
import { normalizeRepositoryCommand } from '../../../src/cli/repositories/command-normalization';
|
|
62
61
|
import { readRepositoryRange } from '../../../src/cli/repository/inspector';
|
|
@@ -157,12 +156,12 @@ export const repositoryToolDefinitions: McpToolDefinition[] = [
|
|
|
157
156
|
include_removed: { type: 'boolean' },
|
|
158
157
|
operation: {
|
|
159
158
|
type: 'string',
|
|
160
|
-
enum: ['summary', 'batch_execute', 'lanes_execute', 'lanes_integrate', 'fast_receipt_get', 'fast_receipt_list', 'execution_route'
|
|
161
|
-
description: 'Defaults to summary. Use batch_execute for multi-step
|
|
159
|
+
enum: ['summary', 'batch_execute', 'lanes_execute', 'lanes_integrate', 'fast_receipt_get', 'fast_receipt_list', 'execution_route'],
|
|
160
|
+
description: 'Defaults to summary. Use batch_execute for multi-step repository capability execution and lanes_execute for limited parallel reads. Workflow/mode selection belongs to the model/user, not Workbench.',
|
|
162
161
|
},
|
|
163
162
|
payload: {
|
|
164
163
|
type: 'object',
|
|
165
|
-
description: 'Operation-specific bounded arguments. Batch write operations should include request_id. For batch_execute: { steps:[{id?, kind, input}], stop_on_error?, allowed_paths?, timeout_ms?, request_id?, purpose? }.
|
|
164
|
+
description: 'Operation-specific bounded arguments. Batch write operations should include request_id. For batch_execute: { steps:[{id?, kind, input}], stop_on_error?, allowed_paths?, timeout_ms?, request_id?, purpose? }.' ,
|
|
166
165
|
additionalProperties: true,
|
|
167
166
|
},
|
|
168
167
|
}),
|
|
@@ -252,7 +251,7 @@ export const repositoryToolDefinitions: McpToolDefinition[] = [
|
|
|
252
251
|
cwd: { type: 'string', description: 'Optional root-relative working directory.' },
|
|
253
252
|
workspace_root: { type: 'string', description: 'Absolute existing local directory used as an ephemeral execution root. Mutually exclusive with repo_id/checkout_id; does not register or initialize the directory.' },
|
|
254
253
|
}, ['command'], true),
|
|
255
|
-
definition('repository_command_execute', '
|
|
254
|
+
definition('repository_command_execute', 'Compatibility facade for commands whose domain context is a repository/workspace. Repository targeting, Git/source mutation fences, and compatibility response fields live here; Process Runtime owns command execution and process identity. New broad host-local command callers should use process_exec. Use rh_context for routine code discovery/reading; shell exploration is fallback-only.', {
|
|
256
255
|
repo_id: repoId,
|
|
257
256
|
checkout_id: { type: 'string', description: 'Optional checkout identity for repositories with multiple local clones.' },
|
|
258
257
|
work_id: { type: 'string', description: 'Optional durable Work identity. Workflow controllers should pass the exact claimed Work id so attribution survives transient MCP transport sessions.' },
|
|
@@ -306,11 +305,10 @@ export function claimedSessionEditBinding(
|
|
|
306
305
|
if (!work) return undefined;
|
|
307
306
|
return {
|
|
308
307
|
workId,
|
|
309
|
-
|
|
310
|
-
|
|
308
|
+
repoId: repository.repoId,
|
|
309
|
+
checkoutId: repository.activeCheckoutId,
|
|
311
310
|
principalId: caller.principalId.trim(),
|
|
312
311
|
controllerInstanceId: caller.controllerInstanceId,
|
|
313
|
-
routeDecisionFingerprint: work.routeDecisionFingerprint,
|
|
314
312
|
};
|
|
315
313
|
}
|
|
316
314
|
|
|
@@ -341,21 +339,52 @@ function resolveRepositorySelectionForClaimedWork(
|
|
|
341
339
|
): ReturnType<typeof resolveRepositorySelection> {
|
|
342
340
|
const checkoutId = typeof args.checkout_id === 'string' ? args.checkout_id.trim() : '';
|
|
343
341
|
const explicitWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
|
|
344
|
-
|
|
342
|
+
let repository = resolveRepositorySelection({
|
|
345
343
|
repoId: repoIdValue || undefined,
|
|
346
344
|
checkoutId: checkoutId || undefined,
|
|
347
345
|
controllerHome,
|
|
348
346
|
allowSoleRepository: true,
|
|
349
347
|
});
|
|
350
|
-
if (!explicitWorkId
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
348
|
+
if (!explicitWorkId) return repository;
|
|
349
|
+
const recordedWork = getWorkContract({ controllerHome, repoId: repository.repoId }, explicitWorkId);
|
|
350
|
+
const recordedHandle = readWorkHandle(controllerHome, repository.repoId, explicitWorkId);
|
|
351
|
+
const workCheckoutId = recordedHandle?.checkoutId?.trim() || recordedWork?.checkoutId?.trim();
|
|
352
|
+
if (!checkoutId && workCheckoutId && workCheckoutId !== repository.activeCheckoutId) {
|
|
353
|
+
repository = resolveRepositorySelection({
|
|
354
|
+
repoId: repository.repoId,
|
|
355
|
+
checkoutId: workCheckoutId,
|
|
356
|
+
controllerHome,
|
|
357
|
+
allowSoleRepository: true,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
let work = resolveExplicitClaimedRepositoryWork(controllerHome, repository, caller, explicitWorkId);
|
|
361
|
+
if (!work) return repository;
|
|
362
|
+
if (work.workKind !== 'repository_change') {
|
|
363
|
+
work = promoteWorkToRepositoryChange({ controllerHome, repoId: repository.repoId }, work.workId);
|
|
364
|
+
}
|
|
365
|
+
const principalId = caller?.principalId?.trim();
|
|
366
|
+
const sessionId = caller?.sessionId?.trim();
|
|
367
|
+
const controllerInstanceId = caller?.controllerInstanceId?.trim();
|
|
368
|
+
if (principalId && sessionId && controllerInstanceId) {
|
|
369
|
+
ensureRunningRepositoryWorkCheckout({
|
|
370
|
+
controllerHome,
|
|
371
|
+
repository,
|
|
372
|
+
workId: work.workId,
|
|
373
|
+
identity: { principalId, sessionId, controllerInstanceId },
|
|
374
|
+
});
|
|
375
|
+
const refreshedWork = getWorkContract({ controllerHome, repoId: repository.repoId }, work.workId);
|
|
376
|
+
const refreshedHandle = readWorkHandle(controllerHome, repository.repoId, work.workId);
|
|
377
|
+
const refreshedCheckoutId = refreshedHandle?.checkoutId?.trim() || refreshedWork?.checkoutId?.trim();
|
|
378
|
+
if (refreshedCheckoutId && refreshedCheckoutId !== repository.activeCheckoutId) {
|
|
379
|
+
repository = resolveRepositorySelection({
|
|
380
|
+
repoId: repository.repoId,
|
|
381
|
+
checkoutId: refreshedCheckoutId,
|
|
382
|
+
controllerHome,
|
|
383
|
+
allowSoleRepository: true,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return repository;
|
|
359
388
|
}
|
|
360
389
|
|
|
361
390
|
function rawDefaultBranchMergeCommand(repository: ReturnType<typeof resolveRepositorySelection>, command: unknown): boolean {
|
|
@@ -372,7 +401,7 @@ function rawDefaultBranchMergeCommand(repository: ReturnType<typeof resolveRepos
|
|
|
372
401
|
|
|
373
402
|
interface HistoricalReadOnlyWorkContext {
|
|
374
403
|
workId: string;
|
|
375
|
-
|
|
404
|
+
state: WorkContract['semanticState'];
|
|
376
405
|
mode: 'historical_read_only_observation';
|
|
377
406
|
attribution: 'not_active_work';
|
|
378
407
|
}
|
|
@@ -385,12 +414,12 @@ function historicalReadOnlyWorkContext(
|
|
|
385
414
|
const requestedWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
|
|
386
415
|
if (!requestedWorkId) return undefined;
|
|
387
416
|
const work = getWorkContract({ controllerHome, repoId: repository.repoId }, requestedWorkId);
|
|
388
|
-
if (!work ||
|
|
417
|
+
if (!work || semanticWorkState(work) === 'open') return undefined;
|
|
389
418
|
const classification = classifyRepositoryCommand(args.command as string | string[], repository.defaultBranch);
|
|
390
419
|
if (classification.risk !== 'readonly') return undefined;
|
|
391
420
|
return {
|
|
392
421
|
workId: work.workId,
|
|
393
|
-
|
|
422
|
+
state: work.semanticState,
|
|
394
423
|
mode: 'historical_read_only_observation',
|
|
395
424
|
attribution: 'not_active_work',
|
|
396
425
|
};
|
|
@@ -402,7 +431,10 @@ function resolveRepositoryCommandTarget(
|
|
|
402
431
|
repoIdValue: string,
|
|
403
432
|
caller?: RepositoryToolCallerContext,
|
|
404
433
|
): {
|
|
405
|
-
repository
|
|
434
|
+
/** Present only for a repository target; absent for an arbitrary workspace. */
|
|
435
|
+
repository?: ReturnType<typeof resolveRepositorySelection>;
|
|
436
|
+
/** Typed command target used for scope, cwd, policy, audit and approval storage. */
|
|
437
|
+
commandTarget: RepositoryCommandScopeTarget;
|
|
406
438
|
executionIdentity: ResolvedExecutionIdentity;
|
|
407
439
|
workspace?: { workspaceId: string; root: string; registered: false };
|
|
408
440
|
historicalWorkContext?: HistoricalReadOnlyWorkContext;
|
|
@@ -415,7 +447,7 @@ function resolveRepositoryCommandTarget(
|
|
|
415
447
|
}
|
|
416
448
|
const target = resolveEphemeralWorkspaceTarget(workspaceRoot, controllerHome);
|
|
417
449
|
return {
|
|
418
|
-
|
|
450
|
+
commandTarget: target.commandTarget,
|
|
419
451
|
executionIdentity: {
|
|
420
452
|
schemaVersion: 1,
|
|
421
453
|
authority: 'ephemeral_workspace',
|
|
@@ -442,6 +474,7 @@ function resolveRepositoryCommandTarget(
|
|
|
442
474
|
if (historicalWorkContext) {
|
|
443
475
|
return {
|
|
444
476
|
repository: selectedRepository,
|
|
477
|
+
commandTarget: selectedRepository,
|
|
445
478
|
executionIdentity: {
|
|
446
479
|
schemaVersion: 1,
|
|
447
480
|
authority: 'repository',
|
|
@@ -460,6 +493,7 @@ function resolveRepositoryCommandTarget(
|
|
|
460
493
|
: undefined;
|
|
461
494
|
return {
|
|
462
495
|
repository,
|
|
496
|
+
commandTarget: repository,
|
|
463
497
|
executionIdentity: {
|
|
464
498
|
schemaVersion: 1,
|
|
465
499
|
authority: 'repository',
|
|
@@ -591,7 +625,10 @@ function compactProcessCommandPayload(input: {
|
|
|
591
625
|
route?: string;
|
|
592
626
|
reasons: string[];
|
|
593
627
|
decision?: unknown;
|
|
594
|
-
|
|
628
|
+
/** Repository id for a repository target; absent for an arbitrary workspace target. */
|
|
629
|
+
repoId?: string;
|
|
630
|
+
/** Workspace scope id when the target is an arbitrary workspace. */
|
|
631
|
+
scopeId?: string;
|
|
595
632
|
checkoutId?: string;
|
|
596
633
|
workspace?: { workspaceId: string; root: string; registered: false };
|
|
597
634
|
historicalWorkContext?: HistoricalReadOnlyWorkContext;
|
|
@@ -700,8 +737,8 @@ function compactProcessCommandPayload(input: {
|
|
|
700
737
|
|
|
701
738
|
function emptyRepositoryMigration(repository: ReturnType<typeof registerRepository>) {
|
|
702
739
|
return {
|
|
703
|
-
|
|
704
|
-
|
|
740
|
+
repoId: repository.repoId,
|
|
741
|
+
checkoutId: repository.activeCheckoutId,
|
|
705
742
|
scanned: 0,
|
|
706
743
|
updated: 0,
|
|
707
744
|
unresolved: 0,
|
|
@@ -867,39 +904,6 @@ export async function callRepositoryTool(
|
|
|
867
904
|
const payload = typeof args.payload === 'object' && args.payload !== null
|
|
868
905
|
? args.payload as Record<string, unknown>
|
|
869
906
|
: {};
|
|
870
|
-
if (operation === 'assess_work_mode') {
|
|
871
|
-
const description = typeof payload.description === 'string'
|
|
872
|
-
? payload.description
|
|
873
|
-
: typeof args.description === 'string' ? args.description : '';
|
|
874
|
-
const assessment = assessWorkMode({
|
|
875
|
-
description,
|
|
876
|
-
knownPaths: Array.isArray(payload.known_paths) ? payload.known_paths.map(String) : undefined,
|
|
877
|
-
expectedFiles: typeof payload.expected_files === 'number' ? payload.expected_files : undefined,
|
|
878
|
-
expectedChangedLines: typeof payload.expected_changed_lines === 'number' ? payload.expected_changed_lines : undefined,
|
|
879
|
-
requiresInvestigation: payload.requires_investigation === true,
|
|
880
|
-
requiresParallelism: payload.requires_parallelism === true,
|
|
881
|
-
requiresLongRunningChecks: payload.requires_long_running_checks === true,
|
|
882
|
-
needsDependencies: payload.needs_dependencies === true,
|
|
883
|
-
requiresIndependentDeliverables: payload.requires_independent_deliverables === true,
|
|
884
|
-
independentTaskCount: typeof payload.independent_task_count === 'number' ? payload.independent_task_count : undefined,
|
|
885
|
-
requiresRemoteWrite: payload.requires_remote_write === true || payload.remote_write === true,
|
|
886
|
-
requiresRecovery: payload.requires_recovery === true,
|
|
887
|
-
agentRequested: payload.agent_requested === true || payload.requires_worker === true,
|
|
888
|
-
requiresWorkerIsolation: payload.requires_worker_isolation === true,
|
|
889
|
-
risk: typeof payload.risk === 'string' ? payload.risk as 'low' | 'medium' | 'high' | 'destructive' : undefined,
|
|
890
|
-
explicitMode: parseExplicitTaskMode(payload.mode),
|
|
891
|
-
});
|
|
892
|
-
return result({
|
|
893
|
-
assessment,
|
|
894
|
-
routing: {
|
|
895
|
-
path: assessment.executionPath,
|
|
896
|
-
reasons: assessment.reasons,
|
|
897
|
-
recommendedMode: assessment.recommendedMode,
|
|
898
|
-
issueRequired: assessment.issueRequired,
|
|
899
|
-
},
|
|
900
|
-
nextTools: assessment.nextTools,
|
|
901
|
-
});
|
|
902
|
-
}
|
|
903
907
|
const internalTool = {
|
|
904
908
|
batch_execute: 'repository_batch_execute',
|
|
905
909
|
lanes_execute: 'repository_lanes_execute',
|
|
@@ -924,8 +928,8 @@ export async function callRepositoryTool(
|
|
|
924
928
|
: readRepositoryGitStatusSample(controllerHome, repository.repoId, repository.activeCheckoutId);
|
|
925
929
|
return result({
|
|
926
930
|
status: status ?? {
|
|
927
|
-
|
|
928
|
-
|
|
931
|
+
repoId: repository.repoId,
|
|
932
|
+
checkoutId: repository.activeCheckoutId,
|
|
929
933
|
sampleSource: 'daemon-sample',
|
|
930
934
|
sampled: false,
|
|
931
935
|
observedAt: null,
|
|
@@ -972,24 +976,14 @@ export async function callRepositoryTool(
|
|
|
972
976
|
allowSoleRepository: true,
|
|
973
977
|
});
|
|
974
978
|
return result({
|
|
975
|
-
|
|
976
|
-
|
|
979
|
+
repoId: repository.repoId,
|
|
980
|
+
checkoutId: repository.activeCheckoutId,
|
|
977
981
|
plan: buildSafePatchPlan(repository, { operations: args.operations, chunkSize: args.chunk_size }),
|
|
978
982
|
});
|
|
979
983
|
}
|
|
980
984
|
case 'repository_safe_patch_apply': {
|
|
981
985
|
const repository = resolveRepositorySelectionForClaimedWork(controllerHome, args, repoIdValue, caller);
|
|
982
986
|
const binding = safePatchEditBinding(controllerHome, repository, caller, args);
|
|
983
|
-
if (binding?.workId) {
|
|
984
|
-
const work = getWorkContract({ controllerHome, repoId: repository.repoId }, binding.workId);
|
|
985
|
-
if (!work) throw new Error(`WORK_NOT_FOUND: ${binding.workId}`);
|
|
986
|
-
const requestedPaths = buildSafePatchPlan(repository, { operations: args.operations, chunkSize: args.chunk_size })
|
|
987
|
-
.chunks.flatMap((chunk) => chunk.paths);
|
|
988
|
-
assertWorkPathsWithinScope(work, requestedPaths, {
|
|
989
|
-
forbidden: 'WORK_MUTATION_FORBIDDEN_PATH',
|
|
990
|
-
outOfScope: 'WORK_MUTATION_PATH_OUT_OF_SCOPE',
|
|
991
|
-
});
|
|
992
|
-
}
|
|
993
987
|
const applied = withControllerLock(
|
|
994
988
|
controllerHome,
|
|
995
989
|
{ scope: 'repository', repoId: repository.repoId },
|
|
@@ -1009,6 +1003,7 @@ export async function callRepositoryTool(
|
|
|
1009
1003
|
repository,
|
|
1010
1004
|
workId: binding.workId,
|
|
1011
1005
|
principalId: binding.principalId ?? caller?.principalId ?? '',
|
|
1006
|
+
sessionId: caller?.sessionId,
|
|
1012
1007
|
})
|
|
1013
1008
|
: undefined;
|
|
1014
1009
|
const patchResult = applySafePatch(repository, {
|
|
@@ -1080,8 +1075,8 @@ export async function callRepositoryTool(
|
|
|
1080
1075
|
errorMessage: firstFailure?.message,
|
|
1081
1076
|
});
|
|
1082
1077
|
const payload = {
|
|
1083
|
-
|
|
1084
|
-
|
|
1078
|
+
repoId: repository.repoId,
|
|
1079
|
+
checkoutId: repository.activeCheckoutId,
|
|
1085
1080
|
...applied as unknown as Record<string, unknown>,
|
|
1086
1081
|
phase: digest.phase,
|
|
1087
1082
|
statusLabel: digest.statusLabel,
|
|
@@ -1096,12 +1091,12 @@ export async function callRepositoryTool(
|
|
|
1096
1091
|
}
|
|
1097
1092
|
case 'repository_command_preview': {
|
|
1098
1093
|
const target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
|
|
1099
|
-
const {
|
|
1094
|
+
const { commandTarget } = target;
|
|
1100
1095
|
const execution = withControllerLock(
|
|
1101
1096
|
controllerHome,
|
|
1102
|
-
{ scope: 'repository', repoId:
|
|
1097
|
+
{ scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
|
|
1103
1098
|
'mcp:repository_command_preview',
|
|
1104
|
-
() => executeRepositoryCommand(controllerHome,
|
|
1099
|
+
() => executeRepositoryCommand(controllerHome, commandTarget, {
|
|
1105
1100
|
command: args.command as string | string[],
|
|
1106
1101
|
cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
|
|
1107
1102
|
dryRun: true,
|
|
@@ -1109,23 +1104,32 @@ export async function callRepositoryTool(
|
|
|
1109
1104
|
}),
|
|
1110
1105
|
60_000,
|
|
1111
1106
|
);
|
|
1107
|
+
// Repository targets keep repoId/checkoutId. An arbitrary workspace target
|
|
1108
|
+
// reports its workspace scope id and never a repository id.
|
|
1109
|
+
const { repoId: _previewRepoId, checkoutId: _previewCheckoutId, ...workspacePreviewFields } = execution as unknown as Record<string, unknown>;
|
|
1112
1110
|
return result({
|
|
1113
|
-
...execution as unknown as Record<string, unknown
|
|
1111
|
+
...(commandTarget.repoId ? execution as unknown as Record<string, unknown> : workspacePreviewFields),
|
|
1112
|
+
...(commandTarget.repoId ? {} : { scopeId: commandExecutionScopeKey(commandTarget) }),
|
|
1114
1113
|
...(target.workspace ? { workspace: target.workspace } : {}),
|
|
1115
1114
|
});
|
|
1116
1115
|
}
|
|
1117
1116
|
case 'repository_command_execute': {
|
|
1118
1117
|
const explorationGuidance = fragmentedRepositoryExplorationGuidance(args.command);
|
|
1119
1118
|
let target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
|
|
1120
|
-
let { repository, executionIdentity, historicalWorkContext } = target;
|
|
1119
|
+
let { repository, commandTarget, executionIdentity, historicalWorkContext } = target;
|
|
1120
|
+
// Repository targets keep their established identity fields. An arbitrary
|
|
1121
|
+
// workspace target reports a workspace scope id and never a repository id.
|
|
1122
|
+
const commandScopeKey = commandExecutionScopeKey(commandTarget);
|
|
1123
|
+
const scopeFields: Record<string, unknown> = repository
|
|
1124
|
+
? { repoId: commandScopeKey, checkoutId: commandTarget.activeCheckoutId }
|
|
1125
|
+
: { scopeId: commandScopeKey };
|
|
1121
1126
|
const explicitWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
}
|
|
1127
|
+
// Repository-semantic checks apply only when a repository target exists;
|
|
1128
|
+
// an arbitrary workspace has no bound session, default branch, or Work.
|
|
1129
|
+
if (repository && !explicitWorkId) assertNoBoundExecutionSessionMutation(controllerHome, repository, caller);
|
|
1130
|
+
// Git integration is a capability with its own repository, scope and
|
|
1131
|
+
// concurrency checks. A Work's semantic completion and any optional
|
|
1132
|
+
// verification/review evidence never admit or deny this operation.
|
|
1129
1133
|
const timeoutMs = typeof args.timeout_ms === 'number'
|
|
1130
1134
|
? args.timeout_ms
|
|
1131
1135
|
: typeof args.timeout_ms === 'string'
|
|
@@ -1155,7 +1159,7 @@ export async function callRepositoryTool(
|
|
|
1155
1159
|
const routeClass = classifyRepositoryCommandRoute(args.command as string | string[], {
|
|
1156
1160
|
forceDurable,
|
|
1157
1161
|
workId: executionIdentity.workId,
|
|
1158
|
-
defaultBranch:
|
|
1162
|
+
defaultBranch: commandTarget.defaultBranch,
|
|
1159
1163
|
timeoutMs,
|
|
1160
1164
|
});
|
|
1161
1165
|
const processRequestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
|
|
@@ -1168,7 +1172,7 @@ export async function callRepositoryTool(
|
|
|
1168
1172
|
);
|
|
1169
1173
|
}
|
|
1170
1174
|
let mutationAuthority: ReturnType<typeof ensureRepositoryMutationWorkHandle> | undefined;
|
|
1171
|
-
const mutationClassification = classifyRepositoryCommand(args.command as string | string[],
|
|
1175
|
+
const mutationClassification = classifyRepositoryCommand(args.command as string | string[], commandTarget.defaultBranch);
|
|
1172
1176
|
if (
|
|
1173
1177
|
(mutationClassification.risk === 'workspace_write' || mutationClassification.risk === 'destructive')
|
|
1174
1178
|
&& (routeClass.route === 'process_direct' || routeClass.route === 'process_managed')
|
|
@@ -1176,51 +1180,43 @@ export async function callRepositoryTool(
|
|
|
1176
1180
|
if (executionIdentity.workId) {
|
|
1177
1181
|
mutationAuthority = withControllerLock(
|
|
1178
1182
|
controllerHome,
|
|
1179
|
-
{ scope: 'repository', repoId:
|
|
1183
|
+
{ scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
|
|
1180
1184
|
'mcp:repository_command_execute:mutation-authority',
|
|
1181
1185
|
() => ensureRepositoryMutationWorkHandle({
|
|
1182
1186
|
controllerHome,
|
|
1183
|
-
repository
|
|
1187
|
+
repository: repository!,
|
|
1184
1188
|
workId: executionIdentity.workId!,
|
|
1185
1189
|
principalId: caller?.principalId ?? '',
|
|
1190
|
+
sessionId: caller?.sessionId,
|
|
1186
1191
|
deferEffectPromotion: true,
|
|
1187
1192
|
}),
|
|
1188
1193
|
60_000,
|
|
1189
1194
|
);
|
|
1190
|
-
// Pre-mutation reconciliation may advance expectedHead.
|
|
1191
|
-
//
|
|
1192
|
-
|
|
1193
|
-
|
|
1195
|
+
// Pre-mutation reconciliation may advance expectedHead. Preserve the
|
|
1196
|
+
// complete WorkHandle identity after that CAS; rebuilding a generic
|
|
1197
|
+
// repository identity here drops branch/expectedHead and prevents the
|
|
1198
|
+
// successful command from settling its legitimate successor HEAD.
|
|
1199
|
+
executionIdentity = executionIdentityForWork(repository!, mutationAuthority.handle);
|
|
1194
1200
|
} else {
|
|
1195
1201
|
withControllerLock(
|
|
1196
1202
|
controllerHome,
|
|
1197
|
-
{ scope: 'repository', repoId:
|
|
1203
|
+
{ scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
|
|
1198
1204
|
'mcp:repository_command_execute:unattributed-mutation-authority',
|
|
1199
1205
|
() => assertCanonicalRepositoryMutationWorkHandleAvailable({
|
|
1200
1206
|
controllerHome,
|
|
1201
|
-
repositoryId:
|
|
1202
|
-
checkoutId:
|
|
1207
|
+
repositoryId: commandExecutionScopeKey(commandTarget),
|
|
1208
|
+
checkoutId: commandTarget.activeCheckoutId ?? '',
|
|
1203
1209
|
}),
|
|
1204
1210
|
60_000,
|
|
1205
1211
|
);
|
|
1206
1212
|
}
|
|
1207
1213
|
}
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
assertWorkPathsWithinScope(work, commitScope.paths, {
|
|
1215
|
-
forbidden: 'WORK_COMMIT_STAGED_PATH_FORBIDDEN',
|
|
1216
|
-
outOfScope: 'WORK_COMMIT_STAGED_PATH_OUT_OF_SCOPE',
|
|
1217
|
-
});
|
|
1218
|
-
}
|
|
1219
|
-
// repository_command_execute owns its command execution architecture.
|
|
1220
|
-
// Do not send ordinary command text through Thin Harness semantic risk
|
|
1221
|
-
// routing: that creates duplicate regex/classifier policy and turns
|
|
1222
|
-
// unknown CLI shapes into false durable/reject decisions. Only an
|
|
1223
|
-
// explicitly requested durable mode uses the generic durable router.
|
|
1214
|
+
// Compatibility boundary only: this facade owns repository-domain
|
|
1215
|
+
// context (target resolution, Git/source mutation fencing and legacy
|
|
1216
|
+
// response translation), while Unified Process Runtime owns execution,
|
|
1217
|
+
// handles, cancellation and persistence. Do not create another generic
|
|
1218
|
+
// command executor here. Thin Harness is consulted only for an explicit
|
|
1219
|
+
// external durable boundary, not as a second command classifier.
|
|
1224
1220
|
const routingDecision = forceDurable
|
|
1225
1221
|
? routeExecution({
|
|
1226
1222
|
operation: 'repository_command_execute',
|
|
@@ -1255,8 +1251,7 @@ export async function callRepositoryTool(
|
|
|
1255
1251
|
path: routeClass.reason,
|
|
1256
1252
|
route: 'reject',
|
|
1257
1253
|
status: 'rejected',
|
|
1258
|
-
|
|
1259
|
-
checkoutId: repository.activeCheckoutId,
|
|
1254
|
+
...scopeFields,
|
|
1260
1255
|
workspace: target.workspace,
|
|
1261
1256
|
message: routeClass.reason === 'standalone_recovery_lifecycle_required'
|
|
1262
1257
|
? 'Canonical Runtime and connector lifecycle operations must be submitted to the standalone Forge Recovery owner, not executed as a child of repository Process Runtime.'
|
|
@@ -1277,8 +1272,7 @@ export async function callRepositoryTool(
|
|
|
1277
1272
|
accepted: false,
|
|
1278
1273
|
mode: 'durable',
|
|
1279
1274
|
path: 'ephemeral_workspace_promotion_required',
|
|
1280
|
-
|
|
1281
|
-
checkoutId: repository.activeCheckoutId,
|
|
1275
|
+
...scopeFields,
|
|
1282
1276
|
workspace: target.workspace,
|
|
1283
1277
|
message: 'Ephemeral workspaces must be registered before durable remote effects so Process identity and reconciliation have a stable repository authority.',
|
|
1284
1278
|
suggestedOperation: 'repository_register',
|
|
@@ -1287,7 +1281,7 @@ export async function callRepositoryTool(
|
|
|
1287
1281
|
if (routeClass.route === 'process_direct' || routeClass.route === 'process_managed' || routeClass.route === 'durable') {
|
|
1288
1282
|
const processResult = await executeRepositoryCommandViaProcessRuntime({
|
|
1289
1283
|
controllerHome,
|
|
1290
|
-
repository,
|
|
1284
|
+
repository: commandTarget,
|
|
1291
1285
|
command: args.command as string | string[],
|
|
1292
1286
|
cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
|
|
1293
1287
|
timeoutMs,
|
|
@@ -1300,18 +1294,18 @@ export async function callRepositoryTool(
|
|
|
1300
1294
|
workId: executionIdentity.workId,
|
|
1301
1295
|
executionIdentity,
|
|
1302
1296
|
allowNonGitWorkspace: target.workspace !== undefined,
|
|
1297
|
+
principalId: caller?.principalId ?? undefined,
|
|
1303
1298
|
});
|
|
1304
|
-
if (mutationAuthority && (processResult.route === 'process_direct' || processResult.route === 'process_managed')) {
|
|
1299
|
+
if (repository && mutationAuthority && (processResult.route === 'process_direct' || processResult.route === 'process_managed')) {
|
|
1305
1300
|
const processHandle = processResult.process;
|
|
1306
1301
|
const postStatus = repositoryGitStatus(repository);
|
|
1307
1302
|
const expectedHead = mutationAuthority.handle.expectedHead;
|
|
1308
|
-
const mutationObserved =
|
|
1309
|
-
|| !postStatus.clean
|
|
1303
|
+
const mutationObserved = !postStatus.clean
|
|
1310
1304
|
|| (Boolean(postStatus.head) && postStatus.head !== expectedHead);
|
|
1311
1305
|
if (mutationObserved) {
|
|
1312
1306
|
withControllerLock(
|
|
1313
1307
|
controllerHome,
|
|
1314
|
-
{ scope: 'repository', repoId:
|
|
1308
|
+
{ scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
|
|
1315
1309
|
'mcp:repository_command_execute:mutation-started',
|
|
1316
1310
|
() => markRepositoryMutationStarted({
|
|
1317
1311
|
controllerHome,
|
|
@@ -1342,8 +1336,7 @@ export async function callRepositoryTool(
|
|
|
1342
1336
|
mode: processResult.route,
|
|
1343
1337
|
path: processResult.reason ?? routeClass.reason,
|
|
1344
1338
|
route: processResult.route,
|
|
1345
|
-
|
|
1346
|
-
checkoutId: repository.activeCheckoutId,
|
|
1339
|
+
...scopeFields,
|
|
1347
1340
|
workspace: target.workspace,
|
|
1348
1341
|
status: processResult.executionStatus,
|
|
1349
1342
|
policyDecision: processResult.policyDecision ?? 'approval_required',
|
|
@@ -1370,8 +1363,7 @@ export async function callRepositoryTool(
|
|
|
1370
1363
|
route: processResult.route,
|
|
1371
1364
|
reasons: [processResult.reason ?? routeClass.reason, ...routingDecision.reasons],
|
|
1372
1365
|
decision: detailLevel === 'detail' ? routingDecision : undefined,
|
|
1373
|
-
|
|
1374
|
-
checkoutId: repository.activeCheckoutId,
|
|
1366
|
+
...scopeFields,
|
|
1375
1367
|
workspace: target.workspace,
|
|
1376
1368
|
historicalWorkContext,
|
|
1377
1369
|
processId: handle?.processId,
|
|
@@ -1434,8 +1426,7 @@ export async function callRepositoryTool(
|
|
|
1434
1426
|
accepted: false,
|
|
1435
1427
|
mode: 'durable',
|
|
1436
1428
|
path: 'ephemeral_workspace_promotion_required',
|
|
1437
|
-
|
|
1438
|
-
checkoutId: repository.activeCheckoutId,
|
|
1429
|
+
...scopeFields,
|
|
1439
1430
|
workspace: target.workspace,
|
|
1440
1431
|
message: 'Ephemeral workspaces support bounded local Direct/Managed execution only. Register the directory before durable, remote, release, or resumable Work.',
|
|
1441
1432
|
suggestedOperation: 'repository_register',
|
|
@@ -1449,13 +1440,13 @@ export async function callRepositoryTool(
|
|
|
1449
1440
|
try {
|
|
1450
1441
|
const routeClass = classifyRepositoryCommandRoute(args.command as string | string[], {
|
|
1451
1442
|
forceDurable: false,
|
|
1452
|
-
defaultBranch:
|
|
1443
|
+
defaultBranch: commandTarget.defaultBranch,
|
|
1453
1444
|
timeoutMs,
|
|
1454
1445
|
});
|
|
1455
1446
|
if (routeClass.route === 'process_direct') {
|
|
1456
1447
|
const processResult = await executeRepositoryCommandViaProcessRuntime({
|
|
1457
1448
|
controllerHome,
|
|
1458
|
-
repository,
|
|
1449
|
+
repository: commandTarget,
|
|
1459
1450
|
command: args.command as string | string[],
|
|
1460
1451
|
cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
|
|
1461
1452
|
timeoutMs,
|
|
@@ -1463,6 +1454,7 @@ export async function callRepositoryTool(
|
|
|
1463
1454
|
requestId: typeof args.request_id === 'string' ? args.request_id : undefined,
|
|
1464
1455
|
workId: executionIdentity.workId,
|
|
1465
1456
|
executionIdentity,
|
|
1457
|
+
principalId: caller?.principalId ?? undefined,
|
|
1466
1458
|
});
|
|
1467
1459
|
if (processResult.route === 'process_direct') {
|
|
1468
1460
|
const execRecord = processResult.process as unknown as Record<string, unknown> | undefined;
|
|
@@ -1476,8 +1468,7 @@ export async function callRepositoryTool(
|
|
|
1476
1468
|
mode: 'durable',
|
|
1477
1469
|
reasons: ['durable_worker_inline_process_direct', routeClass.reason, ...routingDecision.reasons],
|
|
1478
1470
|
}),
|
|
1479
|
-
|
|
1480
|
-
checkoutId: repository.activeCheckoutId,
|
|
1471
|
+
...scopeFields,
|
|
1481
1472
|
ok,
|
|
1482
1473
|
processId: typeof execRecord?.processId === 'string' ? execRecord.processId : undefined,
|
|
1483
1474
|
status: typeof execRecord?.status === 'string' ? execRecord.status : undefined,
|
|
@@ -1544,8 +1535,8 @@ export async function callRepositoryTool(
|
|
|
1544
1535
|
const batch = await executeRepositoryBatch(
|
|
1545
1536
|
{ controllerHome, repository },
|
|
1546
1537
|
{
|
|
1547
|
-
|
|
1548
|
-
|
|
1538
|
+
repoId: repository.repoId,
|
|
1539
|
+
checkoutId: repository.activeCheckoutId,
|
|
1549
1540
|
mode: args.mode === 'fast' || args.mode === 'durable' || args.mode === 'auto' ? args.mode : 'auto',
|
|
1550
1541
|
steps,
|
|
1551
1542
|
stopOnError: args.stop_on_error !== false,
|
|
@@ -1569,8 +1560,8 @@ export async function callRepositoryTool(
|
|
|
1569
1560
|
const lanes = await executeLightweightLanes(
|
|
1570
1561
|
{ controllerHome, repository },
|
|
1571
1562
|
{
|
|
1572
|
-
|
|
1573
|
-
|
|
1563
|
+
repoId: repository.repoId,
|
|
1564
|
+
checkoutId: repository.activeCheckoutId,
|
|
1574
1565
|
readLanes: Array.isArray(args.read_lanes)
|
|
1575
1566
|
? args.read_lanes
|
|
1576
1567
|
.filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null)
|
|
@@ -38,6 +38,11 @@ export const DEFAULT_CONTROLLER_TOOL_NAMES = [
|
|
|
38
38
|
'plugin_action_execute',
|
|
39
39
|
|
|
40
40
|
// Managed Process Runtime lifecycle (attach / poll / cancel — never re-exec).
|
|
41
|
+
// process_exec is the canonical host-local command lane: the Forge instance is
|
|
42
|
+
// the target, cwd is an execution argument, and it is authorized by one
|
|
43
|
+
// explicit `process:exec` canonical Grant. repository_command_execute stays as
|
|
44
|
+
// translation-only compatibility over the repository target.
|
|
45
|
+
'process_exec',
|
|
41
46
|
'process_get',
|
|
42
47
|
'process_wait',
|
|
43
48
|
'process_logs',
|
package/adapters/mcp/toolset.ts
CHANGED
|
@@ -11,6 +11,8 @@ import { runtimeToolDefinitions } from './runtime-gateway/runtime-tool-definitio
|
|
|
11
11
|
import { executionToolDefinitions } from './runtime-gateway/execution-tools';
|
|
12
12
|
import { processToolDefinitions } from './runtime-gateway/process-tools';
|
|
13
13
|
import { injectDurableCommandFields } from './runtime-gateway/router';
|
|
14
|
+
import { injectAutomationEnvelopeFields } from './runtime-gateway/automation-receipt-adapter';
|
|
15
|
+
import { injectCognitionSettlementFields } from './runtime-gateway/cognition-settlement';
|
|
14
16
|
import { DEFAULT_CONTROLLER_TOOL_NAMES, PREFERRED_FACADE_TOOL_NAMES, STABLE_CONTROLLER_TOOL_NAMES } from './toolset-names';
|
|
15
17
|
export { BOOTSTRAP_CONTROLLER_TOOL_NAMES, CORE_CONTROLLER_TOOL_NAMES, DEFAULT_CONTROLLER_TOOL_NAMES, PREFERRED_FACADE_TOOL_NAMES, STABLE_CONTROLLER_TOOL_NAMES } from './toolset-names';
|
|
16
18
|
import type { McpToolset } from './types';
|
|
@@ -197,10 +199,9 @@ function buildStaticControllerExposureSnapshot(
|
|
|
197
199
|
const definitions = expectedToolNames
|
|
198
200
|
.map((name) => definitionByName.get(name))
|
|
199
201
|
.filter((definition): definition is McpToolDefinition => Boolean(definition))
|
|
200
|
-
// Fingerprint the definitions that ListTools
|
|
201
|
-
//
|
|
202
|
-
|
|
203
|
-
.map(injectDurableCommandFields);
|
|
202
|
+
// Fingerprint the exact definitions that ListTools returns. Shared transport
|
|
203
|
+
// contracts are injected here once rather than re-declared by domain registries.
|
|
204
|
+
.map((definition) => injectCognitionSettlementFields(injectAutomationEnvelopeFields(injectDurableCommandFields(definition))));
|
|
204
205
|
const actualToolNames = definitions.map((tool) => tool.name);
|
|
205
206
|
const actualSet = new Set(actualToolNames);
|
|
206
207
|
const expectedSet = new Set(expectedToolNames);
|
|
@@ -272,7 +273,7 @@ export function clearControllerExposureCacheForTest(): void {
|
|
|
272
273
|
export function allControllerToolDefinitions(ctx: MultiRepositoryMcpToolContext): McpToolDefinition[] {
|
|
273
274
|
return uniqueDefinitions(
|
|
274
275
|
runtimeToolDefinitions.concat(executionToolDefinitions, processToolDefinitions, accessToolDefinitions, repositoryToolDefinitions, buildMultiRepositoryToolDefinitions(ctx)),
|
|
275
|
-
).definitions;
|
|
276
|
+
).definitions.map((definition) => injectCognitionSettlementFields(injectAutomationEnvelopeFields(injectDurableCommandFields(definition))));
|
|
276
277
|
}
|
|
277
278
|
|
|
278
279
|
export function controllerExposureSnapshot(ctx: MultiRepositoryMcpToolContext): ControllerExposureSnapshot {
|