@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
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import type { McpToolDefinition } from '../../../packages/protocols/mcp/tool-contract';
|
|
3
|
+
import type { ExecutionTimeoutPolicy } from '../../../src/runtime/execution/jobs/types';
|
|
4
|
+
import { classifyRepositoryCommand } from '../../../src/cli/repositories/command-classifier';
|
|
5
|
+
import { isFastEligibleTool, routeExecution, type ExecutionDecision } from '../../../src/runtime/execution/thin-harness';
|
|
6
|
+
import { classifyRepositoryCommandRoute } from '../../../src/runtime/execution/process-runtime';
|
|
7
|
+
import { isProcessIsolatedReadDiagnostic } from '../../../src/runtime/diagnostics/process-facade';
|
|
8
|
+
|
|
9
|
+
/** Pure deterministic MCP Gateway placement policy. No execution or lifecycle mutation belongs here. */
|
|
10
|
+
const DIRECT_REPOSITORY_TOOLS = new Set(['repository_list', 'repository_get', 'repository_workbench', 'repository_command_preview']);
|
|
11
|
+
const DIRECT_CONTROL_WRITE_TOOLS = new Set([
|
|
12
|
+
'runtime_maintenance_apply',
|
|
13
|
+
// Protected credential preparation and physical input own their authorization boundary.
|
|
14
|
+
// Neither may be promoted into Process/ExecutionJob persistence or replay.
|
|
15
|
+
'computer_console_unlock_prepare',
|
|
16
|
+
'computer_console_unlock',
|
|
17
|
+
'computer_console_unlock_enroll',
|
|
18
|
+
'computer_console_unlock_status',
|
|
19
|
+
'computer_console_unlock_recover',
|
|
20
|
+
'computer_console_unlock_revoke',
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
const THIN_ROUTED_TOOLS = new Set([
|
|
24
|
+
'repository_command_execute',
|
|
25
|
+
'repository_safe_patch_apply',
|
|
26
|
+
'repository_safe_patch_plan',
|
|
27
|
+
'capability_execute',
|
|
28
|
+
'repository_git_status',
|
|
29
|
+
'repository_git_diff',
|
|
30
|
+
'repository_git_commit',
|
|
31
|
+
'git_stage_paths',
|
|
32
|
+
'git_commit_paths',
|
|
33
|
+
'git_diff_paths',
|
|
34
|
+
'apply_patch',
|
|
35
|
+
'apply_edit_operations',
|
|
36
|
+
'search_repository',
|
|
37
|
+
'read_file_range',
|
|
38
|
+
'read_repository_file',
|
|
39
|
+
// Checks and edit verification use Process Runtime unless multi-phase/release requires Durable.
|
|
40
|
+
'run_check',
|
|
41
|
+
'verify_edit_session',
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
/** Blocking native host tools must never execute on the public MCP event loop. */
|
|
45
|
+
const GATEWAY_ISOLATED_TOOLS = new Set([
|
|
46
|
+
// Native Apple tooling uses synchronous xcodebuild/simctl subprocesses.
|
|
47
|
+
'ios_review_packet', 'ios_xcode_status', 'ios_simulators_list', 'ios_project_discover',
|
|
48
|
+
'ios_schemes_list', 'ios_simulator_boot', 'ios_app_build', 'ios_app_install',
|
|
49
|
+
'ios_app_launch', 'ios_simulator_screenshot', 'ios_simulator_log_tail', 'ios_ui_smoke_test',
|
|
50
|
+
// Diagnostics and maintenance perform process-table and recursive filesystem scans.
|
|
51
|
+
'workflow_watchdog_report', 'runtime_cleanup_preview', 'runtime_cleanup_apply',
|
|
52
|
+
'runtime_maintenance_status', 'runtime_maintenance_apply',
|
|
53
|
+
// Release and recovery operations may spawn Git/process checks or restart managed children.
|
|
54
|
+
'release_gate', 'runtime_recovery', 'capability_recovery',
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
export function isGatewayIsolatedTool(name: string): boolean {
|
|
58
|
+
return GATEWAY_ISOLATED_TOOLS.has(name);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Tools that own their execution boundary and must never fall through to
|
|
63
|
+
* retired generic ExecutionJob creation. Legacy iOS atomics are compatibility
|
|
64
|
+
* adapters over the typed iOS plugin authority.
|
|
65
|
+
*/
|
|
66
|
+
const SELF_MANAGED_DURABLE_TOOLS = new Set([
|
|
67
|
+
'plugin_action_execute',
|
|
68
|
+
'ios_xcode_status', 'ios_simulators_list', 'ios_project_discover', 'ios_schemes_list',
|
|
69
|
+
'ios_simulator_boot', 'ios_app_build', 'ios_app_install', 'ios_app_launch',
|
|
70
|
+
'ios_simulator_screenshot', 'ios_simulator_log_tail', 'ios_ui_smoke_test',
|
|
71
|
+
]);
|
|
72
|
+
|
|
73
|
+
export function isSelfManagedDurableTool(name: string): boolean {
|
|
74
|
+
return SELF_MANAGED_DURABLE_TOOLS.has(name);
|
|
75
|
+
}
|
|
76
|
+
/** High-frequency bounded reads execute in the current MCP request. */
|
|
77
|
+
const DIRECT_HOT_READ_TOOLS = new Set([
|
|
78
|
+
'get_task_run', 'get_task_run_events', 'get_task_run_log',
|
|
79
|
+
'get_job', 'list_jobs',
|
|
80
|
+
'work_status_digest', 'work_result_summary',
|
|
81
|
+
'controller_ready', 'repository_runtime_snapshot',
|
|
82
|
+
'rh_status', 'rh_context', 'rh_inbox',
|
|
83
|
+
'repository_git_status', 'repository_git_diff', 'git_diff_paths',
|
|
84
|
+
]);
|
|
85
|
+
|
|
86
|
+
export function isDirectHotReadTool(name: string): boolean {
|
|
87
|
+
return DIRECT_HOT_READ_TOOLS.has(name);
|
|
88
|
+
}
|
|
89
|
+
/** Small interactive development writes: run synchronously by default so ChatGPT/GUI get immediate results. */
|
|
90
|
+
const INTERACTIVE_SYNC_WRITE_TOOLS = new Set([
|
|
91
|
+
'repository_safe_patch_apply',
|
|
92
|
+
'capability_execute',
|
|
93
|
+
'repository_git_create_branch',
|
|
94
|
+
'repository_git_switch_branch',
|
|
95
|
+
'repository_git_merge_branch',
|
|
96
|
+
'repository_git_delete_branch',
|
|
97
|
+
'repository_git_commit',
|
|
98
|
+
'repository_git_finish_workflow',
|
|
99
|
+
'begin_edit_session',
|
|
100
|
+
'apply_patch',
|
|
101
|
+
'apply_edit_operations',
|
|
102
|
+
'create_edit_savepoint',
|
|
103
|
+
'git_stage_paths',
|
|
104
|
+
'git_commit_paths',
|
|
105
|
+
// Recovery writes against an existing Run must remain available while legacy
|
|
106
|
+
// Runs are the very thing preventing runtime-storage relocation. These tools
|
|
107
|
+
// do not create new execution ownership or dispatch new work.
|
|
108
|
+
'finish_task_run',
|
|
109
|
+
'cancel_task_run',
|
|
110
|
+
]);
|
|
111
|
+
const AGENT_DELEGATION_TOOLS = new Set([
|
|
112
|
+
'dispatch_task',
|
|
113
|
+
'launch_issue',
|
|
114
|
+
'dispatch_ready_tasks',
|
|
115
|
+
'retry_task_run',
|
|
116
|
+
'quick_agent_session',
|
|
117
|
+
]);
|
|
118
|
+
const EXPLICIT_EXTERNAL_CONTROLLER_TOOLS = new Set([
|
|
119
|
+
'publish_issue_to_github',
|
|
120
|
+
'close_github_issue',
|
|
121
|
+
'request_release_gate',
|
|
122
|
+
]);
|
|
123
|
+
|
|
124
|
+
const GATEWAY_ROUTE_BEHAVIOR_PROBES: ReadonlyArray<{
|
|
125
|
+
id: string;
|
|
126
|
+
operation: string;
|
|
127
|
+
args: Record<string, unknown>;
|
|
128
|
+
}> = [
|
|
129
|
+
{ id: 'hot-read', operation: 'controller_ready', args: {} },
|
|
130
|
+
{ id: 'isolated-read-diagnostic', operation: 'workflow_watchdog_report', args: {} },
|
|
131
|
+
{ id: 'readonly-command', operation: 'repository_command_execute', args: { command: ['git', 'status', '--short'] } },
|
|
132
|
+
{ id: 'managed-local-command', operation: 'repository_command_execute', args: { command: ['bun', 'run', 'check:type'], timeout_ms: 120_000 } },
|
|
133
|
+
{ id: 'focused-check', operation: 'run_check', args: { check_id: 'package:check:type' } },
|
|
134
|
+
{ id: 'release-check', operation: 'run_check', args: { check_id: 'package:check:release' } },
|
|
135
|
+
{ id: 'interactive-write', operation: 'repository_safe_patch_apply', args: { operations: [] } },
|
|
136
|
+
{ id: 'external-controller', operation: 'request_release_gate', args: {} },
|
|
137
|
+
{ id: 'unknown-tool', operation: '__route_behavior_probe_unknown__', args: {} },
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
export interface GatewayRouteBehaviorSnapshot {
|
|
141
|
+
schemaVersion: 1;
|
|
142
|
+
fingerprint: string;
|
|
143
|
+
probeCount: number;
|
|
144
|
+
probes: Array<{
|
|
145
|
+
id: string;
|
|
146
|
+
operation: string;
|
|
147
|
+
path: 'direct' | 'fast' | 'durable' | 'reject';
|
|
148
|
+
reasons: string[];
|
|
149
|
+
decision?: {
|
|
150
|
+
mode: string;
|
|
151
|
+
risk: string;
|
|
152
|
+
estimatedClass: string;
|
|
153
|
+
requiresIsolation: boolean;
|
|
154
|
+
requiresRecovery: boolean;
|
|
155
|
+
effects: Record<string, boolean>;
|
|
156
|
+
};
|
|
157
|
+
}>;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Fingerprint the real Gateway classifier over a fixed, bounded behavior matrix.
|
|
162
|
+
* This is deliberately distinct from the MCP schema/tool-surface fingerprint.
|
|
163
|
+
*/
|
|
164
|
+
export function gatewayRouteBehaviorSnapshot(): GatewayRouteBehaviorSnapshot {
|
|
165
|
+
const probes = GATEWAY_ROUTE_BEHAVIOR_PROBES.map((probe) => {
|
|
166
|
+
const classification = classifyGatewayExecutionPath(probe.operation, probe.args);
|
|
167
|
+
return {
|
|
168
|
+
id: probe.id,
|
|
169
|
+
operation: probe.operation,
|
|
170
|
+
path: classification.path,
|
|
171
|
+
reasons: [...classification.reasons],
|
|
172
|
+
...(classification.decision ? {
|
|
173
|
+
decision: {
|
|
174
|
+
mode: classification.decision.mode,
|
|
175
|
+
risk: classification.decision.risk,
|
|
176
|
+
estimatedClass: classification.decision.estimatedClass,
|
|
177
|
+
requiresIsolation: classification.decision.requiresIsolation,
|
|
178
|
+
requiresRecovery: classification.decision.requiresRecovery,
|
|
179
|
+
effects: { ...classification.decision.effects },
|
|
180
|
+
},
|
|
181
|
+
} : {}),
|
|
182
|
+
};
|
|
183
|
+
});
|
|
184
|
+
return {
|
|
185
|
+
schemaVersion: 1,
|
|
186
|
+
fingerprint: createHash('sha256').update(JSON.stringify(probes)).digest('hex'),
|
|
187
|
+
probeCount: probes.length,
|
|
188
|
+
probes,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const MAX_DURABLE_TIMEOUT_MS = 24 * 60 * 60_000;
|
|
192
|
+
|
|
193
|
+
function durableTimeoutMs(value: unknown, fallback: number): number {
|
|
194
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) return fallback;
|
|
195
|
+
return Math.max(1_000, Math.min(Math.trunc(value), MAX_DURABLE_TIMEOUT_MS));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function wantsAsyncExecution(args: Record<string, unknown>): boolean {
|
|
199
|
+
return args.apply_mode === 'async'
|
|
200
|
+
|| args.mode === 'async'
|
|
201
|
+
|| args.mode === 'durable'
|
|
202
|
+
|| args.async === true
|
|
203
|
+
|| args.background === true;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Release checks cross the external Controller boundary when explicitly
|
|
207
|
+
* requested asynchronously; ordinary checks remain Process-Runtime local. */
|
|
208
|
+
function isReleaseCheckId(value: unknown): boolean {
|
|
209
|
+
const id = typeof value === 'string' ? value.trim().toLowerCase() : '';
|
|
210
|
+
return id === 'check:release' || id === 'package:check:release';
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function runsAsInteractiveSyncWrite(
|
|
214
|
+
name: string,
|
|
215
|
+
args: Record<string, unknown> = {},
|
|
216
|
+
): boolean {
|
|
217
|
+
return INTERACTIVE_SYNC_WRITE_TOOLS.has(name) && !wantsAsyncExecution(args);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export function wantsWaitForResult(args: Record<string, unknown>): boolean {
|
|
221
|
+
return args.wait === true
|
|
222
|
+
|| args.await_result === true
|
|
223
|
+
|| args.wait_for_result === true;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function waitTimeoutMs(args: Record<string, unknown>): number {
|
|
227
|
+
const explicitInteractiveWait = args.interactive_wait_ms ?? args.wait_ms;
|
|
228
|
+
if (typeof explicitInteractiveWait === 'number' && Number.isFinite(explicitInteractiveWait)) {
|
|
229
|
+
return Math.max(200, Math.min(Math.trunc(explicitInteractiveWait), 120_000));
|
|
230
|
+
}
|
|
231
|
+
if (typeof args.timeout_ms === 'number' && Number.isFinite(args.timeout_ms) && wantsWaitForResult(args)) {
|
|
232
|
+
return Math.max(200, Math.min(Math.trunc(args.timeout_ms), 120_000));
|
|
233
|
+
}
|
|
234
|
+
return 15_000;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export function operationExecutionTimeoutMsForMcpCall(
|
|
238
|
+
name: string,
|
|
239
|
+
args: Record<string, unknown>,
|
|
240
|
+
): number {
|
|
241
|
+
const requested = args.execution_timeout_ms ?? args.timeout_ms;
|
|
242
|
+
return durableTimeoutMs(requested, AGENT_DELEGATION_TOOLS.has(name) ? 60 * 60_000 : 15 * 60_000);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Build independent budgets for the durable Parent Job. Agent delegation keeps
|
|
247
|
+
* the caller's operation execution budget on the Child Run; the Parent only
|
|
248
|
+
* receives enough execution time to create and durably associate that child.
|
|
249
|
+
*/
|
|
250
|
+
export function executionTimeoutPolicyForMcpCall(
|
|
251
|
+
name: string,
|
|
252
|
+
args: Record<string, unknown>,
|
|
253
|
+
): ExecutionTimeoutPolicy {
|
|
254
|
+
const operationExecutionMs = operationExecutionTimeoutMsForMcpCall(name, args);
|
|
255
|
+
const agentDelegation = AGENT_DELEGATION_TOOLS.has(name);
|
|
256
|
+
return {
|
|
257
|
+
admissionTimeoutMs: durableTimeoutMs(
|
|
258
|
+
args.admission_timeout_ms,
|
|
259
|
+
agentDelegation ? 5 * 60_000 : operationExecutionMs,
|
|
260
|
+
),
|
|
261
|
+
queueTimeoutMs: durableTimeoutMs(
|
|
262
|
+
args.queue_timeout_ms,
|
|
263
|
+
agentDelegation ? MAX_DURABLE_TIMEOUT_MS : operationExecutionMs,
|
|
264
|
+
),
|
|
265
|
+
executionTimeoutMs: agentDelegation ? 120_000 : operationExecutionMs,
|
|
266
|
+
interactiveWaitMs: waitTimeoutMs(args),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export function classifyGatewayExecutionPath(
|
|
271
|
+
name: string,
|
|
272
|
+
args: Record<string, unknown> = {},
|
|
273
|
+
opts: { allowReadOnly?: boolean; forceDurable?: boolean; definition?: McpToolDefinition } = {},
|
|
274
|
+
): {
|
|
275
|
+
path: 'direct' | 'fast' | 'durable' | 'reject';
|
|
276
|
+
reasons: string[];
|
|
277
|
+
decision?: ExecutionDecision;
|
|
278
|
+
} {
|
|
279
|
+
// Heavy read-only diagnostics must leave the Gateway event loop before the
|
|
280
|
+
// generic read-only shortcut. Process Runtime preserves the same request and
|
|
281
|
+
// returns either the completed JSON or a queryable process handle.
|
|
282
|
+
if (isProcessIsolatedReadDiagnostic(name)) {
|
|
283
|
+
return { path: 'fast', reasons: ['isolated_read_diagnostic_process'] };
|
|
284
|
+
}
|
|
285
|
+
// Registered bounded reads execute through their real handler.
|
|
286
|
+
if (opts.definition?.annotations?.readOnlyHint === true) {
|
|
287
|
+
return { path: 'direct', reasons: ['registered_readonly_tool'] };
|
|
288
|
+
}
|
|
289
|
+
if (name.startsWith('repository_') && DIRECT_REPOSITORY_TOOLS.has(name)) {
|
|
290
|
+
return { path: 'direct', reasons: ['direct_repository_tool'] };
|
|
291
|
+
}
|
|
292
|
+
if (isDirectHotReadTool(name)) {
|
|
293
|
+
return { path: 'direct', reasons: ['direct_hot_read'] };
|
|
294
|
+
}
|
|
295
|
+
if (runsAsInteractiveSyncWrite(name, args)) {
|
|
296
|
+
return { path: 'direct', reasons: ['interactive_sync_write'] };
|
|
297
|
+
}
|
|
298
|
+
if (isSelfManagedDurableTool(name)) {
|
|
299
|
+
return { path: 'direct', reasons: ['self_managed_durable_boundary'] };
|
|
300
|
+
}
|
|
301
|
+
if (DIRECT_CONTROL_WRITE_TOOLS.has(name) && !wantsAsyncExecution(args)) {
|
|
302
|
+
return { path: 'direct', reasons: ['bounded_direct_control_write'] };
|
|
303
|
+
}
|
|
304
|
+
if (EXPLICIT_EXTERNAL_CONTROLLER_TOOLS.has(name)) {
|
|
305
|
+
return { path: 'durable', reasons: ['explicit_external_controller_boundary'] };
|
|
306
|
+
}
|
|
307
|
+
if (opts.forceDurable === true || isGatewayIsolatedTool(name)) {
|
|
308
|
+
return {
|
|
309
|
+
path: 'durable',
|
|
310
|
+
reasons: opts.forceDurable ? ['force_durable'] : ['gateway_isolated_tool'],
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
const selfManagedProcessAsync = (
|
|
314
|
+
name === 'repository_command_execute'
|
|
315
|
+
|| name === 'run_check'
|
|
316
|
+
|| name === 'verify_edit_session'
|
|
317
|
+
) && (
|
|
318
|
+
args.apply_mode === 'async'
|
|
319
|
+
|| args.mode === 'async'
|
|
320
|
+
|| args.async === true
|
|
321
|
+
|| args.background === true
|
|
322
|
+
) && !(name === 'run_check' && isReleaseCheckId(args.check_id ?? args.checkId));
|
|
323
|
+
// Async on Process-Runtime-owned tools means return the managed Process
|
|
324
|
+
// handle immediately. It must not promote local work into the retired
|
|
325
|
+
// ExecutionJob path. Explicit durable mode still crosses the external
|
|
326
|
+
// Controller boundary.
|
|
327
|
+
if (wantsAsyncExecution(args) && !selfManagedProcessAsync) {
|
|
328
|
+
return {
|
|
329
|
+
path: 'durable',
|
|
330
|
+
reasons: ['caller_requested_async_or_durable'],
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
// run_check: Process Runtime for ordinary checks; Durable only for release/multi-phase.
|
|
334
|
+
if (name === 'run_check') {
|
|
335
|
+
const checkId = String(args.check_id ?? args.checkId ?? '').trim();
|
|
336
|
+
const batchCheckIds = Array.isArray(args.check_ids)
|
|
337
|
+
? args.check_ids.map((value) => String(value).trim()).filter(Boolean)
|
|
338
|
+
: [];
|
|
339
|
+
if (args.mode === 'durable' || args.force_durable === true) {
|
|
340
|
+
return { path: 'durable', reasons: ['caller_requested_durable_check'] };
|
|
341
|
+
}
|
|
342
|
+
if (isReleaseCheckId(checkId) && batchCheckIds.length === 0) {
|
|
343
|
+
return { path: 'durable', reasons: ['release_check_requires_durable_boundary'] };
|
|
344
|
+
}
|
|
345
|
+
// Gateway owns transport placement, not Check lifecycle semantics. Until
|
|
346
|
+
// the registered ControllerCheck is resolved by the Check owner below,
|
|
347
|
+
// never infer Durable handling from a caller-provided id string.
|
|
348
|
+
// Route as "fast" so shouldCreateDurableJob returns false; actual execution
|
|
349
|
+
// uses Process Runtime (direct or managed handle) in routeDurableMcpCall / legacy handler.
|
|
350
|
+
return {
|
|
351
|
+
path: 'fast',
|
|
352
|
+
reasons: ['run_check_process_runtime'],
|
|
353
|
+
decision: {
|
|
354
|
+
mode: 'fast',
|
|
355
|
+
reasons: ['run_check_process_runtime'],
|
|
356
|
+
risk: 'workspace_write',
|
|
357
|
+
estimatedClass: 'short',
|
|
358
|
+
requiresIsolation: false,
|
|
359
|
+
requiresRecovery: false,
|
|
360
|
+
effects: {
|
|
361
|
+
readsWorkspace: true,
|
|
362
|
+
mutatesWorkspace: true,
|
|
363
|
+
mutatesGitRefs: false,
|
|
364
|
+
remoteWrite: false,
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// verify_edit_session is a Process Runtime orchestration surface. It may
|
|
371
|
+
// return a managed handle, but it must never be promoted to a retired
|
|
372
|
+
// ExecutionJob/LocalJob merely because the edit session has checks.
|
|
373
|
+
if (name === 'verify_edit_session') {
|
|
374
|
+
if (args.mode === 'durable' || args.force_durable === true) {
|
|
375
|
+
return { path: 'durable', reasons: ['caller_requested_durable_edit_verification'] };
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
path: 'fast',
|
|
379
|
+
reasons: ['verify_edit_session_process_runtime'],
|
|
380
|
+
decision: {
|
|
381
|
+
mode: 'fast',
|
|
382
|
+
reasons: ['verify_edit_session_process_runtime'],
|
|
383
|
+
risk: 'workspace_write',
|
|
384
|
+
estimatedClass: 'short',
|
|
385
|
+
requiresIsolation: false,
|
|
386
|
+
requiresRecovery: false,
|
|
387
|
+
effects: {
|
|
388
|
+
readsWorkspace: true,
|
|
389
|
+
mutatesWorkspace: true,
|
|
390
|
+
mutatesGitRefs: false,
|
|
391
|
+
remoteWrite: false,
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// repository_command_execute has one authoritative classifier. Process Runtime
|
|
398
|
+
// owns every local single-process command regardless of timeout. Async requests
|
|
399
|
+
// stay here and return a handle; explicit durable mode remains an external-
|
|
400
|
+
// Controller boundary.
|
|
401
|
+
if (name === 'repository_command_execute') {
|
|
402
|
+
const command = args.command;
|
|
403
|
+
if (!(typeof command === 'string' || Array.isArray(command))) {
|
|
404
|
+
return { path: 'reject', reasons: ['repository_command_missing'] };
|
|
405
|
+
}
|
|
406
|
+
const route = classifyRepositoryCommandRoute(command as string | string[], {
|
|
407
|
+
defaultBranch: typeof args.default_branch === 'string' ? args.default_branch : undefined,
|
|
408
|
+
timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : undefined,
|
|
409
|
+
});
|
|
410
|
+
if (route.route === 'process_direct' || route.route === 'process_managed') {
|
|
411
|
+
const commandClassification = classifyRepositoryCommand(
|
|
412
|
+
command as string | string[],
|
|
413
|
+
typeof args.default_branch === 'string' ? args.default_branch : undefined,
|
|
414
|
+
);
|
|
415
|
+
const risk = commandClassification.risk === 'readonly'
|
|
416
|
+
? 'readonly'
|
|
417
|
+
: commandClassification.risk === 'remote_write'
|
|
418
|
+
? 'remote_write'
|
|
419
|
+
: commandClassification.risk === 'destructive'
|
|
420
|
+
? 'destructive'
|
|
421
|
+
: 'workspace_write';
|
|
422
|
+
const reasons = ['repository_command_process_runtime', route.reason];
|
|
423
|
+
return {
|
|
424
|
+
path: 'fast',
|
|
425
|
+
reasons,
|
|
426
|
+
decision: {
|
|
427
|
+
mode: 'fast',
|
|
428
|
+
reasons,
|
|
429
|
+
risk,
|
|
430
|
+
estimatedClass: route.route === 'process_direct' ? 'short' : 'long',
|
|
431
|
+
requiresIsolation: false,
|
|
432
|
+
requiresRecovery: false,
|
|
433
|
+
effects: {
|
|
434
|
+
readsWorkspace: true,
|
|
435
|
+
mutatesWorkspace: risk !== 'readonly',
|
|
436
|
+
mutatesGitRefs: risk !== 'readonly' && /(?:^|\s)git\s+(?:commit|merge|branch|switch|checkout|reset|rebase|tag)\b/i.test(
|
|
437
|
+
Array.isArray(command) ? command.join(' ') : command,
|
|
438
|
+
),
|
|
439
|
+
remoteWrite: risk === 'remote_write',
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
if (route.route === 'reject') return { path: 'reject', reasons: [route.reason] };
|
|
445
|
+
return { path: 'durable', reasons: [route.reason] };
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (THIN_ROUTED_TOOLS.has(name)) {
|
|
449
|
+
const decision = routeExecution({
|
|
450
|
+
operation: name,
|
|
451
|
+
mode: args.mode === 'fast' ? 'fast' : 'auto',
|
|
452
|
+
background: args.background === true || args.apply_mode === 'async' || args.async === true,
|
|
453
|
+
requiresRecovery: args.requires_recovery === true,
|
|
454
|
+
requiresIsolation: args.isolation === 'new_worktree' || args.requires_isolation === true,
|
|
455
|
+
requiresWorktree: args.isolation === 'new_worktree',
|
|
456
|
+
agentRun: name === 'quick_agent_session' || name === 'dispatch_task',
|
|
457
|
+
remoteWrite: name.includes('push') || name === 'publish_issue_to_github',
|
|
458
|
+
timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : undefined,
|
|
459
|
+
command: args.command as string | string[] | undefined,
|
|
460
|
+
paths: Array.isArray(args.paths) ? args.paths.map(String) : undefined,
|
|
461
|
+
allowedPaths: Array.isArray(args.allowed_paths) ? args.allowed_paths.map(String) : undefined,
|
|
462
|
+
patchOperationCount: Array.isArray(args.operations) ? args.operations.length : undefined,
|
|
463
|
+
patchPaths: Array.isArray(args.operations)
|
|
464
|
+
? args.operations
|
|
465
|
+
.filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null)
|
|
466
|
+
.map((entry) => String(entry.path ?? '').trim())
|
|
467
|
+
.filter(Boolean)
|
|
468
|
+
: undefined,
|
|
469
|
+
});
|
|
470
|
+
if (decision.mode === 'fast') {
|
|
471
|
+
return {
|
|
472
|
+
path: 'fast',
|
|
473
|
+
reasons: decision.reasons,
|
|
474
|
+
decision,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
if (decision.mode === 'reject') {
|
|
478
|
+
return { path: 'reject', reasons: decision.reasons, decision };
|
|
479
|
+
}
|
|
480
|
+
// Keep isFastEligibleTool as a secondary guard for tools whose operation
|
|
481
|
+
// name maps to a Fast allowlist entry but routeExecution used a durable alias.
|
|
482
|
+
if (isFastEligibleTool(name, args)) {
|
|
483
|
+
return {
|
|
484
|
+
path: 'fast',
|
|
485
|
+
reasons: ['thin_router_fast_eligible'],
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
return {
|
|
489
|
+
path: 'durable',
|
|
490
|
+
reasons: decision.reasons.length > 0 ? decision.reasons : ['thin_router_requires_durable'],
|
|
491
|
+
decision,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
if (opts.definition) {
|
|
495
|
+
return { path: 'direct', reasons: ['registered_tool_direct_handler'] };
|
|
496
|
+
}
|
|
497
|
+
return { path: 'reject', reasons: ['tool_not_found'] };
|
|
498
|
+
}
|
|
499
|
+
|
|
@@ -5,7 +5,8 @@ import type { MultiRepositoryMcpToolContext } from '../multi-repository';
|
|
|
5
5
|
import { allControllerToolDefinitions, controllerExposureSnapshot, controllerToolSurfaceStatus } from '../toolset';
|
|
6
6
|
import { boundedPluginArtifactImageContent, jsonPreview, result, resultWithPluginArtifactImages } from './result-adapter';
|
|
7
7
|
import { expectedRevision, repositoryRootForRepoId, selected, stringList } from './shared-adapter';
|
|
8
|
-
import {
|
|
8
|
+
import { callStatusInboxAdapter, GIT_IDENTITY_SAMPLE_TTL_MS, summarizeInvalidActiveWorkCandidate, summarizeWorkListItem } from './status-inbox-adapter';
|
|
9
|
+
import { ageMs, controllerReadinessEvidence, localControllerDiagnosticMatchesRuntime, probeLocalControllerHealth, runtimeSourceSnapshotStatus, type ControllerReadinessSignals } from './runtime-readiness-observation';
|
|
9
10
|
import { listRepositories, repositorySummary, resolveRepositorySelection } from '../../../src/cli/repositories/registry';
|
|
10
11
|
import { repositoryControllerRoot } from '../../../src/cli/repositories/controller-home';
|
|
11
12
|
import { cancelExecutionJob, findExecutionJob, getExecutionJob, getExecutionJobByRequestId, listExecutionJobs } from '../../../src/runtime/execution/jobs/store';
|
|
@@ -26,15 +27,13 @@ import {
|
|
|
26
27
|
type GradedObservation,
|
|
27
28
|
} from '../../../src/runtime/health';
|
|
28
29
|
import { ensureRepositoryRuntimeStorage } from '../../../src/cli/repositories/runtime-storage';
|
|
29
|
-
import { assessWorkMode, parseExplicitTaskMode } from '../../../src/cli/controller/work-mode';
|
|
30
30
|
import { projectBoard } from '../../../src/cli/controller/issue-store';
|
|
31
31
|
import { buildControllerTaskLedgerProjection } from '../../../src/cli/controller/task-ledger';
|
|
32
|
-
import {
|
|
32
|
+
import { CONTROLLER_CONTEXT_IMPACT_DOMAINS, type ControllerContextImpactDomain } from '../../../src/cli/controller/context/types';
|
|
33
33
|
import { legacyIssueAuthorityRetired } from '../../../src/cli/controller/legacy-issue-cutover';
|
|
34
34
|
import { buildControllerOperationalPlan } from '../../../src/cli/controller/operational-plan';
|
|
35
35
|
import { listControllerChecks, readLatestControllerCheckEvidence } from '../../../src/cli/controller/check-runner';
|
|
36
36
|
import { listActiveAgentJobSnapshots } from '../../../src/cli/agent-jobs/job-manager';
|
|
37
|
-
import type { TaskRisk } from '../../../src/cli/controller/types';
|
|
38
37
|
import {
|
|
39
38
|
controllerContextPerformanceSnapshot,
|
|
40
39
|
controllerContextProjectionAgeMs,
|
|
@@ -191,30 +190,6 @@ function summarizeRuntimeProjectionForReadiness<T extends { currentAttention?: u
|
|
|
191
190
|
*/
|
|
192
191
|
|
|
193
192
|
|
|
194
|
-
function controllerContextAssessment(args: Record<string, unknown>) {
|
|
195
|
-
const description = typeof args.description === 'string' && args.description.trim()
|
|
196
|
-
? args.description
|
|
197
|
-
: 'Inspect the selected repository context.';
|
|
198
|
-
return assessWorkMode({
|
|
199
|
-
description,
|
|
200
|
-
knownPaths: stringList(args.known_paths),
|
|
201
|
-
expectedFiles: typeof args.expected_files === 'number' ? args.expected_files : undefined,
|
|
202
|
-
expectedChangedLines: typeof args.expected_changed_lines === 'number' ? args.expected_changed_lines : undefined,
|
|
203
|
-
requiresInvestigation: args.requires_investigation === true,
|
|
204
|
-
requiresParallelism: args.requires_parallelism === true,
|
|
205
|
-
requiresLongRunningChecks: args.requires_long_running_checks === true,
|
|
206
|
-
needsDependencies: args.needs_dependencies === true,
|
|
207
|
-
requiresIndependentDeliverables: args.requires_independent_deliverables === true,
|
|
208
|
-
independentTaskCount: typeof args.independent_task_count === 'number' ? args.independent_task_count : undefined,
|
|
209
|
-
requiresRemoteWrite: args.requires_remote_write === true || args.remote_write === true,
|
|
210
|
-
requiresRecovery: args.requires_recovery === true,
|
|
211
|
-
agentRequested: args.agent_requested === true || args.requires_worker === true,
|
|
212
|
-
requiresWorkerIsolation: args.requires_worker_isolation === true,
|
|
213
|
-
risk: typeof args.risk === 'string' ? args.risk as TaskRisk : undefined,
|
|
214
|
-
explicitMode: parseExplicitTaskMode(args.mode) ?? (typeof args.description === 'string' && args.description.trim() ? undefined : 'direct'),
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
|
|
218
193
|
function compactContextTask(value: unknown): Record<string, unknown> {
|
|
219
194
|
const task = contextRecord(value);
|
|
220
195
|
return {
|
|
@@ -247,7 +222,6 @@ function compactControllerContextSummaryPayload(payload: Record<string, unknown>
|
|
|
247
222
|
const activeRuns = Array.isArray(payload.activeRuns) ? payload.activeRuns : [];
|
|
248
223
|
const attention = Array.isArray(ledger.attention) ? ledger.attention : [];
|
|
249
224
|
const readyTasks = Array.isArray(ledger.readyTasks) ? ledger.readyTasks : [];
|
|
250
|
-
const recommendedExecution = contextRecord(payload.recommendedExecution);
|
|
251
225
|
const runtimeIdentity = contextRecord(payload.runtimeIdentity);
|
|
252
226
|
const runtime = contextRecord(payload.runtime);
|
|
253
227
|
const repoId = String(payload.repoId ?? repository.repoId ?? '');
|
|
@@ -317,8 +291,6 @@ function compactControllerContextSummaryPayload(payload: Record<string, unknown>
|
|
|
317
291
|
attention: attention.slice(0, 5).map(compactContextTask),
|
|
318
292
|
readyTasks: readyTasks.slice(0, 5).map(compactContextTask),
|
|
319
293
|
execution: {
|
|
320
|
-
recommendedMode: recommendedExecution.mode ?? recommendedExecution.recommendedMode ?? null,
|
|
321
|
-
executionPath: recommendedExecution.executionPath ?? recommendedExecution.path ?? null,
|
|
322
294
|
requiredChecks: recommendedCheckIds,
|
|
323
295
|
},
|
|
324
296
|
runtime: {
|
|
@@ -388,7 +360,6 @@ function compactControllerContextSummaryPayload(payload: Record<string, unknown>
|
|
|
388
360
|
const localBridge = contextRecord(payload.localBridge);
|
|
389
361
|
return { reconciliation: localBridge.reconciliation };
|
|
390
362
|
})(),
|
|
391
|
-
recommendedExecution: recommendedExecution,
|
|
392
363
|
...(payload.repository ? { repositorySummary: repository } : {}),
|
|
393
364
|
};
|
|
394
365
|
if (ready.health || ready.ready !== undefined) {
|
|
@@ -698,19 +669,6 @@ export async function callRuntimeObservationAdapter(ctx: MultiRepositoryMcpToolC
|
|
|
698
669
|
};
|
|
699
670
|
const repositoryStartedAt = performance.now();
|
|
700
671
|
const repository = selected(ctx, args);
|
|
701
|
-
const recommendedExecution = controllerContextAssessment(args);
|
|
702
|
-
const modeContextPack = recommendedExecution.modeBehavior.structuralContext === 'required'
|
|
703
|
-
? buildControllerContextPack(repository.canonicalRoot, ctx.policy, {
|
|
704
|
-
description: typeof args.description === 'string' ? args.description : undefined,
|
|
705
|
-
knownPaths: stringList(args.known_paths),
|
|
706
|
-
structuralContext: 'required',
|
|
707
|
-
maxFiles: 8,
|
|
708
|
-
maxSnippets: 20,
|
|
709
|
-
session: ctx.sessionId?.trim()
|
|
710
|
-
? { sessionId: ctx.sessionId.trim(), repoId: repository.repoId, checkoutId: repository.activeCheckoutId }
|
|
711
|
-
: undefined,
|
|
712
|
-
})
|
|
713
|
-
: undefined;
|
|
714
672
|
markPhase('repositoryRouting', repositoryStartedAt);
|
|
715
673
|
const variant = args.detail_level === 'detail' ? 'detail' as const : 'summary' as const;
|
|
716
674
|
const runtimeRoot = repositoryControllerRoot(ctx.controllerHome, repository.repoId);
|
|
@@ -816,19 +774,11 @@ export async function callRuntimeObservationAdapter(ctx: MultiRepositoryMcpToolC
|
|
|
816
774
|
projectionRecord: typeof cached,
|
|
817
775
|
input: { cacheHit: boolean; stale: boolean; refreshJobId?: string },
|
|
818
776
|
): CallToolResult => {
|
|
819
|
-
const {
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
...
|
|
823
|
-
|
|
824
|
-
...contextRecord(basePayload.execution),
|
|
825
|
-
recommendedMode: recommendedExecution.recommendedMode,
|
|
826
|
-
executionPath: recommendedExecution.executionPath,
|
|
827
|
-
},
|
|
828
|
-
} : {}),
|
|
829
|
-
recommendedExecution,
|
|
830
|
-
...(modeContextPack ? { modeContextPack } : {}),
|
|
831
|
-
};
|
|
777
|
+
const {
|
|
778
|
+
modeContextPack: _legacyModeContextPack,
|
|
779
|
+
recommendedExecution: _legacyRecommendedExecution,
|
|
780
|
+
...taskScopedPayload
|
|
781
|
+
} = payload;
|
|
832
782
|
if (!controllerContextProjectionPayloadMatchesSourceIdentity(taskScopedPayload, sourceIdentity)) {
|
|
833
783
|
const response = withRuntimeResponseMeta({
|
|
834
784
|
error: {
|
|
@@ -992,8 +942,6 @@ export async function callRuntimeObservationAdapter(ctx: MultiRepositoryMcpToolC
|
|
|
992
942
|
repoId: repository.repoId,
|
|
993
943
|
repository: repositorySummary(repository),
|
|
994
944
|
runtimeStorage,
|
|
995
|
-
recommendedExecution,
|
|
996
|
-
...(modeContextPack ? { modeContextPack } : {}),
|
|
997
945
|
runtimeProjection,
|
|
998
946
|
runtimeProjectionState: {
|
|
999
947
|
stale: runtimeSnapshot.stale,
|
|
@@ -1093,14 +1041,15 @@ export async function callRuntimeObservationAdapter(ctx: MultiRepositoryMcpToolC
|
|
|
1093
1041
|
? 'Raw job state is intentionally not returned through MCP. Use the bounded job summary, events, and get_artifact with artifactId (ART-...), not evidenceId (EVD-...).'
|
|
1094
1042
|
: jobSummary.terminal
|
|
1095
1043
|
? String(jobSummary.summary ?? '')
|
|
1096
|
-
: 'Historical Job is still active. Continue independent work; read it only if an observation can change the next decision, and
|
|
1044
|
+
: 'Historical Job is still active. Continue independent work; read it only if an observation can change the next decision, and join only the exact underlying managed process when this result becomes a dependency. Do not periodically poll.',
|
|
1097
1045
|
}, jobSummary.phase === 'failed' || jobSummary.phase === 'timed_out');
|
|
1098
1046
|
}
|
|
1099
1047
|
case 'get_artifact': {
|
|
1100
1048
|
const artifactId = String(args.artifact_id ?? '').trim();
|
|
1101
|
-
const
|
|
1049
|
+
const legacyArtifactRepoId = String(args.repo_id ?? '').trim() || undefined;
|
|
1050
|
+
const artifactPrincipalId = ctx.principalId?.trim() || '__anonymous__';
|
|
1102
1051
|
if (artifactId.startsWith('EVD-')) {
|
|
1103
|
-
const evidence = readExecutionEvidence(ctx.controllerHome,
|
|
1052
|
+
const evidence = readExecutionEvidence(ctx.controllerHome, artifactId, { legacyRepoId: legacyArtifactRepoId, principalId: artifactPrincipalId });
|
|
1104
1053
|
return result({
|
|
1105
1054
|
referenceType: 'evidence',
|
|
1106
1055
|
evidenceId: evidence.evidenceId,
|
|
@@ -1121,11 +1070,11 @@ export async function callRuntimeObservationAdapter(ctx: MultiRepositoryMcpToolC
|
|
|
1121
1070
|
message: `Expected artifactId starting with ART- (got ${artifactId.slice(0, 40)}). evidenceId (EVD-...) is audit metadata; use get_job artifactRefs for content.`,
|
|
1122
1071
|
},
|
|
1123
1072
|
referenceType: 'unknown',
|
|
1124
|
-
next: 'Call get_job, read artifactRefs[].artifactId (ART-...), then get_artifact with that id
|
|
1073
|
+
next: 'Call get_job, read artifactRefs[].artifactId (ART-...), then get_artifact with that id. repo_id is only a legacy adoption hint.',
|
|
1125
1074
|
}, true);
|
|
1126
1075
|
}
|
|
1127
1076
|
const maxBytes = typeof args.max_bytes === 'number' ? args.max_bytes : 64 * 1024;
|
|
1128
|
-
const loaded = readExecutionArtifact(ctx.controllerHome,
|
|
1077
|
+
const loaded = readExecutionArtifact(ctx.controllerHome, artifactId, maxBytes, { legacyRepoId: legacyArtifactRepoId, principalId: artifactPrincipalId });
|
|
1129
1078
|
// Do not re-attach controller/repository/runtime envelopes here; multi-repo layer already compact.
|
|
1130
1079
|
return result({
|
|
1131
1080
|
referenceType: 'artifact',
|