@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
package/src/cli/commands/mcp.ts
CHANGED
|
@@ -28,7 +28,6 @@ export interface McpServeOptions {
|
|
|
28
28
|
devRunnerAgents?: string;
|
|
29
29
|
devRunnerTimeoutMs?: string;
|
|
30
30
|
devRunnerMaxTimeoutMs?: string;
|
|
31
|
-
toolset?: 'facade' | 'core' | 'advanced' | 'full';
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
interface McpAccessOptions {
|
|
@@ -105,7 +104,6 @@ async function runRepositoryAccessCommand(
|
|
|
105
104
|
repo: rawOpts.repo ?? '.',
|
|
106
105
|
controllerHome: rawOpts.controllerHome,
|
|
107
106
|
profile: 'controller',
|
|
108
|
-
toolset: 'core',
|
|
109
107
|
});
|
|
110
108
|
const result = callAccessTool(ctx, toolName, {
|
|
111
109
|
repo_id: rawOpts.repoId,
|
|
@@ -170,7 +168,6 @@ export function buildMcpCommand(): Command {
|
|
|
170
168
|
.option('--host <host>', 'HTTP bind host', '127.0.0.1')
|
|
171
169
|
.option('--port <port>', 'HTTP bind port', '8765')
|
|
172
170
|
.option('--profile <profile>', 'MCP profile: planner|executor|orchestrator|controller', 'controller')
|
|
173
|
-
.option('--toolset <toolset>', 'Controller toolset: facade|core|advanced|full (default advanced; facade is an explicit five-tool ChatGPT surface)')
|
|
174
171
|
.option('--auth <mode>', 'HTTP auth mode: oauth|bearer|none', 'oauth')
|
|
175
172
|
.option('--enable-chatgpt-browser', 'Expose tools that operate the user logged-in ChatGPT Web browser session')
|
|
176
173
|
.option('--enable-dev-runner', 'Enable local Codex/Claude task runners for controller or orchestrator profiles')
|
|
@@ -191,7 +188,6 @@ export function buildMcpCommand(): Command {
|
|
|
191
188
|
repo: rawOpts.repo ?? '.',
|
|
192
189
|
controllerHome: rawOpts.controllerHome,
|
|
193
190
|
profile: rawOpts.profile,
|
|
194
|
-
toolset: rawOpts.toolset,
|
|
195
191
|
enableChatgptBrowser: rawOpts.enableChatgptBrowser === true,
|
|
196
192
|
enableDevRunner: rawOpts.enableDevRunner,
|
|
197
193
|
devRunnerAgents: rawOpts.devRunnerAgents,
|
|
@@ -206,7 +202,6 @@ export function buildMcpCommand(): Command {
|
|
|
206
202
|
repo: rawOpts.repo,
|
|
207
203
|
controllerHome: rawOpts.controllerHome,
|
|
208
204
|
profile: rawOpts.profile,
|
|
209
|
-
toolset: rawOpts.toolset,
|
|
210
205
|
host: rawOpts.host,
|
|
211
206
|
port: parsePort(rawOpts.port),
|
|
212
207
|
auth: rawOpts.auth,
|
|
@@ -18,7 +18,6 @@ import {
|
|
|
18
18
|
isAgenticPackagingIntent,
|
|
19
19
|
isBugFixIntent,
|
|
20
20
|
isBugOrHuntIntent,
|
|
21
|
-
isCodegraphRouteIntent,
|
|
22
21
|
isDoneIntent,
|
|
23
22
|
isEmbeddedApprovedPlanIntent,
|
|
24
23
|
isExecutionApprovalIntent,
|
|
@@ -185,7 +184,6 @@ export function runPromptGuardVerdictFromPrompt(prompt: string): PromptGuardVerd
|
|
|
185
184
|
plan_discussion_continuation: bit(decisionFacts.planningDiscussion),
|
|
186
185
|
trigger_question: bit(isTriggerQuestionPrompt(ctx)),
|
|
187
186
|
agentic_packaging: bit(isAgenticPackagingIntent(ctx)),
|
|
188
|
-
codegraph_route: bit(isCodegraphRouteIntent(ctx)),
|
|
189
187
|
nontrivial_code_task: bit(isNontrivialCodeTaskIntent(ctx)),
|
|
190
188
|
health_route: bit(isHealthRouteIntent(ctx)),
|
|
191
189
|
spa_day: bit(isSpaDayIntent(ctx)),
|
|
@@ -19,8 +19,7 @@ import {
|
|
|
19
19
|
} from '../repositories/controller-home';
|
|
20
20
|
import { FORGE_VERSION } from '../../version';
|
|
21
21
|
import {
|
|
22
|
-
|
|
23
|
-
RECOVERY_WATCHDOG_LABEL,
|
|
22
|
+
RECOVERY_DAEMON_LABEL,
|
|
24
23
|
inspectRecoveryTunnelLaunchdContract,
|
|
25
24
|
installStandaloneRecovery,
|
|
26
25
|
recoveryLaunchdPid,
|
|
@@ -37,6 +36,7 @@ import {
|
|
|
37
36
|
activateRuntimeRelease,
|
|
38
37
|
defaultPrimaryRuntimeServiceConfig,
|
|
39
38
|
loadRecoveryConfig,
|
|
39
|
+
normalizeRecoveryInstallProfile,
|
|
40
40
|
recoverPrimaryRuntime,
|
|
41
41
|
recoveryMachineIdentity,
|
|
42
42
|
restartPrimaryConnector,
|
|
@@ -61,7 +61,6 @@ import {
|
|
|
61
61
|
scheduleLinuxControllerHomeMigration,
|
|
62
62
|
type RecoveryControllerHomeMigrationPreflight,
|
|
63
63
|
} from '../../runtime/standalone-recovery/controller-home-migration';
|
|
64
|
-
import { configureCodegraph, ensureCodegraph } from '../tools/codegraph';
|
|
65
64
|
import { isProcessAlive } from '../../runtime/shared/process-tree';
|
|
66
65
|
import { systemdUserServicePid, systemdUserUnitName, systemdUserUnitPath } from '../controller/systemd-user';
|
|
67
66
|
import { installWindowsHostRecoveryPlugin } from '../../runtime/plugins/windows-host-recovery-install';
|
|
@@ -149,12 +148,57 @@ export type { RecoveryControllerHomeMigrationPreflight };
|
|
|
149
148
|
export interface RecoveryConnectorDependencies {
|
|
150
149
|
platform?: NodeJS.Platform;
|
|
151
150
|
pathExists?: (path: string) => boolean;
|
|
152
|
-
launchdPid?: (role: '
|
|
153
|
-
systemdPid?: (role: '
|
|
151
|
+
launchdPid?: (role: 'daemon') => number | undefined;
|
|
152
|
+
systemdPid?: (role: 'daemon') => number | undefined;
|
|
154
153
|
tunnelLaunchdPid?: (label: string) => number | undefined;
|
|
155
154
|
tunnelSystemdPid?: (unitName: string) => number | undefined;
|
|
156
155
|
openAiTunnelStatus?: (service: OpenAiSecureTunnelServiceConfig) => OpenAiSecureTunnelRuntimeObservation;
|
|
157
156
|
processAlive?: (pid: number) => boolean;
|
|
157
|
+
processParentPid?: (pid: number) => number | undefined;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function recoveryProcessParentPid(pid: number): number | undefined {
|
|
161
|
+
if (process.platform === 'win32' || !Number.isInteger(pid) || pid <= 1) return undefined;
|
|
162
|
+
const result = spawnSync('ps', ['-o', 'ppid=', '-p', String(pid)], {
|
|
163
|
+
encoding: 'utf8',
|
|
164
|
+
timeout: 2_000,
|
|
165
|
+
maxBuffer: 8 * 1024,
|
|
166
|
+
});
|
|
167
|
+
if (result.status !== 0) return undefined;
|
|
168
|
+
const parent = Number.parseInt((result.stdout ?? '').trim(), 10);
|
|
169
|
+
return Number.isInteger(parent) && parent > 0 ? parent : undefined;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* launchd may own a tiny wrapper (/usr/bin/env) while Recovery records the
|
|
174
|
+
* compiled child PID in its runtime identity. Treat only that bounded process
|
|
175
|
+
* lineage as the same managed service; unrelated live PIDs still fail closed.
|
|
176
|
+
*/
|
|
177
|
+
export function recoveryManagedServiceOwnsRuntimeProcess(
|
|
178
|
+
managedPid: number | undefined,
|
|
179
|
+
runtimePid: number | undefined,
|
|
180
|
+
dependencies: {
|
|
181
|
+
processAlive?: (pid: number) => boolean;
|
|
182
|
+
processParentPid?: (pid: number) => number | undefined;
|
|
183
|
+
maxDepth?: number;
|
|
184
|
+
} = {},
|
|
185
|
+
): boolean {
|
|
186
|
+
if (!managedPid || !runtimePid || managedPid <= 0 || runtimePid <= 0) return false;
|
|
187
|
+
const processAlive = dependencies.processAlive ?? isProcessAlive;
|
|
188
|
+
if (!processAlive(managedPid) || !processAlive(runtimePid)) return false;
|
|
189
|
+
if (managedPid === runtimePid) return true;
|
|
190
|
+
const parentPid = dependencies.processParentPid ?? recoveryProcessParentPid;
|
|
191
|
+
const maxDepth = Math.max(1, Math.min(Math.trunc(dependencies.maxDepth ?? 8), 32));
|
|
192
|
+
const visited = new Set<number>([runtimePid]);
|
|
193
|
+
let current = runtimePid;
|
|
194
|
+
for (let depth = 0; depth < maxDepth; depth += 1) {
|
|
195
|
+
const parent = parentPid(current);
|
|
196
|
+
if (!parent || parent <= 0 || visited.has(parent)) return false;
|
|
197
|
+
if (parent === managedPid) return true;
|
|
198
|
+
visited.add(parent);
|
|
199
|
+
current = parent;
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
158
202
|
}
|
|
159
203
|
|
|
160
204
|
export interface RecoveryConnectorDescriptor {
|
|
@@ -174,8 +218,7 @@ export interface RecoveryConnectorDescriptor {
|
|
|
174
218
|
};
|
|
175
219
|
healthUrl: string;
|
|
176
220
|
services: {
|
|
177
|
-
|
|
178
|
-
watchdog: { label: string; platform: 'launchd' | 'systemd-user'; serviceInstalled: boolean; plistInstalled: boolean; running: boolean; pid?: number };
|
|
221
|
+
recovery: { label: string; platform: 'launchd' | 'systemd-user'; serviceInstalled: boolean; plistInstalled: boolean; running: boolean; pid?: number };
|
|
179
222
|
tunnel: {
|
|
180
223
|
configured: boolean;
|
|
181
224
|
platform?: 'launchd' | 'systemd-user' | 'openai-secure-tunnel';
|
|
@@ -208,15 +251,19 @@ export function recoveryConnectorDescriptor(
|
|
|
208
251
|
const url = configuredUrl ?? `${localOrigin}/recovery/mcp`;
|
|
209
252
|
const origin = new URL(url).origin;
|
|
210
253
|
const passphraseConfigured = Boolean(readMcpServiceOAuthPassphrase(home));
|
|
211
|
-
const
|
|
212
|
-
const watchdogIdentity = readRecoveryRuntimeIdentity(home, 'watchdog');
|
|
254
|
+
const recoveryIdentity = readRecoveryRuntimeIdentity(home, 'daemon');
|
|
213
255
|
const platform = dependencies.platform ?? process.platform;
|
|
214
256
|
const servicePlatform: 'launchd' | 'systemd-user' = platform === 'linux' ? 'systemd-user' : 'launchd';
|
|
215
257
|
const pathExists = dependencies.pathExists ?? existsSync;
|
|
216
258
|
const launchdPid = dependencies.launchdPid ?? recoveryLaunchdPid;
|
|
217
|
-
const systemdPid = dependencies.systemdPid ?? ((
|
|
218
|
-
const managedPid = (
|
|
259
|
+
const systemdPid = dependencies.systemdPid ?? ((_role: 'daemon') => systemdUserServicePid(RECOVERY_DAEMON_LABEL));
|
|
260
|
+
const managedPid = () => servicePlatform === 'systemd-user' ? systemdPid('daemon') : launchdPid('daemon');
|
|
219
261
|
const processAlive = dependencies.processAlive ?? isProcessAlive;
|
|
262
|
+
const serviceOwnsRuntimeProcess = (managedPid: number | undefined, runtimePid: number | undefined) =>
|
|
263
|
+
recoveryManagedServiceOwnsRuntimeProcess(managedPid, runtimePid, {
|
|
264
|
+
processAlive,
|
|
265
|
+
processParentPid: dependencies.processParentPid,
|
|
266
|
+
});
|
|
220
267
|
const configuredTunnel = config.recoveryTunnelService;
|
|
221
268
|
const tunnelService = configuredTunnel?.platform === 'launchd' ? configuredTunnel : undefined;
|
|
222
269
|
const systemdTunnelService = configuredTunnel?.platform === 'systemd-user' ? configuredTunnel : undefined;
|
|
@@ -256,40 +303,24 @@ export function recoveryConnectorDescriptor(
|
|
|
256
303
|
: Boolean(tunnelLaunchdPid && processAlive(tunnelLaunchdPid));
|
|
257
304
|
const tunnelHealthy = openAiTunnelService ? openAiTunnelStatus?.healthy === true : tunnelRunning;
|
|
258
305
|
const tunnelReady = openAiTunnelService ? openAiTunnelStatus?.ok === true : tunnelRestartSafe && tunnelRunning;
|
|
259
|
-
const
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
const
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const gatewayManagedPid = managedPid('gateway');
|
|
268
|
-
const watchdogManagedPid = managedPid('watchdog');
|
|
269
|
-
const gatewayRunning = Boolean(
|
|
270
|
-
gatewayIdentity
|
|
271
|
-
&& gatewayManagedPid
|
|
272
|
-
&& gatewayIdentity.pid === gatewayManagedPid
|
|
273
|
-
&& processAlive(gatewayIdentity.pid)
|
|
274
|
-
&& authority.current
|
|
275
|
-
&& gatewayIdentity.releaseRevision === authority.current.releaseRevision
|
|
276
|
-
&& gatewayIdentity.manifestSha256 === authority.current.manifestSha256,
|
|
277
|
-
);
|
|
278
|
-
const watchdogRunning = Boolean(
|
|
279
|
-
watchdogIdentity
|
|
280
|
-
&& watchdogManagedPid
|
|
281
|
-
&& watchdogIdentity.pid === watchdogManagedPid
|
|
282
|
-
&& processAlive(watchdogIdentity.pid)
|
|
306
|
+
const recoveryPlistInstalled = pathExists(authority.daemonLaunchAgent);
|
|
307
|
+
const recoveryServiceInstalled = servicePlatform === 'systemd-user'
|
|
308
|
+
? pathExists(systemdUserUnitPath(RECOVERY_DAEMON_LABEL))
|
|
309
|
+
: recoveryPlistInstalled;
|
|
310
|
+
const recoveryManagedPid = managedPid();
|
|
311
|
+
const recoveryRunning = Boolean(
|
|
312
|
+
recoveryIdentity
|
|
313
|
+
&& serviceOwnsRuntimeProcess(recoveryManagedPid, recoveryIdentity.pid)
|
|
283
314
|
&& authority.current
|
|
284
|
-
&&
|
|
285
|
-
&&
|
|
315
|
+
&& recoveryIdentity.releaseRevision === authority.current.releaseRevision
|
|
316
|
+
&& recoveryIdentity.manifestSha256 === authority.current.manifestSha256,
|
|
286
317
|
);
|
|
287
|
-
const installed = Boolean(authority.current &&
|
|
318
|
+
const installed = Boolean(authority.current && recoveryServiceInstalled);
|
|
288
319
|
const publicEndpoint = Boolean(configuredUrl?.startsWith('https://'));
|
|
289
320
|
const warnings: string[] = [];
|
|
290
321
|
if (!authority.current) warnings.push('No current immutable Forge Recovery release is installed. Run forge recovery install.');
|
|
291
|
-
if (!
|
|
292
|
-
if (!
|
|
322
|
+
if (!recoveryServiceInstalled) warnings.push(`Forge Recovery ${servicePlatform} service is not installed. Run forge recovery install.`);
|
|
323
|
+
if (!recoveryRunning) warnings.push('Forge Recovery service is not running on the current Recovery release.');
|
|
293
324
|
if (!configuredTunnel) warnings.push('Recovery is loopback-only. Configure a dedicated OpenAI Secure MCP Tunnel or an HTTPS tunnel service before adding it to ChatGPT.');
|
|
294
325
|
else if (openAiTunnelService) {
|
|
295
326
|
if (!tunnelRestartSafe) warnings.push('The dedicated OpenAI Recovery tunnel must use a valid alias, tunnel id, loopback MCP endpoint, and env:/file: runtime API key reference.');
|
|
@@ -310,7 +341,7 @@ export function recoveryConnectorDescriptor(
|
|
|
310
341
|
transport: 'streamable_http',
|
|
311
342
|
url,
|
|
312
343
|
public: publicEndpoint,
|
|
313
|
-
readyForChatGPT: installed &&
|
|
344
|
+
readyForChatGPT: installed && recoveryRunning && tunnelReady && (openAiTunnelService ? true : publicEndpoint) && passphraseConfigured,
|
|
314
345
|
installed,
|
|
315
346
|
currentRelease: authority.current?.releaseRevision,
|
|
316
347
|
previousRelease: authority.previous?.releaseRevision,
|
|
@@ -321,21 +352,13 @@ export function recoveryConnectorDescriptor(
|
|
|
321
352
|
},
|
|
322
353
|
healthUrl: `${origin}/recovery/health`,
|
|
323
354
|
services: {
|
|
324
|
-
|
|
325
|
-
label:
|
|
326
|
-
platform: servicePlatform,
|
|
327
|
-
serviceInstalled: gatewayServiceInstalled,
|
|
328
|
-
plistInstalled: gatewayPlistInstalled,
|
|
329
|
-
running: gatewayRunning,
|
|
330
|
-
...(gatewayIdentity ? { pid: gatewayIdentity.pid } : {}),
|
|
331
|
-
},
|
|
332
|
-
watchdog: {
|
|
333
|
-
label: RECOVERY_WATCHDOG_LABEL,
|
|
355
|
+
recovery: {
|
|
356
|
+
label: RECOVERY_DAEMON_LABEL,
|
|
334
357
|
platform: servicePlatform,
|
|
335
|
-
serviceInstalled:
|
|
336
|
-
plistInstalled:
|
|
337
|
-
running:
|
|
338
|
-
...(
|
|
358
|
+
serviceInstalled: recoveryServiceInstalled,
|
|
359
|
+
plistInstalled: recoveryPlistInstalled,
|
|
360
|
+
running: recoveryRunning,
|
|
361
|
+
...(recoveryIdentity ? { pid: recoveryIdentity.pid } : {}),
|
|
339
362
|
},
|
|
340
363
|
tunnel: {
|
|
341
364
|
configured: Boolean(configuredTunnel),
|
|
@@ -603,7 +626,6 @@ export async function verifyRecoveryConnector(
|
|
|
603
626
|
credentialRetirement: 'shared_recovery_token_not_individually_revocable',
|
|
604
627
|
};
|
|
605
628
|
|
|
606
|
-
let mcpSessionId: string | undefined;
|
|
607
629
|
const rpc = async (id: number | undefined, method: string, params?: Record<string, unknown>) => {
|
|
608
630
|
const response = await request(connector.url, {
|
|
609
631
|
method: 'POST',
|
|
@@ -612,10 +634,12 @@ export async function verifyRecoveryConnector(
|
|
|
612
634
|
accept: 'application/json, text/event-stream',
|
|
613
635
|
'content-type': 'application/json',
|
|
614
636
|
'mcp-protocol-version': '2025-06-18',
|
|
615
|
-
...(mcpSessionId ? { 'mcp-session-id': mcpSessionId } : {}),
|
|
616
637
|
},
|
|
617
638
|
body: JSON.stringify({ jsonrpc: '2.0', ...(id === undefined ? {} : { id }), method, ...(params ? { params } : {}) }),
|
|
618
639
|
});
|
|
640
|
+
if (response.headers.get('mcp-session-id')?.trim()) {
|
|
641
|
+
throw new Error(`${method} unexpectedly established transport session state`);
|
|
642
|
+
}
|
|
619
643
|
if (method === 'notifications/initialized') {
|
|
620
644
|
if (response.status !== 202) throw new Error(`${method} HTTP ${response.status}`);
|
|
621
645
|
return { response, result: {} as Record<string, unknown> };
|
|
@@ -625,71 +649,44 @@ export async function verifyRecoveryConnector(
|
|
|
625
649
|
if (response.status !== 200 || Object.keys(rpcError).length > 0) {
|
|
626
650
|
throw new Error(`${method} HTTP ${response.status}${typeof rpcError.message === 'string' ? `: ${rpcError.message}` : ''}`);
|
|
627
651
|
}
|
|
628
|
-
if (method === 'initialize') {
|
|
629
|
-
const returnedSessionId = response.headers.get('mcp-session-id')?.trim();
|
|
630
|
-
if (!returnedSessionId) throw new Error('initialize HTTP 200: Mcp-Session-Id missing');
|
|
631
|
-
mcpSessionId = returnedSessionId;
|
|
632
|
-
}
|
|
633
652
|
return { response, result: jsonObject(body.result) };
|
|
634
653
|
};
|
|
635
|
-
const closeMcpSession = async (): Promise<void> => {
|
|
636
|
-
const sessionId = mcpSessionId;
|
|
637
|
-
if (!sessionId) return;
|
|
638
|
-
mcpSessionId = undefined;
|
|
639
|
-
try {
|
|
640
|
-
await request(connector.url, {
|
|
641
|
-
method: 'DELETE',
|
|
642
|
-
headers: {
|
|
643
|
-
authorization: `Bearer ${accessToken}`,
|
|
644
|
-
accept: 'application/json, text/event-stream',
|
|
645
|
-
'mcp-protocol-version': '2025-06-18',
|
|
646
|
-
'mcp-session-id': sessionId,
|
|
647
|
-
},
|
|
648
|
-
});
|
|
649
|
-
} catch {
|
|
650
|
-
// Session cleanup is best-effort and must not hide the verifier result.
|
|
651
|
-
}
|
|
652
|
-
};
|
|
653
654
|
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
if (!mcpOk) failures.push('mcp: initialize, Forge version, tool surface, or read-only calls did not match the Recovery contract.');
|
|
690
|
-
} finally {
|
|
691
|
-
await closeMcpSession();
|
|
692
|
-
}
|
|
655
|
+
const initialized = await rpc(11, 'initialize', {
|
|
656
|
+
protocolVersion: '2025-06-18',
|
|
657
|
+
capabilities: {},
|
|
658
|
+
clientInfo: { name: 'forge-recovery-verifier', version: FORGE_VERSION },
|
|
659
|
+
});
|
|
660
|
+
const initializedNotification = await rpc(undefined, 'notifications/initialized');
|
|
661
|
+
const listed = await rpc(12, 'tools/list');
|
|
662
|
+
const tools = Array.isArray(listed.result.tools)
|
|
663
|
+
? listed.result.tools.map((tool) => jsonObject(tool).name).filter((name): name is string => typeof name === 'string')
|
|
664
|
+
: [];
|
|
665
|
+
const expectedTools = RECOVERY_TOOLS.map((tool) => tool.name);
|
|
666
|
+
const runtimeStatusCall = await rpc(13, 'tools/call', { name: 'runtime_status', arguments: {} });
|
|
667
|
+
const listReleasesCall = await rpc(14, 'tools/call', { name: 'list_releases', arguments: {} });
|
|
668
|
+
const initializedResult = initialized.result;
|
|
669
|
+
const serverInfo = jsonObject(initializedResult.serverInfo);
|
|
670
|
+
const mcpOk = initialized.response.status === 200
|
|
671
|
+
&& initializedNotification.response.status === 202
|
|
672
|
+
&& initializedResult.protocolVersion === '2025-06-18'
|
|
673
|
+
&& serverInfo.name === 'forge-standalone-recovery'
|
|
674
|
+
&& serverInfo.version === FORGE_VERSION
|
|
675
|
+
&& JSON.stringify(tools) === JSON.stringify(expectedTools)
|
|
676
|
+
&& runtimeStatusCall.response.status === 200
|
|
677
|
+
&& listReleasesCall.response.status === 200;
|
|
678
|
+
probes.mcp = {
|
|
679
|
+
ok: mcpOk,
|
|
680
|
+
initializeStatus: initialized.response.status,
|
|
681
|
+
initializedNotificationStatus: initializedNotification.response.status,
|
|
682
|
+
protocolVersion: typeof initializedResult.protocolVersion === 'string' ? initializedResult.protocolVersion : undefined,
|
|
683
|
+
serverName: typeof serverInfo.name === 'string' ? serverInfo.name : undefined,
|
|
684
|
+
serverVersion: typeof serverInfo.version === 'string' ? serverInfo.version : undefined,
|
|
685
|
+
tools,
|
|
686
|
+
runtimeStatusCall: runtimeStatusCall.response.status === 200,
|
|
687
|
+
listReleasesCall: listReleasesCall.response.status === 200,
|
|
688
|
+
};
|
|
689
|
+
if (!mcpOk) failures.push('mcp: stateless initialize, Forge version, tool surface, or read-only calls did not match the Recovery contract.');
|
|
693
690
|
} catch (error) {
|
|
694
691
|
failures.push(`oauthPkce/mcp: ${error instanceof Error ? error.message : String(error)}`);
|
|
695
692
|
}
|
|
@@ -751,16 +748,18 @@ export function buildRecoveryCommand(): Command {
|
|
|
751
748
|
.requiredOption('--repo <path>', 'Forge source repository root used for Recovery and Runtime immutable releases')
|
|
752
749
|
.requiredOption('--primary-connector-service-label <label>', 'Primary OAuth/Connector launchd label')
|
|
753
750
|
.option('--primary-connector-service-plist <path>', 'Absolute primary OAuth/Connector launchd plist path')
|
|
754
|
-
.option('--configure-codegraph', 'Initialize/sync CodeGraph and configure repository-scoped MCP for Codex and Claude during the bootstrap')
|
|
755
751
|
.action(async (opts: {
|
|
756
752
|
controllerHome: string;
|
|
757
753
|
repo: string;
|
|
758
754
|
primaryConnectorServiceLabel: string;
|
|
759
755
|
primaryConnectorServicePlist?: string;
|
|
760
|
-
configureCodegraph?: boolean;
|
|
761
756
|
}) => {
|
|
762
757
|
const home = resolveControllerHome(opts.controllerHome);
|
|
763
758
|
const repoRoot = resolve(opts.repo);
|
|
759
|
+
const primaryRuntimeSourceRepository = findRegisteredRepositoryByCheckoutRoot(repoRoot, home);
|
|
760
|
+
if (!primaryRuntimeSourceRepository) {
|
|
761
|
+
throw new Error(`RECOVERY_PRIMARY_RUNTIME_SOURCE_REPOSITORY_NOT_REGISTERED: ${repoRoot}`);
|
|
762
|
+
}
|
|
764
763
|
const current = loadRecoveryConfig(home);
|
|
765
764
|
const primaryConnectorBase = launchdService(
|
|
766
765
|
opts.primaryConnectorServiceLabel,
|
|
@@ -774,6 +773,7 @@ export function buildRecoveryCommand(): Command {
|
|
|
774
773
|
const installed = await installStandaloneRecovery({
|
|
775
774
|
controllerHome: home,
|
|
776
775
|
repoRoot,
|
|
776
|
+
primaryRuntimeSourceRepositoryId: primaryRuntimeSourceRepository.repoId,
|
|
777
777
|
port: current.gateway?.port ?? 8787,
|
|
778
778
|
publicMcpUrl: current.publicMcpUrl,
|
|
779
779
|
recoveryPublicUrl: current.recoveryPublicUrl,
|
|
@@ -781,6 +781,7 @@ export function buildRecoveryCommand(): Command {
|
|
|
781
781
|
primaryPublicTunnelService: current.primaryPublicTunnelService,
|
|
782
782
|
primaryRuntimeService: current.primaryRuntimeService ?? defaultPrimaryRuntimeServiceConfig(),
|
|
783
783
|
primaryConnectorService,
|
|
784
|
+
profile: 'self-healing',
|
|
784
785
|
});
|
|
785
786
|
const refreshed = loadRecoveryConfig(home);
|
|
786
787
|
const runtime = await stageAndActivateConfiguredRuntimeRelease(refreshed);
|
|
@@ -789,18 +790,9 @@ export function buildRecoveryCommand(): Command {
|
|
|
789
790
|
process.exitCode = 1;
|
|
790
791
|
return;
|
|
791
792
|
}
|
|
792
|
-
let codegraph: Record<string, unknown> | undefined;
|
|
793
|
-
let codegraphOk = true;
|
|
794
|
-
if (opts.configureCodegraph === true) {
|
|
795
|
-
const ensured = ensureCodegraph({ repoRoot, init: true, sync: true, host: 'both' });
|
|
796
|
-
const configured = configureCodegraph({ repoRoot, target: 'both', location: 'global' });
|
|
797
|
-
codegraphOk = !ensured.actions.some((entry) => entry.status === 'failed')
|
|
798
|
-
&& !configured.actions.some((entry) => entry.status === 'failed');
|
|
799
|
-
codegraph = { ensured, configured };
|
|
800
|
-
}
|
|
801
793
|
const connector = await restartPrimaryConnector(refreshed);
|
|
802
|
-
const ok = connector.ok
|
|
803
|
-
output({ ok, phase: !connector.ok ? 'connector_restart' :
|
|
794
|
+
const ok = connector.ok;
|
|
795
|
+
output({ ok, phase: !connector.ok ? 'connector_restart' : 'complete', recovery: installed, runtime, connector });
|
|
804
796
|
if (!ok) process.exitCode = 1;
|
|
805
797
|
});
|
|
806
798
|
|
|
@@ -952,8 +944,9 @@ export function buildRecoveryCommand(): Command {
|
|
|
952
944
|
});
|
|
953
945
|
|
|
954
946
|
command.command('install')
|
|
955
|
-
.description('Build and activate the
|
|
947
|
+
.description('Build Forge Recovery artifacts and activate only the explicitly selected persistent Recovery profile')
|
|
956
948
|
.requiredOption('--controller-home <path>', 'Explicit Controller Home')
|
|
949
|
+
.option('--profile <profile>', 'Recovery install profile: manual, gateway, or self-healing', 'manual')
|
|
957
950
|
.option('--port <port>', 'Loopback Recovery Gateway port', '8787')
|
|
958
951
|
.option('--public-mcp-url <url>', 'Primary Forge MCP public URL')
|
|
959
952
|
.option('--recovery-public-url <url>', 'Dedicated Forge Recovery MCP public URL')
|
|
@@ -978,7 +971,7 @@ export function buildRecoveryCommand(): Command {
|
|
|
978
971
|
.option('--primary-openai-profile-dir <path>', 'Optional absolute tunnel-client profile directory for primary Forge')
|
|
979
972
|
.option('--primary-openai-admin-profile <profile>', 'Optional tunnel-client admin profile used for primary runtime connect')
|
|
980
973
|
.option('--primary-runtime-source-root <path>', 'Stable canonical/package source used by Recovery for future Runtime staging')
|
|
981
|
-
.option('--stage-only', '
|
|
974
|
+
.option('--stage-only', 'Compatibility alias: build/canary only and do not mutate installed Recovery config or services')
|
|
982
975
|
.action(async (opts: {
|
|
983
976
|
controllerHome: string;
|
|
984
977
|
port: string;
|
|
@@ -1005,9 +998,12 @@ export function buildRecoveryCommand(): Command {
|
|
|
1005
998
|
primaryOpenaiProfileDir?: string;
|
|
1006
999
|
primaryOpenaiAdminProfile?: string;
|
|
1007
1000
|
primaryRuntimeSourceRoot?: string;
|
|
1001
|
+
profile: string;
|
|
1008
1002
|
stageOnly?: boolean;
|
|
1009
1003
|
}) => {
|
|
1010
1004
|
const home = resolveControllerHome(opts.controllerHome);
|
|
1005
|
+
const profile = normalizeRecoveryInstallProfile(opts.stageOnly ? 'manual' : opts.profile, 'manual');
|
|
1006
|
+
if (opts.stageOnly && opts.profile !== 'manual') throw new Error('RECOVERY_STAGE_ONLY_PROFILE_CONFLICT');
|
|
1011
1007
|
const port = Number(opts.port);
|
|
1012
1008
|
if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('RECOVERY_PORT_INVALID');
|
|
1013
1009
|
const recoveryLaunchdTunnel = launchdService(opts.recoveryTunnelServiceLabel, opts.recoveryTunnelServicePlist, 'RECOVERY_TUNNEL') as PublicTunnelServiceConfig | undefined;
|
|
@@ -1063,6 +1059,7 @@ export function buildRecoveryCommand(): Command {
|
|
|
1063
1059
|
assertDistinctRecoveryOpenAiTunnelIdentity(recoveryTunnelService, primaryPublicTunnelService);
|
|
1064
1060
|
|
|
1065
1061
|
const recoveryPublicUrl = endpoint(opts.recoveryPublicUrl, 'RECOVERY_PUBLIC_URL');
|
|
1062
|
+
if (profile === 'manual' && (recoveryTunnelService || recoveryPublicUrl)) throw new Error('RECOVERY_PROFILE_GATEWAY_REQUIRED');
|
|
1066
1063
|
if (recoveryOpenAiTunnel && recoveryPublicUrl) throw new Error('RECOVERY_OPENAI_TUNNEL_PUBLIC_URL_CONFLICT');
|
|
1067
1064
|
if ((recoveryLaunchdTunnel || recoverySystemdTunnel) && !recoveryPublicUrl) throw new Error('RECOVERY_PUBLIC_URL_AND_TUNNEL_SERVICE_MUST_BE_CONFIGURED_TOGETHER');
|
|
1068
1065
|
if (!recoveryTunnelService && recoveryPublicUrl) throw new Error('RECOVERY_PUBLIC_URL_AND_TUNNEL_SERVICE_MUST_BE_CONFIGURED_TOGETHER');
|
|
@@ -1080,8 +1077,12 @@ export function buildRecoveryCommand(): Command {
|
|
|
1080
1077
|
controllerHome: home,
|
|
1081
1078
|
repoRoot: primaryRuntimeSourceRoot,
|
|
1082
1079
|
...(primaryRuntimeSourceRepository ? { primaryRuntimeSourceRepositoryId: primaryRuntimeSourceRepository.repoId } : {}),
|
|
1083
|
-
|
|
1080
|
+
// The package root is only the CLI's location. A package installation
|
|
1081
|
+
// is not a Git checkout, while the explicitly registered primary
|
|
1082
|
+
// Runtime source is the immutable Recovery release's provenance.
|
|
1083
|
+
sourceRoot: primaryRuntimeSourceRoot,
|
|
1084
1084
|
port,
|
|
1085
|
+
profile,
|
|
1085
1086
|
stageOnly: opts.stageOnly === true,
|
|
1086
1087
|
primaryRuntimeService: defaultPrimaryRuntimeServiceConfig(),
|
|
1087
1088
|
publicMcpUrl: endpoint(opts.publicMcpUrl, 'PUBLIC_MCP_URL'),
|
|
@@ -1092,6 +1093,7 @@ export function buildRecoveryCommand(): Command {
|
|
|
1092
1093
|
});
|
|
1093
1094
|
output({
|
|
1094
1095
|
status: opts.stageOnly ? 'staged' : 'installed',
|
|
1096
|
+
profile: result.profile,
|
|
1095
1097
|
staged: result.staged.release,
|
|
1096
1098
|
activation: result.activated,
|
|
1097
1099
|
connector: recoveryConnectorDescriptor(home),
|
|
@@ -106,7 +106,23 @@ export function buildRepositoryCommand(): Command {
|
|
|
106
106
|
.argument('<repo-id>', 'Stable repository ID'))
|
|
107
107
|
.action((repoId: string, opts: { controllerHome?: string; json?: boolean }) => {
|
|
108
108
|
const repository = getRepository(repoId, opts.controllerHome, { includeRemoved: true });
|
|
109
|
-
|
|
109
|
+
const validation = validateRepository(repoId, opts.controllerHome);
|
|
110
|
+
if (opts.json === true) {
|
|
111
|
+
output({ validation, ...initializeRepository(repository, opts.controllerHome) }, true);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// The default validation view is bounded even when the repository has
|
|
115
|
+
// thousands of historical checkout records. Full audit data is opt-in.
|
|
116
|
+
output({
|
|
117
|
+
validation,
|
|
118
|
+
repository: repositorySummary(repository),
|
|
119
|
+
checkouts: {
|
|
120
|
+
total: repository.checkouts.length,
|
|
121
|
+
active: repository.checkouts.filter((checkout) => !checkout.lifecycle || checkout.lifecycle === 'active').length,
|
|
122
|
+
archived: repository.checkouts.filter((checkout) => checkout.lifecycle === 'archived').length,
|
|
123
|
+
removed: repository.checkouts.filter((checkout) => checkout.lifecycle === 'removed').length,
|
|
124
|
+
},
|
|
125
|
+
}, false);
|
|
110
126
|
});
|
|
111
127
|
|
|
112
128
|
common(command.command('command')
|
|
@@ -12,6 +12,7 @@ import { listOccurrences, listSchedules } from '../../../packages/kernel/schedul
|
|
|
12
12
|
import { observeRuntimeStatus } from '../../runtime/root/status';
|
|
13
13
|
import { readMcpServiceBearerToken } from '../../../adapters/mcp/auth';
|
|
14
14
|
import { createSetupBootstrapControlApi } from './bootstrap-control';
|
|
15
|
+
import { readSetupProfile, runtimeDeploymentTopologyForSetupProfile } from './setup-profile';
|
|
15
16
|
import { publishRuntimeRelease } from '../../runtime/root/release-store';
|
|
16
17
|
import { installForgeRuntimeService } from '../../runtime/root/service';
|
|
17
18
|
import { activateScheduledPackageRuntimeServiceFromPath, installPackageRuntimeService, readPackageRuntimeActivationReceipt } from '../../runtime/root/package-runtime-service';
|
|
@@ -73,12 +74,14 @@ export function buildRuntimeCommand(): Command {
|
|
|
73
74
|
writeFileSync(tokenPath, `${token}\n`, { mode: 0o600 });
|
|
74
75
|
}
|
|
75
76
|
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
|
|
77
|
+
const setupProfile = readSetupProfile();
|
|
76
78
|
const result = await installPackageRuntimeService({
|
|
77
79
|
controllerHome: home,
|
|
78
80
|
packageRoot,
|
|
79
81
|
host: opts.host,
|
|
80
82
|
port,
|
|
81
83
|
authTokenFile: tokenPath,
|
|
84
|
+
...(setupProfile ? { topology: runtimeDeploymentTopologyForSetupProfile(setupProfile) } : {}),
|
|
82
85
|
forcePortable: opts.portable === true,
|
|
83
86
|
refreshConnector: opts.refreshConnector === true,
|
|
84
87
|
});
|
|
@@ -116,7 +119,6 @@ export function buildRuntimeCommand(): Command {
|
|
|
116
119
|
.option('--port <port>', 'MCP listener port', '8765')
|
|
117
120
|
.option('--stage-only', 'Build and validate the immutable Runtime release without publishing or activating it')
|
|
118
121
|
.option('--auth-token-file <path>', 'Raw bearer token file (defaults to controllerHome/mcp/runtime-token, created from the MCP bearer token when missing)')
|
|
119
|
-
.option('--exclusive-work-id <id>', 'Persistently admit only this P0 Work while migration is active')
|
|
120
122
|
.option('--node-executable <path>', 'Executable launchd uses to run the Forge Runtime service runner', process.execPath)
|
|
121
123
|
.option('--runner-path <path>', 'Forge Runtime service runner entry', join(resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..'), 'bin', 'forge-runtime-service.mjs'))
|
|
122
124
|
.action(async (opts: {
|
|
@@ -125,7 +127,6 @@ export function buildRuntimeCommand(): Command {
|
|
|
125
127
|
host: string;
|
|
126
128
|
port: string;
|
|
127
129
|
authTokenFile?: string;
|
|
128
|
-
exclusiveWorkId?: string;
|
|
129
130
|
nodeExecutable: string;
|
|
130
131
|
runnerPath: string;
|
|
131
132
|
stageOnly?: boolean;
|
|
@@ -171,7 +172,6 @@ export function buildRuntimeCommand(): Command {
|
|
|
171
172
|
host: opts.host,
|
|
172
173
|
port,
|
|
173
174
|
authTokenFile: tokenPath,
|
|
174
|
-
...(opts.exclusiveWorkId?.trim() ? { exclusiveWorkId: opts.exclusiveWorkId.trim() } : {}),
|
|
175
175
|
},
|
|
176
176
|
runnerPath: resolve(opts.runnerPath),
|
|
177
177
|
nodeExecutable: resolve(opts.nodeExecutable),
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Shared synchronous setup/adoption command execution; no Runtime or Work authority. */
|
|
2
|
+
import { runProcess as runBoundedProcess } from '../../effects/process-runner';
|
|
3
|
+
|
|
4
|
+
export interface SetupExecutionStep {
|
|
5
|
+
step: string;
|
|
6
|
+
status: "ok" | "skipped" | "failed";
|
|
7
|
+
command?: string[];
|
|
8
|
+
detail?: string;
|
|
9
|
+
stdout?: string;
|
|
10
|
+
stderr?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function runSetupProcess(command: string, args: string[], cwd: string, env?: NodeJS.ProcessEnv): SetupExecutionStep {
|
|
14
|
+
const result = runBoundedProcess(command, args, { cwd, env });
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
step: "",
|
|
18
|
+
status: result.ok ? "ok" : "failed",
|
|
19
|
+
command: [...result.command],
|
|
20
|
+
stdout: result.stdout,
|
|
21
|
+
stderr: result.stderr || result.error,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function withProcessEnv<T>(env: NodeJS.ProcessEnv | undefined, fn: () => T): T {
|
|
26
|
+
if (!env) return fn();
|
|
27
|
+
const previous = new Map<string, string | undefined>();
|
|
28
|
+
for (const [key, value] of Object.entries(env)) {
|
|
29
|
+
previous.set(key, process.env[key]);
|
|
30
|
+
if (value === undefined) delete process.env[key];
|
|
31
|
+
else process.env[key] = value;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return fn();
|
|
35
|
+
} finally {
|
|
36
|
+
for (const [key, value] of previous) {
|
|
37
|
+
if (value === undefined) delete process.env[key];
|
|
38
|
+
else process.env[key] = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|