@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,91 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
import type { McpPolicy, McpProfileName } from '../types';
|
|
5
|
+
import { buildControllerContextPackAsync } from '../../../src/cli/controller/context-pack';
|
|
6
|
+
import type { ControllerContextPackOptions } from '../../../src/cli/controller/context/types';
|
|
7
|
+
import { PROCESS_RUNTIME_RELEASE_CANARY_ARG } from '../../../src/runtime/execution/process-runtime/canary';
|
|
8
|
+
import { closeCodeGraphReadProviderSessions } from '../../../src/runtime/context/codegraph-read-provider';
|
|
9
|
+
|
|
10
|
+
interface ContextPackEnvelope {
|
|
11
|
+
schemaVersion: 1;
|
|
12
|
+
repoRoot: string;
|
|
13
|
+
policy: McpPolicy;
|
|
14
|
+
options: ControllerContextPackOptions;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function profile(value: unknown): McpProfileName {
|
|
18
|
+
if (value === 'planner' || value === 'executor' || value === 'orchestrator' || value === 'controller') return value;
|
|
19
|
+
throw new Error('CONTEXT_PACK_POLICY_PROFILE_INVALID');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function stringList(value: unknown): string[] {
|
|
23
|
+
if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
|
|
24
|
+
throw new Error('CONTEXT_PACK_POLICY_GLOBS_INVALID');
|
|
25
|
+
}
|
|
26
|
+
return value.map(String);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function policy(value: unknown): McpPolicy {
|
|
30
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('CONTEXT_PACK_POLICY_INVALID');
|
|
31
|
+
const input = value as Record<string, unknown>;
|
|
32
|
+
const execution = input.execution;
|
|
33
|
+
if (!execution || typeof execution !== 'object' || Array.isArray(execution)) throw new Error('CONTEXT_PACK_POLICY_EXECUTION_INVALID');
|
|
34
|
+
const e = execution as Record<string, unknown>;
|
|
35
|
+
const maxFileBytes = Number(input.maxFileBytes);
|
|
36
|
+
if (!Number.isFinite(maxFileBytes) || maxFileBytes <= 0) throw new Error('CONTEXT_PACK_POLICY_MAX_FILE_BYTES_INVALID');
|
|
37
|
+
return {
|
|
38
|
+
profile: profile(input.profile),
|
|
39
|
+
readGlobs: stringList(input.readGlobs),
|
|
40
|
+
writeGlobs: stringList(input.writeGlobs),
|
|
41
|
+
denyGlobs: stringList(input.denyGlobs),
|
|
42
|
+
maxFileBytes,
|
|
43
|
+
execution: {
|
|
44
|
+
fixedWorkflowCheck: e.fixedWorkflowCheck === true,
|
|
45
|
+
codexRunner: e.codexRunner === true,
|
|
46
|
+
agentRunner: e.agentRunner === true,
|
|
47
|
+
allowedAgents: Array.isArray(e.allowedAgents)
|
|
48
|
+
? e.allowedAgents.filter((entry): entry is 'codex' | 'claude' => entry === 'codex' || entry === 'claude')
|
|
49
|
+
: [],
|
|
50
|
+
runnerTimeoutMs: Number(e.runnerTimeoutMs) || 0,
|
|
51
|
+
runnerMaxTimeoutMs: Number(e.runnerMaxTimeoutMs) || 0,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function runContextPackSidecar(
|
|
57
|
+
argv = process.argv.slice(2),
|
|
58
|
+
input = readFileSync(0, 'utf8'),
|
|
59
|
+
): Promise<number> {
|
|
60
|
+
if (argv.includes(PROCESS_RUNTIME_RELEASE_CANARY_ARG)) {
|
|
61
|
+
process.stdout.write('forge context-pack release canary\n');
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
const envelope = JSON.parse(input) as ContextPackEnvelope;
|
|
65
|
+
if (envelope.schemaVersion !== 1 || typeof envelope.repoRoot !== 'string' || !envelope.repoRoot.trim()) {
|
|
66
|
+
throw new Error('CONTEXT_PACK_REQUEST_INVALID');
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const pack = await buildControllerContextPackAsync(
|
|
70
|
+
resolve(envelope.repoRoot),
|
|
71
|
+
policy(envelope.policy),
|
|
72
|
+
envelope.options && typeof envelope.options === 'object' ? envelope.options : {},
|
|
73
|
+
);
|
|
74
|
+
process.stdout.write(`${JSON.stringify({ schemaVersion: 1, pack })}\n`);
|
|
75
|
+
return 0;
|
|
76
|
+
} finally {
|
|
77
|
+
// The Context Pack async path may reuse a CodeGraph session for progressive
|
|
78
|
+
// waves. This process is intentionally disposable, so do not inherit the
|
|
79
|
+
// normal 30-second provider idle lifetime.
|
|
80
|
+
await closeCodeGraphReadProviderSessions();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (import.meta.main) {
|
|
85
|
+
try {
|
|
86
|
+
process.exitCode = await runContextPackSidecar();
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
89
|
+
process.exitCode = 1;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -54,7 +54,7 @@ export function runtimeIdentitySnapshot(ctx: MultiRepositoryMcpToolContext): Run
|
|
|
54
54
|
export function authenticatedFacadeControllerIdentity(
|
|
55
55
|
ctx: MultiRepositoryMcpToolContext,
|
|
56
56
|
args: Record<string, unknown>,
|
|
57
|
-
|
|
57
|
+
options: { allowTransportSessionRollover?: boolean } = {},
|
|
58
58
|
): { controllerId: string; principalId: string; sessionId: string; transportSessionId?: string; controllerAuthorityId?: string; authorityViaSessionCompatibility?: boolean; controllerInstanceId: string; controllerType: 'chatgpt' | 'codex' | 'claude' | 'grok' | 'human' } {
|
|
59
59
|
const principalId = ctx.principalId?.trim();
|
|
60
60
|
const transportSessionId = ctx.sessionId?.trim();
|
|
@@ -76,8 +76,16 @@ export function authenticatedFacadeControllerIdentity(
|
|
|
76
76
|
// the caller does not provide an explicit compatibility carrier. Durable Work
|
|
77
77
|
// authority is never derived from this request binding.
|
|
78
78
|
const sessionId = transportSessionId || requestedSessionId || `mcp_request_${randomUUID().replace(/-/g, '')}`;
|
|
79
|
+
const transportRolloverRequested = Boolean(
|
|
80
|
+
transportSessionId
|
|
81
|
+
&& requestedSessionId
|
|
82
|
+
&& requestedSessionId !== transportSessionId,
|
|
83
|
+
);
|
|
84
|
+
if (transportRolloverRequested && options.allowTransportSessionRollover !== true) {
|
|
85
|
+
throw new Error('CONTROLLER_TRANSPORT_SESSION_ROLLOVER_NOT_ALLOWED: this operation must use the current authenticated transport session or an explicit controller_authority_id');
|
|
86
|
+
}
|
|
79
87
|
const compatibilityAuthorityId = (!transportSessionId && requestedSessionId ? requestedSessionId : '')
|
|
80
|
-
|| (
|
|
88
|
+
|| (transportRolloverRequested ? requestedSessionId : '');
|
|
81
89
|
const controllerAuthorityId = requestedAuthorityId || compatibilityAuthorityId;
|
|
82
90
|
const authorityViaSessionCompatibility = !requestedAuthorityId && Boolean(compatibilityAuthorityId);
|
|
83
91
|
if (requestedControllerId && requestedControllerId !== principalId) {
|
|
@@ -117,7 +125,11 @@ export function assertFacadeControllerRoundAuthority(
|
|
|
117
125
|
workId: string,
|
|
118
126
|
args: Record<string, unknown>,
|
|
119
127
|
): ControllerRoundRelayRecord | undefined {
|
|
120
|
-
|
|
128
|
+
// A frozen client may carry its explicit controller authority through the
|
|
129
|
+
// bounded `session_id` compatibility carrier. Resolving that carrier is not an
|
|
130
|
+
// authorization shortcut: `assertControllerRoundInvocationAuthority` still owns
|
|
131
|
+
// the exact principal/Work/round comparison below.
|
|
132
|
+
const identity = authenticatedFacadeControllerIdentity(ctx, args, { allowTransportSessionRollover: true });
|
|
121
133
|
return assertControllerRoundInvocationAuthority({
|
|
122
134
|
...store,
|
|
123
135
|
workId,
|
|
@@ -165,7 +177,10 @@ export function currentFacadeTerminalizationAuthority(
|
|
|
165
177
|
workId: string,
|
|
166
178
|
args: Record<string, unknown>,
|
|
167
179
|
): ControllerTerminalizationAuthority {
|
|
168
|
-
|
|
180
|
+
// Frozen clients may carry an exact controller authority through the bounded
|
|
181
|
+
// `session_id` compatibility carrier; the terminalization authority check below
|
|
182
|
+
// still owns the exact owner/Work/revision comparison.
|
|
183
|
+
const identity = authenticatedFacadeControllerIdentity(ctx, args, { allowTransportSessionRollover: true });
|
|
169
184
|
return controllerTerminalizationAuthorityForInvocation({
|
|
170
185
|
...store,
|
|
171
186
|
workId,
|
|
@@ -181,7 +196,7 @@ export function currentTerminalCleanupAuthority(
|
|
|
181
196
|
workId: string,
|
|
182
197
|
args: Record<string, unknown>,
|
|
183
198
|
): ControllerTerminalizationAuthority {
|
|
184
|
-
const identity = authenticatedFacadeControllerIdentity(ctx, args);
|
|
199
|
+
const identity = authenticatedFacadeControllerIdentity(ctx, args, { allowTransportSessionRollover: true });
|
|
185
200
|
return terminalCleanupAuthorityForInvocation({
|
|
186
201
|
...store,
|
|
187
202
|
workId,
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import type { CallToolResult } from '../../../packages/protocols/mcp/tool-contract';
|
|
2
|
+
import type { MultiRepositoryMcpToolContext } from '../multi-repository';
|
|
3
|
+
import { callRepositoryTool } from '../tool-mapping/repository-tools';
|
|
4
|
+
import { commitSelectedPaths, selectedPathDiff, stageSelectedPaths } from '../../../src/cli/repositories/selected-path-actions';
|
|
5
|
+
import { deliverWork } from '../../../src/runtime/control-plane/execution/work-delivery-service';
|
|
6
|
+
import { validateWork } from '../../../src/runtime/control-plane/execution/work-operation-service';
|
|
7
|
+
import { startOrResumeSession } from './execution-tools';
|
|
8
|
+
import { result } from './result-adapter';
|
|
9
|
+
import { selected } from './shared-adapter';
|
|
10
|
+
import { callWorkflowSupervisorAdapter } from './workflow-supervisor-adapter';
|
|
11
|
+
import {
|
|
12
|
+
claimControllerRoundSession,
|
|
13
|
+
getControllerRoundRelay,
|
|
14
|
+
releaseObservedControllerSession,
|
|
15
|
+
submitControllerRoundDisposition,
|
|
16
|
+
type ControllerRoundDisposition,
|
|
17
|
+
} from '../../../packages/kernel/controller/api/index';
|
|
18
|
+
import { recoverControllerAuthority } from '../../../src/runtime/control-plane/execution/controller-authority-recovery';
|
|
19
|
+
import { authenticatedFacadeControllerIdentity, runtimeIdentitySnapshot } from './controller-authority-adapter';
|
|
20
|
+
import { readControllerConnectionSnapshot, repairControllerConnection } from '../../../src/runtime/control-plane/facade/controller-connection';
|
|
21
|
+
import { readLocalConversationProviderStatus, sendLocalConversation } from '../../../src/runtime/control-plane/launcher/local-conversation-controller';
|
|
22
|
+
|
|
23
|
+
function object(value: unknown): Record<string, unknown> {
|
|
24
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return {};
|
|
25
|
+
return value as Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function callCoreCapabilityAdapter(
|
|
29
|
+
ctx: MultiRepositoryMcpToolContext,
|
|
30
|
+
name: string,
|
|
31
|
+
args: Record<string, unknown>,
|
|
32
|
+
): Promise<CallToolResult | undefined> {
|
|
33
|
+
if (name !== 'capability_execute') return undefined;
|
|
34
|
+
const capabilityId = typeof args.capability_id === 'string' ? args.capability_id.trim() : '';
|
|
35
|
+
const action = typeof args.action === 'string' ? args.action.trim() : '';
|
|
36
|
+
const input = object(args.arguments);
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
if (capabilityId === 'controller.connection') {
|
|
40
|
+
if (action === 'get') return result({ ...readControllerConnectionSnapshot(ctx.controllerHome) });
|
|
41
|
+
if (action === 'repair_connector') return result(repairControllerConnection(ctx.controllerHome));
|
|
42
|
+
return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported controller.connection action: ${action || '<empty>'}` } }, true);
|
|
43
|
+
}
|
|
44
|
+
if (capabilityId === 'controller.local_conversation') {
|
|
45
|
+
if (action === 'status') return result({ ...readLocalConversationProviderStatus() });
|
|
46
|
+
if (action === 'send') {
|
|
47
|
+
const conversationId = typeof input.conversation_id === 'string' ? input.conversation_id.trim() : '';
|
|
48
|
+
const prompt = typeof input.prompt === 'string' ? input.prompt.trim() : '';
|
|
49
|
+
const providerSessionId = typeof input.provider_session_id === 'string' ? input.provider_session_id.trim() : undefined;
|
|
50
|
+
const timeoutMs = typeof input.timeout_ms === 'number' ? input.timeout_ms : undefined;
|
|
51
|
+
const requestedRepoId = typeof args.repo_id === 'string' ? args.repo_id.trim() : '';
|
|
52
|
+
const repository = requestedRepoId ? selected(ctx, args) : undefined;
|
|
53
|
+
return result({ ...await sendLocalConversation({
|
|
54
|
+
controllerHome: ctx.controllerHome,
|
|
55
|
+
conversationId,
|
|
56
|
+
prompt,
|
|
57
|
+
providerSessionId,
|
|
58
|
+
repoId: repository?.repoId,
|
|
59
|
+
timeoutMs,
|
|
60
|
+
}) });
|
|
61
|
+
}
|
|
62
|
+
return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported controller.local_conversation action: ${action || '<empty>'}` } }, true);
|
|
63
|
+
}
|
|
64
|
+
if (capabilityId === 'controller.workflow_supervisor') {
|
|
65
|
+
const forwarded = await callWorkflowSupervisorAdapter(ctx, 'supervisor_task', {
|
|
66
|
+
...input,
|
|
67
|
+
operation: action,
|
|
68
|
+
request_id: typeof args.request_id === 'string' ? args.request_id.trim() : '',
|
|
69
|
+
...(typeof args.repo_id === 'string' && args.repo_id.trim() ? { repo_id: args.repo_id.trim() } : {}),
|
|
70
|
+
});
|
|
71
|
+
return forwarded ?? result({ error: { code: 'CORE_CAPABILITY_ROUTE_UNAVAILABLE', message: 'Workflow Supervisor capability route is unavailable.' } }, true);
|
|
72
|
+
}
|
|
73
|
+
if (capabilityId === 'controller.round_recovery') {
|
|
74
|
+
if (action !== 'recover_and_dispose') {
|
|
75
|
+
return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported controller.round_recovery action: ${action || '<empty>'}` } }, true);
|
|
76
|
+
}
|
|
77
|
+
if (input.user_directed !== true) throw new Error('WORK_CONTROLLER_AUTHORITY_RECOVERY_USER_REQUIRED: user_directed=true is required.');
|
|
78
|
+
const workId = typeof input.work_id === 'string' ? input.work_id.trim() : '';
|
|
79
|
+
const recoveryReason = typeof input.recovery_reason === 'string' ? input.recovery_reason.trim() : '';
|
|
80
|
+
const disposition = typeof input.disposition === 'string' ? input.disposition.trim() as ControllerRoundDisposition : undefined;
|
|
81
|
+
const handoffId = typeof input.handoff_id === 'string' ? input.handoff_id.trim() : undefined;
|
|
82
|
+
if (!workId) throw new Error('WORK_CONTROLLER_AUTHORITY_RECOVERY_WORK_REQUIRED');
|
|
83
|
+
if (!recoveryReason) throw new Error('WORK_CONTROLLER_AUTHORITY_RECOVERY_REASON_REQUIRED');
|
|
84
|
+
if (!disposition || !['continue_immediately', 'wait', 'wait_for_user', 'goal_complete'].includes(disposition)) {
|
|
85
|
+
throw new Error('CONTROLLER_RELAY_DISPOSITION_INVALID');
|
|
86
|
+
}
|
|
87
|
+
if (disposition === 'wait_for_user' && !handoffId) throw new Error('CONTROLLER_RELAY_WAIT_FOR_USER_HANDOFF_REQUIRED');
|
|
88
|
+
|
|
89
|
+
const repository = selected(ctx, args);
|
|
90
|
+
const store = { controllerHome: ctx.controllerHome, repoId: repository.repoId };
|
|
91
|
+
const before = getControllerRoundRelay(store, workId);
|
|
92
|
+
if (!before) throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_RELAY_REQUIRED: ${workId}`);
|
|
93
|
+
const identity = authenticatedFacadeControllerIdentity(ctx, {});
|
|
94
|
+
const recovered = recoverControllerAuthority({
|
|
95
|
+
controllerHome: ctx.controllerHome,
|
|
96
|
+
repoId: repository.repoId,
|
|
97
|
+
repositoryActiveCheckoutId: repository.activeCheckoutId,
|
|
98
|
+
workId,
|
|
99
|
+
requestedBy: 'user',
|
|
100
|
+
recoveryReason,
|
|
101
|
+
identity,
|
|
102
|
+
runtime: runtimeIdentitySnapshot(ctx),
|
|
103
|
+
leaseMs: 60_000,
|
|
104
|
+
});
|
|
105
|
+
if (!('relay' in recovered)) throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_RELAY_REQUIRED: ${workId}`);
|
|
106
|
+
if (before.providerDispatchEffectId && recovered.relay.providerDispatchEffectId !== before.providerDispatchEffectId) {
|
|
107
|
+
throw new Error(`WORK_CONTROLLER_AUTHORITY_RECOVERY_EFFECT_CHANGED: ${workId}`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const claimed = claimControllerRoundSession(store, {
|
|
111
|
+
workId,
|
|
112
|
+
relayWorkId: workId,
|
|
113
|
+
sessionClaim: {
|
|
114
|
+
workId,
|
|
115
|
+
controllerId: identity.controllerId,
|
|
116
|
+
controllerType: identity.controllerType,
|
|
117
|
+
sessionId: identity.sessionId,
|
|
118
|
+
principalId: identity.principalId,
|
|
119
|
+
controllerInstanceId: identity.controllerInstanceId,
|
|
120
|
+
leaseMs: 60_000,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
if (!claimed.relay || claimed.relay.status !== 'claimed') throw new Error(`CONTROLLER_RELAY_ROUND_NOT_CLAIMED: ${claimed.relay?.status ?? 'missing'}`);
|
|
124
|
+
|
|
125
|
+
let disposed;
|
|
126
|
+
let releaseResult;
|
|
127
|
+
try {
|
|
128
|
+
disposed = submitControllerRoundDisposition(store, {
|
|
129
|
+
workId,
|
|
130
|
+
identity: {
|
|
131
|
+
controllerId: claimed.session.controllerId,
|
|
132
|
+
controllerType: claimed.session.controllerType,
|
|
133
|
+
principalId: claimed.session.principalId?.trim() || claimed.session.controllerId,
|
|
134
|
+
controllerInstanceId: claimed.session.controllerInstanceId?.trim() || '',
|
|
135
|
+
sessionId: claimed.session.sessionId,
|
|
136
|
+
},
|
|
137
|
+
disposition,
|
|
138
|
+
relayScopeId: recovered.relay.relayScopeId,
|
|
139
|
+
requirementId: recovered.relay.requirementId,
|
|
140
|
+
...(handoffId ? { handoffId } : {}),
|
|
141
|
+
reason: recoveryReason,
|
|
142
|
+
});
|
|
143
|
+
} finally {
|
|
144
|
+
releaseResult = releaseObservedControllerSession(store, {
|
|
145
|
+
workId,
|
|
146
|
+
actor: `controller-round-recovery:${identity.controllerId}`,
|
|
147
|
+
owner: claimed.session,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (!releaseResult?.allowed) throw new Error(`WORK_CONTROLLER_RELEASE_FENCED: ${workId}:${releaseResult?.reason ?? 'unknown'}`);
|
|
151
|
+
const after = getControllerRoundRelay(store, workId);
|
|
152
|
+
return result({
|
|
153
|
+
repoId: repository.repoId,
|
|
154
|
+
workId,
|
|
155
|
+
authorityRecovered: true,
|
|
156
|
+
claimed: true,
|
|
157
|
+
disposition,
|
|
158
|
+
dispositionStatus: disposed.status,
|
|
159
|
+
relayScopeId: disposed.relayScopeId,
|
|
160
|
+
ownerReleased: true,
|
|
161
|
+
providerDispatchEffectId: after?.providerDispatchEffectId,
|
|
162
|
+
providerDispatchEffectPreserved: before.providerDispatchEffectId === after?.providerDispatchEffectId,
|
|
163
|
+
providerRedispatched: false,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (capabilityId === 'repository.direct_edit') {
|
|
167
|
+
const toolName = action === 'plan'
|
|
168
|
+
? 'repository_safe_patch_plan'
|
|
169
|
+
: action === 'apply'
|
|
170
|
+
? 'repository_safe_patch_apply'
|
|
171
|
+
: undefined;
|
|
172
|
+
if (!toolName) {
|
|
173
|
+
return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported repository.direct_edit action: ${action || '<empty>'}` } }, true);
|
|
174
|
+
}
|
|
175
|
+
const workId = action === 'apply' && typeof input.work_id === 'string' ? input.work_id.trim() : '';
|
|
176
|
+
const callerSession = workId && (!ctx.sessionId || !ctx.principalId || !ctx.controllerInstanceId)
|
|
177
|
+
? startOrResumeSession(ctx)
|
|
178
|
+
: undefined;
|
|
179
|
+
const forwarded = await callRepositoryTool(ctx.controllerHome, toolName, {
|
|
180
|
+
...input,
|
|
181
|
+
...(typeof args.repo_id === 'string' && args.repo_id.trim() ? { repo_id: args.repo_id.trim() } : {}),
|
|
182
|
+
...(typeof args.checkout_id === 'string' && args.checkout_id.trim() ? { checkout_id: args.checkout_id.trim() } : {}),
|
|
183
|
+
}, {
|
|
184
|
+
sessionId: callerSession?.sessionId ?? ctx.sessionId,
|
|
185
|
+
principalId: callerSession?.principalId ?? ctx.principalId,
|
|
186
|
+
controllerInstanceId: callerSession?.controllerInstanceId ?? ctx.controllerInstanceId,
|
|
187
|
+
});
|
|
188
|
+
return forwarded ?? result({
|
|
189
|
+
error: { code: 'CORE_CAPABILITY_ROUTE_UNAVAILABLE', message: 'Repository direct-edit capability route is unavailable.' },
|
|
190
|
+
}, true);
|
|
191
|
+
}
|
|
192
|
+
if (capabilityId === 'repository.validation') {
|
|
193
|
+
if (action !== 'validate_work') {
|
|
194
|
+
return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported repository.validation action: ${action || '<empty>'}` } }, true);
|
|
195
|
+
}
|
|
196
|
+
const repository = selected(ctx, args);
|
|
197
|
+
const sessionId = typeof input.session_id === 'string' && input.session_id.trim()
|
|
198
|
+
? input.session_id.trim()
|
|
199
|
+
: startOrResumeSession(ctx).sessionId;
|
|
200
|
+
return result(await validateWork(ctx, {
|
|
201
|
+
...input,
|
|
202
|
+
session_id: sessionId,
|
|
203
|
+
repo_id: repository.repoId,
|
|
204
|
+
request_id: typeof args.request_id === 'string' ? args.request_id.trim() : '',
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
if (capabilityId !== 'repository.git') {
|
|
208
|
+
return result({ error: { code: 'CORE_CAPABILITY_UNSUPPORTED', message: `Unsupported core capability: ${capabilityId || '<empty>'}` } }, true);
|
|
209
|
+
}
|
|
210
|
+
const repository = selected(ctx, args);
|
|
211
|
+
switch (action) {
|
|
212
|
+
case 'diff_paths':
|
|
213
|
+
return result({
|
|
214
|
+
...selectedPathDiff(repository, {
|
|
215
|
+
paths: input.paths,
|
|
216
|
+
staged: input.staged === true,
|
|
217
|
+
maxBytes: typeof input.max_bytes === 'number' ? input.max_bytes : undefined,
|
|
218
|
+
}),
|
|
219
|
+
});
|
|
220
|
+
case 'stage_paths': {
|
|
221
|
+
const staged = stageSelectedPaths(ctx.controllerHome, repository, { paths: input.paths });
|
|
222
|
+
return result({
|
|
223
|
+
repoId: repository.repoId,
|
|
224
|
+
checkoutId: repository.activeCheckoutId,
|
|
225
|
+
...staged,
|
|
226
|
+
}, staged.execution.ok !== true);
|
|
227
|
+
}
|
|
228
|
+
case 'commit_paths': {
|
|
229
|
+
const committed = commitSelectedPaths(ctx.controllerHome, repository, {
|
|
230
|
+
paths: input.paths,
|
|
231
|
+
message: input.message,
|
|
232
|
+
});
|
|
233
|
+
return result({
|
|
234
|
+
repoId: repository.repoId,
|
|
235
|
+
checkoutId: repository.activeCheckoutId,
|
|
236
|
+
...committed,
|
|
237
|
+
}, Boolean(committed.error));
|
|
238
|
+
}
|
|
239
|
+
case 'deliver_work': {
|
|
240
|
+
const sessionId = typeof input.session_id === 'string' && input.session_id.trim()
|
|
241
|
+
? input.session_id.trim()
|
|
242
|
+
: startOrResumeSession(ctx).sessionId;
|
|
243
|
+
const delivered = await deliverWork(ctx, {
|
|
244
|
+
...input,
|
|
245
|
+
session_id: sessionId,
|
|
246
|
+
repo_id: repository.repoId,
|
|
247
|
+
});
|
|
248
|
+
return result(delivered);
|
|
249
|
+
}
|
|
250
|
+
default:
|
|
251
|
+
return result({ error: { code: 'CORE_CAPABILITY_ACTION_UNSUPPORTED', message: `Unsupported repository.git action: ${action || '<empty>'}` } }, true);
|
|
252
|
+
}
|
|
253
|
+
} catch (error) {
|
|
254
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
255
|
+
const structuredCode = /^([A-Z][A-Z0-9_]+)(?::|$)/.exec(message)?.[1];
|
|
256
|
+
return result({ error: { code: structuredCode ?? 'CORE_CAPABILITY_FAILED', message } }, true);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
@@ -5,11 +5,13 @@ import {
|
|
|
5
5
|
engineeringRequirementContextDigest,
|
|
6
6
|
type ContextClosureReceipt,
|
|
7
7
|
type EngineeringAdmissionEvidence,
|
|
8
|
+
type EngineeringDecisionArea,
|
|
8
9
|
type IndependentCritiqueFinding,
|
|
9
10
|
type ProjectEngineeringContractReceipt,
|
|
10
11
|
} from '../../../packages/kernel/work/api/index';
|
|
11
12
|
import { loadProjectEngineeringContract } from '../../../src/runtime/context/project-engineering-contract';
|
|
12
13
|
import { validateRuntimeIssuedContextClosureReceipt } from '../../../src/runtime/context/context-closure';
|
|
14
|
+
import { ENGINEERING_DECISION_INPUT_ENTRIES, engineeringDecisionInputKey } from './engineering-tool-contract';
|
|
13
15
|
|
|
14
16
|
type RecordValue = Record<string, unknown>;
|
|
15
17
|
function object(value: unknown, code: string): RecordValue {
|
|
@@ -25,6 +27,10 @@ function strings(value: unknown, code: string): string[] {
|
|
|
25
27
|
return value.map((entry) => text(entry, code));
|
|
26
28
|
}
|
|
27
29
|
|
|
30
|
+
function engineeringDecisionErrorCode(area: EngineeringDecisionArea): string {
|
|
31
|
+
return `ENGINEERING_DESIGN_${engineeringDecisionInputKey(area).toUpperCase()}_REQUIRED`;
|
|
32
|
+
}
|
|
33
|
+
|
|
28
34
|
export function mintEngineeringAdmissionEvidence(input: {
|
|
29
35
|
repoRoot: string;
|
|
30
36
|
sourceRevision: string;
|
|
@@ -60,33 +66,10 @@ export function mintEngineeringAdmissionEvidence(input: {
|
|
|
60
66
|
|
|
61
67
|
const design = object(draft.design_decision, 'ENGINEERING_DESIGN_DECISION_REQUIRED');
|
|
62
68
|
const decisionsInput = object(design.decisions, 'ENGINEERING_DESIGN_DECISIONS_REQUIRED');
|
|
63
|
-
const decisions = {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
lifecycle: text(decisionsInput.lifecycle, 'ENGINEERING_DESIGN_LIFECYCLE_REQUIRED'),
|
|
68
|
-
concurrency: text(decisionsInput.concurrency, 'ENGINEERING_DESIGN_CONCURRENCY_REQUIRED'),
|
|
69
|
-
persistence: text(decisionsInput.persistence, 'ENGINEERING_DESIGN_PERSISTENCE_REQUIRED'),
|
|
70
|
-
failure: text(decisionsInput.failure, 'ENGINEERING_DESIGN_FAILURE_REQUIRED'),
|
|
71
|
-
projectionCache: text(decisionsInput.projection_cache, 'ENGINEERING_DESIGN_PROJECTION_CACHE_REQUIRED'),
|
|
72
|
-
time: text(decisionsInput.time, 'ENGINEERING_DESIGN_TIME_REQUIRED'),
|
|
73
|
-
performance: text(decisionsInput.performance, 'ENGINEERING_DESIGN_PERFORMANCE_REQUIRED'),
|
|
74
|
-
compatibility: text(decisionsInput.compatibility, 'ENGINEERING_DESIGN_COMPATIBILITY_REQUIRED'),
|
|
75
|
-
semanticScopeIdentity: text(decisionsInput.semantic_scope_identity, 'ENGINEERING_DESIGN_SEMANTIC_SCOPE_IDENTITY_REQUIRED'),
|
|
76
|
-
authorizationTrust: text(decisionsInput.authorization_trust, 'ENGINEERING_DESIGN_AUTHORIZATION_TRUST_REQUIRED'),
|
|
77
|
-
resourceFencing: text(decisionsInput.resource_fencing, 'ENGINEERING_DESIGN_RESOURCE_FENCING_REQUIRED'),
|
|
78
|
-
deploymentTopology: text(decisionsInput.deployment_topology, 'ENGINEERING_DESIGN_DEPLOYMENT_TOPOLOGY_REQUIRED'),
|
|
79
|
-
schemaEvolutionDurability: text(decisionsInput.schema_evolution_durability, 'ENGINEERING_DESIGN_SCHEMA_EVOLUTION_DURABILITY_REQUIRED'),
|
|
80
|
-
idempotencyReplay: text(decisionsInput.idempotency_replay, 'ENGINEERING_DESIGN_IDEMPOTENCY_REPLAY_REQUIRED'),
|
|
81
|
-
retentionGc: text(decisionsInput.retention_gc, 'ENGINEERING_DESIGN_RETENTION_GC_REQUIRED'),
|
|
82
|
-
observabilityEvidence: text(decisionsInput.observability_evidence, 'ENGINEERING_DESIGN_OBSERVABILITY_EVIDENCE_REQUIRED'),
|
|
83
|
-
recoveryFailureDomain: text(decisionsInput.recovery_failure_domain, 'ENGINEERING_DESIGN_RECOVERY_FAILURE_DOMAIN_REQUIRED'),
|
|
84
|
-
capacityBackpressure: text(decisionsInput.capacity_backpressure, 'ENGINEERING_DESIGN_CAPACITY_BACKPRESSURE_REQUIRED'),
|
|
85
|
-
releaseUpgradeRollback: text(decisionsInput.release_upgrade_rollback, 'ENGINEERING_DESIGN_RELEASE_UPGRADE_ROLLBACK_REQUIRED'),
|
|
86
|
-
securityPrivacy: text(decisionsInput.security_privacy, 'ENGINEERING_DESIGN_SECURITY_PRIVACY_REQUIRED'),
|
|
87
|
-
portability: text(decisionsInput.portability, 'ENGINEERING_DESIGN_PORTABILITY_REQUIRED'),
|
|
88
|
-
migrationRetirement: text(decisionsInput.migration_retirement, 'ENGINEERING_DESIGN_MIGRATION_RETIREMENT_REQUIRED'),
|
|
89
|
-
};
|
|
69
|
+
const decisions = Object.fromEntries(ENGINEERING_DECISION_INPUT_ENTRIES.map(({ area, field }) => [
|
|
70
|
+
area,
|
|
71
|
+
text(decisionsInput[field], engineeringDecisionErrorCode(area)),
|
|
72
|
+
])) as Record<EngineeringDecisionArea, string>;
|
|
90
73
|
const budgetInput = object(design.complexity_budget, 'ENGINEERING_COMPLEXITY_BUDGET_REQUIRED');
|
|
91
74
|
const complexityBudget = {
|
|
92
75
|
addedWriters: Number(budgetInput.added_writers ?? 0),
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ENGINEERING_DECISION_AREAS,
|
|
3
|
+
type EngineeringDecisionArea,
|
|
4
|
+
} from '../../../packages/kernel/work/api/index';
|
|
5
|
+
|
|
6
|
+
export function engineeringDecisionInputKey(area: EngineeringDecisionArea): string {
|
|
7
|
+
return area.replace(/[A-Z]/g, (character) => `_${character.toLowerCase()}`);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const ENGINEERING_DECISION_INPUT_ENTRIES = ENGINEERING_DECISION_AREAS.map((area) => ({
|
|
11
|
+
area,
|
|
12
|
+
field: engineeringDecisionInputKey(area),
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
export const ENGINEERING_DECISION_INPUT_FIELDS = ENGINEERING_DECISION_INPUT_ENTRIES.map(({ field }) => field);
|
|
@@ -11,33 +11,10 @@ import { readControllerResult, searchControllerResult } from '../../../src/runti
|
|
|
11
11
|
import { resumeExecutionJobAfterApproval } from '../../../src/runtime/execution/jobs/store';
|
|
12
12
|
import { recordMcpTiming, type McpTimingTrace } from '../../../src/runtime/diagnostics/mcp-timing';
|
|
13
13
|
import { compactHandle, contractFor, identityFor, makeBoundedWorkResult, principalFor, requireSession, workForSession } from '../../../src/runtime/control-plane/execution/work-execution-support';
|
|
14
|
-
import { finalizeWork } from '../../../src/runtime/control-plane/execution/work-finalization-service';
|
|
15
14
|
import { bindSessionRepository, prepareWork } from '../../../src/runtime/control-plane/execution/work-preparation-service';
|
|
16
15
|
import { executeWork, validateWork } from '../../../src/runtime/control-plane/execution/work-operation-service';
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
// Compatibility exports: implementation authority lives in control-plane execution.
|
|
20
|
-
export {
|
|
21
|
-
inspectWorkTargetAdvance,
|
|
22
|
-
targetAdvanceLinearMergeCommits,
|
|
23
|
-
planTargetAdvanceValidationAuthority,
|
|
24
|
-
targetAdvanceWorkScopeViolation,
|
|
25
|
-
inspectDirectTargetDelivery,
|
|
26
|
-
inspectTargetDirtyWorkOwnership,
|
|
27
|
-
inspectDirectCanonicalTargetAdvanceReconciliation,
|
|
28
|
-
completionReceiptChangedPaths,
|
|
29
|
-
inspectCleanupOnlyMergedHead,
|
|
30
|
-
resetFinalizationStagesForRequest,
|
|
31
|
-
} from '../../../src/runtime/control-plane/execution/work-finalization-service';
|
|
32
|
-
export { releasePreparedWorkOwnership } from '../../../src/runtime/control-plane/execution/work-execution-support';
|
|
33
17
|
export { selectDefaultWorkValidationChecks } from '../../../src/runtime/control-plane/execution/work-operation-service';
|
|
34
|
-
export type {
|
|
35
|
-
DirectCanonicalTargetAdvanceInspection,
|
|
36
|
-
DirectTargetDeliveryInspection,
|
|
37
|
-
TargetAdvanceValidationTransferPlan,
|
|
38
|
-
TargetDirtyWorkOwnershipInspection,
|
|
39
|
-
WorkTargetAdvanceInspection,
|
|
40
|
-
} from '../../../src/runtime/control-plane/execution/work-finalization-service';
|
|
41
18
|
|
|
42
19
|
function definition(name: string, description: string, properties: Record<string, unknown>, required: string[] = [], readOnlyHint = false, destructiveHint = false): McpToolDefinition {
|
|
43
20
|
return { name, description, inputSchema: { type: 'object', properties, ...(required.length ? { required } : {}), additionalProperties: false }, annotations: { readOnlyHint, openWorldHint: false, destructiveHint } };
|
|
@@ -52,24 +29,20 @@ export const executionToolDefinitions: McpToolDefinition[] = [
|
|
|
52
29
|
definition('session_bind_repository', 'Explicitly bind the current session to one registered repository and checkout.', { session_id: sessionId, repo_id: repoId, checkout_id: { type: 'string' } }, ['repo_id'], false),
|
|
53
30
|
definition('work_prepare', 'Prepare or reuse one controller-owned work handle and bind it to a WorkContract, checkout, branch, and permission snapshot.', {
|
|
54
31
|
session_id: sessionId, repo_id: repoId, checkout_id: { type: 'string' }, work_id: workId,
|
|
55
|
-
objective: { type: 'string' }, goal_id: { type: 'string' }, acceptance_criteria: { type: 'array', items: { type: 'string' } },
|
|
32
|
+
objective: { type: 'string' }, goal_id: { type: 'string' }, acceptance_criteria: { type: 'array', items: { type: 'string' } }, checks: { type: 'array', items: { type: 'string' } },
|
|
56
33
|
isolation: { type: 'string', enum: ['reuse', 'new_worktree', 'auto'] }, base_ref: { type: 'string' }, needs_dependencies: { type: 'boolean' },
|
|
57
34
|
expected_previous_head: { type: 'string', description: 'Explicit prior WorkHandle HEAD required for audited successor adoption of an existing work_id.' },
|
|
58
|
-
adopt_candidate_head: { type: 'string', description: 'Explicit current successor commit to adopt after exact identity, ownership, cleanliness,
|
|
35
|
+
adopt_candidate_head: { type: 'string', description: 'Explicit current successor commit to adopt after exact identity, ownership, cleanliness, and ancestry validation.' },
|
|
59
36
|
}, [], false),
|
|
60
|
-
definition('work_inspect', 'Collect bounded Git, WorkContract, path, check, and readiness evidence through one work handle.', { session_id: sessionId, repo_id: repoId, work_id: workId, detail: { type: 'string', enum: ['summary', 'detail'] } }, ['work_id'], true),
|
|
37
|
+
definition('work_inspect', 'Collect bounded Git, WorkContract, changed-path, check, and readiness evidence through one work handle.', { session_id: sessionId, repo_id: repoId, work_id: workId, detail: { type: 'string', enum: ['summary', 'detail'] } }, ['work_id'], true),
|
|
61
38
|
definition('work_execute', 'Execute approved, repository-scoped commands against a validated work handle while preserving the existing command policy and audit path.', {
|
|
62
39
|
session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId,
|
|
63
40
|
command: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }] }, approval_token: { type: 'string' }, cwd: { type: 'string' }, timeout_ms: { type: 'number' }, max_output_bytes: { type: 'number' },
|
|
64
41
|
commands: { type: 'array', items: { type: 'object' } }, approval_request_id: { type: 'string' },
|
|
65
42
|
}, ['work_id'], false),
|
|
66
43
|
definition('work_validate', 'Run targeted checks or read-only validation commands against a work handle with full current-state validation.', {
|
|
67
|
-
session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId, check_ids: { type: 'array', items: { type: 'string' } }, commands: { type: 'array', items: { type: 'object' } },
|
|
44
|
+
session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId, check_ids: { type: 'array', items: { type: 'string' } }, commands: { type: 'array', items: { type: 'object' } }, interactive_wait_ms: { type: 'number', description: 'Optional bounded attach window for checks launched by this validation call. Defaults to asynchronous behavior.' },
|
|
68
45
|
}, ['work_id'], false),
|
|
69
|
-
definition('work_finalize', 'Idempotently validate, commit, merge, clean a managed worktree, and complete the existing WorkContract in independently recorded stages.', {
|
|
70
|
-
session_id: sessionId, controller_id: { type: 'string', description: 'Controller identity that holds the Work lease. Defaults to the authenticated principal.' }, repo_id: repoId, work_id: workId, commit: { type: 'boolean' }, message: { type: 'string' }, merge: { type: 'boolean' }, target_branch: { type: 'string' }, remote_write: { type: 'boolean', description: 'When true, push the exact locally integrated target revision to origin before cleanup and Work terminalization.' }, delete_branch: { type: 'boolean' }, cleanup: { type: 'boolean' }, no_ff: { type: 'boolean' }, approval_request_id: { type: 'string' },
|
|
71
|
-
completion_outcome: { type: 'string', enum: ['completed_changed', 'completed_no_change'] }, no_change_evidence: { type: 'string', description: 'Objective-specific proof that the requested state already holds; required for completed_no_change.' },
|
|
72
|
-
}, ['work_id'], false, true),
|
|
73
46
|
definition('approval_resolve', 'Resolve a controller approval request from the current conversation; GUI approval is optional and not required for continuation.', { session_id: sessionId, repo_id: repoId, work_id: workId, approval_request_id: { type: 'string' }, confirm_authorization: { type: 'boolean' } }, ['approval_request_id', 'confirm_authorization'], false),
|
|
74
47
|
definition('result_read', 'Read a session-scoped result reference with bounded pagination.', { session_id: sessionId, result_ref: { type: 'string' }, work_id: workId, cursor: { type: 'number' }, limit: { type: 'number' } }, ['result_ref'], true),
|
|
75
48
|
definition('result_search', 'Search a session-scoped result reference without returning the full payload.', { session_id: sessionId, result_ref: { type: 'string' }, work_id: workId, query: { type: 'string' }, limit: { type: 'number' } }, ['result_ref', 'query'], true),
|
|
@@ -77,15 +50,10 @@ export const executionToolDefinitions: McpToolDefinition[] = [
|
|
|
77
50
|
|
|
78
51
|
const executionToolNames = new Set(executionToolDefinitions.map((tool) => tool.name));
|
|
79
52
|
|
|
80
|
-
/**
|
|
81
|
-
* Work mutation tool names remain grouped for compatibility with older Worker
|
|
82
|
-
* entrypoints. On the public MCP surface they execute directly through
|
|
83
|
-
* WorkContract + Process Runtime ownership rather than durable ExecutionJobs.
|
|
84
|
-
*/
|
|
53
|
+
/** Repository execution and validation remain Process/WorkHandle operations; semantic Work completion is separate. */
|
|
85
54
|
const DURABLE_WORK_OPERATION_NAMES = new Set([
|
|
86
55
|
'work_execute',
|
|
87
56
|
'work_validate',
|
|
88
|
-
'work_finalize',
|
|
89
57
|
]);
|
|
90
58
|
|
|
91
59
|
export function isDurableWorkOperation(name: string): boolean {
|
|
@@ -102,7 +70,7 @@ function failure(error: unknown): CallToolResult {
|
|
|
102
70
|
return result({ error: { code, message } }, true);
|
|
103
71
|
}
|
|
104
72
|
|
|
105
|
-
function startOrResumeSession(ctx: MultiRepositoryMcpToolContext): ExecutionSessionContext {
|
|
73
|
+
export function startOrResumeSession(ctx: MultiRepositoryMcpToolContext): ExecutionSessionContext {
|
|
106
74
|
const permissionVersion = ctx.explicitRepository ? currentPermissionSnapshotVersion(ctx.controllerHome, ctx.explicitRepository.repoId) : 0;
|
|
107
75
|
return startExecutionSession(ctx.controllerHome, {
|
|
108
76
|
sessionId: ctx.sessionId,
|
|
@@ -135,15 +103,14 @@ function inspectWork(ctx: MultiRepositoryMcpToolContext, args: Record<string, un
|
|
|
135
103
|
git: { status, diff: { nameOnly: diff.nameOnly, stat: diff.stat, patch: diff.patch, truncated: diff.truncated } },
|
|
136
104
|
workContract: contract ? {
|
|
137
105
|
workId: contract.workId,
|
|
138
|
-
|
|
106
|
+
state: contract.semanticState,
|
|
139
107
|
objective: contract.objective,
|
|
140
108
|
checks: contract.checks,
|
|
141
109
|
acceptanceCriteria: contract.acceptanceCriteria,
|
|
142
|
-
allowedPaths: contract.allowedPaths,
|
|
143
110
|
semantics: buildWorkContinuationSnapshot(contract).semantics,
|
|
144
111
|
} : undefined,
|
|
145
112
|
continuation: contract ? buildWorkContinuationSnapshot(contract) : undefined,
|
|
146
|
-
paths: {
|
|
113
|
+
paths: { changed: diff.nameOnly },
|
|
147
114
|
checks: checks.map((checkId) => ({ checkId, registered: listControllerChecks(validated.worktreeRepository.canonicalRoot).some((check) => check.id === checkId) })),
|
|
148
115
|
package: packageManifest ? { name: packageManifest.name, scripts: packageManifest.scripts } : undefined,
|
|
149
116
|
};
|
|
@@ -166,7 +133,6 @@ export async function callExecutionTool(ctx: MultiRepositoryMcpToolContext, name
|
|
|
166
133
|
case 'work_inspect': return result(inspectWork(ctx, args));
|
|
167
134
|
case 'work_execute': return result(await executeWork(ctx, args));
|
|
168
135
|
case 'work_validate': return result(await validateWork(ctx, args));
|
|
169
|
-
case 'work_finalize': return result(await finalizeWork(ctx, args));
|
|
170
136
|
case 'approval_resolve': {
|
|
171
137
|
const session = requireSession(ctx, args);
|
|
172
138
|
const repositoryId = typeof args.repo_id === 'string' && args.repo_id.trim() ? args.repo_id.trim() : session.activeRepositoryId;
|
|
@@ -20,11 +20,12 @@ async function runEditSessionValidationViaProcessRuntime(
|
|
|
20
20
|
args: Record<string, unknown>,
|
|
21
21
|
): Promise<CallToolResult> {
|
|
22
22
|
const resolved = resolveEditValidationRepository(repository, editSessionId);
|
|
23
|
+
const explicitWorkId = typeof args.work_id === 'string' && args.work_id.trim() ? args.work_id.trim() : undefined;
|
|
23
24
|
const binding = claimedSessionEditBinding(ctx.controllerHome, resolved.repository, {
|
|
24
25
|
sessionId: ctx.sessionId,
|
|
25
26
|
principalId: ctx.principalId,
|
|
26
27
|
controllerInstanceId: ctx.controllerInstanceId,
|
|
27
|
-
},
|
|
28
|
+
}, explicitWorkId ?? resolved.session.workId);
|
|
28
29
|
assertEditSessionDurableBinding(resolved.session, binding, { requireBoundIdentity: true });
|
|
29
30
|
const validation = await startOrJoinEditValidation(ctx.controllerHome, resolved.repository, {
|
|
30
31
|
editSessionId,
|