@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,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, 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
|
}),
|
|
@@ -245,25 +244,23 @@ export const repositoryToolDefinitions: McpToolDefinition[] = [
|
|
|
245
244
|
validation_only: { type: 'boolean', description: 'When true, do not edit. Reconcile/reuse the existing session validation Processes identified by session_id/check_ids/validation_request_id.' },
|
|
246
245
|
apply_mode: { type: 'string', enum: ['sync', 'async'], description: 'Defaults to sync for interactive development. Set async only for a separately durable operation.' },
|
|
247
246
|
}),
|
|
248
|
-
definition('
|
|
247
|
+
definition('execute_command', 'Single terminal entry. Repository and authorized workspace commands need no Work or Plan. Explicit scope=host uses the existing ForgeInstance process:exec Grant. Process Runtime owns execution, process handles and timeouts; Git ownership checks remain mechanical.', {
|
|
249
248
|
repo_id: repoId,
|
|
250
249
|
checkout_id: { type: 'string', description: 'Optional checkout identity for repositories with multiple local clones.' },
|
|
251
|
-
|
|
250
|
+
work_id: { type: 'string', description: 'Optional Work provenance; ordinary commands never require a Work. Work-attributed effects require a stable request_id.' },
|
|
251
|
+
scope: { type: 'string', enum: ['repository', 'host'], description: 'Defaults to repository; host requires an explicit process:exec ForgeInstance Grant.' },
|
|
252
|
+
command: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }], description: 'Repository: typed argv or shell string; host: typed argv only.' },
|
|
253
|
+
shell_command: { type: 'string', description: 'Host shell only; mutually exclusive with command and requires scope=host.' },
|
|
254
|
+
request_id: { type: 'string', description: 'Stable invocation id for reconnect without duplicate effects.' },
|
|
252
255
|
cwd: { type: 'string', description: 'Optional root-relative working directory.' },
|
|
253
256
|
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
|
-
|
|
255
|
-
|
|
256
|
-
repo_id: repoId,
|
|
257
|
-
checkout_id: { type: 'string', description: 'Optional checkout identity for repositories with multiple local clones.' },
|
|
258
|
-
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.' },
|
|
259
|
-
command: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }], description: 'Legacy shell string or typed argv array. Typed argv executes without a shell.' },
|
|
260
|
-
cwd: { type: 'string', description: 'Optional root-relative working directory.' },
|
|
261
|
-
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.' },
|
|
262
|
-
approval_token: { type: 'string', description: 'Exact approval token returned by repository_command_preview.' },
|
|
257
|
+
dry_run: { type: 'boolean', description: 'Preview without executing: returns command classification, approval token and Git snapshots for repository/workspace target.' },
|
|
258
|
+
approval_token: { type: 'string', description: 'Exact approval token returned by execute_command(dry_run=true).' },
|
|
263
259
|
approval_request_id: { type: 'string', description: 'Resolved approvalRequestId returned by approval_resolve.' },
|
|
264
260
|
timeout_ms: { type: 'number', description: 'Optional execution timeout in milliseconds.' },
|
|
265
|
-
max_output_bytes: { type: 'number', description: '
|
|
266
|
-
|
|
261
|
+
max_output_bytes: { type: 'number', minimum: 1024, maximum: 1048576, description: 'Captured output limit 1024–1048576 bytes.' },
|
|
262
|
+
interactive_wait_ms: { type: 'number', description: 'Optional short attachment window; long-running processes return a handle.' },
|
|
263
|
+
}),
|
|
267
264
|
|
|
268
265
|
// Thin Harness V1 is exposed through repository_workbench operations to keep the stable tool surface bounded.
|
|
269
266
|
];
|
|
@@ -306,11 +303,10 @@ export function claimedSessionEditBinding(
|
|
|
306
303
|
if (!work) return undefined;
|
|
307
304
|
return {
|
|
308
305
|
workId,
|
|
309
|
-
|
|
310
|
-
|
|
306
|
+
repoId: repository.repoId,
|
|
307
|
+
checkoutId: repository.activeCheckoutId,
|
|
311
308
|
principalId: caller.principalId.trim(),
|
|
312
309
|
controllerInstanceId: caller.controllerInstanceId,
|
|
313
|
-
routeDecisionFingerprint: work.routeDecisionFingerprint,
|
|
314
310
|
};
|
|
315
311
|
}
|
|
316
312
|
|
|
@@ -341,21 +337,49 @@ function resolveRepositorySelectionForClaimedWork(
|
|
|
341
337
|
): ReturnType<typeof resolveRepositorySelection> {
|
|
342
338
|
const checkoutId = typeof args.checkout_id === 'string' ? args.checkout_id.trim() : '';
|
|
343
339
|
const explicitWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
|
|
344
|
-
|
|
340
|
+
let repository = resolveRepositorySelection({
|
|
345
341
|
repoId: repoIdValue || undefined,
|
|
346
342
|
checkoutId: checkoutId || undefined,
|
|
347
343
|
controllerHome,
|
|
348
344
|
allowSoleRepository: true,
|
|
349
345
|
});
|
|
350
|
-
if (!explicitWorkId
|
|
346
|
+
if (!explicitWorkId) return repository;
|
|
347
|
+
const recordedWork = getWorkContract({ controllerHome, repoId: repository.repoId }, explicitWorkId);
|
|
348
|
+
const recordedHandle = readWorkHandle(controllerHome, repository.repoId, explicitWorkId);
|
|
349
|
+
const workCheckoutId = recordedHandle?.checkoutId?.trim() || recordedWork?.checkoutId?.trim();
|
|
350
|
+
if (!checkoutId && workCheckoutId && workCheckoutId !== repository.activeCheckoutId) {
|
|
351
|
+
repository = resolveRepositorySelection({
|
|
352
|
+
repoId: repository.repoId,
|
|
353
|
+
checkoutId: workCheckoutId,
|
|
354
|
+
controllerHome,
|
|
355
|
+
allowSoleRepository: true,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
351
358
|
const work = resolveExplicitClaimedRepositoryWork(controllerHome, repository, caller, explicitWorkId);
|
|
352
|
-
if (!work
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
+
if (!work) return repository;
|
|
360
|
+
const principalId = caller?.principalId?.trim();
|
|
361
|
+
const sessionId = caller?.sessionId?.trim();
|
|
362
|
+
const controllerInstanceId = caller?.controllerInstanceId?.trim();
|
|
363
|
+
if (principalId && sessionId && controllerInstanceId) {
|
|
364
|
+
ensureRunningRepositoryWorkCheckout({
|
|
365
|
+
controllerHome,
|
|
366
|
+
repository,
|
|
367
|
+
workId: work.workId,
|
|
368
|
+
identity: { principalId, sessionId, controllerInstanceId },
|
|
369
|
+
});
|
|
370
|
+
const refreshedWork = getWorkContract({ controllerHome, repoId: repository.repoId }, work.workId);
|
|
371
|
+
const refreshedHandle = readWorkHandle(controllerHome, repository.repoId, work.workId);
|
|
372
|
+
const refreshedCheckoutId = refreshedHandle?.checkoutId?.trim() || refreshedWork?.checkoutId?.trim();
|
|
373
|
+
if (refreshedCheckoutId && refreshedCheckoutId !== repository.activeCheckoutId) {
|
|
374
|
+
repository = resolveRepositorySelection({
|
|
375
|
+
repoId: repository.repoId,
|
|
376
|
+
checkoutId: refreshedCheckoutId,
|
|
377
|
+
controllerHome,
|
|
378
|
+
allowSoleRepository: true,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return repository;
|
|
359
383
|
}
|
|
360
384
|
|
|
361
385
|
function rawDefaultBranchMergeCommand(repository: ReturnType<typeof resolveRepositorySelection>, command: unknown): boolean {
|
|
@@ -372,7 +396,7 @@ function rawDefaultBranchMergeCommand(repository: ReturnType<typeof resolveRepos
|
|
|
372
396
|
|
|
373
397
|
interface HistoricalReadOnlyWorkContext {
|
|
374
398
|
workId: string;
|
|
375
|
-
|
|
399
|
+
state: WorkContract['semanticState'];
|
|
376
400
|
mode: 'historical_read_only_observation';
|
|
377
401
|
attribution: 'not_active_work';
|
|
378
402
|
}
|
|
@@ -385,12 +409,12 @@ function historicalReadOnlyWorkContext(
|
|
|
385
409
|
const requestedWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
|
|
386
410
|
if (!requestedWorkId) return undefined;
|
|
387
411
|
const work = getWorkContract({ controllerHome, repoId: repository.repoId }, requestedWorkId);
|
|
388
|
-
if (!work ||
|
|
412
|
+
if (!work || semanticWorkState(work) === 'open') return undefined;
|
|
389
413
|
const classification = classifyRepositoryCommand(args.command as string | string[], repository.defaultBranch);
|
|
390
414
|
if (classification.risk !== 'readonly') return undefined;
|
|
391
415
|
return {
|
|
392
416
|
workId: work.workId,
|
|
393
|
-
|
|
417
|
+
state: work.semanticState,
|
|
394
418
|
mode: 'historical_read_only_observation',
|
|
395
419
|
attribution: 'not_active_work',
|
|
396
420
|
};
|
|
@@ -402,7 +426,10 @@ function resolveRepositoryCommandTarget(
|
|
|
402
426
|
repoIdValue: string,
|
|
403
427
|
caller?: RepositoryToolCallerContext,
|
|
404
428
|
): {
|
|
405
|
-
repository
|
|
429
|
+
/** Present only for a repository target; absent for an arbitrary workspace. */
|
|
430
|
+
repository?: ReturnType<typeof resolveRepositorySelection>;
|
|
431
|
+
/** Typed command target used for scope, cwd, policy, audit and approval storage. */
|
|
432
|
+
commandTarget: RepositoryCommandScopeTarget;
|
|
406
433
|
executionIdentity: ResolvedExecutionIdentity;
|
|
407
434
|
workspace?: { workspaceId: string; root: string; registered: false };
|
|
408
435
|
historicalWorkContext?: HistoricalReadOnlyWorkContext;
|
|
@@ -415,7 +442,7 @@ function resolveRepositoryCommandTarget(
|
|
|
415
442
|
}
|
|
416
443
|
const target = resolveEphemeralWorkspaceTarget(workspaceRoot, controllerHome);
|
|
417
444
|
return {
|
|
418
|
-
|
|
445
|
+
commandTarget: target.commandTarget,
|
|
419
446
|
executionIdentity: {
|
|
420
447
|
schemaVersion: 1,
|
|
421
448
|
authority: 'ephemeral_workspace',
|
|
@@ -442,6 +469,7 @@ function resolveRepositoryCommandTarget(
|
|
|
442
469
|
if (historicalWorkContext) {
|
|
443
470
|
return {
|
|
444
471
|
repository: selectedRepository,
|
|
472
|
+
commandTarget: selectedRepository,
|
|
445
473
|
executionIdentity: {
|
|
446
474
|
schemaVersion: 1,
|
|
447
475
|
authority: 'repository',
|
|
@@ -460,6 +488,7 @@ function resolveRepositoryCommandTarget(
|
|
|
460
488
|
: undefined;
|
|
461
489
|
return {
|
|
462
490
|
repository,
|
|
491
|
+
commandTarget: repository,
|
|
463
492
|
executionIdentity: {
|
|
464
493
|
schemaVersion: 1,
|
|
465
494
|
authority: 'repository',
|
|
@@ -557,33 +586,6 @@ function failure(error: unknown): RepositoryToolResult {
|
|
|
557
586
|
return { ...result({ error: { code, message, ...(compactDetails !== undefined ? { details: compactDetails } : {}) } }), isError: true };
|
|
558
587
|
}
|
|
559
588
|
|
|
560
|
-
interface RepositoryExplorationGuidance {
|
|
561
|
-
code: 'FRAGMENTED_REPOSITORY_EXPLORATION';
|
|
562
|
-
recommendedTool: 'rh_context';
|
|
563
|
-
recommendedOperation: 'search';
|
|
564
|
-
message: string;
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
function fragmentedRepositoryExplorationGuidance(command: unknown): RepositoryExplorationGuidance | undefined {
|
|
568
|
-
if (typeof command !== 'string') return undefined;
|
|
569
|
-
const segments = command.split(/(?:&&|\|\||[;|])/g);
|
|
570
|
-
const readPrograms = new Set<string>();
|
|
571
|
-
let readStepCount = 0;
|
|
572
|
-
for (const segment of segments) {
|
|
573
|
-
const match = segment.trim().match(/^(?:(?:command|env)\s+)?(?:[A-Za-z_][A-Za-z0-9_]*=[^\s]+\s+)*(rg|grep|sed|cat|head|tail)\b/i);
|
|
574
|
-
if (!match) continue;
|
|
575
|
-
readStepCount += 1;
|
|
576
|
-
readPrograms.add(match[1]!.toLowerCase());
|
|
577
|
-
}
|
|
578
|
-
if (readStepCount < 2) return undefined;
|
|
579
|
-
return {
|
|
580
|
-
code: 'FRAGMENTED_REPOSITORY_EXPLORATION',
|
|
581
|
-
recommendedTool: 'rh_context',
|
|
582
|
-
recommendedOperation: 'search',
|
|
583
|
-
message: `Detected ${readStepCount} chained repository read steps (${[...readPrograms].join(', ')}). Prefer a broad rh_context request first, then repeat rh_context with selected paths or relationships when more evidence can improve correctness; keep shell search as fallback when the Context Plane cannot supply the needed evidence.`,
|
|
584
|
-
};
|
|
585
|
-
}
|
|
586
|
-
|
|
587
589
|
function compactProcessCommandPayload(input: {
|
|
588
590
|
accepted?: boolean;
|
|
589
591
|
mode: string;
|
|
@@ -591,7 +593,10 @@ function compactProcessCommandPayload(input: {
|
|
|
591
593
|
route?: string;
|
|
592
594
|
reasons: string[];
|
|
593
595
|
decision?: unknown;
|
|
594
|
-
|
|
596
|
+
/** Repository id for a repository target; absent for an arbitrary workspace target. */
|
|
597
|
+
repoId?: string;
|
|
598
|
+
/** Workspace scope id when the target is an arbitrary workspace. */
|
|
599
|
+
scopeId?: string;
|
|
595
600
|
checkoutId?: string;
|
|
596
601
|
workspace?: { workspaceId: string; root: string; registered: false };
|
|
597
602
|
historicalWorkContext?: HistoricalReadOnlyWorkContext;
|
|
@@ -607,7 +612,6 @@ function compactProcessCommandPayload(input: {
|
|
|
607
612
|
/** summary (default) omits nested process / routing dumps; detail restores diagnostics. */
|
|
608
613
|
detailLevel?: 'summary' | 'detail';
|
|
609
614
|
includeFullProcess?: boolean;
|
|
610
|
-
guidance?: RepositoryExplorationGuidance;
|
|
611
615
|
}): Record<string, unknown> {
|
|
612
616
|
const output = compactCommandOutput(input.stdout, input.stderr, { ok: input.ok === true });
|
|
613
617
|
const detail = input.detailLevel === 'detail' || input.includeFullProcess === true;
|
|
@@ -643,7 +647,6 @@ function compactProcessCommandPayload(input: {
|
|
|
643
647
|
stderr: output.stderr ?? '',
|
|
644
648
|
...(output.stdoutTruncated ? { stdoutTruncated: true, stdoutBytes: output.stdoutBytes } : {}),
|
|
645
649
|
...(output.stderrTruncated ? { stderrTruncated: true, stderrBytes: output.stderrBytes } : {}),
|
|
646
|
-
...(input.guidance ? { guidance: input.guidance, suggestedOperation: 'rh_context' } : {}),
|
|
647
650
|
};
|
|
648
651
|
if (completed && !ok) {
|
|
649
652
|
payload.error = {
|
|
@@ -692,7 +695,6 @@ function compactProcessCommandPayload(input: {
|
|
|
692
695
|
}
|
|
693
696
|
: {}),
|
|
694
697
|
durableSideEffects: effects,
|
|
695
|
-
...(input.guidance ? { guidance: input.guidance, suggestedOperation: 'rh_context' } : {}),
|
|
696
698
|
next: input.next,
|
|
697
699
|
detailLevel: 'detail',
|
|
698
700
|
};
|
|
@@ -700,8 +702,8 @@ function compactProcessCommandPayload(input: {
|
|
|
700
702
|
|
|
701
703
|
function emptyRepositoryMigration(repository: ReturnType<typeof registerRepository>) {
|
|
702
704
|
return {
|
|
703
|
-
|
|
704
|
-
|
|
705
|
+
repoId: repository.repoId,
|
|
706
|
+
checkoutId: repository.activeCheckoutId,
|
|
705
707
|
scanned: 0,
|
|
706
708
|
updated: 0,
|
|
707
709
|
unresolved: 0,
|
|
@@ -734,7 +736,7 @@ export async function callRepositoryTool(
|
|
|
734
736
|
args: Record<string, unknown>,
|
|
735
737
|
caller?: RepositoryToolCallerContext,
|
|
736
738
|
): Promise<RepositoryToolResult | undefined> {
|
|
737
|
-
if (!name.startsWith('repository_') && name !== 'read_repository_file') return undefined;
|
|
739
|
+
if (!name.startsWith('repository_') && name !== 'read_repository_file' && name !== 'execute_command') return undefined;
|
|
738
740
|
try {
|
|
739
741
|
const repoIdValue = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
|
|
740
742
|
switch (name) {
|
|
@@ -867,39 +869,6 @@ export async function callRepositoryTool(
|
|
|
867
869
|
const payload = typeof args.payload === 'object' && args.payload !== null
|
|
868
870
|
? args.payload as Record<string, unknown>
|
|
869
871
|
: {};
|
|
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
872
|
const internalTool = {
|
|
904
873
|
batch_execute: 'repository_batch_execute',
|
|
905
874
|
lanes_execute: 'repository_lanes_execute',
|
|
@@ -920,12 +889,12 @@ export async function callRepositoryTool(
|
|
|
920
889
|
case 'repository_git_status': {
|
|
921
890
|
const repository = resolveRepositorySelection({ repoId: repoIdValue || undefined, checkoutId: typeof args.checkout_id === 'string' ? args.checkout_id : undefined, controllerHome, allowSoleRepository: true });
|
|
922
891
|
const status = args.refresh === true
|
|
923
|
-
? writeRepositoryGitStatusSample(controllerHome, repository)
|
|
892
|
+
? await writeRepositoryGitStatusSample(controllerHome, repository)
|
|
924
893
|
: readRepositoryGitStatusSample(controllerHome, repository.repoId, repository.activeCheckoutId);
|
|
925
894
|
return result({
|
|
926
895
|
status: status ?? {
|
|
927
|
-
|
|
928
|
-
|
|
896
|
+
repoId: repository.repoId,
|
|
897
|
+
checkoutId: repository.activeCheckoutId,
|
|
929
898
|
sampleSource: 'daemon-sample',
|
|
930
899
|
sampled: false,
|
|
931
900
|
observedAt: null,
|
|
@@ -972,24 +941,14 @@ export async function callRepositoryTool(
|
|
|
972
941
|
allowSoleRepository: true,
|
|
973
942
|
});
|
|
974
943
|
return result({
|
|
975
|
-
|
|
976
|
-
|
|
944
|
+
repoId: repository.repoId,
|
|
945
|
+
checkoutId: repository.activeCheckoutId,
|
|
977
946
|
plan: buildSafePatchPlan(repository, { operations: args.operations, chunkSize: args.chunk_size }),
|
|
978
947
|
});
|
|
979
948
|
}
|
|
980
949
|
case 'repository_safe_patch_apply': {
|
|
981
950
|
const repository = resolveRepositorySelectionForClaimedWork(controllerHome, args, repoIdValue, caller);
|
|
982
951
|
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
952
|
const applied = withControllerLock(
|
|
994
953
|
controllerHome,
|
|
995
954
|
{ scope: 'repository', repoId: repository.repoId },
|
|
@@ -1003,12 +962,15 @@ export async function callRepositoryTool(
|
|
|
1003
962
|
workId: binding?.workId,
|
|
1004
963
|
});
|
|
1005
964
|
}
|
|
1006
|
-
|
|
965
|
+
// A validation-only reattachment is not repository mutation admission;
|
|
966
|
+
// it must never promote a thin investigation to repository_change.
|
|
967
|
+
const mutationAuthority = binding?.workId && args.validation_only !== true
|
|
1007
968
|
? ensureRepositoryMutationWorkHandle({
|
|
1008
969
|
controllerHome,
|
|
1009
970
|
repository,
|
|
1010
971
|
workId: binding.workId,
|
|
1011
972
|
principalId: binding.principalId ?? caller?.principalId ?? '',
|
|
973
|
+
sessionId: caller?.sessionId,
|
|
1012
974
|
})
|
|
1013
975
|
: undefined;
|
|
1014
976
|
const patchResult = applySafePatch(repository, {
|
|
@@ -1080,8 +1042,8 @@ export async function callRepositoryTool(
|
|
|
1080
1042
|
errorMessage: firstFailure?.message,
|
|
1081
1043
|
});
|
|
1082
1044
|
const payload = {
|
|
1083
|
-
|
|
1084
|
-
|
|
1045
|
+
repoId: repository.repoId,
|
|
1046
|
+
checkoutId: repository.activeCheckoutId,
|
|
1085
1047
|
...applied as unknown as Record<string, unknown>,
|
|
1086
1048
|
phase: digest.phase,
|
|
1087
1049
|
statusLabel: digest.statusLabel,
|
|
@@ -1094,38 +1056,47 @@ export async function callRepositoryTool(
|
|
|
1094
1056
|
};
|
|
1095
1057
|
return ok ? result(payload) : { ...result(payload), isError: true };
|
|
1096
1058
|
}
|
|
1097
|
-
case '
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1059
|
+
case 'execute_command': {
|
|
1060
|
+
if (args.scope !== undefined && args.scope !== 'repository') throw new Error('COMMAND_SCOPE_INVALID: host scope uses the authorized host command lane');
|
|
1061
|
+
if (args.shell_command !== undefined) throw new Error('COMMAND_SCOPE_INVALID: shell_command requires scope=host');
|
|
1062
|
+
if (args.command === undefined) throw new Error('COMMAND_REQUIRED: repository commands require command');
|
|
1063
|
+
if (args.dry_run === true) {
|
|
1064
|
+
const target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
|
|
1065
|
+
const { commandTarget } = target;
|
|
1066
|
+
const execution = withControllerLock(
|
|
1067
|
+
controllerHome,
|
|
1068
|
+
{ scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
|
|
1069
|
+
'mcp:execute_command:preview',
|
|
1070
|
+
() => executeRepositoryCommand(controllerHome, commandTarget, {
|
|
1071
|
+
command: args.command as string | string[],
|
|
1072
|
+
cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
|
|
1073
|
+
dryRun: true,
|
|
1074
|
+
allowNonGitWorkspace: target.workspace !== undefined,
|
|
1075
|
+
}),
|
|
1076
|
+
60_000,
|
|
1077
|
+
);
|
|
1078
|
+
const { repoId: _previewRepoId, checkoutId: _previewCheckoutId, ...workspacePreviewFields } = execution as unknown as Record<string, unknown>;
|
|
1079
|
+
return result({
|
|
1080
|
+
...(commandTarget.repoId ? execution as unknown as Record<string, unknown> : workspacePreviewFields),
|
|
1081
|
+
...(commandTarget.repoId ? {} : { scopeId: commandExecutionScopeKey(commandTarget) }),
|
|
1082
|
+
...(target.workspace ? { workspace: target.workspace } : {}),
|
|
1083
|
+
});
|
|
1084
|
+
}
|
|
1119
1085
|
let target = resolveRepositoryCommandTarget(controllerHome, args, repoIdValue, caller);
|
|
1120
|
-
let { repository, executionIdentity, historicalWorkContext } = target;
|
|
1086
|
+
let { repository, commandTarget, executionIdentity, historicalWorkContext } = target;
|
|
1087
|
+
// Repository targets keep their established identity fields. An arbitrary
|
|
1088
|
+
// workspace target reports a workspace scope id and never a repository id.
|
|
1089
|
+
const commandScopeKey = commandExecutionScopeKey(commandTarget);
|
|
1090
|
+
const scopeFields: Record<string, unknown> = repository
|
|
1091
|
+
? { repoId: commandScopeKey, checkoutId: commandTarget.activeCheckoutId }
|
|
1092
|
+
: { scopeId: commandScopeKey };
|
|
1121
1093
|
const explicitWorkId = typeof args.work_id === 'string' ? args.work_id.trim() : '';
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
}
|
|
1094
|
+
// Repository-semantic checks apply only when a repository target exists;
|
|
1095
|
+
// an arbitrary workspace has no bound session, default branch, or Work.
|
|
1096
|
+
if (repository && !explicitWorkId) assertNoBoundExecutionSessionMutation(controllerHome, repository, caller);
|
|
1097
|
+
// Git integration is a capability with its own repository, scope and
|
|
1098
|
+
// concurrency checks. A Work's semantic completion and any optional
|
|
1099
|
+
// verification/review evidence never admit or deny this operation.
|
|
1129
1100
|
const timeoutMs = typeof args.timeout_ms === 'number'
|
|
1130
1101
|
? args.timeout_ms
|
|
1131
1102
|
: typeof args.timeout_ms === 'string'
|
|
@@ -1155,7 +1126,7 @@ export async function callRepositoryTool(
|
|
|
1155
1126
|
const routeClass = classifyRepositoryCommandRoute(args.command as string | string[], {
|
|
1156
1127
|
forceDurable,
|
|
1157
1128
|
workId: executionIdentity.workId,
|
|
1158
|
-
defaultBranch:
|
|
1129
|
+
defaultBranch: commandTarget.defaultBranch,
|
|
1159
1130
|
timeoutMs,
|
|
1160
1131
|
});
|
|
1161
1132
|
const processRequestId = typeof args.request_id === 'string' ? args.request_id.trim() : '';
|
|
@@ -1168,7 +1139,7 @@ export async function callRepositoryTool(
|
|
|
1168
1139
|
);
|
|
1169
1140
|
}
|
|
1170
1141
|
let mutationAuthority: ReturnType<typeof ensureRepositoryMutationWorkHandle> | undefined;
|
|
1171
|
-
const mutationClassification = classifyRepositoryCommand(args.command as string | string[],
|
|
1142
|
+
const mutationClassification = classifyRepositoryCommand(args.command as string | string[], commandTarget.defaultBranch);
|
|
1172
1143
|
if (
|
|
1173
1144
|
(mutationClassification.risk === 'workspace_write' || mutationClassification.risk === 'destructive')
|
|
1174
1145
|
&& (routeClass.route === 'process_direct' || routeClass.route === 'process_managed')
|
|
@@ -1176,54 +1147,46 @@ export async function callRepositoryTool(
|
|
|
1176
1147
|
if (executionIdentity.workId) {
|
|
1177
1148
|
mutationAuthority = withControllerLock(
|
|
1178
1149
|
controllerHome,
|
|
1179
|
-
{ scope: 'repository', repoId:
|
|
1180
|
-
'mcp:
|
|
1150
|
+
{ scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
|
|
1151
|
+
'mcp:execute_command:mutation-authority',
|
|
1181
1152
|
() => ensureRepositoryMutationWorkHandle({
|
|
1182
1153
|
controllerHome,
|
|
1183
|
-
repository
|
|
1154
|
+
repository: repository!,
|
|
1184
1155
|
workId: executionIdentity.workId!,
|
|
1185
1156
|
principalId: caller?.principalId ?? '',
|
|
1157
|
+
sessionId: caller?.sessionId,
|
|
1186
1158
|
deferEffectPromotion: true,
|
|
1187
1159
|
}),
|
|
1188
1160
|
60_000,
|
|
1189
1161
|
);
|
|
1190
|
-
// Pre-mutation reconciliation may advance expectedHead.
|
|
1191
|
-
//
|
|
1192
|
-
|
|
1193
|
-
|
|
1162
|
+
// Pre-mutation reconciliation may advance expectedHead. Preserve the
|
|
1163
|
+
// complete WorkHandle identity after that CAS; rebuilding a generic
|
|
1164
|
+
// repository identity here drops branch/expectedHead and prevents the
|
|
1165
|
+
// successful command from settling its legitimate successor HEAD.
|
|
1166
|
+
executionIdentity = executionIdentityForWork(repository!, mutationAuthority.handle);
|
|
1194
1167
|
} else {
|
|
1195
1168
|
withControllerLock(
|
|
1196
1169
|
controllerHome,
|
|
1197
|
-
{ scope: 'repository', repoId:
|
|
1198
|
-
'mcp:
|
|
1170
|
+
{ scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
|
|
1171
|
+
'mcp:execute_command:unattributed-mutation-authority',
|
|
1199
1172
|
() => assertCanonicalRepositoryMutationWorkHandleAvailable({
|
|
1200
1173
|
controllerHome,
|
|
1201
|
-
repositoryId:
|
|
1202
|
-
checkoutId:
|
|
1174
|
+
repositoryId: commandExecutionScopeKey(commandTarget),
|
|
1175
|
+
checkoutId: commandTarget.activeCheckoutId ?? '',
|
|
1203
1176
|
}),
|
|
1204
1177
|
60_000,
|
|
1205
1178
|
);
|
|
1206
1179
|
}
|
|
1207
1180
|
}
|
|
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.
|
|
1181
|
+
// Compatibility boundary only: this facade owns repository-domain
|
|
1182
|
+
// context (target resolution, Git/source mutation fencing and legacy
|
|
1183
|
+
// response translation), while Unified Process Runtime owns execution,
|
|
1184
|
+
// handles, cancellation and persistence. Do not create another generic
|
|
1185
|
+
// command executor here. Thin Harness is consulted only for an explicit
|
|
1186
|
+
// external durable boundary, not as a second command classifier.
|
|
1224
1187
|
const routingDecision = forceDurable
|
|
1225
1188
|
? routeExecution({
|
|
1226
|
-
operation: '
|
|
1189
|
+
operation: 'execute_command',
|
|
1227
1190
|
mode: 'durable',
|
|
1228
1191
|
timeoutMs,
|
|
1229
1192
|
background: args.background === true || args.async === true,
|
|
@@ -1255,8 +1218,7 @@ export async function callRepositoryTool(
|
|
|
1255
1218
|
path: routeClass.reason,
|
|
1256
1219
|
route: 'reject',
|
|
1257
1220
|
status: 'rejected',
|
|
1258
|
-
|
|
1259
|
-
checkoutId: repository.activeCheckoutId,
|
|
1221
|
+
...scopeFields,
|
|
1260
1222
|
workspace: target.workspace,
|
|
1261
1223
|
message: routeClass.reason === 'standalone_recovery_lifecycle_required'
|
|
1262
1224
|
? '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 +1239,7 @@ export async function callRepositoryTool(
|
|
|
1277
1239
|
accepted: false,
|
|
1278
1240
|
mode: 'durable',
|
|
1279
1241
|
path: 'ephemeral_workspace_promotion_required',
|
|
1280
|
-
|
|
1281
|
-
checkoutId: repository.activeCheckoutId,
|
|
1242
|
+
...scopeFields,
|
|
1282
1243
|
workspace: target.workspace,
|
|
1283
1244
|
message: 'Ephemeral workspaces must be registered before durable remote effects so Process identity and reconciliation have a stable repository authority.',
|
|
1284
1245
|
suggestedOperation: 'repository_register',
|
|
@@ -1287,7 +1248,7 @@ export async function callRepositoryTool(
|
|
|
1287
1248
|
if (routeClass.route === 'process_direct' || routeClass.route === 'process_managed' || routeClass.route === 'durable') {
|
|
1288
1249
|
const processResult = await executeRepositoryCommandViaProcessRuntime({
|
|
1289
1250
|
controllerHome,
|
|
1290
|
-
repository,
|
|
1251
|
+
repository: commandTarget,
|
|
1291
1252
|
command: args.command as string | string[],
|
|
1292
1253
|
cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
|
|
1293
1254
|
timeoutMs,
|
|
@@ -1300,19 +1261,19 @@ export async function callRepositoryTool(
|
|
|
1300
1261
|
workId: executionIdentity.workId,
|
|
1301
1262
|
executionIdentity,
|
|
1302
1263
|
allowNonGitWorkspace: target.workspace !== undefined,
|
|
1264
|
+
principalId: caller?.principalId ?? undefined,
|
|
1303
1265
|
});
|
|
1304
|
-
if (mutationAuthority && (processResult.route === 'process_direct' || processResult.route === 'process_managed')) {
|
|
1266
|
+
if (repository && mutationAuthority && (processResult.route === 'process_direct' || processResult.route === 'process_managed')) {
|
|
1305
1267
|
const processHandle = processResult.process;
|
|
1306
1268
|
const postStatus = repositoryGitStatus(repository);
|
|
1307
1269
|
const expectedHead = mutationAuthority.handle.expectedHead;
|
|
1308
|
-
const mutationObserved =
|
|
1309
|
-
|| !postStatus.clean
|
|
1270
|
+
const mutationObserved = !postStatus.clean
|
|
1310
1271
|
|| (Boolean(postStatus.head) && postStatus.head !== expectedHead);
|
|
1311
1272
|
if (mutationObserved) {
|
|
1312
1273
|
withControllerLock(
|
|
1313
1274
|
controllerHome,
|
|
1314
|
-
{ scope: 'repository', repoId:
|
|
1315
|
-
'mcp:
|
|
1275
|
+
{ scope: 'repository', repoId: commandExecutionScopeKey(commandTarget) },
|
|
1276
|
+
'mcp:execute_command:mutation-started',
|
|
1316
1277
|
() => markRepositoryMutationStarted({
|
|
1317
1278
|
controllerHome,
|
|
1318
1279
|
repository,
|
|
@@ -1342,8 +1303,7 @@ export async function callRepositoryTool(
|
|
|
1342
1303
|
mode: processResult.route,
|
|
1343
1304
|
path: processResult.reason ?? routeClass.reason,
|
|
1344
1305
|
route: processResult.route,
|
|
1345
|
-
|
|
1346
|
-
checkoutId: repository.activeCheckoutId,
|
|
1306
|
+
...scopeFields,
|
|
1347
1307
|
workspace: target.workspace,
|
|
1348
1308
|
status: processResult.executionStatus,
|
|
1349
1309
|
policyDecision: processResult.policyDecision ?? 'approval_required',
|
|
@@ -1352,7 +1312,7 @@ export async function callRepositoryTool(
|
|
|
1352
1312
|
message: authorization.decision === 'user_confirmation_required'
|
|
1353
1313
|
? authorization.humanSummary
|
|
1354
1314
|
: authorization.reason,
|
|
1355
|
-
suggestedOperation: '
|
|
1315
|
+
suggestedOperation: 'execute_command(dry_run=true)',
|
|
1356
1316
|
});
|
|
1357
1317
|
}
|
|
1358
1318
|
const completed = directWithoutHandle || handle?.completed === true;
|
|
@@ -1370,8 +1330,7 @@ export async function callRepositoryTool(
|
|
|
1370
1330
|
route: processResult.route,
|
|
1371
1331
|
reasons: [processResult.reason ?? routeClass.reason, ...routingDecision.reasons],
|
|
1372
1332
|
decision: detailLevel === 'detail' ? routingDecision : undefined,
|
|
1373
|
-
|
|
1374
|
-
checkoutId: repository.activeCheckoutId,
|
|
1333
|
+
...scopeFields,
|
|
1375
1334
|
workspace: target.workspace,
|
|
1376
1335
|
historicalWorkContext,
|
|
1377
1336
|
processId: handle?.processId,
|
|
@@ -1382,7 +1341,6 @@ export async function callRepositoryTool(
|
|
|
1382
1341
|
stdout: processResult.stdout,
|
|
1383
1342
|
stderr: processResult.stderr,
|
|
1384
1343
|
durableSideEffects: processResult.durableSideEffects,
|
|
1385
|
-
guidance: explorationGuidance,
|
|
1386
1344
|
next: directWithoutHandle
|
|
1387
1345
|
? processResult.reason === 'readonly_fast_path'
|
|
1388
1346
|
? 'Bounded readonly execution completed without Process record / Lease / Local Job / ExecutionJob / Worker.'
|
|
@@ -1424,7 +1382,7 @@ export async function callRepositoryTool(
|
|
|
1424
1382
|
// Process Runtime is authoritative. Falling through could spawn the
|
|
1425
1383
|
// same command again through the legacy Fast/Local Job path.
|
|
1426
1384
|
if (process.env.FORGE_DEBUG_PROCESS_RUNTIME === '1') {
|
|
1427
|
-
console.error('[
|
|
1385
|
+
console.error('[execute_command] process runtime error', error);
|
|
1428
1386
|
}
|
|
1429
1387
|
return failure(error);
|
|
1430
1388
|
}
|
|
@@ -1434,8 +1392,7 @@ export async function callRepositoryTool(
|
|
|
1434
1392
|
accepted: false,
|
|
1435
1393
|
mode: 'durable',
|
|
1436
1394
|
path: 'ephemeral_workspace_promotion_required',
|
|
1437
|
-
|
|
1438
|
-
checkoutId: repository.activeCheckoutId,
|
|
1395
|
+
...scopeFields,
|
|
1439
1396
|
workspace: target.workspace,
|
|
1440
1397
|
message: 'Ephemeral workspaces support bounded local Direct/Managed execution only. Register the directory before durable, remote, release, or resumable Work.',
|
|
1441
1398
|
suggestedOperation: 'repository_register',
|
|
@@ -1449,13 +1406,13 @@ export async function callRepositoryTool(
|
|
|
1449
1406
|
try {
|
|
1450
1407
|
const routeClass = classifyRepositoryCommandRoute(args.command as string | string[], {
|
|
1451
1408
|
forceDurable: false,
|
|
1452
|
-
defaultBranch:
|
|
1409
|
+
defaultBranch: commandTarget.defaultBranch,
|
|
1453
1410
|
timeoutMs,
|
|
1454
1411
|
});
|
|
1455
1412
|
if (routeClass.route === 'process_direct') {
|
|
1456
1413
|
const processResult = await executeRepositoryCommandViaProcessRuntime({
|
|
1457
1414
|
controllerHome,
|
|
1458
|
-
repository,
|
|
1415
|
+
repository: commandTarget,
|
|
1459
1416
|
command: args.command as string | string[],
|
|
1460
1417
|
cwd: typeof args.cwd === 'string' ? args.cwd : undefined,
|
|
1461
1418
|
timeoutMs,
|
|
@@ -1463,6 +1420,7 @@ export async function callRepositoryTool(
|
|
|
1463
1420
|
requestId: typeof args.request_id === 'string' ? args.request_id : undefined,
|
|
1464
1421
|
workId: executionIdentity.workId,
|
|
1465
1422
|
executionIdentity,
|
|
1423
|
+
principalId: caller?.principalId ?? undefined,
|
|
1466
1424
|
});
|
|
1467
1425
|
if (processResult.route === 'process_direct') {
|
|
1468
1426
|
const execRecord = processResult.process as unknown as Record<string, unknown> | undefined;
|
|
@@ -1476,8 +1434,7 @@ export async function callRepositoryTool(
|
|
|
1476
1434
|
mode: 'durable',
|
|
1477
1435
|
reasons: ['durable_worker_inline_process_direct', routeClass.reason, ...routingDecision.reasons],
|
|
1478
1436
|
}),
|
|
1479
|
-
|
|
1480
|
-
checkoutId: repository.activeCheckoutId,
|
|
1437
|
+
...scopeFields,
|
|
1481
1438
|
ok,
|
|
1482
1439
|
processId: typeof execRecord?.processId === 'string' ? execRecord.processId : undefined,
|
|
1483
1440
|
status: typeof execRecord?.status === 'string' ? execRecord.status : undefined,
|
|
@@ -1495,7 +1452,7 @@ export async function callRepositoryTool(
|
|
|
1495
1452
|
}
|
|
1496
1453
|
} catch (error) {
|
|
1497
1454
|
if (process.env.FORGE_DEBUG_PROCESS_RUNTIME === '1') {
|
|
1498
|
-
console.error('[
|
|
1455
|
+
console.error('[execute_command] durable worker inline process runtime error', error);
|
|
1499
1456
|
}
|
|
1500
1457
|
}
|
|
1501
1458
|
}
|
|
@@ -1505,7 +1462,7 @@ export async function callRepositoryTool(
|
|
|
1505
1462
|
path: 'external_controller_required',
|
|
1506
1463
|
routing: compactRoutingSummary({ path: 'durable', mode: 'durable', reasons: [routingDecision.reasons.join(','), 'local_bridge_execution_retired'] }),
|
|
1507
1464
|
message: 'This command requires explicit external Controller handling; Local Bridge Jobs are retired for repository commands.',
|
|
1508
|
-
|
|
1465
|
+
next: 'This execution boundary requires separate external authority; the model chooses an authorized domain capability or alternative command based on the task.',
|
|
1509
1466
|
externalEffect: {
|
|
1510
1467
|
outcome: 'not_started',
|
|
1511
1468
|
ambiguousFailureOutcome: 'outcome_unknown',
|
|
@@ -1544,8 +1501,8 @@ export async function callRepositoryTool(
|
|
|
1544
1501
|
const batch = await executeRepositoryBatch(
|
|
1545
1502
|
{ controllerHome, repository },
|
|
1546
1503
|
{
|
|
1547
|
-
|
|
1548
|
-
|
|
1504
|
+
repoId: repository.repoId,
|
|
1505
|
+
checkoutId: repository.activeCheckoutId,
|
|
1549
1506
|
mode: args.mode === 'fast' || args.mode === 'durable' || args.mode === 'auto' ? args.mode : 'auto',
|
|
1550
1507
|
steps,
|
|
1551
1508
|
stopOnError: args.stop_on_error !== false,
|
|
@@ -1569,8 +1526,8 @@ export async function callRepositoryTool(
|
|
|
1569
1526
|
const lanes = await executeLightweightLanes(
|
|
1570
1527
|
{ controllerHome, repository },
|
|
1571
1528
|
{
|
|
1572
|
-
|
|
1573
|
-
|
|
1529
|
+
repoId: repository.repoId,
|
|
1530
|
+
checkoutId: repository.activeCheckoutId,
|
|
1574
1531
|
readLanes: Array.isArray(args.read_lanes)
|
|
1575
1532
|
? args.read_lanes
|
|
1576
1533
|
.filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null)
|