@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,10 +1,12 @@
|
|
|
1
|
+
import { writeAtomicTextFile } from '../shared/atomic-text-file';
|
|
1
2
|
import { randomUUID } from 'crypto';
|
|
2
|
-
import { existsSync,
|
|
3
|
+
import { existsSync, readFileSync, rmSync } from 'fs';
|
|
3
4
|
import { setTimeout as sleep } from 'timers/promises';
|
|
4
5
|
import { dirname, join, resolve } from 'path';
|
|
5
6
|
import { resolveControllerHome } from '../../cli/repositories/controller-home';
|
|
6
7
|
import { createPlatformServiceManagerHost, probeSystemdUserAvailable, type PlatformServiceManagerHost, type PlatformServiceManagerKind, type SystemdUserUnitInput } from '../platform/service-manager';
|
|
7
|
-
import {
|
|
8
|
+
import { reconcileRetiredForgePersistentServices, type ForgeRetiredServiceReconciliation } from '../platform/service-inventory';
|
|
9
|
+
import { runtimeAuthorityFreeEnvironment } from '../shared/process-environment';
|
|
8
10
|
import {
|
|
9
11
|
activeRuntimeEntrypoint,
|
|
10
12
|
activeRuntimeLaunchSpec,
|
|
@@ -19,6 +21,7 @@ import { materializePackageRuntimeRelease, type PackageRuntimeRelease } from './
|
|
|
19
21
|
import { readRuntimeReleaseAuthority, revertInitialRuntimeReleasePublication, rollbackRuntimeRelease } from './release-store';
|
|
20
22
|
import { loadMcpServiceLocalConfig } from '../../../adapters/mcp/auth';
|
|
21
23
|
import { ensurePackageConnectorService, type PackageConnectorServiceResult } from './package-connector-service';
|
|
24
|
+
import { normalizeRuntimeDeploymentTopology, type RuntimeDeploymentTopology } from './deployment-topology';
|
|
22
25
|
|
|
23
26
|
export type PackageRuntimeServiceMode = PlatformServiceManagerKind;
|
|
24
27
|
|
|
@@ -74,6 +77,7 @@ export interface PackageRuntimeServiceInstallResult {
|
|
|
74
77
|
pid?: number;
|
|
75
78
|
warnings: string[];
|
|
76
79
|
connector?: PackageConnectorServiceResult;
|
|
80
|
+
retiredServices?: ForgeRetiredServiceReconciliation[];
|
|
77
81
|
activation?: {
|
|
78
82
|
operationId: string;
|
|
79
83
|
status: 'activation_scheduled';
|
|
@@ -89,11 +93,11 @@ export interface PackageRuntimeServiceOptions {
|
|
|
89
93
|
host?: string;
|
|
90
94
|
port?: number;
|
|
91
95
|
authTokenFile: string;
|
|
92
|
-
exclusiveWorkId?: string;
|
|
93
96
|
platform?: NodeJS.Platform;
|
|
94
97
|
env?: NodeJS.ProcessEnv;
|
|
95
98
|
forcePortable?: boolean;
|
|
96
99
|
refreshConnector?: boolean;
|
|
100
|
+
topology?: RuntimeDeploymentTopology;
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
export interface PackageRuntimeServiceDependencies {
|
|
@@ -101,6 +105,7 @@ export interface PackageRuntimeServiceDependencies {
|
|
|
101
105
|
ensureConnectorService?: typeof ensurePackageConnectorService;
|
|
102
106
|
scheduleDarwinActivation?: (request: PackageRuntimeActivationRequest) => Promise<{ label: string; servicePath: string }>;
|
|
103
107
|
activationMode?: 'detached' | 'inline';
|
|
108
|
+
reconcileRetiredServices?: typeof reconcileRetiredForgePersistentServices;
|
|
104
109
|
}
|
|
105
110
|
|
|
106
111
|
export interface PackageRuntimeActivationDependencies {
|
|
@@ -110,13 +115,6 @@ export interface PackageRuntimeActivationDependencies {
|
|
|
110
115
|
cleanupActivationHelper?: (request: PackageRuntimeActivationRequest) => Promise<void>;
|
|
111
116
|
}
|
|
112
117
|
|
|
113
|
-
function atomicWrite(path: string, content: string, mode = 0o600): void {
|
|
114
|
-
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
115
|
-
const temporary = `${path}.${process.pid}.tmp`;
|
|
116
|
-
writeFileSync(temporary, content, { encoding: 'utf8', mode });
|
|
117
|
-
renameSync(temporary, path);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
118
|
export function renderForgeRuntimeSystemdUserUnit(input: {
|
|
121
119
|
description?: string;
|
|
122
120
|
executable: string;
|
|
@@ -131,14 +129,10 @@ export function systemdUserAvailable(env: NodeJS.ProcessEnv = process.env): bool
|
|
|
131
129
|
}
|
|
132
130
|
|
|
133
131
|
function cleanRuntimeInstallerEnvironment(env: NodeJS.ProcessEnv, releaseEnvironment: Record<string, string>): NodeJS.ProcessEnv {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
delete next.FORGE_RELEASE_REVISION;
|
|
139
|
-
delete next.FORGE_RELEASE_SOURCE_COMMIT;
|
|
140
|
-
delete next.FORGE_RELEASE_CLEAN_WORKSPACE;
|
|
141
|
-
return { ...next, ...releaseEnvironment };
|
|
132
|
+
// The selected immutable release is the only authority reintroduced below.
|
|
133
|
+
// Do not carry an installer, host Runtime or Supervisor writer claim across
|
|
134
|
+
// this service boundary.
|
|
135
|
+
return { ...runtimeAuthorityFreeEnvironment(env), ...releaseEnvironment };
|
|
142
136
|
}
|
|
143
137
|
|
|
144
138
|
export function systemdRuntimeInstallCommands(unitName: string): string[][] {
|
|
@@ -189,7 +183,7 @@ function startPortableRuntime(controllerHome: string, env: NodeJS.ProcessEnv, ho
|
|
|
189
183
|
stderrPath: paths.stderrPath,
|
|
190
184
|
errorCode: 'FORGE_PORTABLE_RUNTIME_START_FAILED',
|
|
191
185
|
});
|
|
192
|
-
|
|
186
|
+
writeAtomicTextFile(join(paths.serviceRoot, 'portable.json'), `${JSON.stringify({ schemaVersion: 1, pid, startedAt: new Date().toISOString() }, null, 2)}\n`);
|
|
193
187
|
return pid;
|
|
194
188
|
}
|
|
195
189
|
|
|
@@ -208,7 +202,7 @@ function activationPaths(controllerHome: string, operationId: string): { request
|
|
|
208
202
|
}
|
|
209
203
|
|
|
210
204
|
function writeActivationRequest(request: PackageRuntimeActivationRequest): void {
|
|
211
|
-
|
|
205
|
+
writeAtomicTextFile(request.requestPath, `${JSON.stringify(request, null, 2)}\n`);
|
|
212
206
|
}
|
|
213
207
|
|
|
214
208
|
function writeActivationReceipt(
|
|
@@ -232,7 +226,7 @@ function writeActivationReceipt(
|
|
|
232
226
|
helperLabel: request.helperLabel,
|
|
233
227
|
...extra,
|
|
234
228
|
};
|
|
235
|
-
|
|
229
|
+
writeAtomicTextFile(request.receiptPath, `${JSON.stringify(receipt, null, 2)}\n`);
|
|
236
230
|
return receipt;
|
|
237
231
|
}
|
|
238
232
|
|
|
@@ -299,7 +293,7 @@ export function renderPackageRuntimeActivationLaunchAgent(request: PackageRuntim
|
|
|
299
293
|
async function scheduleDarwinPackageRuntimeActivation(request: PackageRuntimeActivationRequest): Promise<{ label: string; servicePath: string }> {
|
|
300
294
|
if (process.platform !== 'darwin') throw new Error('FORGE_PACKAGE_RUNTIME_ACTIVATION_HELPER_PLATFORM_UNSUPPORTED');
|
|
301
295
|
const host = createPlatformServiceManagerHost({ platform: 'darwin' });
|
|
302
|
-
|
|
296
|
+
writeAtomicTextFile(request.helperSourcePlistPath, renderPackageRuntimeActivationLaunchAgent(request), 0o600);
|
|
303
297
|
host.installLaunchd(request.helperSourcePlistPath, request.helperLabel);
|
|
304
298
|
const result = await host.bootstrapLaunchd({ label: request.helperLabel, plistPath: request.helperInstalledPlistPath });
|
|
305
299
|
if (!result.ok) throw new Error(`FORGE_PACKAGE_RUNTIME_ACTIVATION_HELPER_BOOTSTRAP_FAILED: ${result.diagnostics.join('; ')}`);
|
|
@@ -351,7 +345,7 @@ async function rollbackPackageRuntimeActivation(
|
|
|
351
345
|
}
|
|
352
346
|
try {
|
|
353
347
|
if (request.priorConfigBytes === undefined) rmSync(servicePaths.configPath, { force: true });
|
|
354
|
-
else
|
|
348
|
+
else writeAtomicTextFile(servicePaths.configPath, request.priorConfigBytes);
|
|
355
349
|
syncForgeRuntimeActiveEntrypoint(request.controllerHome);
|
|
356
350
|
} catch (error) {
|
|
357
351
|
errors.push(error instanceof Error ? error.message : String(error));
|
|
@@ -471,7 +465,7 @@ export async function installPackageRuntimeService(
|
|
|
471
465
|
host: options.host ?? '127.0.0.1',
|
|
472
466
|
port: options.port ?? 8765,
|
|
473
467
|
authTokenFile: options.authTokenFile,
|
|
474
|
-
|
|
468
|
+
topology: normalizeRuntimeDeploymentTopology(options.topology),
|
|
475
469
|
};
|
|
476
470
|
writeForgeRuntimeServiceConfig(config);
|
|
477
471
|
syncForgeRuntimeActiveEntrypoint(controllerHome);
|
|
@@ -479,6 +473,11 @@ export async function installPackageRuntimeService(
|
|
|
479
473
|
const env = options.env ?? process.env;
|
|
480
474
|
const serviceHost = createPlatformServiceManagerHost({ platform, env, forcePortable: options.forcePortable });
|
|
481
475
|
const serviceManager = serviceHost.selection;
|
|
476
|
+
const retiredServices = await (dependencies.reconcileRetiredServices ?? reconcileRetiredForgePersistentServices)({
|
|
477
|
+
host: serviceHost,
|
|
478
|
+
env,
|
|
479
|
+
accountHome: env.HOME,
|
|
480
|
+
});
|
|
482
481
|
const installDarwinService = dependencies.installDarwinService ?? installForgeRuntimeService;
|
|
483
482
|
const explicitInjectedInline = Boolean(dependencies.installDarwinService && !dependencies.scheduleDarwinActivation && !dependencies.activationMode);
|
|
484
483
|
const activationMode = dependencies.activationMode ?? (explicitInjectedInline ? 'inline' : 'detached');
|
|
@@ -592,6 +591,7 @@ export async function installPackageRuntimeService(
|
|
|
592
591
|
}
|
|
593
592
|
}
|
|
594
593
|
|
|
594
|
+
base = { ...base, retiredServices };
|
|
595
595
|
if (!connectorEndpoint || base.status === 'activation_scheduled') return base;
|
|
596
596
|
const ensureConnectorService = dependencies.ensureConnectorService ?? ensurePackageConnectorService;
|
|
597
597
|
const connector = await ensureConnectorService({
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
1
3
|
import { runProcess } from '../../effects/process-runner';
|
|
2
4
|
import { PROCESS_RUNTIME_RELEASE_CANARY_ARG } from '../execution/process-runtime/canary';
|
|
5
|
+
import { resolveBunExecutable } from '../shared/process-environment';
|
|
3
6
|
import {
|
|
4
7
|
assertRuntimeReleaseExecutionSurface,
|
|
5
8
|
type RuntimeReleaseExecutionSurface,
|
|
6
9
|
} from './release-manifest';
|
|
7
10
|
|
|
8
11
|
export interface RuntimeReleaseExecutionCanaryCommand {
|
|
9
|
-
name: RuntimeReleaseExecutionSurface['entries'][number]['name'];
|
|
12
|
+
name: RuntimeReleaseExecutionSurface['entries'][number]['name'] | 'connector_cli';
|
|
10
13
|
executable: string;
|
|
11
14
|
args: string[];
|
|
12
15
|
}
|
|
@@ -22,8 +25,10 @@ export interface RuntimeReleaseExecutionCanaryDependencies {
|
|
|
22
25
|
|
|
23
26
|
/**
|
|
24
27
|
* Release execution canaries deliberately do not inherit developer-tool PATH
|
|
25
|
-
* entries.
|
|
26
|
-
*
|
|
28
|
+
* entries. Standalone-binary artifacts must execute without Homebrew, Bun, nvm,
|
|
29
|
+
* or similar PATH dependencies. Legacy source scripts are probed through the
|
|
30
|
+
* same explicitly resolved Bun executable that their Process Runtime uses in
|
|
31
|
+
* production, while executable shebangs remain the artifact's own launch contract.
|
|
27
32
|
*/
|
|
28
33
|
export function runtimeReleaseCanaryEnvironment(
|
|
29
34
|
env: NodeJS.ProcessEnv = process.env,
|
|
@@ -39,7 +44,23 @@ export function runtimeReleaseCanaryEnvironment(
|
|
|
39
44
|
return { ...env, PATH: '/usr/bin:/bin:/usr/sbin:/sbin' };
|
|
40
45
|
}
|
|
41
46
|
|
|
42
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* Execute legacy JavaScript/TypeScript through the resolved Bun runtime only
|
|
49
|
+
* when the artifact does not declare a different executable shebang.
|
|
50
|
+
*/
|
|
51
|
+
function releaseScriptRequiresBun(entryPath: string): boolean {
|
|
52
|
+
const firstLine = readFileSync(entryPath, 'utf8').split(/\r?\n/, 1)[0]?.trim() ?? '';
|
|
53
|
+
if (!firstLine.startsWith('#!')) return true;
|
|
54
|
+
const shebangTokens = firstLine.slice(2).trim().split(/\s+/).filter(Boolean);
|
|
55
|
+
return shebangTokens.some((token) => /(?:^|\/)bun(?:\.exe)?$/i.test(token));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Execute the minimum immutable Runtime execution surface plus the package
|
|
60
|
+
* Connector CLI import graph. The latter is intentionally a help-only command:
|
|
61
|
+
* it loads the exact CLI dependency closure used by the persistent Connector
|
|
62
|
+
* without opening a listener or mutating Runtime authority.
|
|
63
|
+
*/
|
|
43
64
|
export function assertRuntimeReleaseExecutionCanaries(
|
|
44
65
|
manifestPath: string,
|
|
45
66
|
controllerHome: string,
|
|
@@ -52,20 +73,44 @@ export function assertRuntimeReleaseExecutionCanaries(
|
|
|
52
73
|
{
|
|
53
74
|
cwd: surface.releaseRoot,
|
|
54
75
|
env: runtimeReleaseCanaryEnvironment(),
|
|
55
|
-
timeoutMs:
|
|
76
|
+
timeoutMs: 30_000,
|
|
56
77
|
maxOutputBytes: 64 * 1024,
|
|
57
78
|
},
|
|
58
79
|
));
|
|
59
|
-
|
|
60
|
-
const canary: RuntimeReleaseExecutionCanaryCommand = {
|
|
61
|
-
name: entry.name,
|
|
62
|
-
executable: entry.path,
|
|
63
|
-
args: [PROCESS_RUNTIME_RELEASE_CANARY_ARG],
|
|
64
|
-
};
|
|
80
|
+
const assertCanary = (canary: RuntimeReleaseExecutionCanaryCommand): void => {
|
|
65
81
|
const result = runExecutionEntryCanary(canary);
|
|
66
82
|
if (!result.ok) {
|
|
67
|
-
|
|
83
|
+
const detail = result.stderr || result.stdout || result.error || 'unknown failure';
|
|
84
|
+
const legacyCheckRunnerUsageProbe = surface.manifest.executionMode !== 'standalone-binary'
|
|
85
|
+
&& canary.name === 'check_runner'
|
|
86
|
+
&& detail.trim() === 'PERSISTED_CHECK_USAGE: missing --repo';
|
|
87
|
+
if (legacyCheckRunnerUsageProbe) return;
|
|
88
|
+
throw new Error(`RUNTIME_RELEASE_EXECUTION_CANARY_FAILED: ${canary.name}: ${detail}`.slice(0, 2_000));
|
|
68
89
|
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
for (const entry of surface.entries) {
|
|
93
|
+
const args = entry.canary === 'runtime_interpreter' ? ['--version'] : [PROCESS_RUNTIME_RELEASE_CANARY_ARG];
|
|
94
|
+
const legacyScript = surface.manifest.executionMode !== 'standalone-binary'
|
|
95
|
+
&& /\.(?:[cm]?js|tsx?)$/i.test(entry.path);
|
|
96
|
+
const usesExplicitBun = legacyScript && releaseScriptRequiresBun(entry.path);
|
|
97
|
+
assertCanary({
|
|
98
|
+
name: entry.name,
|
|
99
|
+
executable: usesExplicitBun ? resolveBunExecutable(process.execPath, process.env) : entry.path,
|
|
100
|
+
args: usesExplicitBun ? [entry.path, ...args] : args,
|
|
101
|
+
});
|
|
69
102
|
}
|
|
103
|
+
|
|
104
|
+
// Package launcher releases execute source-backed CLI code from their own
|
|
105
|
+
// immutable snapshot. Compiled standalone releases have a different closed
|
|
106
|
+
// artifact surface and therefore do not use this source CLI probe.
|
|
107
|
+
if (surface.manifest.executionMode !== 'standalone-binary' && surface.manifest.packageRoot) {
|
|
108
|
+
assertCanary({
|
|
109
|
+
name: 'connector_cli',
|
|
110
|
+
executable: resolveBunExecutable(process.execPath, process.env),
|
|
111
|
+
args: [join(surface.releaseRoot, 'package', 'src', 'cli', 'index.ts'), 'mcp', 'serve', '--help'],
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
70
115
|
return surface;
|
|
71
116
|
}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
1
2
|
import { createHash } from 'crypto';
|
|
2
|
-
import { readFileSync } from 'fs';
|
|
3
|
+
import { lstatSync, readFileSync } from 'fs';
|
|
3
4
|
import { dirname, join, resolve } from 'path';
|
|
4
|
-
import { pathToFileURL } from 'url';
|
|
5
5
|
|
|
6
6
|
export const RUNTIME_BUNDLE_ENTRYPOINT = 'forge-runtime-bundle.js' as const;
|
|
7
|
+
export const RUNTIME_INTERPRETER_ENTRYPOINT = process.platform === 'win32'
|
|
8
|
+
? 'forge-runtime-bun.exe' as const
|
|
9
|
+
: 'forge-runtime-bun' as const;
|
|
7
10
|
|
|
8
11
|
interface RuntimeBundleManifestRecord {
|
|
9
12
|
runtimeBundleEntrypoint?: unknown;
|
|
10
13
|
runtimeBundleArtifactIdentity?: unknown;
|
|
14
|
+
runtimeInterpreterEntrypoint?: unknown;
|
|
15
|
+
runtimeInterpreterArtifactIdentity?: unknown;
|
|
11
16
|
}
|
|
12
17
|
|
|
13
18
|
function releaseManifestPath(argv: readonly string[]): string {
|
|
@@ -21,6 +26,8 @@ export function resolveCompiledRuntimeBundle(argv: readonly string[] = process.a
|
|
|
21
26
|
manifestPath: string;
|
|
22
27
|
bundlePath: string;
|
|
23
28
|
artifactIdentity: string;
|
|
29
|
+
interpreterPath: string;
|
|
30
|
+
interpreterArtifactIdentity: string;
|
|
24
31
|
} {
|
|
25
32
|
const manifestPath = releaseManifestPath(argv);
|
|
26
33
|
let manifest: RuntimeBundleManifestRecord;
|
|
@@ -38,9 +45,14 @@ export function resolveCompiledRuntimeBundle(argv: readonly string[] = process.a
|
|
|
38
45
|
if (!/^sha256:[a-f0-9]{64}$/.test(artifactIdentity)) {
|
|
39
46
|
throw new Error('RUNTIME_RELEASE_BUNDLE_IDENTITY_INVALID');
|
|
40
47
|
}
|
|
41
|
-
const
|
|
48
|
+
const releaseRoot = dirname(manifestPath);
|
|
49
|
+
const bundlePath = join(releaseRoot, RUNTIME_BUNDLE_ENTRYPOINT);
|
|
42
50
|
let actualIdentity: string;
|
|
43
51
|
try {
|
|
52
|
+
const status = lstatSync(bundlePath);
|
|
53
|
+
if (status.isSymbolicLink() || !status.isFile()) {
|
|
54
|
+
throw new Error('bundle must be a regular file');
|
|
55
|
+
}
|
|
44
56
|
actualIdentity = `sha256:${createHash('sha256').update(readFileSync(bundlePath)).digest('hex')}`;
|
|
45
57
|
} catch (error) {
|
|
46
58
|
throw new Error(`RUNTIME_RELEASE_BUNDLE_READ_FAILED: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -48,16 +60,86 @@ export function resolveCompiledRuntimeBundle(argv: readonly string[] = process.a
|
|
|
48
60
|
if (actualIdentity !== artifactIdentity) {
|
|
49
61
|
throw new Error('RUNTIME_RELEASE_BUNDLE_ARTIFACT_IDENTITY_MISMATCH');
|
|
50
62
|
}
|
|
51
|
-
|
|
63
|
+
if (manifest.runtimeInterpreterEntrypoint !== RUNTIME_INTERPRETER_ENTRYPOINT) {
|
|
64
|
+
throw new Error(`RUNTIME_RELEASE_INTERPRETER_ENTRYPOINT_INVALID: expected ${RUNTIME_INTERPRETER_ENTRYPOINT}`);
|
|
65
|
+
}
|
|
66
|
+
const interpreterArtifactIdentity = typeof manifest.runtimeInterpreterArtifactIdentity === 'string'
|
|
67
|
+
? manifest.runtimeInterpreterArtifactIdentity.trim().toLowerCase()
|
|
68
|
+
: '';
|
|
69
|
+
if (!/^sha256:[a-f0-9]{64}$/.test(interpreterArtifactIdentity)) {
|
|
70
|
+
throw new Error('RUNTIME_RELEASE_INTERPRETER_IDENTITY_INVALID');
|
|
71
|
+
}
|
|
72
|
+
const interpreterPath = join(releaseRoot, RUNTIME_INTERPRETER_ENTRYPOINT);
|
|
73
|
+
let actualInterpreterIdentity: string;
|
|
74
|
+
try {
|
|
75
|
+
const status = lstatSync(interpreterPath);
|
|
76
|
+
if (status.isSymbolicLink() || !status.isFile() || (status.mode & 0o111) === 0) {
|
|
77
|
+
throw new Error('interpreter must be a regular executable file');
|
|
78
|
+
}
|
|
79
|
+
actualInterpreterIdentity = `sha256:${createHash('sha256').update(readFileSync(interpreterPath)).digest('hex')}`;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
throw new Error(`RUNTIME_RELEASE_INTERPRETER_READ_FAILED: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
}
|
|
83
|
+
if (actualInterpreterIdentity !== interpreterArtifactIdentity) {
|
|
84
|
+
throw new Error('RUNTIME_RELEASE_INTERPRETER_ARTIFACT_IDENTITY_MISMATCH');
|
|
85
|
+
}
|
|
86
|
+
return { manifestPath, bundlePath, artifactIdentity, interpreterPath, interpreterArtifactIdentity };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function runtimeChildArgs(argv: readonly string[]): string[] {
|
|
90
|
+
const firstRuntimeArgument = argv.findIndex((argument) => argument.startsWith('--'));
|
|
91
|
+
if (firstRuntimeArgument < 0 || !argv.includes('--controller-home')) {
|
|
92
|
+
throw new Error('RUNTIME_CONTROLLER_HOME_ARGUMENT_REQUIRED');
|
|
93
|
+
}
|
|
94
|
+
return argv.slice(firstRuntimeArgument);
|
|
52
95
|
}
|
|
53
96
|
|
|
54
97
|
export async function runCompiledRuntimeLoader(argv: string[] = process.argv): Promise<void> {
|
|
55
98
|
const bundle = resolveCompiledRuntimeBundle(argv);
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
99
|
+
const child = spawn(bundle.interpreterPath, [bundle.bundlePath, ...runtimeChildArgs(argv)], {
|
|
100
|
+
cwd: dirname(bundle.manifestPath),
|
|
101
|
+
stdio: 'inherit',
|
|
102
|
+
env: process.env,
|
|
103
|
+
});
|
|
104
|
+
let childExited = false;
|
|
105
|
+
const forwardSignal = (signal: NodeJS.Signals): void => {
|
|
106
|
+
if (childExited) return;
|
|
107
|
+
try { child.kill(signal); } catch { /* child lifecycle reconciliation owns terminal state */ }
|
|
108
|
+
};
|
|
109
|
+
const terminateChildOnLauncherExit = (): void => {
|
|
110
|
+
if (childExited) return;
|
|
111
|
+
try { child.kill('SIGTERM'); } catch { /* launcher is already exiting */ }
|
|
112
|
+
};
|
|
113
|
+
const forwardedSignals: NodeJS.Signals[] = process.platform === 'win32'
|
|
114
|
+
? ['SIGINT', 'SIGTERM']
|
|
115
|
+
: ['SIGINT', 'SIGTERM', 'SIGUSR1', 'SIGUSR2'];
|
|
116
|
+
const signalHandlers = new Map<NodeJS.Signals, () => void>();
|
|
117
|
+
for (const signal of forwardedSignals) {
|
|
118
|
+
const handler = () => forwardSignal(signal);
|
|
119
|
+
signalHandlers.set(signal, handler);
|
|
120
|
+
process.on(signal, handler);
|
|
121
|
+
}
|
|
122
|
+
process.once('exit', terminateChildOnLauncherExit);
|
|
123
|
+
try {
|
|
124
|
+
const outcome = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolveChild, rejectChild) => {
|
|
125
|
+
child.once('error', rejectChild);
|
|
126
|
+
child.once('exit', (code, signal) => {
|
|
127
|
+
childExited = true;
|
|
128
|
+
resolveChild({ code, signal });
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
if (outcome.signal) {
|
|
132
|
+
for (const [signal, handler] of signalHandlers) process.off(signal, handler);
|
|
133
|
+
signalHandlers.clear();
|
|
134
|
+
process.off('exit', terminateChildOnLauncherExit);
|
|
135
|
+
process.kill(process.pid, outcome.signal);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (outcome.code !== 0) process.exitCode = outcome.code ?? 1;
|
|
139
|
+
} finally {
|
|
140
|
+
for (const [signal, handler] of signalHandlers) process.off(signal, handler);
|
|
141
|
+
process.off('exit', terminateChildOnLauncherExit);
|
|
59
142
|
}
|
|
60
|
-
await loaded.runCanonicalRuntimeCli(argv);
|
|
61
143
|
}
|
|
62
144
|
|
|
63
145
|
if (import.meta.main) {
|
|
@@ -53,20 +53,19 @@ function optionalRuntimeComponent<
|
|
|
53
53
|
export const COMPILED_RUNTIME_RELEASE_COMPONENT_FIELDS = [
|
|
54
54
|
'executionMode',
|
|
55
55
|
'runtimeBundleEntrypoint', 'runtimeBundleArtifactIdentity',
|
|
56
|
+
'runtimeInterpreterEntrypoint', 'runtimeInterpreterArtifactIdentity',
|
|
56
57
|
'diagnosticEntrypoint', 'diagnosticArtifactIdentity',
|
|
58
|
+
'connectorEntrypoint', 'connectorArtifactIdentity',
|
|
57
59
|
'browserNodeBridgeEntrypoint', 'browserNodeBridgeArtifactIdentity',
|
|
58
60
|
'browserHandoffEntrypoint', 'browserHandoffArtifactIdentity',
|
|
61
|
+
'workflowSupervisorNativeHostEntrypoint', 'workflowSupervisorNativeHostArtifactIdentity',
|
|
59
62
|
'processRunnerEntrypoint', 'processRunnerArtifactIdentity',
|
|
60
63
|
'checkRunnerEntrypoint', 'checkRunnerArtifactIdentity',
|
|
61
64
|
'schedulerWorkerEntrypoint', 'schedulerWorkerArtifactIdentity',
|
|
62
65
|
'periodicCleanupEntrypoint', 'periodicCleanupArtifactIdentity',
|
|
63
66
|
'pluginActionSidecarEntrypoint', 'pluginActionSidecarArtifactIdentity',
|
|
64
67
|
'externalPluginProbeEntrypoint', 'externalPluginProbeArtifactIdentity',
|
|
65
|
-
'codeGraphNodeEntrypoint', 'codeGraphNodeArtifactIdentity',
|
|
66
|
-
'codeGraphSidecarEntrypoint', 'codeGraphSidecarArtifactIdentity',
|
|
67
|
-
'codeGraphLibraryRoot', 'codeGraphLibraryArtifactIdentity',
|
|
68
68
|
'packageRoot', 'packageArtifactIdentity',
|
|
69
|
-
'controllerUiRoot', 'controllerUiArtifactIdentity',
|
|
70
69
|
] as const satisfies readonly (keyof RuntimeReleaseManifest)[];
|
|
71
70
|
|
|
72
71
|
/**
|
|
@@ -120,12 +119,32 @@ export function loadRuntimeReleaseManifest(
|
|
|
120
119
|
identityField: 'runtimeBundleArtifactIdentity',
|
|
121
120
|
canonicalEntry: 'forge-runtime-bundle.js',
|
|
122
121
|
});
|
|
122
|
+
const runtimeInterpreter = optionalRuntimeComponent({
|
|
123
|
+
value,
|
|
124
|
+
entryField: 'runtimeInterpreterEntrypoint',
|
|
125
|
+
identityField: 'runtimeInterpreterArtifactIdentity',
|
|
126
|
+
canonicalEntry: (process.platform === 'win32' ? 'forge-runtime-bun.exe' : 'forge-runtime-bun') as RuntimeReleaseManifest['runtimeInterpreterEntrypoint'],
|
|
127
|
+
});
|
|
123
128
|
if (value.configurationSchemaVersion !== 1) {
|
|
124
129
|
throw new Error('RELEASE_MANIFEST_INVALID: configurationSchemaVersion must be 1');
|
|
125
130
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
131
|
+
// Pre-scope compiled releases were portable and omitted both fields. Legacy
|
|
132
|
+
// package releases always persisted controllerHome, so preserve that binding
|
|
133
|
+
// while accepting the immutable compiled artifact format already in use.
|
|
134
|
+
const deploymentScope = value.deploymentScope === undefined
|
|
135
|
+
? (value.controllerHome === undefined ? 'portable' : 'controller-home')
|
|
136
|
+
: requireString(value.deploymentScope, 'deploymentScope');
|
|
137
|
+
if (deploymentScope !== 'controller-home' && deploymentScope !== 'portable') {
|
|
138
|
+
throw new Error(`RELEASE_MANIFEST_INVALID: deploymentScope must be portable when present, got ${deploymentScope}`);
|
|
139
|
+
}
|
|
140
|
+
let controllerHome: string | undefined;
|
|
141
|
+
if (deploymentScope === 'controller-home') {
|
|
142
|
+
controllerHome = resolve(requireString(value.controllerHome, 'controllerHome'));
|
|
143
|
+
if (canonicalExistingPathIdentity(controllerHome) !== canonicalExistingPathIdentity(expectedControllerHome)) {
|
|
144
|
+
throw new Error('RELEASE_MANIFEST_CONTROLLER_HOME_MISMATCH');
|
|
145
|
+
}
|
|
146
|
+
} else if (value.controllerHome !== undefined) {
|
|
147
|
+
throw new Error('RELEASE_MANIFEST_INVALID: portable release must not embed controllerHome');
|
|
129
148
|
}
|
|
130
149
|
const compatibility = value.databaseSchemaCompatibility as Record<string, unknown> | undefined;
|
|
131
150
|
const minimum = Number(compatibility?.minimum);
|
|
@@ -144,6 +163,12 @@ export function loadRuntimeReleaseManifest(
|
|
|
144
163
|
identityField: 'diagnosticArtifactIdentity',
|
|
145
164
|
canonicalEntry: 'forge-cli',
|
|
146
165
|
});
|
|
166
|
+
const connector = optionalRuntimeComponent({
|
|
167
|
+
value,
|
|
168
|
+
entryField: 'connectorEntrypoint',
|
|
169
|
+
identityField: 'connectorArtifactIdentity',
|
|
170
|
+
canonicalEntry: 'forge-mcp-gateway',
|
|
171
|
+
});
|
|
147
172
|
const browserNodeBridge = optionalRuntimeComponent({
|
|
148
173
|
value,
|
|
149
174
|
entryField: 'browserNodeBridgeEntrypoint',
|
|
@@ -156,6 +181,12 @@ export function loadRuntimeReleaseManifest(
|
|
|
156
181
|
identityField: 'browserHandoffArtifactIdentity',
|
|
157
182
|
canonicalEntry: 'browser-handoff-host.js',
|
|
158
183
|
});
|
|
184
|
+
const workflowSupervisorNativeHost = optionalRuntimeComponent({
|
|
185
|
+
value,
|
|
186
|
+
entryField: 'workflowSupervisorNativeHostEntrypoint',
|
|
187
|
+
identityField: 'workflowSupervisorNativeHostArtifactIdentity',
|
|
188
|
+
canonicalEntry: 'forge-workflow-supervisor-native-host',
|
|
189
|
+
});
|
|
159
190
|
const processRunner = optionalRuntimeComponent({
|
|
160
191
|
value,
|
|
161
192
|
entryField: 'processRunnerEntrypoint',
|
|
@@ -168,6 +199,18 @@ export function loadRuntimeReleaseManifest(
|
|
|
168
199
|
identityField: 'checkRunnerArtifactIdentity',
|
|
169
200
|
canonicalEntry: 'forge-check-runner',
|
|
170
201
|
});
|
|
202
|
+
const typescriptNavigation = optionalRuntimeComponent({
|
|
203
|
+
value,
|
|
204
|
+
entryField: 'typescriptNavigationEntrypoint',
|
|
205
|
+
identityField: 'typescriptNavigationArtifactIdentity',
|
|
206
|
+
canonicalEntry: 'forge-typescript-navigation',
|
|
207
|
+
});
|
|
208
|
+
const contextPack = optionalRuntimeComponent({
|
|
209
|
+
value,
|
|
210
|
+
entryField: 'contextPackEntrypoint',
|
|
211
|
+
identityField: 'contextPackArtifactIdentity',
|
|
212
|
+
canonicalEntry: 'forge-context-pack',
|
|
213
|
+
});
|
|
171
214
|
const schedulerWorker = optionalRuntimeComponent({
|
|
172
215
|
value,
|
|
173
216
|
entryField: 'schedulerWorkerEntrypoint',
|
|
@@ -232,36 +275,6 @@ export function loadRuntimeReleaseManifest(
|
|
|
232
275
|
};
|
|
233
276
|
}
|
|
234
277
|
|
|
235
|
-
const codeGraphFields = [
|
|
236
|
-
value.codeGraphNodeEntrypoint,
|
|
237
|
-
value.codeGraphNodeArtifactIdentity,
|
|
238
|
-
value.codeGraphSidecarEntrypoint,
|
|
239
|
-
value.codeGraphSidecarArtifactIdentity,
|
|
240
|
-
value.codeGraphLibraryRoot,
|
|
241
|
-
value.codeGraphLibraryArtifactIdentity,
|
|
242
|
-
];
|
|
243
|
-
const hasCodeGraphRuntime = codeGraphFields.some((entry) => entry !== undefined);
|
|
244
|
-
let codeGraphRuntime: Pick<RuntimeReleaseManifest,
|
|
245
|
-
'codeGraphNodeEntrypoint' | 'codeGraphNodeArtifactIdentity'
|
|
246
|
-
| 'codeGraphSidecarEntrypoint' | 'codeGraphSidecarArtifactIdentity'
|
|
247
|
-
| 'codeGraphLibraryRoot' | 'codeGraphLibraryArtifactIdentity'> | undefined;
|
|
248
|
-
if (hasCodeGraphRuntime) {
|
|
249
|
-
const nodeEntrypoint = requireString(value.codeGraphNodeEntrypoint, 'codeGraphNodeEntrypoint');
|
|
250
|
-
const sidecarEntrypoint = requireString(value.codeGraphSidecarEntrypoint, 'codeGraphSidecarEntrypoint');
|
|
251
|
-
const libraryRoot = requireString(value.codeGraphLibraryRoot, 'codeGraphLibraryRoot');
|
|
252
|
-
if (nodeEntrypoint !== 'codegraph-node' || sidecarEntrypoint !== 'codegraph-sidecar.cjs' || libraryRoot !== 'codegraph-lib') {
|
|
253
|
-
throw new Error('RELEASE_MANIFEST_INVALID: CodeGraph release paths must use the canonical co-located names');
|
|
254
|
-
}
|
|
255
|
-
codeGraphRuntime = {
|
|
256
|
-
codeGraphNodeEntrypoint: 'codegraph-node',
|
|
257
|
-
codeGraphNodeArtifactIdentity: requireSha256Identity(value.codeGraphNodeArtifactIdentity, 'codeGraphNodeArtifactIdentity'),
|
|
258
|
-
codeGraphSidecarEntrypoint: 'codegraph-sidecar.cjs',
|
|
259
|
-
codeGraphSidecarArtifactIdentity: requireSha256Identity(value.codeGraphSidecarArtifactIdentity, 'codeGraphSidecarArtifactIdentity'),
|
|
260
|
-
codeGraphLibraryRoot: 'codegraph-lib',
|
|
261
|
-
codeGraphLibraryArtifactIdentity: requireSha256Identity(value.codeGraphLibraryArtifactIdentity, 'codeGraphLibraryArtifactIdentity'),
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
|
|
265
278
|
const argumentsValue = value.arguments;
|
|
266
279
|
if (!Array.isArray(argumentsValue) || argumentsValue.some((item) => typeof item !== 'string')) {
|
|
267
280
|
throw new Error('RELEASE_MANIFEST_INVALID: arguments must be a string array');
|
|
@@ -280,22 +293,26 @@ export function loadRuntimeReleaseManifest(
|
|
|
280
293
|
entrypoint: 'forge-runtime',
|
|
281
294
|
...(executionMode ? { executionMode: 'standalone-binary' as const } : {}),
|
|
282
295
|
...(runtimeBundle ?? {}),
|
|
296
|
+
...(runtimeInterpreter ?? {}),
|
|
283
297
|
...(diagnostic ?? {}),
|
|
298
|
+
...(connector ?? {}),
|
|
284
299
|
...(browserNodeBridge ?? {}),
|
|
285
300
|
...(browserHandoff ?? {}),
|
|
301
|
+
...(workflowSupervisorNativeHost ?? {}),
|
|
286
302
|
...(processRunner ?? {}),
|
|
287
303
|
...(checkRunner ?? {}),
|
|
304
|
+
...(typescriptNavigation ?? {}),
|
|
305
|
+
...(contextPack ?? {}),
|
|
288
306
|
...(schedulerWorker ?? {}),
|
|
289
307
|
...(periodicCleanup ?? {}),
|
|
290
308
|
...(pluginActionSidecar ?? {}),
|
|
291
309
|
...(externalPluginProbe ?? {}),
|
|
292
310
|
...(browserAutomationHelper ?? {}),
|
|
293
|
-
...(codeGraphRuntime ?? {}),
|
|
294
311
|
...(packageSnapshot ?? {}),
|
|
295
312
|
...(controllerUi ?? {}),
|
|
296
313
|
arguments: argumentsValue as string[],
|
|
297
314
|
configurationSchemaVersion: 1,
|
|
298
|
-
controllerHome,
|
|
315
|
+
...(deploymentScope === 'portable' ? { deploymentScope: 'portable' as const } : { controllerHome: controllerHome! }),
|
|
299
316
|
databaseSchemaCompatibility: { minimum, maximum },
|
|
300
317
|
workerProtocolVersion,
|
|
301
318
|
...(typeof value.sourceRepositoryId === 'string' && value.sourceRepositoryId.trim() ? { sourceRepositoryId: value.sourceRepositoryId.trim() } : {}),
|
|
@@ -310,9 +327,10 @@ export interface RuntimeReleaseExecutionSurface {
|
|
|
310
327
|
manifest: RuntimeReleaseManifest;
|
|
311
328
|
releaseRoot: string;
|
|
312
329
|
entries: Array<{
|
|
313
|
-
name: 'process_runner' | 'check_runner' | 'scheduler_worker' | 'periodic_cleanup';
|
|
330
|
+
name: 'runtime_interpreter' | 'process_runner' | 'check_runner' | 'typescript_navigation' | 'context_pack' | 'scheduler_worker' | 'periodic_cleanup';
|
|
314
331
|
path: string;
|
|
315
332
|
artifactIdentity: string;
|
|
333
|
+
canary: 'runtime_interpreter' | 'process_runtime';
|
|
316
334
|
}>;
|
|
317
335
|
}
|
|
318
336
|
|
|
@@ -338,25 +356,47 @@ export function assertRuntimeReleaseExecutionSurface(
|
|
|
338
356
|
}
|
|
339
357
|
const releaseRoot = dirname(resolvedManifestPath);
|
|
340
358
|
const entries: RuntimeReleaseExecutionSurface['entries'] = [
|
|
359
|
+
...(manifest.runtimeInterpreterEntrypoint && manifest.runtimeInterpreterArtifactIdentity ? [{
|
|
360
|
+
name: 'runtime_interpreter' as const,
|
|
361
|
+
path: join(releaseRoot, manifest.runtimeInterpreterEntrypoint),
|
|
362
|
+
artifactIdentity: manifest.runtimeInterpreterArtifactIdentity,
|
|
363
|
+
canary: 'runtime_interpreter' as const,
|
|
364
|
+
}] : []),
|
|
341
365
|
{
|
|
342
366
|
name: 'process_runner',
|
|
343
367
|
path: join(releaseRoot, manifest.processRunnerEntrypoint),
|
|
344
368
|
artifactIdentity: manifest.processRunnerArtifactIdentity,
|
|
369
|
+
canary: 'process_runtime',
|
|
345
370
|
},
|
|
346
371
|
{
|
|
347
372
|
name: 'check_runner',
|
|
348
373
|
path: join(releaseRoot, manifest.checkRunnerEntrypoint),
|
|
349
374
|
artifactIdentity: manifest.checkRunnerArtifactIdentity,
|
|
375
|
+
canary: 'process_runtime',
|
|
350
376
|
},
|
|
377
|
+
...(manifest.typescriptNavigationEntrypoint && manifest.typescriptNavigationArtifactIdentity ? [{
|
|
378
|
+
name: 'typescript_navigation' as const,
|
|
379
|
+
path: join(releaseRoot, manifest.typescriptNavigationEntrypoint),
|
|
380
|
+
artifactIdentity: manifest.typescriptNavigationArtifactIdentity,
|
|
381
|
+
canary: 'process_runtime' as const,
|
|
382
|
+
}] : []),
|
|
383
|
+
...(manifest.contextPackEntrypoint && manifest.contextPackArtifactIdentity ? [{
|
|
384
|
+
name: 'context_pack' as const,
|
|
385
|
+
path: join(releaseRoot, manifest.contextPackEntrypoint),
|
|
386
|
+
artifactIdentity: manifest.contextPackArtifactIdentity,
|
|
387
|
+
canary: 'process_runtime' as const,
|
|
388
|
+
}] : []),
|
|
351
389
|
...(manifest.schedulerWorkerEntrypoint && manifest.schedulerWorkerArtifactIdentity ? [{
|
|
352
390
|
name: 'scheduler_worker' as const,
|
|
353
391
|
path: join(releaseRoot, manifest.schedulerWorkerEntrypoint),
|
|
354
392
|
artifactIdentity: manifest.schedulerWorkerArtifactIdentity,
|
|
393
|
+
canary: 'process_runtime' as const,
|
|
355
394
|
}] : []),
|
|
356
395
|
...(manifest.periodicCleanupEntrypoint && manifest.periodicCleanupArtifactIdentity ? [{
|
|
357
396
|
name: 'periodic_cleanup' as const,
|
|
358
397
|
path: join(releaseRoot, manifest.periodicCleanupEntrypoint),
|
|
359
398
|
artifactIdentity: manifest.periodicCleanupArtifactIdentity,
|
|
399
|
+
canary: 'process_runtime' as const,
|
|
360
400
|
}] : []),
|
|
361
401
|
];
|
|
362
402
|
for (const entry of entries) {
|