@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
|
@@ -4,15 +4,46 @@ import { existsSync, readFileSync } from 'fs';
|
|
|
4
4
|
import { isAbsolute, join, resolve } from 'path';
|
|
5
5
|
import { pathToFileURL } from 'url';
|
|
6
6
|
import { resolveControllerHome } from '../src/cli/repositories/controller-home.ts';
|
|
7
|
-
import { findRegisteredRepositoryByCheckoutRoot } from '../src/cli/repositories/registry.ts';
|
|
7
|
+
import { findRegisteredRepositoryByCheckoutRoot, getRepository } from '../src/cli/repositories/registry.ts';
|
|
8
8
|
import { createRecoveryConfig, gatewayToken, loadRecoveryConfig } from '../src/runtime/standalone-recovery/core.ts';
|
|
9
9
|
|
|
10
10
|
export const PLUGIN_ID = 'local_recovery';
|
|
11
11
|
export const PLUGIN_VERSION = '0.1.0';
|
|
12
12
|
export const PROTOCOL_VERSION = 1;
|
|
13
13
|
export const CAPABILITIES = ['forge.local_recovery.transport.v1'];
|
|
14
|
-
export const ACTIONS = [
|
|
15
|
-
|
|
14
|
+
export const ACTIONS = [
|
|
15
|
+
'runtime_status',
|
|
16
|
+
'list_releases',
|
|
17
|
+
'verify_stable_runtime',
|
|
18
|
+
'stage_and_activate_runtime_release',
|
|
19
|
+
'release_session_status',
|
|
20
|
+
'advance_runtime_release_session',
|
|
21
|
+
'verify_runtime_release_session_static',
|
|
22
|
+
'verify_runtime_release_session_candidate',
|
|
23
|
+
'cutover_runtime_release_session',
|
|
24
|
+
'cancel_runtime_release_session',
|
|
25
|
+
'rollback_runtime_release_session',
|
|
26
|
+
'promote_runtime_release_session_known_good',
|
|
27
|
+
];
|
|
28
|
+
const RELEASE_SESSION_ACTIONS = new Set([
|
|
29
|
+
'release_session_status',
|
|
30
|
+
'verify_runtime_release_session_static',
|
|
31
|
+
'verify_runtime_release_session_candidate',
|
|
32
|
+
'cutover_runtime_release_session',
|
|
33
|
+
'cancel_runtime_release_session',
|
|
34
|
+
'rollback_runtime_release_session',
|
|
35
|
+
'promote_runtime_release_session_known_good',
|
|
36
|
+
]);
|
|
37
|
+
const MUTATING_ACTIONS = new Set([
|
|
38
|
+
'stage_and_activate_runtime_release',
|
|
39
|
+
'advance_runtime_release_session',
|
|
40
|
+
'verify_runtime_release_session_static',
|
|
41
|
+
'verify_runtime_release_session_candidate',
|
|
42
|
+
'cutover_runtime_release_session',
|
|
43
|
+
'cancel_runtime_release_session',
|
|
44
|
+
'rollback_runtime_release_session',
|
|
45
|
+
'promote_runtime_release_session_known_good',
|
|
46
|
+
]);
|
|
16
47
|
const LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);
|
|
17
48
|
|
|
18
49
|
function providerError(code, message, retryable = false, details) {
|
|
@@ -91,8 +122,7 @@ export async function callRecoveryTool(controllerHome, toolName, args = {}, inje
|
|
|
91
122
|
protocolVersion: '2025-06-18', capabilities: {}, clientInfo: { name: 'forge-local-recovery-provider', version: PLUGIN_VERSION },
|
|
92
123
|
},
|
|
93
124
|
});
|
|
94
|
-
const sessionId = initialized.response.headers.get('mcp-session-id');
|
|
95
|
-
if (!sessionId) throw providerError('LOCAL_RECOVERY_MCP_SESSION_MISSING', 'Recovery MCP initialize did not return a session id.');
|
|
125
|
+
const sessionId = initialized.response.headers.get('mcp-session-id') || undefined;
|
|
96
126
|
try {
|
|
97
127
|
await postRpc(fetchImpl, endpoint, token, { jsonrpc: '2.0', method: 'notifications/initialized' }, sessionId);
|
|
98
128
|
const called = await postRpc(fetchImpl, endpoint, token, {
|
|
@@ -101,15 +131,21 @@ export async function callRecoveryTool(controllerHome, toolName, args = {}, inje
|
|
|
101
131
|
if (called.payload?.error) throw providerError('LOCAL_RECOVERY_TOOL_FAILED', String(called.payload.error?.message ?? 'Recovery tool failed.'), false);
|
|
102
132
|
const content = called.payload?.result?.content;
|
|
103
133
|
const text = Array.isArray(content) ? content.find((entry) => entry?.type === 'text' && typeof entry.text === 'string')?.text : undefined;
|
|
134
|
+
if (called.payload?.result?.isError === true) {
|
|
135
|
+
const message = typeof text === 'string' && text.trim() ? text.trim().slice(0, 4000) : 'Recovery tool failed.';
|
|
136
|
+
throw providerError('LOCAL_RECOVERY_TOOL_FAILED', message, false);
|
|
137
|
+
}
|
|
104
138
|
if (text) return parseJson(text, 'LOCAL_RECOVERY_TOOL_RESULT_INVALID');
|
|
105
139
|
return called.payload?.result ?? {};
|
|
106
140
|
} finally {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
141
|
+
if (sessionId) {
|
|
142
|
+
try {
|
|
143
|
+
await fetchImpl(endpoint, {
|
|
144
|
+
method: 'DELETE',
|
|
145
|
+
headers: { authorization: `Bearer ${token}`, accept: 'application/json, text/event-stream', 'mcp-session-id': sessionId },
|
|
146
|
+
});
|
|
147
|
+
} catch { /* Session cleanup is best effort; ReleaseSession durability is independent from this transport session. */ }
|
|
148
|
+
}
|
|
113
149
|
}
|
|
114
150
|
}
|
|
115
151
|
|
|
@@ -119,6 +155,17 @@ function assertEmptyInput(input) {
|
|
|
119
155
|
}
|
|
120
156
|
}
|
|
121
157
|
|
|
158
|
+
function releaseSessionInput(input) {
|
|
159
|
+
if (!input || typeof input !== 'object' || Array.isArray(input) || Object.keys(input).length !== 1 || typeof input.session_id !== 'string') {
|
|
160
|
+
throw providerError('LOCAL_RECOVERY_RELEASE_SESSION_ARGUMENTS_INVALID', 'ReleaseSession actions accept only session_id.');
|
|
161
|
+
}
|
|
162
|
+
const sessionId = input.session_id.trim();
|
|
163
|
+
if (sessionId.length < 8 || sessionId.length > 120) {
|
|
164
|
+
throw providerError('LOCAL_RECOVERY_RELEASE_SESSION_ID_INVALID', 'ReleaseSession session_id must be 8 to 120 characters.');
|
|
165
|
+
}
|
|
166
|
+
return { session_id: sessionId };
|
|
167
|
+
}
|
|
168
|
+
|
|
122
169
|
function mutationRequestId(requestId) {
|
|
123
170
|
return `local-recovery:${createHash('sha256').update(String(requestId)).digest('hex').slice(0, 32)}`;
|
|
124
171
|
}
|
|
@@ -127,9 +174,36 @@ export function ensureSourceRepositoryProvenance(controllerHome, injected = {})
|
|
|
127
174
|
const loadConfig = injected.loadRecoveryConfig ?? loadRecoveryConfig;
|
|
128
175
|
const persistConfig = injected.createRecoveryConfig ?? createRecoveryConfig;
|
|
129
176
|
const findRepository = injected.findRegisteredRepositoryByCheckoutRoot ?? findRegisteredRepositoryByCheckoutRoot;
|
|
177
|
+
const readRepository = injected.getRepository ?? getRepository;
|
|
130
178
|
const recoveryConfig = loadConfig(controllerHome);
|
|
131
|
-
|
|
179
|
+
const repositoryId = typeof recoveryConfig.primaryRuntimeSourceRepositoryId === 'string'
|
|
180
|
+
? recoveryConfig.primaryRuntimeSourceRepositoryId.trim()
|
|
181
|
+
: '';
|
|
132
182
|
const sourceRoot = typeof recoveryConfig.primaryRuntimeSourceRoot === 'string' ? recoveryConfig.primaryRuntimeSourceRoot.trim() : '';
|
|
183
|
+
|
|
184
|
+
if (repositoryId) {
|
|
185
|
+
let repository;
|
|
186
|
+
try {
|
|
187
|
+
repository = readRepository(repositoryId, controllerHome);
|
|
188
|
+
} catch {
|
|
189
|
+
throw providerError('LOCAL_RECOVERY_SOURCE_REPOSITORY_UNRESOLVED', 'Configured primary Runtime source repository id is not one enabled registered repository.');
|
|
190
|
+
}
|
|
191
|
+
if (!repository || repository.repoId !== repositoryId || repository.enabled === false || repository.removedAt) {
|
|
192
|
+
throw providerError('LOCAL_RECOVERY_SOURCE_REPOSITORY_UNRESOLVED', 'Configured primary Runtime source repository id is not one enabled registered repository.');
|
|
193
|
+
}
|
|
194
|
+
const canonicalRoot = typeof repository.canonicalRoot === 'string' && repository.canonicalRoot.trim()
|
|
195
|
+
? resolve(repository.canonicalRoot.trim())
|
|
196
|
+
: '';
|
|
197
|
+
if (!canonicalRoot || !isAbsolute(canonicalRoot) || !existsSync(canonicalRoot)) {
|
|
198
|
+
throw providerError('LOCAL_RECOVERY_SOURCE_CANONICAL_ROOT_UNAVAILABLE', 'Configured primary Runtime source repository canonical root is unavailable.');
|
|
199
|
+
}
|
|
200
|
+
if (sourceRoot && resolve(sourceRoot) === canonicalRoot) return recoveryConfig;
|
|
201
|
+
return persistConfig(controllerHome, {
|
|
202
|
+
primaryRuntimeSourceRoot: canonicalRoot,
|
|
203
|
+
primaryRuntimeSourceRepositoryId: repositoryId,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
133
207
|
if (!sourceRoot) throw providerError('LOCAL_RECOVERY_SOURCE_ROOT_UNAVAILABLE', 'Installed Recovery config does not identify the primary Runtime source root.');
|
|
134
208
|
const repository = findRepository(sourceRoot, controllerHome);
|
|
135
209
|
if (!repository?.repoId) throw providerError('LOCAL_RECOVERY_SOURCE_REPOSITORY_UNRESOLVED', 'Configured primary Runtime source root is not owned by one registered repository.');
|
|
@@ -142,10 +216,14 @@ export function ensureSourceRepositoryProvenance(controllerHome, injected = {})
|
|
|
142
216
|
export async function executeAction(actionId, input, providerConfig, injected = {}) {
|
|
143
217
|
const config = validateProviderConfig(providerConfig);
|
|
144
218
|
if (!ACTIONS.includes(actionId)) throw providerError('LOCAL_RECOVERY_ACTION_UNSUPPORTED', 'Unsupported Local Recovery action.');
|
|
145
|
-
|
|
219
|
+
const sessionArgs = RELEASE_SESSION_ACTIONS.has(actionId) ? releaseSessionInput(input) : undefined;
|
|
220
|
+
if (!sessionArgs) assertEmptyInput(input);
|
|
146
221
|
const callTool = injected.callRecoveryTool ?? callRecoveryTool;
|
|
147
|
-
if (actionId === 'stage_and_activate_runtime_release') ensureSourceRepositoryProvenance(config.controllerHome, injected);
|
|
148
|
-
const args =
|
|
222
|
+
if (actionId === 'stage_and_activate_runtime_release' || actionId === 'advance_runtime_release_session') ensureSourceRepositoryProvenance(config.controllerHome, injected);
|
|
223
|
+
const args = {
|
|
224
|
+
...(sessionArgs ?? {}),
|
|
225
|
+
...(MUTATING_ACTIONS.has(actionId) ? { request_id: mutationRequestId(injected.requestId ?? actionId) } : {}),
|
|
226
|
+
};
|
|
149
227
|
return await callTool(config.controllerHome, actionId, args, injected);
|
|
150
228
|
}
|
|
151
229
|
|
package/scripts/init-project.sh
CHANGED
|
@@ -373,60 +373,14 @@ install_dev_tools() {
|
|
|
373
373
|
echo -e "${GREEN}Dev tools installed!${NC}"
|
|
374
374
|
}
|
|
375
375
|
|
|
376
|
-
# Write version stamp into the generated project
|
|
377
|
-
write_version_stamp() {
|
|
378
|
-
local skill_version_file="$SCRIPT_DIR/../assets/skill-version.json"
|
|
379
|
-
local stamp_dir=".claude"
|
|
380
|
-
local stamp_file="$stamp_dir/.skill-version"
|
|
381
|
-
local sv_version="unknown"
|
|
382
|
-
local sv_template_version="unknown"
|
|
383
|
-
|
|
384
|
-
if [ -f "$skill_version_file" ] && command_exists bun; then
|
|
385
|
-
sv_version=$(bun -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).version)")
|
|
386
|
-
sv_template_version=$(bun -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).templateVersion)")
|
|
387
|
-
elif [ -f "$skill_version_file" ] && command_exists node; then
|
|
388
|
-
sv_version=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).version)")
|
|
389
|
-
sv_template_version=$(node -e "console.log(JSON.parse(require('fs').readFileSync('$skill_version_file','utf-8')).templateVersion)")
|
|
390
|
-
fi
|
|
391
|
-
|
|
392
|
-
mkdir -p "$stamp_dir"
|
|
393
|
-
cat > "$stamp_file" << STAMP_EOF
|
|
394
|
-
skill_version=$sv_version
|
|
395
|
-
template_version=$sv_template_version
|
|
396
|
-
generated_at=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
|
|
397
|
-
plan_type=${STACK}
|
|
398
|
-
STAMP_EOF
|
|
399
|
-
echo -e "${GREEN}Version stamp written to $stamp_file${NC}"
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
# Run a skill lifecycle hook (if bun is available)
|
|
403
|
-
run_skill_hook() {
|
|
404
|
-
local event="$1"
|
|
405
|
-
local hook_script="$SCRIPT_DIR/run-skill-hook.ts"
|
|
406
|
-
|
|
407
|
-
if command_exists bun && [ -f "$hook_script" ]; then
|
|
408
|
-
bun "$hook_script" "$event" --context "{\"projectName\":\"$PROJECT_NAME\",\"stack\":\"$STACK\"}" 2>&1 || {
|
|
409
|
-
if [[ "$event" == pre-* ]]; then
|
|
410
|
-
echo -e "${RED}Pre-hook $event failed, aborting.${NC}"
|
|
411
|
-
return 1
|
|
412
|
-
else
|
|
413
|
-
echo -e "${YELLOW}Post-hook $event warning (non-fatal).${NC}"
|
|
414
|
-
fi
|
|
415
|
-
}
|
|
416
|
-
fi
|
|
417
|
-
}
|
|
418
|
-
|
|
419
376
|
# Main execution
|
|
420
377
|
main() {
|
|
421
|
-
run_skill_hook "pre-init" || exit 1
|
|
422
378
|
|
|
423
379
|
check_package_manager
|
|
424
380
|
create_project
|
|
425
381
|
create_structure
|
|
426
382
|
install_dev_tools
|
|
427
|
-
write_version_stamp
|
|
428
383
|
|
|
429
|
-
run_skill_hook "post-init"
|
|
430
384
|
|
|
431
385
|
echo ""
|
|
432
386
|
echo -e "${GREEN}=== Project initialized successfully! ===${NC}"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Install the one Controller-owned physical-iPhone HID Python toolchain.
|
|
3
|
+
# Execute only with an authorized ForgeInstance host process:exec grant.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
if [[ $# -ne 1 || ! -d "$1" ]]; then
|
|
7
|
+
echo "Usage: $0 <existing-controller-home>" >&2
|
|
8
|
+
exit 2
|
|
9
|
+
fi
|
|
10
|
+
if [[ "$(uname -s)" != "Darwin" ]]; then
|
|
11
|
+
echo "The CoreDevice HID toolchain requires macOS." >&2
|
|
12
|
+
exit 2
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
repo_root="$(cd "$(dirname "$0")/.." && pwd -P)"
|
|
16
|
+
controller_home="$(cd "$1" && pwd -P)"
|
|
17
|
+
version="11.24.0"
|
|
18
|
+
# The provider source is the sole runtime version authority. Refuse a stale installer.
|
|
19
|
+
if ! grep -Fq "export const IOS_HID_TOOLCHAIN_VERSION = '$version';" \
|
|
20
|
+
"$repo_root/src/runtime/plugins/ios/remote-xpc-hid.ts"; then
|
|
21
|
+
echo "Installer version no longer matches the RemoteXPC provider pin." >&2
|
|
22
|
+
exit 2
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
toolchains="$controller_home/toolchains"
|
|
26
|
+
mkdir -p "$toolchains"
|
|
27
|
+
target="$toolchains/pymobiledevice3-$version"
|
|
28
|
+
lock="$toolchains/.pymobiledevice3-$version-install.lock"
|
|
29
|
+
if ! mkdir "$lock" 2>/dev/null; then
|
|
30
|
+
echo "The pinned HID toolchain is already being installed; no parallel writer." >&2
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
created=false
|
|
35
|
+
completed=false
|
|
36
|
+
cleanup() {
|
|
37
|
+
if [[ "$created" == true && "$completed" != true ]]; then
|
|
38
|
+
rm -rf -- "$target"
|
|
39
|
+
fi
|
|
40
|
+
rmdir "$lock" 2>/dev/null || true
|
|
41
|
+
}
|
|
42
|
+
trap cleanup EXIT
|
|
43
|
+
|
|
44
|
+
verify() {
|
|
45
|
+
"$1" -c "from importlib.metadata import version; from pymobiledevice3.remote.remote_service_discovery import RemoteServiceDiscoveryService; from pymobiledevice3.remote.core_device.pasteboard_service import PasteboardService; from pymobiledevice3.remote.core_device.hid_service import UniversalHIDServiceService, touch_session; actual=version('pymobiledevice3'); assert actual == '$version', (actual, '$version'); print('pymobiledevice3 ' + actual + ' verified')"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if [[ -e "$target" ]]; then
|
|
49
|
+
verify "$target/bin/python"
|
|
50
|
+
completed=true
|
|
51
|
+
exit 0
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# A newly created target is owned by this invocation. Never alter an old toolchain.
|
|
55
|
+
created=true
|
|
56
|
+
python3 -m venv "$target"
|
|
57
|
+
"$target/bin/python" -m pip install --disable-pip-version-check --no-input "pymobiledevice3==$version"
|
|
58
|
+
verify "$target/bin/python"
|
|
59
|
+
completed=true
|
|
60
|
+
printf 'Installed Controller-owned HID toolchain: %s\n' "$target"
|
|
@@ -2,7 +2,7 @@ import { createHash } from 'crypto';
|
|
|
2
2
|
import { isAbsolute, join, resolve } from 'path';
|
|
3
3
|
import { hostname } from 'os';
|
|
4
4
|
import { systemdUserUnitName } from '../src/cli/controller/systemd-user';
|
|
5
|
-
import { openAiSecureTunnelConnectArgs } from '../
|
|
5
|
+
import { openAiSecureTunnelConnectArgs } from '../adapters/mcp/tunnels/openai-secure-tunnel';
|
|
6
6
|
import type { OpenAiSecureTunnelServiceConfig, PrimaryConnectorServiceConfig, PublicTunnelServiceConfig, RecoveryTunnelServiceConfig } from '../src/runtime/standalone-recovery/core';
|
|
7
7
|
import { installStandaloneRecovery } from '../src/runtime/standalone-recovery/installer';
|
|
8
8
|
|
|
@@ -1029,7 +1029,7 @@ pi_install_helpers() {
|
|
|
1029
1029
|
local target_dir="$1"
|
|
1030
1030
|
local helpers_dir="$2"
|
|
1031
1031
|
local mode="${3:-apply}"
|
|
1032
|
-
local helper_names="${4:-new-spec.sh new-sprint.sh new-plan.sh capture-plan.sh plan-to-todo.sh contract-run.ts contract-worktree.sh ship-worktrees.sh archive-workflow.sh refresh-current-status.sh prepare-handoff.sh verify-contract.sh summarize-failures.sh verify-sprint.sh sprint-backlog.sh check-task-sync.sh check-deploy-sql-order.sh check-architecture-sync.sh check-agent-tooling.sh check-context-files.sh check-brain-manifest.sh sync-brain-docs.sh
|
|
1032
|
+
local helper_names="${4:-new-spec.sh new-sprint.sh new-plan.sh capture-plan.sh plan-to-todo.sh contract-run.ts contract-worktree.sh ship-worktrees.sh archive-workflow.sh refresh-current-status.sh prepare-handoff.sh verify-contract.sh summarize-failures.sh verify-sprint.sh sprint-backlog.sh check-task-sync.sh check-deploy-sql-order.sh check-architecture-sync.sh check-agent-tooling.sh check-context-files.sh check-brain-manifest.sh sync-brain-docs.sh select-agent-context-blocks.sh ensure-task-workflow.sh check-task-workflow.sh switch-plan.sh workflow-contract.ts inspect-project-state.ts migrate-workflow-docs.ts migrate-project-template.sh capability-resolver.ts architecture-event.ts capability-config.ts architecture-queue.sh context-contract-sync.sh workstream-sync.sh prepare-codex-handoff.sh codex-handoff-resume.sh}"
|
|
1033
1033
|
local scripts_dir="$target_dir/scripts"
|
|
1034
1034
|
local runtime_dir="$target_dir/.ai/harness/scripts"
|
|
1035
1035
|
local helper_name
|
|
@@ -1283,7 +1283,7 @@ pi_external_tooling_defaults_summary() {
|
|
|
1283
1283
|
- Mode: optional-enhancements
|
|
1284
1284
|
- Detection: setup/readiness only
|
|
1285
1285
|
- Waza/gstack/gbrain/Mermaid: optional host enhancements; never required for Forge correctness
|
|
1286
|
-
-
|
|
1286
|
+
- Code location: ripgrep lexical source search with explicit language-service definition/reference navigation; no managed graph index
|
|
1287
1287
|
- Auto-actions: never install, upgrade, serve, sync, or enable unrelated third-party tooling automatically
|
|
1288
1288
|
EOF_EXTERNAL_TOOLING_DEFAULTS
|
|
1289
1289
|
}
|
|
@@ -1424,7 +1424,7 @@ pi_forge_version_for_refs() {
|
|
|
1424
1424
|
printf '%s\n' "unknown"
|
|
1425
1425
|
return 0
|
|
1426
1426
|
fi
|
|
1427
|
-
local version_file="$root_dir/
|
|
1427
|
+
local version_file="$root_dir/package.json"
|
|
1428
1428
|
|
|
1429
1429
|
if [[ -f "$version_file" ]]; then
|
|
1430
1430
|
sed -n 's/^[[:space:]]*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$version_file" | head -n 1
|
|
@@ -1825,6 +1825,9 @@ This is the root routing contract for Claude Code and Codex.
|
|
|
1825
1825
|
- Keep root context concise; route durable human-authored detail into product, architecture, research, or intentional project documents.
|
|
1826
1826
|
- Treat `_ref/` as ignored external reference material and `_ops/` as ignored local operations residue.
|
|
1827
1827
|
- Use Controller Home for mutable workflow state instead of recreating repo-local task/workstream/session projections.
|
|
1828
|
+
- For architecture migrations, use one bounded Delivery Transaction: batch discovery -> architecture/root-cause decision -> freeze scope -> coherent implementation -> whole-diff review -> focused validation wave -> canonical gates -> one delivery/cleanup.
|
|
1829
|
+
- Do not create sibling Work, per-file commits, repeated broad validation, or release/canary cycles for same-root-cause discoveries while the current candidate is still moving.
|
|
1830
|
+
- Treat release as a source-complete candidate boundary. Defer workflow/lifecycle machinery improvements to a post-release Plan when they are not required to converge the current version safely.
|
|
1828
1831
|
EOF_ROOT_CONTEXT
|
|
1829
1832
|
}
|
|
1830
1833
|
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
import { homedir } from 'os';
|
|
13
13
|
import { basename, dirname, join, resolve } from 'path';
|
|
14
14
|
import { spawnSync } from 'child_process';
|
|
15
|
+
import { assertRuntimeReleaseExecutionCanaries } from '../src/runtime/root/release-execution-canary';
|
|
15
16
|
import { stageRuntimeRelease } from '../src/runtime/root/release-materialize';
|
|
16
17
|
import { publishRuntimeRelease } from '../src/runtime/root/release-store';
|
|
17
18
|
|
|
@@ -254,6 +255,7 @@ try {
|
|
|
254
255
|
// the clean source checkout before any canonical unit starts.
|
|
255
256
|
preserveLegacyReleaseAuthority(destination, timestamp);
|
|
256
257
|
const stagedRelease = stageRuntimeRelease({ controllerHome: destination, sourceRoot });
|
|
258
|
+
assertRuntimeReleaseExecutionCanaries(stagedRelease.manifestPath, destination);
|
|
257
259
|
publishRuntimeRelease(destination, stagedRelease.manifestPath, `windows-wsl-controller-home-migration-${timestamp}`);
|
|
258
260
|
const release = readActiveRelease(destination);
|
|
259
261
|
atomicWrite(unitPath(units.canonicalRuntime), renderRuntimeUnit(destination, units.canonicalRuntime, release), 0o644);
|
|
@@ -17,7 +17,6 @@ tests/readme-dx.test.ts
|
|
|
17
17
|
|
|
18
18
|
# Runtime proxy bypass intentionally includes Tailscale's standardized CGNAT CIDR.
|
|
19
19
|
adapters/mcp/proxy-env.ts
|
|
20
|
-
src/cli/mcp/proxy-env.ts
|
|
21
20
|
|
|
22
21
|
# Scanner / redaction implementations intentionally embed pattern samples.
|
|
23
22
|
scripts/public-release.ts
|
|
@@ -45,8 +44,6 @@ tests/runtime/target-architecture.test.ts
|
|
|
45
44
|
# and installation locations to prove discovery and identity fencing.
|
|
46
45
|
scripts/portability-bindings.mjs
|
|
47
46
|
tests/runtime/browser-product-discovery.test.ts
|
|
48
|
-
tests/runtime/chatgpt-work-continuation.test.ts
|
|
49
|
-
tests/runtime/frozen-tool-contract-abi.test.ts
|
|
50
47
|
tests/runtime/windows-host-discovery.test.ts
|
|
51
48
|
tests/runtime/standalone-recovery.test.ts
|
|
52
49
|
# Secret-marker rejection tests use non-secret synthetic values by design.
|
|
@@ -55,3 +52,4 @@ tests/runtime/context-plane.test.ts
|
|
|
55
52
|
# Supervisor service unit tests use synthetic homeDir placeholders for PATH assembly.
|
|
56
53
|
# Local monitor bridge defaults may reference a development repository id.
|
|
57
54
|
scripts/run-mobile-monitor-bridge.ts
|
|
55
|
+
tests/runtime/browser-session-authority.test.ts # Intentional placeholder user profile used to prove foreign Chrome profiles are never reclaimed.
|
|
@@ -49,6 +49,11 @@ if (!Number.isInteger(timeoutMs) || timeoutMs < 1 || commandArgs.length === 0) {
|
|
|
49
49
|
});
|
|
50
50
|
child.once('close', (code) => {
|
|
51
51
|
clearTimeout(timeout);
|
|
52
|
+
// The direct child can exit on SIGTERM while a stubborn descendant remains
|
|
53
|
+
// alive in its detached process group. Before dropping the escalation timer,
|
|
54
|
+
// synchronously send SIGKILL to that process group once more so timeout
|
|
55
|
+
// completion cannot orphan compiler/test descendants.
|
|
56
|
+
if (timedOut && process.platform !== 'win32') stop('SIGKILL');
|
|
52
57
|
if (escalation) clearTimeout(escalation);
|
|
53
58
|
process.exitCode = launchFailed ? 1 : (timedOut ? 124 : code ?? 1);
|
|
54
59
|
});
|
|
@@ -22,12 +22,13 @@ export function stepsFor(gate: Gate): Step[] {
|
|
|
22
22
|
{ label: 'repository hygiene', command: 'node', args: ['scripts/check-repository-hygiene.mjs'], timeoutMs: 2 * 60_000 },
|
|
23
23
|
{ label: 'generated authority', command: 'node', args: ['scripts/sync-generated-authority.mjs', '--check'], timeoutMs: 2 * 60_000 },
|
|
24
24
|
{ label: 'source duplication', command: 'node', args: ['scripts/check-source-duplication.mjs'], timeoutMs: 2 * 60_000 },
|
|
25
|
-
{ label: 'controller UI bundle', command: 'bun', args: ['run', 'check:controller-ui'], timeoutMs: 5 * 60_000 },
|
|
26
25
|
{ label: 'test manifest', command: 'bun', args: ['run', 'check:test-governance'], timeoutMs: 5 * 60_000 },
|
|
27
26
|
{ label: 'affected tests', command: 'bun', args: ['run', 'test'], timeoutMs: 30 * 60_000 },
|
|
28
27
|
];
|
|
29
28
|
if (gate === 'main') return [
|
|
30
29
|
{ label: 'focused task receipt', gate: 'task' },
|
|
30
|
+
{ label: 'frozen MCP tool contract', command: 'bun', args: ['run', 'check:mcp-compatibility'], timeoutMs: 2 * 60_000 },
|
|
31
|
+
{ label: 'quality harness benchmark', command: 'bun', args: ['run', 'check:quality-harness'], timeoutMs: 2 * 60_000 },
|
|
31
32
|
{ label: 'core regression', command: 'bun', args: ['run', 'test:core'], timeoutMs: 20 * 60_000 },
|
|
32
33
|
{ label: 'runtime smoke', command: 'bun', args: ['run', 'check:smoke'], timeoutMs: 10 * 60_000 },
|
|
33
34
|
];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { strict as assert } from 'node:assert';
|
|
2
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import {
|
|
6
|
+
FORGE_RECOVERY_DAEMON_LABEL,
|
|
7
|
+
FORGE_RECOVERY_GATEWAY_LABEL,
|
|
8
|
+
forgeConnectorPersistentServiceLabel,
|
|
9
|
+
forgeRuntimePersistentServiceLabel,
|
|
10
|
+
} from '../src/runtime/platform/service-inventory';
|
|
11
|
+
import {
|
|
12
|
+
classifyRecoveryMcpRequest,
|
|
13
|
+
recoveryRuntimeRoleFromExecutable,
|
|
14
|
+
} from '../src/runtime/standalone-recovery/entry';
|
|
15
|
+
import { recentMcpTransportEvidence } from '../adapters/mcp/transports/http-observation';
|
|
16
|
+
import { recordMcpTransportEvent, readRecentMcpTransportEvents } from '../src/runtime/diagnostics/mcp-timing';
|
|
17
|
+
|
|
18
|
+
const controllerHome = mkdtempSync(join(tmpdir(), 'forge-control-plane-failure-domain-'));
|
|
19
|
+
try {
|
|
20
|
+
// Main Runtime/MCP and Recovery must have distinct service identities. A
|
|
21
|
+
// restart or crash fence for one must not name the other lifecycle owner.
|
|
22
|
+
const runtimeLabel = forgeRuntimePersistentServiceLabel(controllerHome);
|
|
23
|
+
const connectorLabel = forgeConnectorPersistentServiceLabel(controllerHome);
|
|
24
|
+
assert.notEqual(runtimeLabel, FORGE_RECOVERY_DAEMON_LABEL);
|
|
25
|
+
assert.notEqual(runtimeLabel, FORGE_RECOVERY_GATEWAY_LABEL);
|
|
26
|
+
assert.notEqual(connectorLabel, FORGE_RECOVERY_DAEMON_LABEL);
|
|
27
|
+
assert.notEqual(connectorLabel, FORGE_RECOVERY_GATEWAY_LABEL);
|
|
28
|
+
assert.notEqual(FORGE_RECOVERY_DAEMON_LABEL, FORGE_RECOVERY_GATEWAY_LABEL);
|
|
29
|
+
assert.equal(recoveryRuntimeRoleFromExecutable('/tmp/forge-recovery-gateway'), 'gateway');
|
|
30
|
+
assert.equal(recoveryRuntimeRoleFromExecutable('/tmp/forge-recovery-watchdog'), 'watchdog');
|
|
31
|
+
|
|
32
|
+
// Recovery owns its own MCP route. Main MCP being unavailable must not turn a
|
|
33
|
+
// valid Recovery request into a route-level 404; authorization is evaluated
|
|
34
|
+
// by the Recovery gateway itself.
|
|
35
|
+
assert.equal(classifyRecoveryMcpRequest({
|
|
36
|
+
method: 'POST',
|
|
37
|
+
url: '/recovery/mcp',
|
|
38
|
+
headers: { authorization: 'Bearer recovery-token' },
|
|
39
|
+
} as any, 'recovery-token'), 'mcp');
|
|
40
|
+
assert.equal(classifyRecoveryMcpRequest({
|
|
41
|
+
method: 'POST',
|
|
42
|
+
url: '/recovery/mcp',
|
|
43
|
+
headers: {},
|
|
44
|
+
} as any, 'recovery-token'), 'auth_required');
|
|
45
|
+
assert.equal(classifyRecoveryMcpRequest({
|
|
46
|
+
method: 'POST',
|
|
47
|
+
url: '/main/mcp',
|
|
48
|
+
headers: { authorization: 'Bearer recovery-token' },
|
|
49
|
+
} as any, 'recovery-token'), 'not_mcp');
|
|
50
|
+
|
|
51
|
+
// Current health and recent incident evidence are separate dimensions. A
|
|
52
|
+
// successful reconnect does not erase the interruption that immediately
|
|
53
|
+
// preceded it, and a later health probe may still truthfully be green.
|
|
54
|
+
const interruptedAt = '2026-09-22T12:00:00.000Z';
|
|
55
|
+
const recoveredAt = '2026-09-22T12:00:05.000Z';
|
|
56
|
+
recordMcpTransportEvent(controllerHome, {
|
|
57
|
+
kind: 'interruption',
|
|
58
|
+
sessionId: 'mcp-before-outage',
|
|
59
|
+
connectionId: 'connection-before-outage',
|
|
60
|
+
route: '/mcp',
|
|
61
|
+
principalId: 'chatgpt-controller',
|
|
62
|
+
reason: 'transport_close',
|
|
63
|
+
at: interruptedAt,
|
|
64
|
+
});
|
|
65
|
+
recordMcpTransportEvent(controllerHome, {
|
|
66
|
+
kind: 'session_initialized',
|
|
67
|
+
sessionId: 'mcp-after-outage',
|
|
68
|
+
connectionId: 'connection-after-outage',
|
|
69
|
+
route: '/mcp',
|
|
70
|
+
principalId: 'chatgpt-controller',
|
|
71
|
+
at: recoveredAt,
|
|
72
|
+
});
|
|
73
|
+
const evidence = recentMcpTransportEvidence(
|
|
74
|
+
readRecentMcpTransportEvents(controllerHome),
|
|
75
|
+
'2026-09-22T11:00:00.000Z',
|
|
76
|
+
Date.parse('2026-09-22T12:01:00.000Z'),
|
|
77
|
+
);
|
|
78
|
+
assert.equal(evidence.current, 'healthy');
|
|
79
|
+
assert.equal(evidence.recentStatus, 'recovered');
|
|
80
|
+
assert.equal(evidence.lastInterruption?.at, interruptedAt);
|
|
81
|
+
assert.equal(evidence.lastRecoveryAt, recoveredAt);
|
|
82
|
+
|
|
83
|
+
console.log(JSON.stringify({
|
|
84
|
+
status: 'ok',
|
|
85
|
+
mainRuntimeLabel: runtimeLabel,
|
|
86
|
+
mainConnectorLabel: connectorLabel,
|
|
87
|
+
recoveryDaemonLabel: FORGE_RECOVERY_DAEMON_LABEL,
|
|
88
|
+
recoveryGatewayLabel: FORGE_RECOVERY_GATEWAY_LABEL,
|
|
89
|
+
recoveryRouteIndependent: true,
|
|
90
|
+
health: evidence,
|
|
91
|
+
}, null, 2));
|
|
92
|
+
} finally {
|
|
93
|
+
rmSync(controllerHome, { recursive: true, force: true });
|
|
94
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { existsSync } from 'fs';
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import { createHash } from 'crypto';
|
|
2
3
|
import { spawnSync } from 'child_process';
|
|
3
|
-
import {
|
|
4
|
+
import { computerPluginAdapter } from '../src/runtime/plugins/computer-registration';
|
|
4
5
|
import { resolveRepoPreferredControllerHome } from '../src/cli/repositories/controller-home';
|
|
5
6
|
|
|
6
7
|
const repoRoot = process.cwd();
|
|
@@ -29,12 +30,12 @@ const common = {
|
|
|
29
30
|
controllerHome,
|
|
30
31
|
repoId,
|
|
31
32
|
repoRoot,
|
|
32
|
-
pluginId: '
|
|
33
|
+
pluginId: 'computer',
|
|
33
34
|
origin: { surface: 'local-ui' as const, actor: 'physical-ios-live-smoke' },
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
async function invoke(actionId: string, args: Record<string, unknown>) {
|
|
37
|
-
return
|
|
38
|
+
return computerPluginAdapter.executeAction({
|
|
38
39
|
...common,
|
|
39
40
|
actionId,
|
|
40
41
|
args,
|
|
@@ -43,6 +44,7 @@ async function invoke(actionId: string, args: Record<string, unknown>) {
|
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
let interactionId: string | undefined;
|
|
47
|
+
let reusedSession = false;
|
|
46
48
|
try {
|
|
47
49
|
const listed = await invoke('physical_device_list', {});
|
|
48
50
|
const devices = Array.isArray(listed.devices) ? listed.devices as Array<Record<string, unknown>> : [];
|
|
@@ -50,6 +52,9 @@ try {
|
|
|
50
52
|
entry.identifier === deviceSelector || entry.udid === deviceSelector || entry.name === deviceSelector);
|
|
51
53
|
if (matches.length !== 1) throw new Error(`Expected exactly one physical iPhone for selector ${deviceSelector}; found ${matches.length}.`);
|
|
52
54
|
const device = matches[0]!;
|
|
55
|
+
if (device.connected !== true || device.screenshotAvailable !== true) {
|
|
56
|
+
throw new Error(`The selected iPhone ${deviceSelector} has no connected CoreDevice screenshot transport. No app inspection or activation was attempted.`);
|
|
57
|
+
}
|
|
53
58
|
const info = await invoke('physical_device_info', { device: device.identifier });
|
|
54
59
|
const apps = await invoke('physical_device_apps', { device: device.identifier, bundle_id: bundleId });
|
|
55
60
|
const installed = Array.isArray(apps.apps) ? apps.apps as Array<Record<string, unknown>> : [];
|
|
@@ -58,11 +63,15 @@ try {
|
|
|
58
63
|
const opened = await invoke('physical_device_open', {
|
|
59
64
|
device: device.identifier,
|
|
60
65
|
bundle_id: bundleId,
|
|
61
|
-
relaunch:
|
|
66
|
+
relaunch: false,
|
|
67
|
+
observe_after_open: true,
|
|
68
|
+
// This is a one-shot open/capture receipt; do not retain a HID worker.
|
|
69
|
+
prewarm_input: false,
|
|
62
70
|
});
|
|
63
71
|
const interaction = opened.interaction as Record<string, unknown> | undefined;
|
|
64
72
|
interactionId = typeof interaction?.interactionId === 'string' ? interaction.interactionId : undefined;
|
|
65
73
|
if (!interactionId) throw new Error('The physical provider did not return an interaction id.');
|
|
74
|
+
reusedSession = opened.reusedSession === true;
|
|
66
75
|
|
|
67
76
|
const screenshot = await invoke('physical_device_screenshot', {
|
|
68
77
|
interaction_id: interactionId,
|
|
@@ -71,17 +80,29 @@ try {
|
|
|
71
80
|
const artifacts = Array.isArray(screenshot.artifactCandidates)
|
|
72
81
|
? screenshot.artifactCandidates as Array<Record<string, unknown>>
|
|
73
82
|
: [];
|
|
74
|
-
const
|
|
83
|
+
const artifact = artifacts[0];
|
|
84
|
+
const path = typeof artifact?.path === 'string' ? artifact.path : '';
|
|
75
85
|
if (!path || !existsSync(path)) throw new Error('The physical provider did not create a screenshot artifact.');
|
|
86
|
+
// Bind the local evidence to this exact CoreDevice observation without
|
|
87
|
+
// claiming what App, SKU or checkout price is actually visible.
|
|
88
|
+
const observation = screenshot.observation as Record<string, unknown> | undefined;
|
|
89
|
+
const image = readFileSync(path);
|
|
90
|
+
const screenshotSha256 = createHash('sha256').update(image).digest('hex');
|
|
91
|
+
const observationId = typeof observation?.observationId === 'string' ? observation.observationId : undefined;
|
|
92
|
+
if (!observationId || artifact?.sha256 !== screenshotSha256 || artifact?.bytes !== image.length
|
|
93
|
+
|| observation?.screenshotSha256 !== screenshotSha256 || observation?.screenshotBytes !== image.length) {
|
|
94
|
+
throw new Error('The screenshot file and CoreDevice observation receipts do not match.');
|
|
95
|
+
}
|
|
76
96
|
const metadata = spawnSync('sips', ['-g', 'pixelWidth', '-g', 'pixelHeight', '-g', 'format', path], { encoding: 'utf8' }).stdout;
|
|
77
97
|
const width = metadata.match(/pixelWidth:\s*(\d+)/)?.[1];
|
|
78
98
|
const height = metadata.match(/pixelHeight:\s*(\d+)/)?.[1];
|
|
79
99
|
const format = metadata.match(/format:\s*(\S+)/)?.[1];
|
|
80
100
|
|
|
81
|
-
const closed = await invoke('physical_device_close', { interaction_id: interactionId });
|
|
101
|
+
const closed = reusedSession ? undefined : await invoke('physical_device_close', { interaction_id: interactionId });
|
|
82
102
|
interactionId = undefined;
|
|
83
103
|
const app = installed[0]!;
|
|
84
104
|
console.log(JSON.stringify({
|
|
105
|
+
verificationLevel: 'source_computer_adapter_open_and_capture_only',
|
|
85
106
|
device: {
|
|
86
107
|
name: device.name,
|
|
87
108
|
model: device.model,
|
|
@@ -97,20 +118,27 @@ try {
|
|
|
97
118
|
version: app.version,
|
|
98
119
|
},
|
|
99
120
|
launchStatus: interaction?.status,
|
|
121
|
+
reusedSession,
|
|
100
122
|
controlPlane: opened.controlPlane,
|
|
101
123
|
coreDeviceCapabilities: info.capabilities,
|
|
102
124
|
screenViewingURLAvailable: typeof info.screenViewingURL === 'string',
|
|
103
125
|
screenshot: {
|
|
104
126
|
created: true,
|
|
127
|
+
path,
|
|
128
|
+
sha256: screenshotSha256,
|
|
129
|
+
bytes: image.length,
|
|
130
|
+
observationId,
|
|
131
|
+
observedAt: observation?.observedAt,
|
|
132
|
+
semanticPriceVerified: false,
|
|
105
133
|
width: width ? Number(width) : undefined,
|
|
106
134
|
height: height ? Number(height) : undefined,
|
|
107
135
|
format,
|
|
108
136
|
},
|
|
109
|
-
closeStatus: (closed
|
|
110
|
-
deviceUnmodified: closed
|
|
137
|
+
closeStatus: (closed?.interaction as Record<string, unknown> | undefined)?.status,
|
|
138
|
+
deviceUnmodified: closed?.deviceUnmodified === true,
|
|
111
139
|
}, null, 2));
|
|
112
140
|
} finally {
|
|
113
|
-
if (interactionId) {
|
|
141
|
+
if (interactionId && !reusedSession) {
|
|
114
142
|
try { await invoke('physical_device_close', { interaction_id: interactionId }); } catch {}
|
|
115
143
|
}
|
|
116
144
|
}
|