@moretea-labs/forge 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +70 -7
- package/CHANGELOG.md +14 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +529 -56
- package/adapters/chatgpt/controller-binding-store.ts +101 -22
- package/adapters/chatgpt/controller-round-host.ts +15 -25
- package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
- package/adapters/chatgpt/provider-delivery.ts +228 -1
- package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
- package/adapters/computer/chatgpt-extension-target.ts +463 -0
- package/adapters/computer/chatgpt-target-router.ts +103 -0
- package/adapters/computer/chrome-extension/background.js +385 -0
- package/adapters/computer/chrome-extension/content.js +378 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +30 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/interaction-target-authority.ts +142 -18
- package/adapters/mcp/auth.ts +0 -1
- package/adapters/mcp/instructions.ts +5 -4
- package/adapters/mcp/multi-repository.ts +3 -19
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
- package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
- package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +411 -73
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +8 -42
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
- package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
- package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
- package/adapters/mcp/runtime-gateway/router.ts +18 -504
- package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
- package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
- package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +246 -0
- package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
- package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
- package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
- package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +263 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
- package/adapters/mcp/server.ts +67 -23
- package/adapters/mcp/setup.ts +1 -3
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
- package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
- package/adapters/mcp/toolset-names.ts +5 -0
- package/adapters/mcp/toolset.ts +6 -5
- package/adapters/mcp/transports/http-observation.ts +365 -0
- package/adapters/mcp/transports/http.ts +154 -677
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +6 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +25 -0
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/skill-version.json +2 -2
- package/docs/architecture/CURRENT.md +111 -41
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
- package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
- package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +221 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/domains/verification.md +1 -0
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
- package/docs/forge-plugin-management.md +2 -2
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +1 -1
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +2 -0
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/standalone-disaster-recovery.md +14 -6
- package/docs/wiki/Implementation.md +1 -1
- package/package.json +25 -14
- package/packages/kernel/cognition/api/index.ts +6 -0
- package/packages/kernel/cognition/application/activation-service.ts +451 -0
- package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
- package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
- package/packages/kernel/cognition/application/memory-service.ts +64 -0
- package/packages/kernel/cognition/domain/learning.ts +106 -0
- package/packages/kernel/cognition/domain/memory.ts +254 -0
- package/packages/kernel/controller/api/index.ts +1 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +12 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
- package/packages/kernel/controller/domain/controller-round.ts +4 -1
- package/packages/kernel/controller/domain/execution-quality.ts +3 -1
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +297 -71
- package/packages/kernel/controller/ports/controller-host.ts +2 -0
- package/packages/kernel/identity/api/index.ts +10 -0
- package/packages/kernel/identity/domain/activity-projection.ts +43 -0
- package/packages/kernel/identity/domain/capability-broker.ts +60 -0
- package/packages/kernel/identity/domain/grant.ts +72 -0
- package/packages/kernel/identity/domain/owned-resource.ts +116 -0
- package/packages/kernel/identity/domain/user-request.ts +93 -0
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +77 -0
- package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
- package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
- package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/scheduler/api/index.ts +0 -2
- package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
- package/packages/kernel/scheduler/application/settlement.ts +0 -15
- package/packages/kernel/scheduler/domain/schedule.ts +87 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +153 -133
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +17 -42
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-design.ts +10 -5
- package/packages/kernel/work/domain/engineering-profile.ts +8 -12
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
- package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
- package/packages/kernel/work/domain/implementation-review.ts +14 -331
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +25 -63
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/session-authority.ts +2 -1
- package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
- package/packages/plugin-runtime/computer/conversation-target.ts +143 -0
- package/packages/plugin-runtime/computer/index.ts +2 -0
- package/packages/plugin-runtime/computer/target-authority.ts +26 -1
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
- package/packages/protocols/computer/contract.ts +27 -1
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +48 -136
- package/scripts/check-runtime-architecture.mjs +622 -217
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/lib/project-init-lib.sh +3 -0
- package/scripts/open-source-audit-allowlist.txt +1 -2
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +0 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-mcp-http-runtime.ts +5 -0
- package/scripts/smoke-runtime-recovery.ts +12 -43
- package/scripts/smoke-schedule-engine.ts +23 -15
- package/scripts/smoke-unattended-transport-recovery.ts +223 -0
- package/scripts/smoke-user-request-continuation-restart.ts +232 -0
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +92 -0
- package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
- package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
- package/scripts/smoke-workflow-supervisor.ts +103 -0
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +11 -34
- package/src/cli/agent-jobs/integration.ts +18 -49
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- package/src/cli/commands/brain-assistant.ts +27 -13
- package/src/cli/commands/brain.ts +13 -15
- package/src/cli/commands/chatgpt.ts +1 -163
- package/src/cli/commands/recovery.ts +135 -121
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-profile.ts +8 -0
- package/src/cli/controller/check-runner.ts +13 -2
- package/src/cli/controller/completion-backlog.ts +3 -3
- package/src/cli/controller/completion-orchestrator.ts +4 -43
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/context/source-materializer.ts +81 -100
- package/src/cli/controller/context-pack.ts +10 -8
- package/src/cli/controller/execution-completion.ts +4 -7
- package/src/cli/controller/execution-policy.ts +36 -153
- package/src/cli/controller/governance.ts +2 -3
- package/src/cli/controller/issue-store.ts +4 -99
- package/src/cli/controller/launch-agents.ts +59 -18
- package/src/cli/controller/operational-plan.ts +24 -51
- package/src/cli/controller/runtime-config.ts +5 -1
- package/src/cli/controller/stuck-state-migration.ts +2 -3
- package/src/cli/controller/systemd-user.ts +39 -1
- package/src/cli/editing/edit-session.ts +1 -7
- package/src/cli/local-bridge/console-automations.ts +18 -13
- package/src/cli/local-bridge/console-view-models.ts +3 -12
- package/src/cli/local-bridge/facade-api.ts +64 -191
- package/src/cli/local-bridge/server.ts +24 -147
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +35 -16
- package/src/cli/repositories/controller-home.ts +48 -0
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/registry.ts +77 -11
- package/src/cli/repositories/structured-git.ts +62 -2
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/runtime/context/assistant-context.ts +20 -7
- package/src/runtime/context/assistant-work-context.ts +89 -27
- package/src/runtime/context/automatic-learning.ts +565 -0
- package/src/runtime/context/cognitive-attention.ts +173 -0
- package/src/runtime/context/cognitive-skill-canary.ts +158 -0
- package/src/runtime/context/context-closure.ts +46 -9
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +1 -9
- package/src/runtime/context/direct-controller-learning.ts +298 -0
- package/src/runtime/context/semantic-navigation-contract.ts +9 -0
- package/src/runtime/context/semantic-navigation.ts +6 -34
- package/src/runtime/context/typescript-navigation-process.ts +145 -0
- package/src/runtime/context/typescript-navigation.ts +89 -3
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +212 -9
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +6 -8
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
- package/src/runtime/control-plane/execution/work-delivery-service.ts +497 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
- package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
- package/src/runtime/control-plane/execution/work-handle-authority.ts +188 -109
- package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
- package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
- package/src/runtime/control-plane/execution/work-operation-service.ts +43 -27
- package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
- package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +173 -186
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
- package/src/runtime/control-plane/facade/capability-registry.ts +362 -37
- package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
- package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
- package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
- package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
- package/src/runtime/control-plane/facade/index.ts +0 -1
- package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
- package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
- package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
- package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
- package/src/runtime/control-plane/facade/types.ts +49 -108
- package/src/runtime/control-plane/facade/work-continuation.ts +8 -8
- package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +239 -112
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- package/src/runtime/control-plane/governance/access-policy.ts +19 -2
- package/src/runtime/control-plane/governance/authorization.ts +20 -3
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -300
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
- package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
- package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
- package/src/runtime/control-plane/release-retention.ts +135 -47
- package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
- package/src/runtime/control-plane/runtime-cleanup.ts +290 -21
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
- package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
- package/src/runtime/diagnostics/incident-repair.ts +313 -146
- package/src/runtime/diagnostics/mcp-timing.ts +114 -0
- package/src/runtime/evidence/artifact-store.ts +158 -40
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/execution/jobs/store.ts +3 -4
- package/src/runtime/execution/managed-workspace.ts +57 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
- package/src/runtime/execution/process-runtime/check-result.ts +105 -1
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
- package/src/runtime/execution/process-runtime/command-facade.ts +79 -27
- package/src/runtime/execution/process-runtime/gc.ts +15 -2
- package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
- package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
- package/src/runtime/execution/process-runtime/index.ts +3 -0
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
- package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
- package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
- package/src/runtime/execution/process-runtime/runtime.ts +35 -2
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/workers/executor.ts +2 -6
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +8 -0
- package/src/runtime/plugins/action-application.ts +85 -28
- package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
- package/src/runtime/plugins/browser-adapter.ts +757 -34
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
- package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +16 -0
- package/src/runtime/plugins/browser-runtime.ts +14 -1
- package/src/runtime/plugins/browser-session-authority.ts +2 -2
- package/src/runtime/plugins/browser-session-store.ts +46 -76
- package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +219 -0
- package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
- package/src/runtime/plugins/computer-registration.ts +222 -11
- package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
- package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
- package/src/runtime/plugins/external-adapter.ts +42 -6
- package/src/runtime/plugins/external-registration.ts +21 -1
- package/src/runtime/plugins/gmail-adapter.ts +23 -2
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +14 -7
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios-adapter.ts +1 -1
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -2
- package/src/runtime/plugins/managed-process-adapter.ts +12 -5
- package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
- package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +602 -428
- package/src/runtime/plugins/types.ts +20 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +3 -3
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +296 -0
- package/src/runtime/release/release-session.ts +716 -0
- package/src/runtime/release/release-state-migration.ts +25 -0
- package/src/runtime/resources/leases/store.ts +56 -25
- package/src/runtime/root/computer-composition.ts +191 -6
- package/src/runtime/root/controller-progression-composition.ts +192 -0
- package/src/runtime/root/controller-round-composition.ts +20 -1
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +111 -18
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +105 -19
- package/src/runtime/root/package-runtime-release.ts +117 -18
- package/src/runtime/root/package-runtime-service.ts +17 -11
- package/src/runtime/root/release-execution-canary.ts +44 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -6
- package/src/runtime/root/release-materialize.ts +372 -28
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +159 -27
- package/src/runtime/root/scheduled-controller-composition.ts +28 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +36 -33
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -3
- package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/process-environment.ts +20 -9
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
- package/src/runtime/standalone-recovery/core.ts +3702 -342
- package/src/runtime/standalone-recovery/entry.ts +469 -39
- package/src/runtime/standalone-recovery/installer.ts +262 -148
- package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
- package/src/runtime/standalone-recovery/operation-lock.ts +1 -1
- package/src/runtime/standalone-recovery/performance.ts +54 -16
- package/src/runtime/standalone-recovery/release.ts +53 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +10 -3
- package/src/runtime/workflow/schedules/engine.ts +138 -172
- package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
- package/src/runtime/workflows/runtime.ts +15 -19
- package/src/testing/test-governance.ts +5 -1
- package/supervisor/chatgpt-conversation.ts +23 -0
- package/supervisor/client.ts +201 -0
- package/supervisor/control-plane.ts +868 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +80 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +786 -0
- package/supervisor/native-messaging/host.ts +39 -0
- package/supervisor/native-messaging/manifest.ts +26 -0
- package/supervisor/native-messaging/protocol.ts +27 -0
- package/supervisor/paths.ts +18 -0
- package/supervisor/protocol.ts +202 -0
- package/supervisor/server.ts +404 -0
- package/supervisor/store.ts +1451 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +255 -0
- package/adapters/chatgpt/controller-host.ts +0 -119
- package/adapters/mcp/controller-round-compatibility.ts +0 -184
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
- package/packages/kernel/progression/api/index.ts +0 -2
- package/packages/kernel/progression/application/projector.ts +0 -211
- package/packages/kernel/progression/domain/types.ts +0 -116
- package/packages/kernel/progression/index.ts +0 -1
- package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
- package/packages/kernel/scheduler/domain/continuation.ts +0 -38
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
- package/packages/kernel/work/domain/admission-policy.ts +0 -34
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-computer-hotpath.ts +0 -255
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -191
- package/scripts/benchmark-ios-agent-device.ts +0 -511
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -169
- package/scripts/benchmark-operational-memory-activation.ts +0 -235
- package/scripts/benchmark-operational-shadow.ts +0 -28
- package/scripts/benchmark-quality-harness.ts +0 -146
- package/scripts/benchmark-route-session-concurrency.ts +0 -915
- package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
- package/scripts/benchmark-thin-harness.ts +0 -251
- package/scripts/benchmark-typescript-navigation.ts +0 -186
- package/scripts/benchmark-work-efficiency.ts +0 -334
- package/scripts/build-controller-ui.ts +0 -28
- package/scripts/check-npm-release.sh +0 -32
- package/scripts/check-public-release-surface.sh +0 -19
- package/scripts/check-release-published.sh +0 -57
- package/scripts/check-release-readiness.sh +0 -37
- package/scripts/check-release-version.mjs +0 -74
- package/scripts/check-tarball-install-smoke.sh +0 -150
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/stage-runtime-release.ts +0 -44
- package/src/cli/controller/progress.ts +0 -656
- package/src/cli/controller/work-mode.ts +0 -181
- package/src/cli/local-bridge/console-assets.ts +0 -17
- package/src/cli/local-bridge/dashboard.ts +0 -17
- package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
- package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
- package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
- package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
- package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/styles.css +0 -28
- package/src/cli/local-bridge/frontend/src/types.ts +0 -15
- package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
- package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
- package/src/cli/local-bridge/ui-dist/app.css +0 -1
- package/src/cli/local-bridge/ui-dist/app.js +0 -11228
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
- package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
- package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
- package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
- package/src/runtime/control-plane/routing/index.ts +0 -1
- package/src/runtime/control-plane/routing/route-policy.ts +0 -401
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { randomBytes } from "crypto";
|
|
2
2
|
import { readFileSync } from "fs";
|
|
3
|
-
import { spawn } from "child_process";
|
|
4
3
|
import { createServer, type Server } from "http";
|
|
5
4
|
import express, {
|
|
6
5
|
type NextFunction,
|
|
@@ -36,11 +35,6 @@ import {
|
|
|
36
35
|
} from "../controller/issue-store";
|
|
37
36
|
import { readTaskRunEvidence } from "../controller/run-evidence";
|
|
38
37
|
import { resolveEffectiveTaskState } from "../controller/task-status-resolver";
|
|
39
|
-
import {
|
|
40
|
-
getControllerTimeline,
|
|
41
|
-
getProjectProgress,
|
|
42
|
-
getTaskProgressDetail,
|
|
43
|
-
} from "../controller/progress";
|
|
44
38
|
import { buildControllerTaskLedgerProjection } from "../controller/task-ledger";
|
|
45
39
|
import { buildControllerOperationalPlan } from "../controller/operational-plan";
|
|
46
40
|
import { exportControllerWorklog, listControllerWorklogEvents, parseWorklogCategory } from "../controller/worklog";
|
|
@@ -73,8 +67,6 @@ import {
|
|
|
73
67
|
rollbackEditSession,
|
|
74
68
|
verifyEditSession,
|
|
75
69
|
} from "../editing/edit-session";
|
|
76
|
-
import { localBridgeDashboardHtml } from "./dashboard";
|
|
77
|
-
import { readConsoleAsset, type ConsoleAssetName } from "./console-assets";
|
|
78
70
|
import { applyConsoleAutomationAction, listConsoleAutomations, summarizeConsoleAutomations } from "./console-automations";
|
|
79
71
|
import {
|
|
80
72
|
ackConsoleHandoff,
|
|
@@ -89,21 +81,17 @@ import {
|
|
|
89
81
|
getConsolePlugin,
|
|
90
82
|
listConsolePlugins,
|
|
91
83
|
toConsoleOperationFeedback,
|
|
92
|
-
continueConsoleWork,
|
|
93
84
|
delegateConsoleWork,
|
|
94
85
|
dismissConsoleHandoff,
|
|
95
|
-
finalizeConsoleWork,
|
|
96
86
|
getConsoleHandoff,
|
|
97
87
|
getConsoleWork,
|
|
98
88
|
listConsoleHandoffs,
|
|
99
89
|
listConsoleWork,
|
|
100
90
|
mapRepositoryCard,
|
|
101
|
-
previewExecutionMode,
|
|
102
91
|
repairConsole,
|
|
103
92
|
resolveConsoleHandoff,
|
|
104
93
|
setConsoleAccessPolicy,
|
|
105
94
|
startConsoleWork,
|
|
106
|
-
stopConsoleWork,
|
|
107
95
|
verifyConsoleWork,
|
|
108
96
|
} from "./facade-api";
|
|
109
97
|
import {
|
|
@@ -113,7 +101,7 @@ import {
|
|
|
113
101
|
forgeToolSurfaceFingerprint,
|
|
114
102
|
defaultLocalAgentRunners,
|
|
115
103
|
} from "../controller/runtime-config";
|
|
116
|
-
import {
|
|
104
|
+
import { taskWriteScopesConflict } from "../controller/execution-policy";
|
|
117
105
|
import { continueTaskAfterSuccessfulRun } from "../controller/execution-completion";
|
|
118
106
|
import { applyCompletionDecision, completionDecisionQueues, finishCompletionBacklog, inspectCompletionBacklog } from "../controller/completion-backlog";
|
|
119
107
|
import { finishEditSession, finishTaskRun } from "../controller/completion-orchestrator";
|
|
@@ -158,7 +146,6 @@ export interface LocalBridgeServerOptions {
|
|
|
158
146
|
defaultRepoId?: string;
|
|
159
147
|
host?: string;
|
|
160
148
|
port?: number;
|
|
161
|
-
openBrowser?: boolean;
|
|
162
149
|
token?: string;
|
|
163
150
|
allowLanMobileIntents?: boolean;
|
|
164
151
|
mode?: "standalone" | "embedded" | "remote" | "disabled" | "unknown";
|
|
@@ -218,22 +205,6 @@ function cookieValue(request: Request, name: string): string | undefined {
|
|
|
218
205
|
return undefined;
|
|
219
206
|
}
|
|
220
207
|
|
|
221
|
-
function openUrl(url: string): void {
|
|
222
|
-
const command =
|
|
223
|
-
process.platform === "darwin"
|
|
224
|
-
? "open"
|
|
225
|
-
: process.platform === "win32"
|
|
226
|
-
? "cmd"
|
|
227
|
-
: "xdg-open";
|
|
228
|
-
const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
229
|
-
try {
|
|
230
|
-
const child = spawn(command, args, { detached: true, stdio: "ignore" });
|
|
231
|
-
child.unref();
|
|
232
|
-
} catch (_error) {
|
|
233
|
-
// The URL is still printed by the caller when a desktop opener is unavailable.
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
208
|
function errorMessage(error: unknown): string {
|
|
238
209
|
return error instanceof Error ? error.message : String(error);
|
|
239
210
|
}
|
|
@@ -263,6 +234,15 @@ function legacyControlPlaneMutationRetiredPayload(): Record<string, unknown> {
|
|
|
263
234
|
};
|
|
264
235
|
}
|
|
265
236
|
|
|
237
|
+
function legacyProgressProjectionRetiredPayload(): Record<string, unknown> {
|
|
238
|
+
return {
|
|
239
|
+
error: "LEGACY_PROGRESS_PROJECTION_RETIRED",
|
|
240
|
+
message: "Legacy Issue/Task progress projections were retired with the Local Bridge web UI. Use Requirement, Plan, Work and execution evidence APIs.",
|
|
241
|
+
authority: "controller-home-sqlite",
|
|
242
|
+
deprecated: true,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
266
246
|
function queryString(value: unknown): string | undefined {
|
|
267
247
|
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
268
248
|
}
|
|
@@ -545,8 +525,7 @@ export function buildLocalControllerSnapshot(repoRoot: string) {
|
|
|
545
525
|
projectState: loadControllerProjectState(repoRoot),
|
|
546
526
|
governance: inspectProjectGovernance(repoRoot),
|
|
547
527
|
recovery,
|
|
548
|
-
|
|
549
|
-
timeline: getControllerTimeline(repoRoot, { limit: 40 }),
|
|
528
|
+
timeline: listControllerWorklogEvents(repoRoot, { limit: 40 }),
|
|
550
529
|
githubPlugin: getGitHubPluginStatus(repoRoot),
|
|
551
530
|
assistantPlugins,
|
|
552
531
|
mobileIntents,
|
|
@@ -949,26 +928,6 @@ export async function startLocalBridgeServer(
|
|
|
949
928
|
next();
|
|
950
929
|
};
|
|
951
930
|
|
|
952
|
-
app.get("/console-assets/:asset", (request, response) => {
|
|
953
|
-
const asset = String(request.params.asset ?? "");
|
|
954
|
-
if (asset !== "app.js" && asset !== "app.css") { response.status(404).end(); return; }
|
|
955
|
-
response.setHeader("Cache-Control", "no-cache");
|
|
956
|
-
response.type(asset.endsWith(".css") ? "text/css" : "application/javascript");
|
|
957
|
-
response.send(readConsoleAsset(asset as ConsoleAssetName));
|
|
958
|
-
});
|
|
959
|
-
|
|
960
|
-
app.get("/", (_request, response) => {
|
|
961
|
-
response.setHeader("Cache-Control", "no-store, max-age=0");
|
|
962
|
-
response.setHeader("Pragma", "no-cache");
|
|
963
|
-
response.setHeader("Expires", "0");
|
|
964
|
-
response.setHeader("Referrer-Policy", "no-referrer");
|
|
965
|
-
response.setHeader(
|
|
966
|
-
"Set-Cookie",
|
|
967
|
-
`${cookieName}=${encodeURIComponent(token)}; Path=/api; HttpOnly; SameSite=Strict`,
|
|
968
|
-
);
|
|
969
|
-
response.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
970
|
-
response.send(localBridgeDashboardHtml());
|
|
971
|
-
});
|
|
972
931
|
app.get("/health", (_request, response) => {
|
|
973
932
|
const exposure = controllerExposureSnapshot(mcpExposureContext);
|
|
974
933
|
const fingerprint = exposure.fingerprint;
|
|
@@ -1242,15 +1201,15 @@ export async function startLocalBridgeServer(
|
|
|
1242
1201
|
repositoryName: repository.displayName,
|
|
1243
1202
|
})),
|
|
1244
1203
|
).sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
|
|
1245
|
-
const
|
|
1204
|
+
const stateOf = (item: (typeof items)[number]) => String(item.advanced?.state ?? "");
|
|
1246
1205
|
response.json({
|
|
1247
1206
|
schemaVersion: 1,
|
|
1248
1207
|
generatedAt: new Date().toISOString(),
|
|
1249
1208
|
summary: {
|
|
1250
1209
|
total: items.length,
|
|
1251
|
-
open: items.filter((item) =>
|
|
1252
|
-
needsAttention: items.filter((item) => ["blocked", "failed"].includes(
|
|
1253
|
-
completed: items.filter((item) => ["completed", "cancelled"].includes(
|
|
1210
|
+
open: items.filter((item) => stateOf(item) === "open").length,
|
|
1211
|
+
needsAttention: items.filter((item) => ["blocked", "failed", "needs_attention"].includes(item.phase)).length,
|
|
1212
|
+
completed: items.filter((item) => ["completed", "cancelled"].includes(stateOf(item))).length,
|
|
1254
1213
|
},
|
|
1255
1214
|
repositories: repositories.map((repository) => ({ repoId: repository.repoId, repositoryName: repository.displayName })),
|
|
1256
1215
|
items,
|
|
@@ -1388,28 +1347,6 @@ export async function startLocalBridgeServer(
|
|
|
1388
1347
|
}
|
|
1389
1348
|
});
|
|
1390
1349
|
|
|
1391
|
-
app.post("/api/console/mode-preview", (request, response) => {
|
|
1392
|
-
try {
|
|
1393
|
-
const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
|
|
1394
|
-
? request.body as Record<string, unknown>
|
|
1395
|
-
: {};
|
|
1396
|
-
const modePreview = previewExecutionMode({
|
|
1397
|
-
objective: queryString(body.objective) ?? "",
|
|
1398
|
-
expectedFiles: typeof body.expectedFiles === "number" ? body.expectedFiles : undefined,
|
|
1399
|
-
expectedChangedLines: typeof body.expectedChangedLines === "number" ? body.expectedChangedLines : undefined,
|
|
1400
|
-
scopeClear: body.scopeClear !== false,
|
|
1401
|
-
requiresInvestigation: body.requiresInvestigation === true,
|
|
1402
|
-
requiresLongRunningChecks: body.requiresLongRunningChecks === true,
|
|
1403
|
-
requiresWorker: body.requiresWorker === true,
|
|
1404
|
-
requiresApproval: body.requiresApproval === true,
|
|
1405
|
-
destructive: body.destructive === true,
|
|
1406
|
-
});
|
|
1407
|
-
response.json({ modePreview });
|
|
1408
|
-
} catch (error) {
|
|
1409
|
-
response.status(400).json({ error: errorMessage(error) });
|
|
1410
|
-
}
|
|
1411
|
-
});
|
|
1412
|
-
|
|
1413
1350
|
app.get("/api/console/inbox", (request, response) => {
|
|
1414
1351
|
try {
|
|
1415
1352
|
const status = queryString(request.query.status) === "all" ? "all"
|
|
@@ -1529,19 +1466,11 @@ export async function startLocalBridgeServer(
|
|
|
1529
1466
|
acceptanceCriteria: Array.isArray(body.acceptanceCriteria) ? body.acceptanceCriteria.map(String) : undefined,
|
|
1530
1467
|
allowedPaths: Array.isArray(body.allowedPaths) ? body.allowedPaths.map(String) : undefined,
|
|
1531
1468
|
forbiddenPaths: Array.isArray(body.forbiddenPaths) ? body.forbiddenPaths.map(String) : undefined,
|
|
1532
|
-
expectedFiles: typeof body.expectedFiles === "number" ? body.expectedFiles : undefined,
|
|
1533
|
-
expectedChangedLines: typeof body.expectedChangedLines === "number" ? body.expectedChangedLines : undefined,
|
|
1534
1469
|
scopeClear: body.scopeClear !== false,
|
|
1535
|
-
requiresInvestigation: body.requiresInvestigation === true,
|
|
1536
|
-
requiresLongRunningChecks: body.requiresLongRunningChecks === true,
|
|
1537
|
-
requiresWorker: body.requiresWorker === true,
|
|
1538
1470
|
requiresApproval: body.requiresApproval === true,
|
|
1539
1471
|
destructive: body.destructive === true,
|
|
1540
1472
|
accessMode: body.accessMode === 'full_access' ? 'full_access' : body.accessMode === 'request' ? 'request' : undefined,
|
|
1541
1473
|
approvalConfirmed: body.approvalConfirmed === true,
|
|
1542
|
-
forceMode: body.forceMode === "direct_control" || body.forceMode === "goal_workloop" || body.forceMode === "handoff_only"
|
|
1543
|
-
? body.forceMode
|
|
1544
|
-
: undefined,
|
|
1545
1474
|
checkIds: Array.isArray(body.checkIds) ? body.checkIds.map(String) : undefined,
|
|
1546
1475
|
});
|
|
1547
1476
|
const feedback = toConsoleOperationFeedback(result);
|
|
@@ -1560,18 +1489,6 @@ export async function startLocalBridgeServer(
|
|
|
1560
1489
|
return { ...result, ...feedback, feedback };
|
|
1561
1490
|
};
|
|
1562
1491
|
|
|
1563
|
-
app.post("/api/console/work/continue", (request, response) => {
|
|
1564
|
-
try {
|
|
1565
|
-
const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
|
|
1566
|
-
? request.body as Record<string, unknown>
|
|
1567
|
-
: {};
|
|
1568
|
-
const result = continueConsoleWork(consoleCtx(request), queryString(body.workId) ?? "", queryString(body.note));
|
|
1569
|
-
response.status(result.status === "not_found" ? 404 : result.status === "blocked" || result.status === "failed" ? 409 : 200).json(withFeedback(result));
|
|
1570
|
-
} catch (error) {
|
|
1571
|
-
response.status(400).json({ error: errorMessage(error) });
|
|
1572
|
-
}
|
|
1573
|
-
});
|
|
1574
|
-
|
|
1575
1492
|
app.post("/api/console/work/verify", async (request, response) => {
|
|
1576
1493
|
try {
|
|
1577
1494
|
const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
|
|
@@ -1590,30 +1507,6 @@ export async function startLocalBridgeServer(
|
|
|
1590
1507
|
}
|
|
1591
1508
|
});
|
|
1592
1509
|
|
|
1593
|
-
app.post("/api/console/work/finalize", (request, response) => {
|
|
1594
|
-
try {
|
|
1595
|
-
const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
|
|
1596
|
-
? request.body as Record<string, unknown>
|
|
1597
|
-
: {};
|
|
1598
|
-
const result = finalizeConsoleWork(consoleCtx(request), queryString(body.workId) ?? "");
|
|
1599
|
-
response.status(result.status === "not_found" ? 404 : result.status === "failed" || result.status === "blocked" ? 409 : 200).json(withFeedback(result));
|
|
1600
|
-
} catch (error) {
|
|
1601
|
-
response.status(400).json({ error: errorMessage(error) });
|
|
1602
|
-
}
|
|
1603
|
-
});
|
|
1604
|
-
|
|
1605
|
-
app.post("/api/console/work/stop", (request, response) => {
|
|
1606
|
-
try {
|
|
1607
|
-
const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
|
|
1608
|
-
? request.body as Record<string, unknown>
|
|
1609
|
-
: {};
|
|
1610
|
-
const result = stopConsoleWork(consoleCtx(request), queryString(body.workId) ?? "", queryString(body.reason));
|
|
1611
|
-
response.status(result.status === "not_found" ? 404 : 200).json(withFeedback(result));
|
|
1612
|
-
} catch (error) {
|
|
1613
|
-
response.status(400).json({ error: errorMessage(error) });
|
|
1614
|
-
}
|
|
1615
|
-
});
|
|
1616
|
-
|
|
1617
1510
|
app.post("/api/console/work/delegate", (request, response) => {
|
|
1618
1511
|
try {
|
|
1619
1512
|
const body = request.body && typeof request.body === "object" && !Array.isArray(request.body)
|
|
@@ -1890,13 +1783,6 @@ export async function startLocalBridgeServer(
|
|
|
1890
1783
|
response.status(400).json({ error: errorMessage(error) });
|
|
1891
1784
|
}
|
|
1892
1785
|
});
|
|
1893
|
-
app.get("/api/progress", (request, response) => {
|
|
1894
|
-
try {
|
|
1895
|
-
response.json(getProjectProgress(requestRepositoryRoot(request, options, controllerHome)));
|
|
1896
|
-
} catch (error) {
|
|
1897
|
-
response.status(400).json({ error: errorMessage(error) });
|
|
1898
|
-
}
|
|
1899
|
-
});
|
|
1900
1786
|
app.get("/api/governance", (request, response) => {
|
|
1901
1787
|
try {
|
|
1902
1788
|
response.json(inspectProjectGovernance(requestRepositoryRoot(request, options, controllerHome)));
|
|
@@ -2007,6 +1893,12 @@ export async function startLocalBridgeServer(
|
|
|
2007
1893
|
response.status(400).json({ error: errorMessage(error) });
|
|
2008
1894
|
}
|
|
2009
1895
|
});
|
|
1896
|
+
app.get("/api/progress", (_request, response) => {
|
|
1897
|
+
response.status(410).json(legacyProgressProjectionRetiredPayload());
|
|
1898
|
+
});
|
|
1899
|
+
app.get("/api/issues/:issueId/tasks/:taskId", (_request, response) => {
|
|
1900
|
+
response.status(410).json(legacyProgressProjectionRetiredPayload());
|
|
1901
|
+
});
|
|
2010
1902
|
app.patch("/api/project-state", (request, response) => {
|
|
2011
1903
|
try {
|
|
2012
1904
|
const body = request.body ?? {};
|
|
@@ -2093,7 +1985,6 @@ export async function startLocalBridgeServer(
|
|
|
2093
1985
|
response.json(issue);
|
|
2094
1986
|
return;
|
|
2095
1987
|
}
|
|
2096
|
-
const policy = taskExecutionPolicy(task);
|
|
2097
1988
|
const confirmAcceptance = request.body?.confirmAcceptance === true;
|
|
2098
1989
|
const reviewer = queryString(request.body?.reviewer) ?? "local-controller-human";
|
|
2099
1990
|
const latestRunId = task.runIds.at(-1);
|
|
@@ -2140,8 +2031,8 @@ export async function startLocalBridgeServer(
|
|
|
2140
2031
|
return { checkId, ok: false, summary: errorMessage(error) };
|
|
2141
2032
|
}
|
|
2142
2033
|
}));
|
|
2143
|
-
if (
|
|
2144
|
-
throw new Error(
|
|
2034
|
+
if (task.acceptanceCriteria.length > 0 && !confirmAcceptance) {
|
|
2035
|
+
throw new Error('Explicit Task acceptance criteria require acceptance evidence when no successful Run is linked');
|
|
2145
2036
|
}
|
|
2146
2037
|
const at = new Date().toISOString();
|
|
2147
2038
|
response.json(recordTaskVerification(repoRoot, issue.id, task.id, {
|
|
@@ -2278,7 +2169,7 @@ export async function startLocalBridgeServer(
|
|
|
2278
2169
|
app.get("/api/timeline", (request, response) => {
|
|
2279
2170
|
try {
|
|
2280
2171
|
response.json({
|
|
2281
|
-
events:
|
|
2172
|
+
events: listControllerWorklogEvents(requestRepositoryRoot(request, options, controllerHome), {
|
|
2282
2173
|
category: parseWorklogCategory(queryString(request.query.category)),
|
|
2283
2174
|
issueId: queryString(request.query.issueId),
|
|
2284
2175
|
taskId: queryString(request.query.taskId),
|
|
@@ -2293,19 +2184,6 @@ export async function startLocalBridgeServer(
|
|
|
2293
2184
|
response.status(400).json({ error: errorMessage(error) });
|
|
2294
2185
|
}
|
|
2295
2186
|
});
|
|
2296
|
-
app.get("/api/issues/:issueId/tasks/:taskId", (request, response) => {
|
|
2297
|
-
try {
|
|
2298
|
-
response.json(
|
|
2299
|
-
getTaskProgressDetail(
|
|
2300
|
-
requestRepositoryRoot(request, options, controllerHome),
|
|
2301
|
-
request.params.issueId,
|
|
2302
|
-
request.params.taskId,
|
|
2303
|
-
),
|
|
2304
|
-
);
|
|
2305
|
-
} catch (error) {
|
|
2306
|
-
response.status(404).json({ error: errorMessage(error) });
|
|
2307
|
-
}
|
|
2308
|
-
});
|
|
2309
2187
|
app.post("/api/worklog/export", (request, response) => {
|
|
2310
2188
|
try {
|
|
2311
2189
|
response.json(
|
|
@@ -2703,7 +2581,6 @@ export async function startLocalBridgeServer(
|
|
|
2703
2581
|
const port =
|
|
2704
2582
|
typeof address === "object" && address ? address.port : requestedPort;
|
|
2705
2583
|
const url = `http://${host === "::1" ? "[::1]" : host}:${port}/`;
|
|
2706
|
-
if (options.openBrowser) openUrl(url);
|
|
2707
2584
|
return {
|
|
2708
2585
|
host,
|
|
2709
2586
|
port,
|
|
@@ -167,7 +167,6 @@ export interface LocalBridgeConfig {
|
|
|
167
167
|
version: 1;
|
|
168
168
|
host?: string;
|
|
169
169
|
port?: number;
|
|
170
|
-
autoOpen?: boolean;
|
|
171
170
|
/** Allow only authenticated /mobile/intent requests on a wildcard/LAN bind. */
|
|
172
171
|
allowLanMobileIntents?: boolean;
|
|
173
172
|
approvals?: Partial<Record<LocalBridgeJobAction, LocalBridgeApproval>>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import {
|
|
2
|
+
mcpServiceOAuthTokenStoreFallbackPaths,
|
|
3
|
+
mcpServiceOAuthTokenStorePath,
|
|
4
|
+
} from '../../../adapters/mcp/auth';
|
|
5
|
+
import {
|
|
6
|
+
McpOAuthTokenStore,
|
|
7
|
+
type McpOAuthClientRetirementResult,
|
|
8
|
+
} from '../../../adapters/mcp/oauth';
|
|
9
|
+
import {
|
|
10
|
+
reconcilePluginCapabilityAuthorizations,
|
|
11
|
+
type ReconcilePluginCapabilityAuthorizationsResult,
|
|
12
|
+
} from '../../runtime/plugins/capability-authorization-grants';
|
|
13
|
+
|
|
14
|
+
export interface RetireMcpOAuthClientOptions {
|
|
15
|
+
now?: Date;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface RetireMcpOAuthClientResult {
|
|
19
|
+
clientId: string;
|
|
20
|
+
ownerScope: string;
|
|
21
|
+
oauth: McpOAuthClientRetirementResult;
|
|
22
|
+
capabilityAuthorizations: ReconcilePluginCapabilityAuthorizationsResult;
|
|
23
|
+
changed: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function requiredClientId(clientId: string): string {
|
|
27
|
+
const normalized = clientId.trim();
|
|
28
|
+
if (!normalized) throw new Error('MCP_OAUTH_CLIENT_ID_REQUIRED');
|
|
29
|
+
return normalized;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function mcpOAuthClientOwnerScope(clientId: string): string {
|
|
33
|
+
return `mcp:oauth-client:${requiredClientId(clientId)}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Converge one retired MCP OAuth client across Forge's existing authorities.
|
|
38
|
+
*
|
|
39
|
+
* Ordering is deliberate and idempotent:
|
|
40
|
+
* 1. revoke credentials and remove the OAuth registration in the OAuth store;
|
|
41
|
+
* 2. once the client is absent from that authority, reclaim only its exact
|
|
42
|
+
* capability-grant owner scope while compacting already-dead grants.
|
|
43
|
+
*
|
|
44
|
+
* This is ordered convergence across two atomic stores, not a fabricated
|
|
45
|
+
* cross-file transaction. A failure in step 2 can be retried safely: step 1
|
|
46
|
+
* becomes a no-op and the exact retired owner is reconciled on the next call.
|
|
47
|
+
*/
|
|
48
|
+
export function retireMcpOAuthClient(
|
|
49
|
+
controllerHome: string,
|
|
50
|
+
clientId: string,
|
|
51
|
+
options: RetireMcpOAuthClientOptions = {},
|
|
52
|
+
): RetireMcpOAuthClientResult {
|
|
53
|
+
const normalizedClientId = requiredClientId(clientId);
|
|
54
|
+
const store = new McpOAuthTokenStore(
|
|
55
|
+
mcpServiceOAuthTokenStorePath(controllerHome),
|
|
56
|
+
mcpServiceOAuthTokenStoreFallbackPaths(controllerHome),
|
|
57
|
+
);
|
|
58
|
+
store.load();
|
|
59
|
+
|
|
60
|
+
const oauth = store.retireClient(normalizedClientId);
|
|
61
|
+
const ownerScope = mcpOAuthClientOwnerScope(normalizedClientId);
|
|
62
|
+
const capabilityAuthorizations = reconcilePluginCapabilityAuthorizations(controllerHome, {
|
|
63
|
+
retiredOwnerScopes: [ownerScope],
|
|
64
|
+
now: options.now,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
clientId: normalizedClientId,
|
|
69
|
+
ownerScope,
|
|
70
|
+
oauth,
|
|
71
|
+
capabilityAuthorizations,
|
|
72
|
+
changed: oauth.changed || capabilityAuthorizations.changed,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -4,7 +4,7 @@ import { appendFileSync, existsSync, lstatSync, mkdirSync } from 'fs';
|
|
|
4
4
|
import { dirname, join, relative, resolve } from 'path';
|
|
5
5
|
import { capProcessOutput, redactProcessOutput } from '../../effects/process-runner';
|
|
6
6
|
import { MAX_AGENT_TIMEOUT_MS, MIN_AGENT_TIMEOUT_MS } from '../controller/runtime-config';
|
|
7
|
-
import {
|
|
7
|
+
import { scopedOperationRoot } from './controller-home';
|
|
8
8
|
import {
|
|
9
9
|
classifyRepositoryCommand,
|
|
10
10
|
type RepositoryCommandAuthorization,
|
|
@@ -13,6 +13,8 @@ import {
|
|
|
13
13
|
import {
|
|
14
14
|
assertCommandPathOperandsStayInRepository,
|
|
15
15
|
assertRepositoryCommandInputAllowed,
|
|
16
|
+
commandExecutionScopeKey,
|
|
17
|
+
type RepositoryCommandScopeTarget,
|
|
16
18
|
type RepositoryCommandExternalPathUsage,
|
|
17
19
|
resolveRepositoryCommandCwd,
|
|
18
20
|
} from './command-scope';
|
|
@@ -22,7 +24,7 @@ import type { RepositoryRecord } from './types';
|
|
|
22
24
|
import { readRepositoryAccessPolicy } from '../../runtime/control-plane/governance/access-policy';
|
|
23
25
|
import { invalidateRepositoryReadCaches } from '../repository/inspector';
|
|
24
26
|
import { assertResolvedAuthorization, decideAuthorization, type AuthorizationDecision } from '../../runtime/control-plane/governance/authorization';
|
|
25
|
-
import { assertRuntimeMayWriteOrThrow } from '../../runtime/root/write-fence';
|
|
27
|
+
import { assertRuntimeMayWriteOrThrow, isRuntimeWriteFenceError } from '../../runtime/root/write-fence';
|
|
26
28
|
import { commandEnvironment, runCanonicalCommand, type RepositoryCommandAsyncHooks, type SpawnCommandResult } from './command-process';
|
|
27
29
|
import {
|
|
28
30
|
changedSnapshotPaths,
|
|
@@ -77,11 +79,13 @@ export interface ExecuteRepositoryCommandInput {
|
|
|
77
79
|
snapshotFingerprintTimeoutMs?: number;
|
|
78
80
|
}
|
|
79
81
|
|
|
82
|
+
export type { RepositoryCommandScopeTarget as RepositoryCommandExecutionTarget };
|
|
83
|
+
|
|
80
84
|
|
|
81
85
|
export interface RepositoryCommandExecution {
|
|
82
86
|
status: 'preview' | 'approval_required' | 'executed';
|
|
83
87
|
repoId: string;
|
|
84
|
-
checkoutId
|
|
88
|
+
checkoutId?: string;
|
|
85
89
|
cwd: string;
|
|
86
90
|
command: RepositoryCommandValue;
|
|
87
91
|
classification: RepositoryCommandClassification;
|
|
@@ -170,7 +174,7 @@ function boundedSnapshotFingerprintPaths(
|
|
|
170
174
|
}
|
|
171
175
|
|
|
172
176
|
function approvalToken(
|
|
173
|
-
repository:
|
|
177
|
+
repository: RepositoryCommandScopeTarget,
|
|
174
178
|
relativeCwd: string,
|
|
175
179
|
command: RepositoryCommandValue,
|
|
176
180
|
classification: RepositoryCommandClassification,
|
|
@@ -179,7 +183,7 @@ function approvalToken(
|
|
|
179
183
|
): string {
|
|
180
184
|
return createHash('sha256').update(JSON.stringify({
|
|
181
185
|
version: 2,
|
|
182
|
-
repoId: repository
|
|
186
|
+
repoId: commandExecutionScopeKey(repository),
|
|
183
187
|
checkoutId: repository.activeCheckoutId,
|
|
184
188
|
cwd: relativeCwd,
|
|
185
189
|
command,
|
|
@@ -190,7 +194,7 @@ function approvalToken(
|
|
|
190
194
|
}
|
|
191
195
|
|
|
192
196
|
function finalizePreparedExecution(
|
|
193
|
-
repository:
|
|
197
|
+
repository: RepositoryCommandScopeTarget,
|
|
194
198
|
input: ExecuteRepositoryCommandInput,
|
|
195
199
|
controllerHome: string | undefined,
|
|
196
200
|
root: string,
|
|
@@ -213,7 +217,7 @@ function finalizePreparedExecution(
|
|
|
213
217
|
} {
|
|
214
218
|
const commandForPersistence = commandValue(command);
|
|
215
219
|
const token = approvalToken(repository, relativeCwd, commandForPersistence, classification, before, externalPathUsages);
|
|
216
|
-
const permission = controllerHome ? readRepositoryAccessPolicy(controllerHome, repository
|
|
220
|
+
const permission = controllerHome ? readRepositoryAccessPolicy(controllerHome, commandExecutionScopeKey(repository)) : undefined;
|
|
217
221
|
const isGit = command.kind === 'argv'
|
|
218
222
|
? command.executable?.split(/[\\/]/).at(-1)?.toLowerCase() === 'git'
|
|
219
223
|
: /^\s*git\s+/i.test(command.shellCommand!);
|
|
@@ -226,8 +230,8 @@ function finalizePreparedExecution(
|
|
|
226
230
|
controllerHome,
|
|
227
231
|
accessMode: permission?.mode ?? 'request',
|
|
228
232
|
risk,
|
|
229
|
-
repositoryId: repository
|
|
230
|
-
currentRepositoryId: repository
|
|
233
|
+
repositoryId: commandExecutionScopeKey(repository),
|
|
234
|
+
currentRepositoryId: commandExecutionScopeKey(repository),
|
|
231
235
|
permissionSnapshotVersion: permission?.revision ?? 1,
|
|
232
236
|
approvalToken: token,
|
|
233
237
|
command: commandForPersistence,
|
|
@@ -237,14 +241,14 @@ function finalizePreparedExecution(
|
|
|
237
241
|
...(input.workId ? { workId: input.workId, boundWorkId: input.workId } : {}),
|
|
238
242
|
}) : undefined);
|
|
239
243
|
const resolved = controllerHome && input.approvalRequestId
|
|
240
|
-
? assertResolvedAuthorization({ controllerHome, repositoryId: repository
|
|
244
|
+
? assertResolvedAuthorization({ controllerHome, repositoryId: commandExecutionScopeKey(repository), approvalRequestId: input.approvalRequestId, sessionId: input.sessionId, principalId: input.principalId, workId: input.workId, permissionSnapshotVersion: permission?.revision ?? 1, command: commandForPersistence })
|
|
241
245
|
: undefined;
|
|
242
246
|
const effectiveDecision: AuthorizationDecision | undefined = resolved
|
|
243
247
|
? { decision: 'allow', source: 'user_confirmation', reason: 'Resolved approval request matches the exact command and current permission snapshot.' }
|
|
244
248
|
: delegated;
|
|
245
249
|
const execution: RepositoryCommandExecution = {
|
|
246
250
|
status: input.dryRun === true ? 'preview' : 'approval_required',
|
|
247
|
-
repoId: repository
|
|
251
|
+
repoId: commandExecutionScopeKey(repository),
|
|
248
252
|
checkoutId: repository.activeCheckoutId,
|
|
249
253
|
cwd: relativeCwd,
|
|
250
254
|
command: commandForPersistence,
|
|
@@ -277,7 +281,7 @@ function finalizePreparedExecution(
|
|
|
277
281
|
}
|
|
278
282
|
|
|
279
283
|
function prepareRepositoryCommandExecution(
|
|
280
|
-
repository:
|
|
284
|
+
repository: RepositoryCommandScopeTarget,
|
|
281
285
|
input: ExecuteRepositoryCommandInput,
|
|
282
286
|
controllerHome?: string,
|
|
283
287
|
): {
|
|
@@ -298,7 +302,7 @@ function prepareRepositoryCommandExecution(
|
|
|
298
302
|
const externalGrants = loadExternalFilesystemGrants(root).grants;
|
|
299
303
|
const externalPathUsages = assertCommandPathOperandsStayInRepository(command, cwd, root, externalGrants, {
|
|
300
304
|
controllerHome,
|
|
301
|
-
repositoryId: repository
|
|
305
|
+
repositoryId: commandExecutionScopeKey(repository),
|
|
302
306
|
});
|
|
303
307
|
const classification = classifyRepositoryCommand(command, repository.defaultBranch);
|
|
304
308
|
const before = input.reuseSnapshot ?? (input.allowNonGitWorkspace ? emptyWorkspaceSnapshot() : repositorySnapshot(root));
|
|
@@ -317,7 +321,7 @@ function prepareRepositoryCommandExecution(
|
|
|
317
321
|
}
|
|
318
322
|
|
|
319
323
|
async function prepareRepositoryCommandExecutionAsync(
|
|
320
|
-
repository:
|
|
324
|
+
repository: RepositoryCommandScopeTarget,
|
|
321
325
|
input: ExecuteRepositoryCommandInput,
|
|
322
326
|
controllerHome?: string,
|
|
323
327
|
mode: 'standard' | 'readonly_direct' = 'standard',
|
|
@@ -339,7 +343,7 @@ async function prepareRepositoryCommandExecutionAsync(
|
|
|
339
343
|
const externalGrants = loadExternalFilesystemGrants(root).grants;
|
|
340
344
|
const externalPathUsages = assertCommandPathOperandsStayInRepository(command, cwd, root, externalGrants, {
|
|
341
345
|
controllerHome,
|
|
342
|
-
repositoryId: repository
|
|
346
|
+
repositoryId: commandExecutionScopeKey(repository),
|
|
343
347
|
});
|
|
344
348
|
const classification = classifyRepositoryCommand(command, repository.defaultBranch);
|
|
345
349
|
if (mode === 'readonly_direct' && classification.risk !== 'readonly') {
|
|
@@ -373,7 +377,7 @@ async function prepareRepositoryCommandExecutionAsync(
|
|
|
373
377
|
}
|
|
374
378
|
|
|
375
379
|
export function previewRepositoryCommandExecution(
|
|
376
|
-
repository:
|
|
380
|
+
repository: RepositoryCommandScopeTarget,
|
|
377
381
|
input: ExecuteRepositoryCommandInput,
|
|
378
382
|
controllerHome?: string,
|
|
379
383
|
): PreparedRepositoryCommandExecution {
|
|
@@ -387,7 +391,7 @@ export function previewRepositoryCommandExecution(
|
|
|
387
391
|
|
|
388
392
|
/** Async preview — preferred on Fast Path to avoid blocking Gateway with sync git snapshots. */
|
|
389
393
|
export async function previewRepositoryCommandExecutionAsync(
|
|
390
|
-
repository:
|
|
394
|
+
repository: RepositoryCommandScopeTarget,
|
|
391
395
|
input: ExecuteRepositoryCommandInput,
|
|
392
396
|
controllerHome?: string,
|
|
393
397
|
): Promise<PreparedRepositoryCommandExecution> {
|
|
@@ -401,10 +405,12 @@ export async function previewRepositoryCommandExecutionAsync(
|
|
|
401
405
|
|
|
402
406
|
function auditCommand(
|
|
403
407
|
controllerHome: string,
|
|
404
|
-
repository:
|
|
408
|
+
repository: RepositoryCommandScopeTarget,
|
|
405
409
|
execution: RepositoryCommandExecution,
|
|
406
410
|
): void {
|
|
407
|
-
|
|
411
|
+
// A workspace target has no repository semantics; its command audit belongs to
|
|
412
|
+
// the workspace partition, not a synthetic repository partition.
|
|
413
|
+
const path = join(scopedOperationRoot(controllerHome, commandExecutionScopeKey(repository)), 'audit', 'commands.jsonl');
|
|
408
414
|
mkdirSync(dirname(path), { recursive: true });
|
|
409
415
|
appendFileSync(path, `${JSON.stringify({
|
|
410
416
|
timestamp: new Date().toISOString(),
|
|
@@ -416,7 +422,7 @@ function auditCommand(
|
|
|
416
422
|
|
|
417
423
|
export function executeRepositoryCommand(
|
|
418
424
|
controllerHome: string,
|
|
419
|
-
repository:
|
|
425
|
+
repository: RepositoryCommandScopeTarget,
|
|
420
426
|
input: ExecuteRepositoryCommandInput,
|
|
421
427
|
): RepositoryCommandExecution {
|
|
422
428
|
const prepared = prepareRepositoryCommandExecution(repository, input, controllerHome);
|
|
@@ -439,7 +445,7 @@ export function executeRepositoryCommand(
|
|
|
439
445
|
try {
|
|
440
446
|
assertRuntimeMayWriteOrThrow('remote_side_effect', controllerHome);
|
|
441
447
|
} catch (error) {
|
|
442
|
-
if (error
|
|
448
|
+
if (isRuntimeWriteFenceError(error)) throw error;
|
|
443
449
|
/* unbound legacy */
|
|
444
450
|
}
|
|
445
451
|
}
|
|
@@ -499,7 +505,7 @@ export function executeRepositoryCommand(
|
|
|
499
505
|
* mutation snapshot or Controller write state, Process records, Leases, Jobs or receipts.
|
|
500
506
|
*/
|
|
501
507
|
export async function executeRepositoryReadOnlyCommandDirect(
|
|
502
|
-
repository:
|
|
508
|
+
repository: RepositoryCommandScopeTarget,
|
|
503
509
|
input: ExecuteRepositoryCommandInput,
|
|
504
510
|
): Promise<RepositoryCommandExecution> {
|
|
505
511
|
const prepared = await prepareRepositoryCommandExecutionAsync(
|
|
@@ -564,7 +570,7 @@ export async function executeRepositoryReadOnlyCommandDirect(
|
|
|
564
570
|
|
|
565
571
|
export async function executeRepositoryCommandAsync(
|
|
566
572
|
controllerHome: string,
|
|
567
|
-
repository:
|
|
573
|
+
repository: RepositoryCommandScopeTarget,
|
|
568
574
|
input: ExecuteRepositoryCommandInput,
|
|
569
575
|
hooks: RepositoryCommandAsyncHooks = {},
|
|
570
576
|
): Promise<RepositoryCommandExecution> {
|