@moretea-labs/forge 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +73 -7
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/README.en.md +24 -3
- package/README.md +10 -6
- package/README.zh-CN.md +5 -3
- package/THIRD_PARTY_NOTICES.md +1 -2
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
- package/adapters/chatgpt/controller-binding-store.ts +101 -22
- package/adapters/chatgpt/controller-round-host.ts +15 -25
- package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
- package/adapters/chatgpt/provider-delivery.ts +229 -2
- package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
- package/adapters/computer/chatgpt-extension-target.ts +708 -0
- package/adapters/computer/chrome-extension/background.js +541 -0
- package/adapters/computer/chrome-extension/content.js +402 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +32 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/desktop-operator-provider.ts +18 -6
- package/adapters/computer/interaction-target-authority.ts +178 -24
- package/adapters/mcp/access-mode.ts +18 -39
- package/adapters/mcp/auth.ts +2 -7
- package/adapters/mcp/instructions.ts +6 -5
- package/adapters/mcp/multi-repository.ts +10 -47
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
- package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
- package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
- package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
- package/adapters/mcp/runtime-gateway/router.ts +19 -507
- package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
- package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
- package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
- package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
- package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
- package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
- package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
- package/adapters/mcp/server.ts +91 -26
- package/adapters/mcp/setup.ts +5 -13
- package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
- package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
- package/adapters/mcp/toolset-names.ts +11 -37
- package/adapters/mcp/toolset.ts +19 -92
- package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
- package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
- package/adapters/mcp/transports/http-observation.ts +377 -0
- package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
- package/adapters/mcp/transports/http.ts +200 -683
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +6 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
- package/adapters/mcp/types.ts +0 -6
- package/assets/hooks/lib/session-state.sh +0 -38
- package/assets/hooks/post-bash.sh +1 -1
- package/assets/hooks/post-tool-observer.sh +0 -5
- package/assets/hooks/prompt-guard.sh +0 -55
- package/assets/partials/04-project-structure.partial.md +1 -1
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -1
- package/assets/partials-agents/08-deep-docs.partial.md +1 -1
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +26 -1
- package/assets/reference-configs/external-tooling.md +0 -76
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/reference-configs/release-deploy.md +1 -1
- package/assets/templates/helpers/architecture-queue.sh +1 -1
- package/assets/templates/helpers/check-agent-tooling.sh +1 -327
- package/assets/templates/helpers/check-task-workflow.sh +1 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
- package/assets/templates/helpers/migrate-project-template.sh +2 -2
- package/assets/workflow-contract.v1.json +0 -2
- package/docs/README.md +5 -2
- package/docs/architecture/CURRENT.md +205 -51
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
- package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
- package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
- package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
- package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
- package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
- package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
- package/docs/architecture/domains/public-surface.md +3 -5
- package/docs/architecture/domains/verification.md +6 -5
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
- package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
- package/docs/forge-plugin-management.md +16 -4
- package/docs/operations/controller-browser-plugin.md +23 -0
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +6 -7
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/github-repository.md +4 -4
- package/docs/operations/github-semantic-release-projection.md +20 -0
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +13 -52
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/runtime-performance-diagnostics.md +8 -0
- package/docs/operations/standalone-disaster-recovery.md +15 -7
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/03-first-repository-task.md +2 -0
- package/docs/wiki/Computer-and-Plugins.md +78 -0
- package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
- package/docs/wiki/Home.md +16 -2
- package/docs/wiki/Implementation.md +25 -13
- package/docs/wiki/Installation.md +28 -32
- package/docs/wiki/Integrations.md +4 -0
- package/docs/wiki/Quick-Start.md +35 -22
- package/docs/wiki/Releases-and-Upgrades.md +15 -25
- package/docs/wiki/_Sidebar.md +5 -1
- package/package.json +25 -25
- package/packages/kernel/cognition/api/index.ts +6 -0
- package/packages/kernel/cognition/application/activation-service.ts +451 -0
- package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
- package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
- package/packages/kernel/cognition/application/memory-service.ts +64 -0
- package/packages/kernel/cognition/domain/learning.ts +106 -0
- package/packages/kernel/cognition/domain/memory.ts +254 -0
- package/packages/kernel/controller/api/index.ts +1 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +12 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
- package/packages/kernel/controller/domain/controller-round.ts +4 -1
- package/packages/kernel/controller/domain/execution-quality.ts +3 -1
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
- package/packages/kernel/controller/ports/controller-host.ts +2 -0
- package/packages/kernel/identity/api/index.ts +10 -0
- package/packages/kernel/identity/domain/activity-projection.ts +43 -0
- package/packages/kernel/identity/domain/capability-broker.ts +60 -0
- package/packages/kernel/identity/domain/grant.ts +72 -0
- package/packages/kernel/identity/domain/owned-resource.ts +116 -0
- package/packages/kernel/identity/domain/user-request.ts +93 -0
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
- package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
- package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
- package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/scheduler/api/index.ts +0 -2
- package/packages/kernel/scheduler/application/eligibility.ts +4 -1
- package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
- package/packages/kernel/scheduler/application/settlement.ts +0 -15
- package/packages/kernel/scheduler/domain/schedule.ts +87 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +18 -42
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-design.ts +10 -5
- package/packages/kernel/work/domain/engineering-profile.ts +8 -12
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
- package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
- package/packages/kernel/work/domain/implementation-review.ts +14 -331
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +34 -65
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
- package/packages/plugin-runtime/browser/session-authority.ts +2 -1
- package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
- package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
- package/packages/plugin-runtime/computer/index.ts +2 -0
- package/packages/plugin-runtime/computer/target-authority.ts +26 -1
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
- package/packages/protocols/computer/contract.ts +27 -1
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/assemble-template.ts +11 -72
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +94 -201
- package/scripts/check-package-identity.mjs +0 -5
- package/scripts/check-runtime-architecture.mjs +921 -239
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/init-project.sh +0 -46
- package/scripts/install-ios-hid-toolchain.sh +60 -0
- package/scripts/install-standalone-recovery.ts +1 -1
- package/scripts/lib/project-init-lib.sh +6 -3
- package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
- package/scripts/open-source-audit-allowlist.txt +1 -3
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-ios-physical-device.ts +38 -10
- package/scripts/smoke-mcp-http-runtime.ts +12 -8
- package/scripts/smoke-mcp-tool-surface.ts +27 -41
- package/scripts/smoke-runtime-recovery.ts +12 -43
- package/scripts/smoke-schedule-engine.ts +23 -15
- package/scripts/smoke-unattended-transport-recovery.ts +223 -0
- package/scripts/smoke-user-request-continuation-restart.ts +232 -0
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
- package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
- package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
- package/scripts/smoke-workflow-supervisor.ts +103 -0
- package/scripts/sync-generated-authority.mjs +0 -1
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +12 -35
- package/src/cli/agent-jobs/integration.ts +20 -51
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- package/src/cli/chatgpt-browser/file-policy.ts +2 -2
- package/src/cli/commands/brain-assistant.ts +27 -13
- package/src/cli/commands/brain.ts +13 -15
- package/src/cli/commands/chatgpt.ts +1 -163
- package/src/cli/commands/doctor.ts +1 -143
- package/src/cli/commands/global-runtime.ts +3 -196
- package/src/cli/commands/init-hook.ts +6 -23
- package/src/cli/commands/init.ts +3 -252
- package/src/cli/commands/mcp.ts +0 -5
- package/src/cli/commands/prompt-guard-decision.ts +0 -2
- package/src/cli/commands/recovery.ts +137 -135
- package/src/cli/commands/repository.ts +17 -1
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-execution.ts +41 -0
- package/src/cli/commands/setup-profile.ts +8 -0
- package/src/cli/controller/check-runner.ts +13 -2
- package/src/cli/controller/completion-backlog.ts +3 -3
- package/src/cli/controller/completion-orchestrator.ts +5 -44
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/composite-operations.ts +1 -1
- package/src/cli/controller/context/instruction-context.ts +1 -1
- package/src/cli/controller/context/known-paths.ts +2 -2
- package/src/cli/controller/context/query-planning.ts +11 -4
- package/src/cli/controller/context/rule-resolution.ts +2 -2
- package/src/cli/controller/context/source-materializer.ts +83 -102
- package/src/cli/controller/context/structural-provider.ts +84 -0
- package/src/cli/controller/context/structural.ts +6 -6
- package/src/cli/controller/context/types.ts +8 -9
- package/src/cli/controller/context-pack.ts +107 -84
- package/src/cli/controller/execution-completion.ts +4 -7
- package/src/cli/controller/execution-policy.ts +36 -153
- package/src/cli/controller/governance.ts +2 -3
- package/src/cli/controller/issue-store.ts +4 -99
- package/src/cli/controller/launch-agents.ts +59 -18
- package/src/cli/controller/operational-plan.ts +25 -52
- package/src/cli/controller/runtime-config.ts +5 -1
- package/src/cli/controller/stuck-state-migration.ts +2 -3
- package/src/cli/controller/systemd-user.ts +42 -10
- package/src/cli/editing/edit-session.ts +18 -12
- package/src/cli/github/github.ts +4 -4
- package/src/cli/github/semantic-projection.ts +174 -0
- package/src/cli/hook/prompt-intents.ts +0 -9
- package/src/cli/index.ts +1 -43
- package/src/cli/local-bridge/connector-freshness.ts +1 -12
- package/src/cli/local-bridge/console-automations.ts +19 -14
- package/src/cli/local-bridge/console-view-models.ts +4 -13
- package/src/cli/local-bridge/facade-api.ts +64 -193
- package/src/cli/local-bridge/server.ts +24 -147
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/repositories/command-classifier.ts +0 -9
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +37 -18
- package/src/cli/repositories/controller-home.ts +48 -0
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/locks.ts +20 -0
- package/src/cli/repositories/registry.ts +79 -12
- package/src/cli/repositories/safe-patch.ts +2 -12
- package/src/cli/repositories/structured-git.ts +101 -5
- package/src/cli/repository/inspector.ts +185 -343
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/effects/process-runner.ts +17 -1
- package/src/runtime/context/assistant-context.ts +20 -7
- package/src/runtime/context/assistant-work-context.ts +89 -27
- package/src/runtime/context/automatic-learning.ts +565 -0
- package/src/runtime/context/cognitive-attention.ts +173 -0
- package/src/runtime/context/cognitive-skill-canary.ts +158 -0
- package/src/runtime/context/context-closure.ts +46 -9
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +1 -9
- package/src/runtime/context/direct-controller-learning.ts +298 -0
- package/src/runtime/context/generic-lsp-provider.ts +1 -1
- package/src/runtime/context/semantic-navigation-contract.ts +16 -0
- package/src/runtime/context/semantic-navigation.ts +7 -35
- package/src/runtime/context/typescript-navigation-process.ts +145 -0
- package/src/runtime/context/typescript-navigation.ts +89 -3
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +6 -8
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
- package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
- package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
- package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
- package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
- package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
- package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
- package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
- package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
- package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
- package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
- package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
- package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
- package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
- package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
- package/src/runtime/control-plane/facade/index.ts +0 -1
- package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
- package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
- package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
- package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
- package/src/runtime/control-plane/facade/types.ts +49 -108
- package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
- package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- package/src/runtime/control-plane/governance/access-policy.ts +19 -2
- package/src/runtime/control-plane/governance/authorization.ts +20 -3
- package/src/runtime/control-plane/governance/external-effects.ts +1 -1
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
- package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
- package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
- package/src/runtime/control-plane/release-retention.ts +135 -47
- package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
- package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
- package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
- package/src/runtime/diagnostics/incident-repair.ts +313 -146
- package/src/runtime/diagnostics/mcp-timing.ts +114 -0
- package/src/runtime/evidence/artifact-store.ts +158 -40
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/evidence/sensitive-output.ts +22 -2
- package/src/runtime/execution/jobs/child-reference.ts +11 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
- package/src/runtime/execution/jobs/store.ts +3 -4
- package/src/runtime/execution/managed-workspace.ts +57 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
- package/src/runtime/execution/process-runtime/check-result.ts +105 -1
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
- package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
- package/src/runtime/execution/process-runtime/gc.ts +15 -2
- package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
- package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
- package/src/runtime/execution/process-runtime/index.ts +3 -0
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
- package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
- package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
- package/src/runtime/execution/process-runtime/runtime.ts +55 -18
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
- package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
- package/src/runtime/execution/workers/executor.ts +3 -8
- package/src/runtime/maintenance/cleanup.ts +41 -5
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +8 -0
- package/src/runtime/plugins/action-application.ts +97 -29
- package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
- package/src/runtime/plugins/browser-adapter.ts +1124 -333
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
- package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +18 -0
- package/src/runtime/plugins/browser-runtime.ts +40 -36
- package/src/runtime/plugins/browser-session-authority.ts +2 -2
- package/src/runtime/plugins/browser-session-store.ts +46 -76
- package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
- package/src/runtime/plugins/computer-registration.ts +298 -20
- package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
- package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
- package/src/runtime/plugins/external-adapter.ts +42 -6
- package/src/runtime/plugins/external-registration.ts +21 -1
- package/src/runtime/plugins/github-adapter.ts +30 -3
- package/src/runtime/plugins/gmail-adapter.ts +189 -3
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +24 -12
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
- package/src/runtime/plugins/ios-adapter.ts +46 -41
- package/src/runtime/plugins/ios-agent-device.ts +54 -4
- package/src/runtime/plugins/ios-device-ownership.ts +103 -0
- package/src/runtime/plugins/ios-physical-device.ts +497 -79
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -100
- package/src/runtime/plugins/managed-process-adapter.ts +12 -5
- package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
- package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +682 -435
- package/src/runtime/plugins/types.ts +24 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/git-status-sampler.ts +2 -19
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +4 -4
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/probe.ts +2 -2
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +312 -0
- package/src/runtime/release/release-session.ts +716 -0
- package/src/runtime/release/release-state-migration.ts +25 -0
- package/src/runtime/resources/leases/store.ts +56 -25
- package/src/runtime/root/computer-composition.ts +191 -6
- package/src/runtime/root/controller-progression-composition.ts +254 -0
- package/src/runtime/root/controller-round-composition.ts +20 -1
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +111 -18
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +227 -29
- package/src/runtime/root/package-runtime-release.ts +117 -30
- package/src/runtime/root/package-runtime-service.ts +24 -24
- package/src/runtime/root/release-execution-canary.ts +57 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -40
- package/src/runtime/root/release-materialize.ts +372 -106
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +160 -29
- package/src/runtime/root/scheduled-controller-composition.ts +29 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +126 -44
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -9
- package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/ios-development.ts +22 -8
- package/src/runtime/safe-tooling/job-summary.ts +1 -1
- package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
- package/src/runtime/shared/atomic-text-file.ts +21 -0
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/json-files.ts +8 -3
- package/src/runtime/shared/process-environment.ts +20 -9
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
- package/src/runtime/standalone-recovery/core.ts +3792 -417
- package/src/runtime/standalone-recovery/entry.ts +507 -45
- package/src/runtime/standalone-recovery/installer.ts +262 -148
- package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
- package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
- package/src/runtime/standalone-recovery/performance.ts +54 -16
- package/src/runtime/standalone-recovery/release.ts +53 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
- package/src/runtime/workflow/schedules/engine.ts +166 -178
- package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
- package/src/runtime/workflows/runtime.ts +15 -19
- package/src/testing/test-governance.ts +5 -1
- package/supervisor/chatgpt-conversation.ts +23 -0
- package/supervisor/client.ts +218 -0
- package/supervisor/control-plane.ts +963 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +147 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +1151 -0
- package/supervisor/native-messaging/host.ts +58 -0
- package/supervisor/native-messaging/manifest.ts +26 -0
- package/supervisor/native-messaging/protocol.ts +27 -0
- package/supervisor/paths.ts +18 -0
- package/supervisor/protocol.ts +250 -0
- package/supervisor/server.ts +412 -0
- package/supervisor/store.ts +1870 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +261 -0
- package/SKILL.md +0 -427
- package/adapters/chatgpt/controller-host.ts +0 -119
- package/adapters/mcp/controller-round-compatibility.ts +0 -184
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
- package/adapters/mcp/toolset-selection.ts +0 -41
- package/agents/openai.yaml +0 -4
- package/assets/skill-hooks.json +0 -41
- package/assets/skill-version.json +0 -189
- package/assets/skills/claude-review/SKILL.md +0 -231
- package/assets/skills/codex-review/SKILL.md +0 -103
- package/assets/templates/helpers/check-skill-version.ts +0 -193
- package/packages/kernel/progression/api/index.ts +0 -2
- package/packages/kernel/progression/application/projector.ts +0 -211
- package/packages/kernel/progression/domain/types.ts +0 -116
- package/packages/kernel/progression/index.ts +0 -1
- package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
- package/packages/kernel/scheduler/domain/continuation.ts +0 -38
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
- package/packages/kernel/work/domain/admission-policy.ts +0 -34
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-computer-hotpath.ts +0 -255
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -191
- package/scripts/benchmark-ios-agent-device.ts +0 -511
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -169
- package/scripts/benchmark-operational-memory-activation.ts +0 -235
- package/scripts/benchmark-operational-shadow.ts +0 -28
- package/scripts/benchmark-quality-harness.ts +0 -146
- package/scripts/benchmark-route-session-concurrency.ts +0 -915
- package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
- package/scripts/benchmark-thin-harness.ts +0 -251
- package/scripts/benchmark-typescript-navigation.ts +0 -186
- package/scripts/benchmark-work-efficiency.ts +0 -334
- package/scripts/build-controller-ui.ts +0 -28
- package/scripts/check-npm-release.sh +0 -32
- package/scripts/check-public-release-surface.sh +0 -19
- package/scripts/check-release-published.sh +0 -57
- package/scripts/check-release-readiness.sh +0 -37
- package/scripts/check-release-version.mjs +0 -74
- package/scripts/check-skill-version.ts +0 -5
- package/scripts/check-tarball-install-smoke.sh +0 -150
- package/scripts/ensure-codegraph.sh +0 -16
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/run-skill-hook.ts +0 -244
- package/scripts/stage-runtime-release.ts +0 -44
- package/scripts/sync-codex-installed-copies.sh +0 -182
- package/src/cli/commands/tools.ts +0 -167
- package/src/cli/controller/progress.ts +0 -656
- package/src/cli/controller/work-mode.ts +0 -181
- package/src/cli/local-bridge/console-assets.ts +0 -17
- package/src/cli/local-bridge/dashboard.ts +0 -17
- package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
- package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
- package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
- package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
- package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/styles.css +0 -28
- package/src/cli/local-bridge/frontend/src/types.ts +0 -15
- package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
- package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
- package/src/cli/local-bridge/ui-dist/app.css +0 -1
- package/src/cli/local-bridge/ui-dist/app.js +0 -11228
- package/src/cli/mcp/access-mode.ts +0 -2
- package/src/cli/mcp/access-tools.ts +0 -2
- package/src/cli/mcp/audit.ts +0 -2
- package/src/cli/mcp/auth.ts +0 -2
- package/src/cli/mcp/instructions.ts +0 -2
- package/src/cli/mcp/legacy-context.ts +0 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -2
- package/src/cli/mcp/multi-repository.ts +0 -2
- package/src/cli/mcp/oauth.ts +0 -2
- package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
- package/src/cli/mcp/paths.ts +0 -2
- package/src/cli/mcp/policy.ts +0 -2
- package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
- package/src/cli/mcp/proxy-env.ts +0 -2
- package/src/cli/mcp/readiness-projection.ts +0 -2
- package/src/cli/mcp/redaction.ts +0 -2
- package/src/cli/mcp/repo.ts +0 -2
- package/src/cli/mcp/repository-tools.ts +0 -2
- package/src/cli/mcp/server.ts +0 -2
- package/src/cli/mcp/setup.ts +0 -2
- package/src/cli/mcp/tool-capability-cache.ts +0 -2
- package/src/cli/mcp/tool-contract.ts +0 -2
- package/src/cli/mcp/tools.ts +0 -2
- package/src/cli/mcp/toolset-names.ts +0 -2
- package/src/cli/mcp/toolset-selection.ts +0 -2
- package/src/cli/mcp/toolset.ts +0 -2
- package/src/cli/mcp/transports/http.ts +0 -2
- package/src/cli/mcp/transports/session-registry.ts +0 -2
- package/src/cli/mcp/transports/stdio.ts +0 -2
- package/src/cli/mcp/types.ts +0 -2
- package/src/cli/mcp/umbrella-tools.ts +0 -2
- package/src/cli/tools/codegraph.ts +0 -695
- package/src/core/adoption/helper-wrapper-plan.ts +0 -159
- package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
- package/src/runtime/context/codegraph-read-provider.ts +0 -611
- package/src/runtime/context/codegraph-sidecar.cjs +0 -248
- package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
- package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
- package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
- package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
- package/src/runtime/control-plane/routing/index.ts +0 -1
- package/src/runtime/control-plane/routing/route-policy.ts +0 -401
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
- package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
- package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
- package/src/runtime/gateway/mcp/process-tools.ts +0 -2
- package/src/runtime/gateway/mcp/router.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
- package/src/runtime/plugins/browser-provider-registry.ts +0 -2
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { createHash, randomUUID } from 'crypto';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, symlinkSync, writeFileSync } from 'fs';
|
|
3
|
+
import { tmpdir } from 'os';
|
|
4
4
|
import { dirname, join, relative, resolve } from 'path';
|
|
5
5
|
import { runProcess } from '../../effects/process-runner';
|
|
6
6
|
import { resolveBunExecutable } from '../shared/process-environment';
|
|
7
|
+
import { assertStorageHeadroom } from '../shared/storage-capacity';
|
|
7
8
|
import { CONTROL_PLANE_SCHEMA_VERSION } from '../control-plane/persistence/sqlite-store';
|
|
8
|
-
import { loadRuntimeReleaseManifest, requireCompleteCompiledRuntimeReleaseManifest } from './release-manifest';
|
|
9
|
+
import { assertRuntimeReleaseExecutionSurface, loadRuntimeReleaseManifest, requireCompleteCompiledRuntimeReleaseManifest } from './release-manifest';
|
|
9
10
|
import { assertRuntimeReleaseExecutionCanaries, type RuntimeReleaseExecutionCanaryCommand } from './release-execution-canary';
|
|
10
11
|
export { assertRuntimeReleaseExecutionCanaries, type RuntimeReleaseExecutionCanaryDependencies } from './release-execution-canary';
|
|
11
12
|
import { packageRuntimeFileIndex, stagePackageRuntimeSnapshot } from './package-runtime-release';
|
|
@@ -34,18 +35,20 @@ export interface StagedRuntimeRelease {
|
|
|
34
35
|
releaseId: string;
|
|
35
36
|
artifactIdentity: string;
|
|
36
37
|
runtimeBundleArtifactIdentity?: string;
|
|
38
|
+
runtimeInterpreterArtifactIdentity?: string;
|
|
37
39
|
diagnosticArtifactIdentity?: string;
|
|
40
|
+
connectorArtifactIdentity?: string;
|
|
38
41
|
browserNodeBridgeArtifactIdentity?: string;
|
|
39
42
|
browserHandoffArtifactIdentity?: string;
|
|
43
|
+
workflowSupervisorNativeHostArtifactIdentity?: string;
|
|
40
44
|
processRunnerArtifactIdentity?: string;
|
|
41
45
|
checkRunnerArtifactIdentity?: string;
|
|
46
|
+
typescriptNavigationArtifactIdentity?: string;
|
|
47
|
+
contextPackArtifactIdentity?: string;
|
|
42
48
|
schedulerWorkerArtifactIdentity?: string;
|
|
43
49
|
periodicCleanupArtifactIdentity?: string;
|
|
44
50
|
pluginActionSidecarArtifactIdentity?: string;
|
|
45
51
|
externalPluginProbeArtifactIdentity?: string;
|
|
46
|
-
codeGraphNodeArtifactIdentity?: string;
|
|
47
|
-
codeGraphSidecarArtifactIdentity?: string;
|
|
48
|
-
codeGraphLibraryArtifactIdentity?: string;
|
|
49
52
|
packageArtifactIdentity?: string;
|
|
50
53
|
controllerUiArtifactIdentity?: string;
|
|
51
54
|
macosCodeSigning?: MacOSRuntimeCodeSigning;
|
|
@@ -61,14 +64,9 @@ export interface RuntimeReleaseMaterializerDependencies {
|
|
|
61
64
|
uuid?: () => string;
|
|
62
65
|
compileBinary?: (input: { sourceRoot: string; outputPath: string; entryPath?: string }) => { ok: boolean; stderr?: string; stdout?: string; error?: string };
|
|
63
66
|
bundleRuntime?: (input: { sourceRoot: string; outputPath: string; entryPath: string }) => { ok: boolean; stderr?: string; stdout?: string; error?: string };
|
|
67
|
+
materializeRuntimeInterpreter?: (input: { sourceRoot: string; outputPath: string }) => { ok: boolean; stderr?: string; stdout?: string; error?: string };
|
|
64
68
|
bundleNodeHost?: (input: { sourceRoot: string; outputPath: string; entryPath: string }) => { ok: boolean; stderr?: string; stdout?: string; error?: string };
|
|
65
69
|
bundleProcessRunner?: (input: { sourceRoot: string; outputPath: string; entryPath: string }) => { ok: boolean; stderr?: string; stdout?: string; error?: string };
|
|
66
|
-
materializeCodeGraphRuntime?: (input: {
|
|
67
|
-
sourceRoot: string;
|
|
68
|
-
nodeOutputPath: string;
|
|
69
|
-
sidecarOutputPath: string;
|
|
70
|
-
libraryOutputPath: string;
|
|
71
|
-
}) => { ok: boolean; stderr?: string; stdout?: string; error?: string };
|
|
72
70
|
}
|
|
73
71
|
|
|
74
72
|
export interface CandidateRuntimeStageReceiptV1 {
|
|
@@ -89,6 +87,7 @@ export interface CandidateRuntimeReleaseStagerDependencies {
|
|
|
89
87
|
bunExecutable: string;
|
|
90
88
|
scriptPath: string;
|
|
91
89
|
sourceRoot: string;
|
|
90
|
+
dependencyRoot: string;
|
|
92
91
|
controllerHome: string;
|
|
93
92
|
expectedHead: string;
|
|
94
93
|
sourceRepositoryId: string;
|
|
@@ -102,6 +101,61 @@ function gitText(root: string, args: string[]): string {
|
|
|
102
101
|
return result.stdout.trim();
|
|
103
102
|
}
|
|
104
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Materialize one exact tracked Git revision into a detached temporary worktree.
|
|
106
|
+
* The mutable source checkout remains only the object/dependency provider and may
|
|
107
|
+
* advance while the callback runs. Lifecycle/Runtime authority is untouched.
|
|
108
|
+
*/
|
|
109
|
+
export function withRuntimeReleaseSourceSnapshot<T>(input: {
|
|
110
|
+
sourceRoot: string;
|
|
111
|
+
sourceRevision: string;
|
|
112
|
+
}, operation: (snapshotRoot: string) => T): T {
|
|
113
|
+
const sourceRoot = resolve(input.sourceRoot);
|
|
114
|
+
const requestedRevision = input.sourceRevision.trim();
|
|
115
|
+
if (!/^[a-f0-9]{40}$/i.test(requestedRevision)) throw new Error('RUNTIME_RELEASE_SOURCE_REVISION_INVALID');
|
|
116
|
+
const resolvedRevision = gitText(sourceRoot, ['rev-parse', '--verify', `${requestedRevision}^{commit}`]);
|
|
117
|
+
if (resolvedRevision !== requestedRevision) throw new Error('RUNTIME_RELEASE_SOURCE_REVISION_MISMATCH');
|
|
118
|
+
// Release materialization is Runtime-owned temporary state, not repository
|
|
119
|
+
// workspace state. Keeping the detached worktree outside sourceRoot prevents
|
|
120
|
+
// Forge's own immutable-source snapshot from perturbing repository status or
|
|
121
|
+
// workspace fingerprints while release validation is running.
|
|
122
|
+
const snapshotContainer = mkdtempSync(join(tmpdir(), `forge-runtime-release-source-${process.pid}-`));
|
|
123
|
+
const snapshotRoot = join(snapshotContainer, `${requestedRevision}-${randomUUID().slice(0, 8)}`);
|
|
124
|
+
const materialized = runProcess('git', ['-C', sourceRoot, 'worktree', 'add', '--detach', '--force', snapshotRoot, requestedRevision], {
|
|
125
|
+
timeoutMs: 60_000,
|
|
126
|
+
maxOutputBytes: 128 * 1024,
|
|
127
|
+
});
|
|
128
|
+
if (!materialized.ok) {
|
|
129
|
+
rmSync(snapshotContainer, { recursive: true, force: true });
|
|
130
|
+
runProcess('git', ['-C', sourceRoot, 'worktree', 'prune'], { timeoutMs: 30_000, maxOutputBytes: 64 * 1024 });
|
|
131
|
+
throw new Error(`RUNTIME_RELEASE_SOURCE_SNAPSHOT_FAILED: ${materialized.stderr || materialized.stdout || materialized.error}`.slice(0, 2_000));
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const sourceDependencies = join(sourceRoot, 'node_modules');
|
|
135
|
+
if (existsSync(sourceDependencies)) {
|
|
136
|
+
const snapshotDependencies = join(snapshotRoot, 'node_modules');
|
|
137
|
+
symlinkSync(realpathSync(sourceDependencies), snapshotDependencies, process.platform === 'win32' ? 'junction' : 'dir');
|
|
138
|
+
}
|
|
139
|
+
if (gitText(snapshotRoot, ['rev-parse', '--verify', 'HEAD']) !== requestedRevision) {
|
|
140
|
+
throw new Error('RUNTIME_RELEASE_SOURCE_SNAPSHOT_REVISION_MISMATCH');
|
|
141
|
+
}
|
|
142
|
+
if (gitText(snapshotRoot, ['status', '--porcelain=v1', '--untracked-files=no'])) {
|
|
143
|
+
throw new Error('RUNTIME_RELEASE_SOURCE_SNAPSHOT_DIRTY');
|
|
144
|
+
}
|
|
145
|
+
return operation(snapshotRoot);
|
|
146
|
+
} finally {
|
|
147
|
+
const removed = runProcess('git', ['-C', sourceRoot, 'worktree', 'remove', '--force', snapshotRoot], {
|
|
148
|
+
timeoutMs: 60_000,
|
|
149
|
+
maxOutputBytes: 128 * 1024,
|
|
150
|
+
});
|
|
151
|
+
if (!removed.ok) {
|
|
152
|
+
rmSync(snapshotRoot, { recursive: true, force: true });
|
|
153
|
+
}
|
|
154
|
+
runProcess('git', ['-C', sourceRoot, 'worktree', 'prune'], { timeoutMs: 30_000, maxOutputBytes: 64 * 1024 });
|
|
155
|
+
rmSync(snapshotContainer, { recursive: true, force: true });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
105
159
|
function sha256(path: string): string {
|
|
106
160
|
return createHash('sha256').update(readFileSync(path)).digest('hex');
|
|
107
161
|
}
|
|
@@ -164,6 +218,10 @@ function inspectMacOSRuntimeCodeSigning(executable: string): MacOSRuntimeCodeSig
|
|
|
164
218
|
return parseMacOSRuntimeCodeSigning({ identifier, teamIdentifier, authority, designatedRequirement }, 'RUNTIME_RELEASE_MACOS_SIGNATURE_INVALID')!;
|
|
165
219
|
}
|
|
166
220
|
|
|
221
|
+
export function macOSRuntimeSigningMayRetryWithoutTimestamp(detail: string): boolean {
|
|
222
|
+
return /(?:^|\n).*timestamp service is not available\.?\s*$/im.test(detail);
|
|
223
|
+
}
|
|
224
|
+
|
|
167
225
|
function defaultSignMacOSRuntime(input: { executable: string; controllerHome: string }): MacOSRuntimeCodeSigning {
|
|
168
226
|
const identities = runProcess('security', ['find-identity', '-v', '-p', 'codesigning'], { timeoutMs: 30_000, maxOutputBytes: 128 * 1024 });
|
|
169
227
|
if (!identities.ok) throw new Error(`RUNTIME_RELEASE_MACOS_SIGNING_IDENTITY_LOOKUP_FAILED: ${identities.stderr || identities.stdout || identities.error}`.slice(0, 2_000));
|
|
@@ -186,9 +244,16 @@ function defaultSignMacOSRuntime(input: { executable: string; controllerHome: st
|
|
|
186
244
|
selected = eligible[0];
|
|
187
245
|
}
|
|
188
246
|
if (expectedTeam && selected.teamIdentifier !== expectedTeam) throw new Error('RUNTIME_RELEASE_MACOS_SIGNING_TEAM_CHANGED');
|
|
189
|
-
const
|
|
190
|
-
'--force', '--sign', selected.hash, '--identifier', FORGE_MACOS_RUNTIME_SIGNING_IDENTIFIER, '--options', 'runtime',
|
|
191
|
-
]
|
|
247
|
+
const signingArgs = [
|
|
248
|
+
'--force', '--sign', selected.hash, '--identifier', FORGE_MACOS_RUNTIME_SIGNING_IDENTIFIER, '--options', 'runtime',
|
|
249
|
+
];
|
|
250
|
+
let signed = runProcess('codesign', [...signingArgs, input.executable], { timeoutMs: 120_000, maxOutputBytes: 128 * 1024 });
|
|
251
|
+
if (!signed.ok) {
|
|
252
|
+
const detail = `${signed.stderr ?? ''}\n${signed.stdout ?? ''}\n${signed.error ?? ''}`;
|
|
253
|
+
if (macOSRuntimeSigningMayRetryWithoutTimestamp(detail)) {
|
|
254
|
+
signed = runProcess('codesign', [...signingArgs, '--timestamp=none', input.executable], { timeoutMs: 120_000, maxOutputBytes: 128 * 1024 });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
192
257
|
if (!signed.ok) throw new Error(`RUNTIME_RELEASE_MACOS_SIGNING_FAILED: ${signed.stderr || signed.stdout || signed.error}`.slice(0, 2_000));
|
|
193
258
|
const inspected = inspectMacOSRuntimeCodeSigning(input.executable);
|
|
194
259
|
if (inspected.teamIdentifier !== selected.teamIdentifier) throw new Error('RUNTIME_RELEASE_MACOS_SIGNING_TEAM_MISMATCH');
|
|
@@ -258,10 +323,12 @@ function parseCandidateStageReceipt(stdout: string): CandidateRuntimeStageReceip
|
|
|
258
323
|
export function stageRuntimeReleaseFromCandidateSource(input: {
|
|
259
324
|
controllerHome: string;
|
|
260
325
|
sourceRoot: string;
|
|
326
|
+
dependencyRoot?: string;
|
|
261
327
|
sourceRepositoryId: string;
|
|
262
328
|
}, dependencies: CandidateRuntimeReleaseStagerDependencies = {}): StagedRuntimeRelease {
|
|
263
329
|
const controllerHome = resolve(input.controllerHome);
|
|
264
330
|
const sourceRoot = resolve(input.sourceRoot);
|
|
331
|
+
const dependencyRoot = resolve(input.dependencyRoot ?? input.sourceRoot);
|
|
265
332
|
const sourceRepositoryId = input.sourceRepositoryId.trim();
|
|
266
333
|
if (!sourceRepositoryId) throw new Error('RUNTIME_RELEASE_SOURCE_REPOSITORY_ID_REQUIRED');
|
|
267
334
|
const expectedHead = gitText(sourceRoot, ['rev-parse', '--verify', 'HEAD']);
|
|
@@ -279,10 +346,11 @@ export function stageRuntimeReleaseFromCandidateSource(input: {
|
|
|
279
346
|
request.scriptPath,
|
|
280
347
|
'--controller-home', request.controllerHome,
|
|
281
348
|
'--source-root', request.sourceRoot,
|
|
349
|
+
'--dependency-root', request.dependencyRoot,
|
|
282
350
|
'--expected-head', request.expectedHead,
|
|
283
351
|
'--source-repository-id', request.sourceRepositoryId,
|
|
284
352
|
], { cwd: request.sourceRoot, timeoutMs: 600_000, maxOutputBytes: 512 * 1024 }));
|
|
285
|
-
const executed = runCandidateStager({ bunExecutable, scriptPath, sourceRoot, controllerHome, expectedHead, sourceRepositoryId });
|
|
353
|
+
const executed = runCandidateStager({ bunExecutable, scriptPath, sourceRoot, dependencyRoot, controllerHome, expectedHead, sourceRepositoryId });
|
|
286
354
|
if (!executed.ok) {
|
|
287
355
|
throw new Error(`RUNTIME_RELEASE_CANDIDATE_STAGE_FAILED: ${executed.stderr || executed.stdout || executed.error}`.slice(0, 2_000));
|
|
288
356
|
}
|
|
@@ -360,18 +428,18 @@ export function stageRuntimeReleaseFromCandidateSource(input: {
|
|
|
360
428
|
releaseId: receipt.releaseId,
|
|
361
429
|
artifactIdentity: receipt.artifactIdentity,
|
|
362
430
|
runtimeBundleArtifactIdentity: manifest.runtimeBundleArtifactIdentity,
|
|
431
|
+
runtimeInterpreterArtifactIdentity: manifest.runtimeInterpreterArtifactIdentity,
|
|
363
432
|
diagnosticArtifactIdentity: manifest.diagnosticArtifactIdentity,
|
|
433
|
+
connectorArtifactIdentity: manifest.connectorArtifactIdentity,
|
|
364
434
|
browserNodeBridgeArtifactIdentity: manifest.browserNodeBridgeArtifactIdentity,
|
|
365
435
|
browserHandoffArtifactIdentity: manifest.browserHandoffArtifactIdentity,
|
|
436
|
+
workflowSupervisorNativeHostArtifactIdentity: manifest.workflowSupervisorNativeHostArtifactIdentity,
|
|
366
437
|
processRunnerArtifactIdentity: manifest.processRunnerArtifactIdentity,
|
|
367
438
|
checkRunnerArtifactIdentity: manifest.checkRunnerArtifactIdentity,
|
|
368
439
|
schedulerWorkerArtifactIdentity: manifest.schedulerWorkerArtifactIdentity,
|
|
369
440
|
periodicCleanupArtifactIdentity: manifest.periodicCleanupArtifactIdentity,
|
|
370
441
|
pluginActionSidecarArtifactIdentity: manifest.pluginActionSidecarArtifactIdentity,
|
|
371
442
|
externalPluginProbeArtifactIdentity: manifest.externalPluginProbeArtifactIdentity,
|
|
372
|
-
codeGraphNodeArtifactIdentity: manifest.codeGraphNodeArtifactIdentity,
|
|
373
|
-
codeGraphSidecarArtifactIdentity: manifest.codeGraphSidecarArtifactIdentity,
|
|
374
|
-
codeGraphLibraryArtifactIdentity: manifest.codeGraphLibraryArtifactIdentity,
|
|
375
443
|
packageArtifactIdentity: manifest.packageArtifactIdentity,
|
|
376
444
|
controllerUiArtifactIdentity: manifest.controllerUiArtifactIdentity,
|
|
377
445
|
...(macosCodeSigning ? { macosCodeSigning } : {}),
|
|
@@ -396,6 +464,31 @@ function defaultCompileBinary(input: { sourceRoot: string; outputPath: string; e
|
|
|
396
464
|
], { cwd: input.sourceRoot, timeoutMs: 300_000, maxOutputBytes: 512 * 1024 });
|
|
397
465
|
}
|
|
398
466
|
|
|
467
|
+
function defaultMaterializeRuntimeInterpreter(input: { sourceRoot: string; outputPath: string }): { ok: boolean; stderr?: string; stdout?: string; error?: string } {
|
|
468
|
+
const configured = process.env.FORGE_BUN_BIN?.trim();
|
|
469
|
+
const bun = configured || resolveBunExecutable(process.execPath, process.env);
|
|
470
|
+
const probe = runProcess(bun, ['-e', 'process.stdout.write(process.execPath)'], {
|
|
471
|
+
cwd: input.sourceRoot,
|
|
472
|
+
timeoutMs: 15_000,
|
|
473
|
+
maxOutputBytes: 16 * 1024,
|
|
474
|
+
});
|
|
475
|
+
if (!probe.ok) return probe;
|
|
476
|
+
try {
|
|
477
|
+
const reported = probe.stdout.trim();
|
|
478
|
+
if (!reported) return { ok: false, error: 'Bun did not report process.execPath' };
|
|
479
|
+
const source = realpathSync(resolve(reported));
|
|
480
|
+
const status = lstatSync(source);
|
|
481
|
+
if (status.isSymbolicLink() || !status.isFile() || (status.mode & 0o111) === 0) {
|
|
482
|
+
return { ok: false, error: `resolved Bun interpreter is not a regular executable: ${source}` };
|
|
483
|
+
}
|
|
484
|
+
copyFileSync(source, input.outputPath);
|
|
485
|
+
chmodSync(input.outputPath, 0o700);
|
|
486
|
+
return { ok: true };
|
|
487
|
+
} catch (error) {
|
|
488
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
399
492
|
function defaultBundleRuntimeScript(input: { sourceRoot: string; outputPath: string; entryPath: string }): { ok: boolean; stderr?: string; stdout?: string; error?: string } {
|
|
400
493
|
const configured = process.env.FORGE_BUN_BIN?.trim();
|
|
401
494
|
const bun = configured || resolveBunExecutable(process.execPath, process.env);
|
|
@@ -420,38 +513,14 @@ function defaultBundleNodeScript(input: { sourceRoot: string; outputPath: string
|
|
|
420
513
|
], { cwd: input.sourceRoot, timeoutMs: 300_000, maxOutputBytes: 512 * 1024 });
|
|
421
514
|
}
|
|
422
515
|
|
|
423
|
-
function defaultMaterializeCodeGraphRuntime(input: {
|
|
424
|
-
sourceRoot: string;
|
|
425
|
-
nodeOutputPath: string;
|
|
426
|
-
sidecarOutputPath: string;
|
|
427
|
-
libraryOutputPath: string;
|
|
428
|
-
}): { ok: boolean; stderr?: string; stdout?: string; error?: string } {
|
|
429
|
-
try {
|
|
430
|
-
const sourceRequire = createRequire(join(input.sourceRoot, 'package.json'));
|
|
431
|
-
const platformPackage = `@colbymchenry/codegraph-${process.platform}-${process.arch}`;
|
|
432
|
-
const packageJson = sourceRequire.resolve(`${platformPackage}/package.json`);
|
|
433
|
-
const packageRoot = dirname(packageJson);
|
|
434
|
-
const nodeSource = join(packageRoot, process.platform === 'win32' ? 'node.exe' : 'node');
|
|
435
|
-
const librarySource = join(packageRoot, 'lib');
|
|
436
|
-
const sidecarSource = join(input.sourceRoot, 'src', 'runtime', 'context', 'codegraph-sidecar.cjs');
|
|
437
|
-
if (!existsSync(nodeSource) || !statSync(nodeSource).isFile()) throw new Error(`${platformPackage} Node runtime is missing`);
|
|
438
|
-
if (!existsSync(librarySource) || !statSync(librarySource).isDirectory()) throw new Error(`${platformPackage} library is missing`);
|
|
439
|
-
if (!existsSync(sidecarSource)) throw new Error('CodeGraph sidecar source is missing');
|
|
440
|
-
copyFileSync(nodeSource, input.nodeOutputPath);
|
|
441
|
-
copyFileSync(sidecarSource, input.sidecarOutputPath);
|
|
442
|
-
cpSync(librarySource, input.libraryOutputPath, { recursive: true, force: false });
|
|
443
|
-
return { ok: true };
|
|
444
|
-
} catch (error) {
|
|
445
|
-
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
516
|
export function stageRuntimeRelease(input: {
|
|
450
517
|
controllerHome: string;
|
|
451
518
|
sourceRoot: string;
|
|
519
|
+
dependencyRoot?: string;
|
|
452
520
|
sourceRepositoryId?: string;
|
|
453
521
|
}, dependencies: RuntimeReleaseMaterializerDependencies = {}): StagedRuntimeRelease {
|
|
454
522
|
const sourceRoot = resolve(input.sourceRoot);
|
|
523
|
+
const dependencyRoot = resolve(input.dependencyRoot ?? input.sourceRoot);
|
|
455
524
|
const sourceRepositoryId = input.sourceRepositoryId?.trim();
|
|
456
525
|
if (input.sourceRepositoryId !== undefined && !sourceRepositoryId) throw new Error('RUNTIME_RELEASE_SOURCE_REPOSITORY_ID_INVALID');
|
|
457
526
|
const sourceCommit = gitText(sourceRoot, ['rev-parse', '--verify', 'HEAD']);
|
|
@@ -472,6 +541,7 @@ export function stageRuntimeRelease(input: {
|
|
|
472
541
|
mkdirSync(staging, { recursive: true, mode: 0o700 });
|
|
473
542
|
try {
|
|
474
543
|
const compileBinary = dependencies.compileBinary ?? defaultCompileBinary;
|
|
544
|
+
const platform = dependencies.platform ?? process.platform;
|
|
475
545
|
const runtimeBundleEntrypoint = 'forge-runtime-bundle.js' as const;
|
|
476
546
|
const runtimeBundlePath = join(staging, runtimeBundleEntrypoint);
|
|
477
547
|
const runtimeBundle = (dependencies.bundleRuntime ?? defaultBundleRuntimeScript)({
|
|
@@ -485,6 +555,20 @@ export function stageRuntimeRelease(input: {
|
|
|
485
555
|
chmodSync(runtimeBundlePath, 0o600);
|
|
486
556
|
const runtimeBundleArtifactIdentity = `sha256:${sha256(runtimeBundlePath)}`;
|
|
487
557
|
|
|
558
|
+
const runtimeInterpreterEntrypoint = platform === 'win32'
|
|
559
|
+
? 'forge-runtime-bun.exe' as const
|
|
560
|
+
: 'forge-runtime-bun' as const;
|
|
561
|
+
const runtimeInterpreterPath = join(staging, runtimeInterpreterEntrypoint);
|
|
562
|
+
const runtimeInterpreter = (dependencies.materializeRuntimeInterpreter ?? defaultMaterializeRuntimeInterpreter)({
|
|
563
|
+
sourceRoot,
|
|
564
|
+
outputPath: runtimeInterpreterPath,
|
|
565
|
+
});
|
|
566
|
+
if (!runtimeInterpreter.ok) {
|
|
567
|
+
throw new Error(`RUNTIME_RELEASE_INTERPRETER_BUILD_FAILED: ${runtimeInterpreter.stderr || runtimeInterpreter.stdout || runtimeInterpreter.error}`.slice(0, 2_000));
|
|
568
|
+
}
|
|
569
|
+
chmodSync(runtimeInterpreterPath, 0o700);
|
|
570
|
+
const runtimeInterpreterArtifactIdentity = `sha256:${sha256(runtimeInterpreterPath)}`;
|
|
571
|
+
|
|
488
572
|
const executable = join(staging, 'forge-runtime');
|
|
489
573
|
const compile = compileBinary({
|
|
490
574
|
sourceRoot,
|
|
@@ -495,7 +579,6 @@ export function stageRuntimeRelease(input: {
|
|
|
495
579
|
throw new Error(`RUNTIME_RELEASE_BUILD_FAILED: ${compile.stderr || compile.stdout || compile.error}`.slice(0, 2_000));
|
|
496
580
|
}
|
|
497
581
|
chmodSync(executable, 0o700);
|
|
498
|
-
const platform = dependencies.platform ?? process.platform;
|
|
499
582
|
const macosCodeSigning = platform === 'darwin'
|
|
500
583
|
? (dependencies.signMacOSRuntime ?? defaultSignMacOSRuntime)({ executable, controllerHome: resolve(input.controllerHome) })
|
|
501
584
|
: undefined;
|
|
@@ -517,6 +600,19 @@ export function stageRuntimeRelease(input: {
|
|
|
517
600
|
chmodSync(diagnosticExecutable, 0o700);
|
|
518
601
|
const diagnosticArtifactIdentity = `sha256:${sha256(diagnosticExecutable)}`;
|
|
519
602
|
|
|
603
|
+
const connectorEntrypoint = 'forge-mcp-gateway' as const;
|
|
604
|
+
const connectorPath = join(staging, connectorEntrypoint);
|
|
605
|
+
const connectorCompile = compileBinary({
|
|
606
|
+
sourceRoot,
|
|
607
|
+
outputPath: connectorPath,
|
|
608
|
+
entryPath: join(sourceRoot, 'src/cli/index.ts'),
|
|
609
|
+
});
|
|
610
|
+
if (!connectorCompile.ok) {
|
|
611
|
+
throw new Error(`RUNTIME_RELEASE_CONNECTOR_BUILD_FAILED: ${connectorCompile.stderr || connectorCompile.stdout || connectorCompile.error}`.slice(0, 2_000));
|
|
612
|
+
}
|
|
613
|
+
chmodSync(connectorPath, 0o700);
|
|
614
|
+
const connectorArtifactIdentity = `sha256:${sha256(connectorPath)}`;
|
|
615
|
+
|
|
520
616
|
const browserNodeBridgeEntrypoint = 'browser-node-bridge-host.js' as const;
|
|
521
617
|
const browserNodeBridgePath = join(staging, browserNodeBridgeEntrypoint);
|
|
522
618
|
const bundleNodeHost = dependencies.bundleNodeHost ?? defaultBundleNodeScript;
|
|
@@ -544,6 +640,19 @@ export function stageRuntimeRelease(input: {
|
|
|
544
640
|
chmodSync(browserHandoffPath, 0o700);
|
|
545
641
|
const browserHandoffArtifactIdentity = `sha256:${sha256(browserHandoffPath)}`;
|
|
546
642
|
|
|
643
|
+
const workflowSupervisorNativeHostEntrypoint = 'forge-workflow-supervisor-native-host' as const;
|
|
644
|
+
const workflowSupervisorNativeHostPath = join(staging, workflowSupervisorNativeHostEntrypoint);
|
|
645
|
+
const workflowSupervisorNativeHostCompile = compileBinary({
|
|
646
|
+
sourceRoot,
|
|
647
|
+
outputPath: workflowSupervisorNativeHostPath,
|
|
648
|
+
entryPath: join(sourceRoot, 'supervisor', 'native-messaging', 'host.ts'),
|
|
649
|
+
});
|
|
650
|
+
if (!workflowSupervisorNativeHostCompile.ok) {
|
|
651
|
+
throw new Error(`RUNTIME_RELEASE_WORKFLOW_SUPERVISOR_NATIVE_HOST_BUILD_FAILED: ${workflowSupervisorNativeHostCompile.stderr || workflowSupervisorNativeHostCompile.stdout || workflowSupervisorNativeHostCompile.error}`.slice(0, 2_000));
|
|
652
|
+
}
|
|
653
|
+
chmodSync(workflowSupervisorNativeHostPath, 0o700);
|
|
654
|
+
const workflowSupervisorNativeHostArtifactIdentity = `sha256:${sha256(workflowSupervisorNativeHostPath)}`;
|
|
655
|
+
|
|
547
656
|
const processRunnerEntrypoint = 'process-runner.js' as const;
|
|
548
657
|
const processRunnerPath = join(staging, processRunnerEntrypoint);
|
|
549
658
|
// Process Runner is part of the immutable execution surface and must not
|
|
@@ -576,6 +685,32 @@ export function stageRuntimeRelease(input: {
|
|
|
576
685
|
chmodSync(checkRunnerPath, 0o700);
|
|
577
686
|
const checkRunnerArtifactIdentity = `sha256:${sha256(checkRunnerPath)}`;
|
|
578
687
|
|
|
688
|
+
const typescriptNavigationEntrypoint = 'forge-typescript-navigation' as const;
|
|
689
|
+
const typescriptNavigationPath = join(staging, typescriptNavigationEntrypoint);
|
|
690
|
+
const typescriptNavigationCompile = compileBinary({
|
|
691
|
+
sourceRoot,
|
|
692
|
+
outputPath: typescriptNavigationPath,
|
|
693
|
+
entryPath: join(sourceRoot, 'adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts'),
|
|
694
|
+
});
|
|
695
|
+
if (!typescriptNavigationCompile.ok) {
|
|
696
|
+
throw new Error(`RUNTIME_RELEASE_TYPESCRIPT_NAVIGATION_BUILD_FAILED: ${typescriptNavigationCompile.stderr || typescriptNavigationCompile.stdout || typescriptNavigationCompile.error}`.slice(0, 2_000));
|
|
697
|
+
}
|
|
698
|
+
chmodSync(typescriptNavigationPath, 0o700);
|
|
699
|
+
const typescriptNavigationArtifactIdentity = `sha256:${sha256(typescriptNavigationPath)}`;
|
|
700
|
+
|
|
701
|
+
const contextPackEntrypoint = 'forge-context-pack' as const;
|
|
702
|
+
const contextPackPath = join(staging, contextPackEntrypoint);
|
|
703
|
+
const contextPackCompile = compileBinary({
|
|
704
|
+
sourceRoot,
|
|
705
|
+
outputPath: contextPackPath,
|
|
706
|
+
entryPath: join(sourceRoot, 'adapters/mcp/runtime-gateway/context-pack-sidecar.ts'),
|
|
707
|
+
});
|
|
708
|
+
if (!contextPackCompile.ok) {
|
|
709
|
+
throw new Error(`RUNTIME_RELEASE_CONTEXT_PACK_BUILD_FAILED: ${contextPackCompile.stderr || contextPackCompile.stdout || contextPackCompile.error}`.slice(0, 2_000));
|
|
710
|
+
}
|
|
711
|
+
chmodSync(contextPackPath, 0o700);
|
|
712
|
+
const contextPackArtifactIdentity = `sha256:${sha256(contextPackPath)}`;
|
|
713
|
+
|
|
579
714
|
const schedulerWorkerEntrypoint = 'forge-scheduler-worker' as const;
|
|
580
715
|
const schedulerWorkerPath = join(staging, schedulerWorkerEntrypoint);
|
|
581
716
|
const schedulerWorkerCompile = compileBinary({
|
|
@@ -625,46 +760,17 @@ export function stageRuntimeRelease(input: {
|
|
|
625
760
|
chmodSync(externalPluginProbePath, 0o700);
|
|
626
761
|
const externalPluginProbeArtifactIdentity = `sha256:${sha256(externalPluginProbePath)}`;
|
|
627
762
|
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
sourceRoot,
|
|
636
|
-
nodeOutputPath: codeGraphNodePath,
|
|
637
|
-
sidecarOutputPath: codeGraphSidecarPath,
|
|
638
|
-
libraryOutputPath: codeGraphLibraryPath,
|
|
639
|
-
});
|
|
640
|
-
if (!codeGraphRuntime.ok) {
|
|
641
|
-
throw new Error(`RUNTIME_RELEASE_CODEGRAPH_BUILD_FAILED: ${codeGraphRuntime.stderr || codeGraphRuntime.stdout || codeGraphRuntime.error}`.slice(0, 2_000));
|
|
642
|
-
}
|
|
643
|
-
chmodSync(codeGraphNodePath, 0o700);
|
|
644
|
-
chmodSync(codeGraphSidecarPath, 0o700);
|
|
645
|
-
const codeGraphNodeArtifactIdentity = `sha256:${sha256(codeGraphNodePath)}`;
|
|
646
|
-
const codeGraphSidecarArtifactIdentity = `sha256:${sha256(codeGraphSidecarPath)}`;
|
|
647
|
-
const codeGraphLibraryArtifactIdentity = `sha256:${sha256Directory(codeGraphLibraryPath)}`;
|
|
648
|
-
|
|
649
|
-
const controllerUiRoot = 'ui-dist' as const;
|
|
650
|
-
const sourceControllerUiPath = join(sourceRoot, 'src', 'cli', 'local-bridge', controllerUiRoot);
|
|
651
|
-
const sourceControllerUiJs = join(sourceControllerUiPath, 'app.js');
|
|
652
|
-
const sourceControllerUiCss = join(sourceControllerUiPath, 'app.css');
|
|
653
|
-
if (!existsSync(sourceControllerUiJs) || !existsSync(sourceControllerUiCss)) {
|
|
654
|
-
throw new Error(`RUNTIME_RELEASE_CONTROLLER_UI_SOURCE_MISSING: ${sourceControllerUiPath}`);
|
|
655
|
-
}
|
|
656
|
-
const controllerUiPath = join(staging, controllerUiRoot);
|
|
657
|
-
cpSync(sourceControllerUiPath, controllerUiPath, { recursive: true, force: false });
|
|
658
|
-
const controllerUiArtifactIdentity = `sha256:${sha256Directory(controllerUiPath)}`;
|
|
659
|
-
|
|
660
|
-
// The persistent OAuth/Connector is source-backed even when the primary
|
|
661
|
-
// Runtime itself is compiled. Co-locate one immutable package snapshot in
|
|
662
|
-
// the same release so standalone Recovery can bind the Connector to the
|
|
663
|
-
// exact active release instead of retaining an older package release.
|
|
763
|
+
// Keep the source-backed package projection during the Recovery migration.
|
|
764
|
+
// The active standalone Recovery release can predate the compiled Connector
|
|
765
|
+
// sidecar and still rebind the primary Connector through package/src/cli.
|
|
766
|
+
// Removing that surface here makes a candidate pass isolated Runtime
|
|
767
|
+
// canaries but fail the real cutover with missing CLI command modules. Once
|
|
768
|
+
// every supported Recovery release launches forge-mcp-gateway, this
|
|
769
|
+
// compatibility projection can be removed together with the fallback.
|
|
664
770
|
const packageRoot = 'package' as const;
|
|
665
771
|
const packagePath = join(staging, packageRoot);
|
|
666
|
-
const packageRecords = packageRuntimeFileIndex(sourceRoot);
|
|
667
|
-
stagePackageRuntimeSnapshot(sourceRoot, packagePath, packageRecords);
|
|
772
|
+
const packageRecords = packageRuntimeFileIndex(sourceRoot, dependencyRoot);
|
|
773
|
+
stagePackageRuntimeSnapshot(sourceRoot, packagePath, packageRecords, dependencyRoot);
|
|
668
774
|
const packageArtifactIdentity = `sha256:${sha256Directory(packagePath)}`;
|
|
669
775
|
|
|
670
776
|
const manifest = {
|
|
@@ -675,17 +781,27 @@ export function stageRuntimeRelease(input: {
|
|
|
675
781
|
executionMode: 'standalone-binary',
|
|
676
782
|
runtimeBundleEntrypoint,
|
|
677
783
|
runtimeBundleArtifactIdentity,
|
|
784
|
+
runtimeInterpreterEntrypoint,
|
|
785
|
+
runtimeInterpreterArtifactIdentity,
|
|
678
786
|
...(normalizedMacOSCodeSigning ? { macosCodeSigning: normalizedMacOSCodeSigning } : {}),
|
|
679
787
|
diagnosticEntrypoint: 'forge-cli',
|
|
680
788
|
diagnosticArtifactIdentity,
|
|
789
|
+
connectorEntrypoint,
|
|
790
|
+
connectorArtifactIdentity,
|
|
681
791
|
browserNodeBridgeEntrypoint,
|
|
682
792
|
browserNodeBridgeArtifactIdentity,
|
|
683
793
|
browserHandoffEntrypoint,
|
|
684
794
|
browserHandoffArtifactIdentity,
|
|
795
|
+
workflowSupervisorNativeHostEntrypoint,
|
|
796
|
+
workflowSupervisorNativeHostArtifactIdentity,
|
|
685
797
|
processRunnerEntrypoint,
|
|
686
798
|
processRunnerArtifactIdentity,
|
|
687
799
|
checkRunnerEntrypoint,
|
|
688
800
|
checkRunnerArtifactIdentity,
|
|
801
|
+
typescriptNavigationEntrypoint,
|
|
802
|
+
typescriptNavigationArtifactIdentity,
|
|
803
|
+
contextPackEntrypoint,
|
|
804
|
+
contextPackArtifactIdentity,
|
|
689
805
|
schedulerWorkerEntrypoint,
|
|
690
806
|
schedulerWorkerArtifactIdentity,
|
|
691
807
|
periodicCleanupEntrypoint,
|
|
@@ -694,19 +810,11 @@ export function stageRuntimeRelease(input: {
|
|
|
694
810
|
pluginActionSidecarArtifactIdentity,
|
|
695
811
|
externalPluginProbeEntrypoint,
|
|
696
812
|
externalPluginProbeArtifactIdentity,
|
|
697
|
-
codeGraphNodeEntrypoint,
|
|
698
|
-
codeGraphNodeArtifactIdentity,
|
|
699
|
-
codeGraphSidecarEntrypoint,
|
|
700
|
-
codeGraphSidecarArtifactIdentity,
|
|
701
|
-
codeGraphLibraryRoot,
|
|
702
|
-
codeGraphLibraryArtifactIdentity,
|
|
703
813
|
packageRoot,
|
|
704
814
|
packageArtifactIdentity,
|
|
705
|
-
controllerUiRoot,
|
|
706
|
-
controllerUiArtifactIdentity,
|
|
707
815
|
arguments: [],
|
|
708
816
|
configurationSchemaVersion: 1,
|
|
709
|
-
|
|
817
|
+
deploymentScope: 'portable',
|
|
710
818
|
databaseSchemaCompatibility: {
|
|
711
819
|
minimum: CONTROL_PLANE_SCHEMA_VERSION,
|
|
712
820
|
maximum: CONTROL_PLANE_SCHEMA_VERSION,
|
|
@@ -728,21 +836,22 @@ export function stageRuntimeRelease(input: {
|
|
|
728
836
|
releaseId,
|
|
729
837
|
artifactIdentity,
|
|
730
838
|
runtimeBundleArtifactIdentity,
|
|
839
|
+
runtimeInterpreterArtifactIdentity,
|
|
731
840
|
...(normalizedMacOSCodeSigning ? { macosCodeSigning: normalizedMacOSCodeSigning } : {}),
|
|
732
841
|
diagnosticArtifactIdentity,
|
|
842
|
+
connectorArtifactIdentity,
|
|
733
843
|
browserNodeBridgeArtifactIdentity,
|
|
734
844
|
browserHandoffArtifactIdentity,
|
|
845
|
+
workflowSupervisorNativeHostArtifactIdentity,
|
|
735
846
|
processRunnerArtifactIdentity,
|
|
736
847
|
checkRunnerArtifactIdentity,
|
|
848
|
+
typescriptNavigationArtifactIdentity,
|
|
849
|
+
contextPackArtifactIdentity,
|
|
737
850
|
schedulerWorkerArtifactIdentity,
|
|
738
851
|
periodicCleanupArtifactIdentity,
|
|
739
852
|
pluginActionSidecarArtifactIdentity,
|
|
740
853
|
externalPluginProbeArtifactIdentity,
|
|
741
|
-
codeGraphNodeArtifactIdentity,
|
|
742
|
-
codeGraphSidecarArtifactIdentity,
|
|
743
|
-
codeGraphLibraryArtifactIdentity,
|
|
744
854
|
packageArtifactIdentity,
|
|
745
|
-
controllerUiArtifactIdentity,
|
|
746
855
|
manifestSha256: createHash('sha256').update(`${JSON.stringify(manifest, null, 2)}\n`).digest('hex'),
|
|
747
856
|
sourceCommit,
|
|
748
857
|
...(sourceRepositoryId ? { sourceRepositoryId } : {}),
|
|
@@ -753,6 +862,161 @@ export function stageRuntimeRelease(input: {
|
|
|
753
862
|
}
|
|
754
863
|
}
|
|
755
864
|
|
|
865
|
+
|
|
866
|
+
interface RuntimeReleaseTreeInspection {
|
|
867
|
+
sha256: string;
|
|
868
|
+
bytes: number;
|
|
869
|
+
files: number;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
function inspectRuntimeReleaseTree(releaseRootInput: string): RuntimeReleaseTreeInspection {
|
|
873
|
+
const requestedRoot = resolve(releaseRootInput);
|
|
874
|
+
if (!existsSync(requestedRoot)) throw new Error('RUNTIME_RELEASE_TREE_MISSING');
|
|
875
|
+
const rootStat = lstatSync(requestedRoot);
|
|
876
|
+
if (!rootStat.isDirectory() || rootStat.isSymbolicLink()) throw new Error('RUNTIME_RELEASE_TREE_ROOT_INVALID');
|
|
877
|
+
const root = realpathSync(requestedRoot);
|
|
878
|
+
const records: Array<{ path: string; mode: number; bytes: number; sha256: string }> = [];
|
|
879
|
+
const visit = (directory: string): void => {
|
|
880
|
+
for (const entry of readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
881
|
+
const path = join(directory, entry.name);
|
|
882
|
+
const stat = lstatSync(path);
|
|
883
|
+
if (stat.isSymbolicLink()) throw new Error(`RUNTIME_RELEASE_TREE_SYMLINK_FORBIDDEN: ${relative(root, path)}`);
|
|
884
|
+
if (stat.isDirectory()) {
|
|
885
|
+
visit(path);
|
|
886
|
+
continue;
|
|
887
|
+
}
|
|
888
|
+
if (!stat.isFile()) throw new Error(`RUNTIME_RELEASE_TREE_SPECIAL_FILE_FORBIDDEN: ${relative(root, path)}`);
|
|
889
|
+
const bytes = readFileSync(path);
|
|
890
|
+
records.push({
|
|
891
|
+
path: relative(root, path).replaceAll('\\', '/'),
|
|
892
|
+
mode: stat.mode & 0o777,
|
|
893
|
+
bytes: bytes.length,
|
|
894
|
+
sha256: createHash('sha256').update(bytes).digest('hex'),
|
|
895
|
+
});
|
|
896
|
+
}
|
|
897
|
+
};
|
|
898
|
+
visit(root);
|
|
899
|
+
const digest = createHash('sha256').update(JSON.stringify(records)).digest('hex');
|
|
900
|
+
return {
|
|
901
|
+
sha256: digest,
|
|
902
|
+
bytes: records.reduce((sum, record) => sum + record.bytes, 0),
|
|
903
|
+
files: records.length,
|
|
904
|
+
};
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
function preserveRuntimeReleaseTreeModes(sourceRootInput: string, targetRootInput: string): void {
|
|
908
|
+
const sourceRoot = resolve(sourceRootInput);
|
|
909
|
+
const targetRoot = resolve(targetRootInput);
|
|
910
|
+
const visit = (sourceDirectory: string, targetDirectory: string): void => {
|
|
911
|
+
for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {
|
|
912
|
+
const sourcePath = join(sourceDirectory, entry.name);
|
|
913
|
+
const targetPath = join(targetDirectory, entry.name);
|
|
914
|
+
const sourceStat = lstatSync(sourcePath);
|
|
915
|
+
if (sourceStat.isDirectory()) {
|
|
916
|
+
chmodSync(targetPath, sourceStat.mode & 0o777);
|
|
917
|
+
visit(sourcePath, targetPath);
|
|
918
|
+
} else if (sourceStat.isFile()) {
|
|
919
|
+
// fs.cpSync applies the process umask to copied files. The release
|
|
920
|
+
// tree digest includes permission bits, so restore the source mode
|
|
921
|
+
// before comparing the staged tree with its immutable source.
|
|
922
|
+
chmodSync(targetPath, sourceStat.mode & 0o777);
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
};
|
|
926
|
+
chmodSync(targetRoot, lstatSync(sourceRoot).mode & 0o777);
|
|
927
|
+
visit(sourceRoot, targetRoot);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
export function runtimeReleaseTreeSha256(releaseRoot: string): string {
|
|
931
|
+
return inspectRuntimeReleaseTree(releaseRoot).sha256;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
export interface PromotedPortableRuntimeRelease {
|
|
935
|
+
releaseId: string;
|
|
936
|
+
artifactIdentity: string;
|
|
937
|
+
manifestPath: string;
|
|
938
|
+
manifestSha256: string;
|
|
939
|
+
treeSha256: string;
|
|
940
|
+
sourceReleaseRoot: string;
|
|
941
|
+
targetReleaseRoot: string;
|
|
942
|
+
reusedExisting: boolean;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
export function promotePortableRuntimeRelease(input: {
|
|
946
|
+
sourceManifestPath: string;
|
|
947
|
+
targetControllerHome: string;
|
|
948
|
+
expectedTreeSha256: string;
|
|
949
|
+
}): PromotedPortableRuntimeRelease {
|
|
950
|
+
const sourceManifestPath = resolve(input.sourceManifestPath);
|
|
951
|
+
const sourceReleaseRoot = dirname(sourceManifestPath);
|
|
952
|
+
const targetControllerHome = resolve(input.targetControllerHome);
|
|
953
|
+
const manifest = loadRuntimeReleaseManifest(sourceManifestPath, targetControllerHome);
|
|
954
|
+
if (manifest.deploymentScope !== 'portable') throw new Error('RUNTIME_RELEASE_PROMOTION_REQUIRES_PORTABLE_ARTIFACT');
|
|
955
|
+
requireCompleteCompiledRuntimeReleaseManifest(manifest);
|
|
956
|
+
assertRuntimeReleaseExecutionSurface(sourceManifestPath, targetControllerHome);
|
|
957
|
+
|
|
958
|
+
const sourceTree = inspectRuntimeReleaseTree(sourceReleaseRoot);
|
|
959
|
+
if (sourceTree.sha256 !== input.expectedTreeSha256) throw new Error('RUNTIME_RELEASE_PROMOTION_SOURCE_TREE_MISMATCH');
|
|
960
|
+
const sourceManifestSha256 = createHash('sha256').update(readFileSync(sourceManifestPath)).digest('hex');
|
|
961
|
+
|
|
962
|
+
const releasesRoot = join(targetControllerHome, 'runtime', 'releases');
|
|
963
|
+
mkdirSync(releasesRoot, { recursive: true, mode: 0o700 });
|
|
964
|
+
const targetReleaseRoot = join(releasesRoot, manifest.releaseId);
|
|
965
|
+
const targetManifestPath = join(targetReleaseRoot, 'manifest.json');
|
|
966
|
+
|
|
967
|
+
const verifyTarget = (reusedExisting: boolean): PromotedPortableRuntimeRelease => {
|
|
968
|
+
const targetManifest = loadRuntimeReleaseManifest(targetManifestPath, targetControllerHome);
|
|
969
|
+
if (
|
|
970
|
+
targetManifest.deploymentScope !== 'portable'
|
|
971
|
+
|| targetManifest.releaseId !== manifest.releaseId
|
|
972
|
+
|| targetManifest.artifactIdentity !== manifest.artifactIdentity
|
|
973
|
+
) throw new Error('RUNTIME_RELEASE_PROMOTION_TARGET_IDENTITY_MISMATCH');
|
|
974
|
+
requireCompleteCompiledRuntimeReleaseManifest(targetManifest);
|
|
975
|
+
assertRuntimeReleaseExecutionSurface(targetManifestPath, targetControllerHome);
|
|
976
|
+
const targetManifestSha256 = createHash('sha256').update(readFileSync(targetManifestPath)).digest('hex');
|
|
977
|
+
const targetTreeSha256 = runtimeReleaseTreeSha256(targetReleaseRoot);
|
|
978
|
+
if (targetManifestSha256 !== sourceManifestSha256 || targetTreeSha256 !== sourceTree.sha256) {
|
|
979
|
+
throw new Error('RUNTIME_RELEASE_PROMOTION_NOT_BYTE_IDENTICAL');
|
|
980
|
+
}
|
|
981
|
+
return {
|
|
982
|
+
releaseId: manifest.releaseId,
|
|
983
|
+
artifactIdentity: manifest.artifactIdentity,
|
|
984
|
+
manifestPath: targetManifestPath,
|
|
985
|
+
manifestSha256: targetManifestSha256,
|
|
986
|
+
treeSha256: targetTreeSha256,
|
|
987
|
+
sourceReleaseRoot,
|
|
988
|
+
targetReleaseRoot,
|
|
989
|
+
reusedExisting,
|
|
990
|
+
};
|
|
991
|
+
};
|
|
992
|
+
|
|
993
|
+
if (existsSync(targetReleaseRoot)) return verifyTarget(true);
|
|
994
|
+
|
|
995
|
+
assertStorageHeadroom(releasesRoot, {
|
|
996
|
+
operation: 'runtime_release_promotion',
|
|
997
|
+
requiredBytes: sourceTree.bytes,
|
|
998
|
+
reserveBytes: 64 * 1024 * 1024,
|
|
999
|
+
});
|
|
1000
|
+
const staging = join(releasesRoot, `.${manifest.releaseId}.promote-${process.pid}-${randomUUID().slice(0, 8)}`);
|
|
1001
|
+
try {
|
|
1002
|
+
cpSync(sourceReleaseRoot, staging, {
|
|
1003
|
+
recursive: true,
|
|
1004
|
+
force: false,
|
|
1005
|
+
errorOnExist: true,
|
|
1006
|
+
preserveTimestamps: false,
|
|
1007
|
+
dereference: false,
|
|
1008
|
+
});
|
|
1009
|
+
preserveRuntimeReleaseTreeModes(sourceReleaseRoot, staging);
|
|
1010
|
+
const stagedTree = inspectRuntimeReleaseTree(staging);
|
|
1011
|
+
if (stagedTree.sha256 !== sourceTree.sha256) throw new Error('RUNTIME_RELEASE_PROMOTION_STAGING_TREE_MISMATCH');
|
|
1012
|
+
renameSync(staging, targetReleaseRoot);
|
|
1013
|
+
return verifyTarget(false);
|
|
1014
|
+
} catch (error) {
|
|
1015
|
+
rmSync(staging, { recursive: true, force: true });
|
|
1016
|
+
throw error;
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
|
|
756
1020
|
export function assertRuntimeReleaseFiles(release: StagedRuntimeRelease, dependencies: { platform?: NodeJS.Platform; inspectMacOSRuntime?: (executable: string) => MacOSRuntimeCodeSigning } = {}): void {
|
|
757
1021
|
const assertRegularFile = (path: string, missingCode: string): void => {
|
|
758
1022
|
if (!existsSync(path)) throw new Error(`${missingCode}: ${path}`);
|
|
@@ -803,6 +1067,13 @@ export function assertRuntimeReleaseFiles(release: StagedRuntimeRelease, depende
|
|
|
803
1067
|
assertFileIdentity(runtimePath, release.artifactIdentity);
|
|
804
1068
|
assertComponentFile({ path: join(release.releasePath, 'forge-runtime-bundle.js'), identity: release.runtimeBundleArtifactIdentity, missingCode: 'RUNTIME_RELEASE_BUNDLE_MISSING' });
|
|
805
1069
|
const platform = dependencies.platform ?? process.platform;
|
|
1070
|
+
const runtimeInterpreterEntrypoint = platform === 'win32' ? 'forge-runtime-bun.exe' : 'forge-runtime-bun';
|
|
1071
|
+
assertComponentFile({
|
|
1072
|
+
path: join(release.releasePath, runtimeInterpreterEntrypoint),
|
|
1073
|
+
identity: release.runtimeInterpreterArtifactIdentity,
|
|
1074
|
+
missingCode: 'RUNTIME_RELEASE_INTERPRETER_MISSING',
|
|
1075
|
+
executable: true,
|
|
1076
|
+
});
|
|
806
1077
|
if (platform === 'darwin' && release.macosCodeSigning) {
|
|
807
1078
|
const actual = (dependencies.inspectMacOSRuntime ?? inspectMacOSRuntimeCodeSigning)(runtimePath);
|
|
808
1079
|
if (actual.identifier !== release.macosCodeSigning.identifier
|
|
@@ -813,23 +1084,18 @@ export function assertRuntimeReleaseFiles(release: StagedRuntimeRelease, depende
|
|
|
813
1084
|
}
|
|
814
1085
|
}
|
|
815
1086
|
assertComponentFile({ path: join(release.releasePath, 'forge-cli'), identity: release.diagnosticArtifactIdentity, missingCode: 'RUNTIME_RELEASE_DIAGNOSTIC_ENTRYPOINT_MISSING', executable: true });
|
|
1087
|
+
assertComponentFile({ path: join(release.releasePath, 'forge-mcp-gateway'), identity: release.connectorArtifactIdentity, missingCode: 'RUNTIME_RELEASE_CONNECTOR_ENTRYPOINT_MISSING', executable: true });
|
|
816
1088
|
assertComponentFile({ path: join(release.releasePath, 'browser-node-bridge-host.js'), identity: release.browserNodeBridgeArtifactIdentity, missingCode: 'RUNTIME_RELEASE_BROWSER_NODE_HOST_MISSING', executable: true });
|
|
817
1089
|
assertComponentFile({ path: join(release.releasePath, 'browser-handoff-host.js'), identity: release.browserHandoffArtifactIdentity, missingCode: 'RUNTIME_RELEASE_BROWSER_HANDOFF_HOST_MISSING', executable: true });
|
|
1090
|
+
assertComponentFile({ path: join(release.releasePath, 'forge-workflow-supervisor-native-host'), identity: release.workflowSupervisorNativeHostArtifactIdentity, missingCode: 'RUNTIME_RELEASE_WORKFLOW_SUPERVISOR_NATIVE_HOST_MISSING', executable: true });
|
|
818
1091
|
assertComponentFile({ path: join(release.releasePath, 'process-runner.js'), identity: release.processRunnerArtifactIdentity, missingCode: 'RUNTIME_RELEASE_PROCESS_RUNNER_MISSING', executable: true });
|
|
819
1092
|
assertComponentFile({ path: join(release.releasePath, 'forge-check-runner'), identity: release.checkRunnerArtifactIdentity, missingCode: 'RUNTIME_RELEASE_CHECK_RUNNER_MISSING', executable: true });
|
|
1093
|
+
assertComponentFile({ path: join(release.releasePath, 'forge-typescript-navigation'), identity: release.typescriptNavigationArtifactIdentity, missingCode: 'RUNTIME_RELEASE_TYPESCRIPT_NAVIGATION_MISSING', executable: true });
|
|
1094
|
+
assertComponentFile({ path: join(release.releasePath, 'forge-context-pack'), identity: release.contextPackArtifactIdentity, missingCode: 'RUNTIME_RELEASE_CONTEXT_PACK_MISSING', executable: true });
|
|
820
1095
|
assertComponentFile({ path: join(release.releasePath, 'forge-scheduler-worker'), identity: release.schedulerWorkerArtifactIdentity, missingCode: 'RUNTIME_RELEASE_SCHEDULER_WORKER_MISSING', executable: true });
|
|
821
1096
|
assertComponentFile({ path: join(release.releasePath, 'forge-periodic-cleanup'), identity: release.periodicCleanupArtifactIdentity, missingCode: 'RUNTIME_RELEASE_PERIODIC_CLEANUP_MISSING', executable: true });
|
|
822
1097
|
assertComponentFile({ path: join(release.releasePath, 'forge-plugin-action-sidecar'), identity: release.pluginActionSidecarArtifactIdentity, missingCode: 'RUNTIME_RELEASE_PLUGIN_ACTION_SIDECAR_MISSING', executable: true });
|
|
823
1098
|
assertComponentFile({ path: join(release.releasePath, 'external-unix-socket-probe.cjs'), identity: release.externalPluginProbeArtifactIdentity, missingCode: 'RUNTIME_RELEASE_EXTERNAL_PLUGIN_PROBE_MISSING', executable: true });
|
|
824
|
-
assertComponentFile({ path: join(release.releasePath, 'codegraph-node'), identity: release.codeGraphNodeArtifactIdentity, missingCode: 'RUNTIME_RELEASE_CODEGRAPH_NODE_MISSING', executable: true });
|
|
825
|
-
assertComponentFile({ path: join(release.releasePath, 'codegraph-sidecar.cjs'), identity: release.codeGraphSidecarArtifactIdentity, missingCode: 'RUNTIME_RELEASE_CODEGRAPH_SIDECAR_MISSING', executable: true });
|
|
826
|
-
if (release.codeGraphLibraryArtifactIdentity) {
|
|
827
|
-
const libraryRoot = join(release.releasePath, 'codegraph-lib');
|
|
828
|
-
if (!existsSync(join(libraryRoot, 'dist', 'index.js'))) {
|
|
829
|
-
throw new Error(`RUNTIME_RELEASE_CODEGRAPH_LIBRARY_MISSING: ${join(libraryRoot, 'dist', 'index.js')}`);
|
|
830
|
-
}
|
|
831
|
-
assertDirectoryIdentity(libraryRoot, release.codeGraphLibraryArtifactIdentity);
|
|
832
|
-
}
|
|
833
1099
|
if (release.packageArtifactIdentity) {
|
|
834
1100
|
const packageRoot = join(release.releasePath, 'package');
|
|
835
1101
|
assertDirectoryIdentity(packageRoot, release.packageArtifactIdentity);
|