@moretea-labs/forge 1.7.1 → 1.8.0
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 +58 -62
- package/CHANGELOG.md +39 -0
- package/CLAUDE.md +42 -62
- package/README.md +2 -2
- package/SKILL.md +0 -1
- package/THIRD_PARTY_NOTICES.md +5 -2
- package/adapters/browser/index.ts +2 -0
- package/adapters/chatgpt/browser-delivery-host.ts +71 -0
- package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
- package/adapters/chatgpt/controller-binding-store.ts +55 -0
- package/adapters/chatgpt/controller-host.ts +119 -0
- package/adapters/chatgpt/controller-round-host.ts +78 -0
- package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
- package/adapters/chatgpt/provider-delivery.ts +113 -0
- package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
- package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
- package/adapters/computer/desktop-operator-contract.ts +7 -0
- package/adapters/computer/desktop-operator-discovery.ts +201 -0
- package/adapters/computer/desktop-operator-negotiation.ts +174 -0
- package/adapters/computer/desktop-operator-provider.ts +312 -0
- package/adapters/computer/index.ts +1 -0
- package/adapters/computer/interaction-target-authority.ts +944 -0
- package/adapters/controller-process/binding-store.ts +34 -0
- package/adapters/controller-process/controller-host.ts +26 -0
- package/adapters/mcp/access-mode.ts +132 -0
- package/adapters/mcp/audit.ts +32 -0
- package/adapters/mcp/auth.ts +407 -0
- package/adapters/mcp/controller-round-compatibility.ts +184 -0
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
- package/adapters/mcp/instructions.ts +36 -0
- package/adapters/mcp/legacy-context.ts +18 -0
- package/adapters/mcp/multi-repository.ts +437 -0
- package/adapters/mcp/oauth.ts +391 -0
- package/adapters/mcp/paths.ts +140 -0
- package/adapters/mcp/policy.ts +232 -0
- package/adapters/mcp/proxy-env.ts +62 -0
- package/adapters/mcp/readiness-projection.ts +24 -0
- package/adapters/mcp/redaction.ts +21 -0
- package/adapters/mcp/repo.ts +24 -0
- package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
- package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
- package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
- package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
- package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
- package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
- package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
- package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
- package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
- package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
- package/adapters/mcp/runtime-gateway/router.ts +728 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
- package/adapters/mcp/server.ts +1048 -0
- package/adapters/mcp/setup.ts +791 -0
- package/adapters/mcp/tool-capability-cache.ts +87 -0
- package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
- package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
- package/adapters/mcp/tool-mapping/tools.ts +9 -0
- package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
- package/adapters/mcp/toolset-names.ts +74 -0
- package/adapters/mcp/toolset-selection.ts +41 -0
- package/adapters/mcp/toolset.ts +336 -0
- package/adapters/mcp/transports/http.ts +1456 -0
- package/adapters/mcp/transports/session-registry.ts +513 -0
- package/adapters/mcp/transports/stdio.ts +8 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
- package/adapters/mcp/types.ts +41 -0
- package/assets/AGENTS.md +2 -16
- package/assets/CLAUDE.md +2 -16
- package/assets/hooks/AGENTS.md +3 -14
- package/assets/hooks/CLAUDE.md +3 -14
- package/assets/hooks/hook-input.sh +9 -2
- package/assets/hooks/lib/workflow-state.sh +28 -10
- package/assets/hooks/prompt-guard.sh +63 -37
- package/assets/hooks/security-sentinel.sh +2 -1
- package/assets/hooks/session-start-context.sh +7 -5
- package/assets/hooks/stop-orchestrator.sh +13 -3
- package/assets/initializer-question-pack.v4.json +11 -7
- package/assets/partials/05-workflow.partial.md +18 -73
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -2
- package/assets/partials-agents/04-task-protocol.partial.md +14 -59
- package/assets/partials-agents/06-quality-safety.partial.md +11 -16
- package/assets/partials-agents/08-deep-docs.partial.md +1 -2
- package/assets/plan-map.json +11 -11
- package/assets/plugin-registry.v1.json +9 -3
- package/assets/plugin-trust-policy.v1.json +6 -0
- package/assets/recovery/ForgeRecovery.ps1 +100 -0
- package/assets/recovery/forge-wsl-rescue +271 -0
- package/assets/reference-configs/development-protocol.md +11 -15
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/global-working-rules.md +9 -1
- package/assets/reference-configs/harness-overview.md +22 -112
- package/assets/reference-configs/hook-operations.md +1 -1
- package/assets/reference-configs/sprint-contracts.md +2 -2
- package/assets/skill-version.json +2 -2
- package/assets/templates/helpers/architecture-event.ts +3 -34
- package/assets/templates/helpers/architecture-queue.sh +61 -10
- package/assets/templates/helpers/archive-workflow.sh +90 -180
- package/assets/templates/helpers/capability-config.ts +8 -11
- package/assets/templates/helpers/capability-resolver.ts +37 -19
- package/assets/templates/helpers/capture-plan.sh +2 -2
- package/assets/templates/helpers/check-architecture-sync.sh +1 -9
- package/assets/templates/helpers/check-task-sync.sh +82 -11
- package/assets/templates/helpers/check-task-workflow.sh +1 -3
- package/assets/templates/helpers/context-contract-sync.sh +1 -12
- package/assets/templates/helpers/contract-worktree.sh +26 -24
- package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
- package/assets/templates/helpers/inspect-project-state.ts +1 -1
- package/assets/templates/helpers/migrate-project-template.sh +1 -1
- package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
- package/assets/templates/helpers/new-plan.sh +2 -2
- package/assets/templates/helpers/plan-to-todo.sh +3 -31
- package/assets/templates/helpers/sprint-backlog.sh +1 -1
- package/assets/templates/helpers/switch-plan.sh +1 -1
- package/assets/templates/helpers/workflow-contract.ts +1 -0
- package/assets/workflow-contract.v1.json +63 -171
- package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
- package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
- package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
- package/docs/architecture/CURRENT.md +148 -13
- package/docs/architecture/EVOLUTION.md +13 -0
- package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
- package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
- package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
- package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
- package/docs/architecture/domains/verification.md +7 -0
- package/docs/architecture/domains/workflow-engine.md +1 -1
- package/docs/architecture/index.md +3 -3
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
- package/docs/forge-chatgpt-mcp-setup.md +5 -3
- package/docs/forge-plugin-management.md +20 -4
- package/docs/forge-runtime-self-healing-loop.md +2 -0
- package/docs/operations/benchmark-cross-version-freeze.md +38 -0
- package/docs/operations/controller-browser-plugin.md +3 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/platform-support.md +16 -8
- package/docs/operations/platform-support.zh-CN.md +2 -2
- package/docs/operations/standalone-disaster-recovery.md +26 -1
- package/docs/operations/uu-remote-rescue.md +41 -0
- package/docs/operations/windows-wsl-host-rescue.md +133 -0
- package/docs/public-usage-guide.md +1 -1
- package/docs/public-usage-guide.zh-CN.md +1 -1
- package/docs/tutorials/01-install-and-start.md +1 -1
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/02-connect-chatgpt.md +4 -4
- package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
- package/docs/wiki/Implementation.md +1 -1
- package/package.json +23 -14
- package/packages/kernel/controller/api/index.ts +2 -0
- package/packages/kernel/controller/application/controller-round-service.ts +29 -0
- package/packages/kernel/controller/application/controller-service.ts +30 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
- package/packages/kernel/controller/domain/controller-round.ts +107 -0
- package/packages/kernel/controller/domain/execution-quality.ts +133 -0
- package/packages/kernel/controller/domain/types.ts +56 -0
- package/packages/kernel/controller/index.ts +1 -0
- package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
- package/packages/kernel/controller/ports/controller-host.ts +16 -0
- package/packages/kernel/goal/api/index.ts +1 -0
- package/packages/kernel/goal/domain/types.ts +40 -0
- package/packages/kernel/goal/index.ts +1 -0
- package/packages/kernel/identity/api/index.ts +5 -0
- package/packages/kernel/identity/application/identity-service.ts +67 -0
- package/packages/kernel/identity/domain/scope.ts +63 -0
- package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
- package/packages/kernel/identity/domain/types.ts +44 -0
- package/packages/kernel/identity/domain/workspace.ts +56 -0
- package/packages/kernel/identity/index.ts +1 -0
- package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
- package/packages/kernel/memory/api/index.ts +5 -0
- package/packages/kernel/memory/application/experience-service.ts +118 -0
- package/packages/kernel/memory/application/outcome-service.ts +77 -0
- package/packages/kernel/memory/domain/experience.ts +103 -0
- package/packages/kernel/memory/domain/operational-prior.ts +92 -0
- package/packages/kernel/memory/index.ts +1 -0
- package/packages/kernel/progression/api/index.ts +2 -0
- package/packages/kernel/progression/application/projector.ts +211 -0
- package/packages/kernel/progression/domain/types.ts +116 -0
- package/packages/kernel/progression/index.ts +1 -0
- package/packages/kernel/scheduler/api/index.ts +6 -0
- package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
- package/packages/kernel/scheduler/application/eligibility.ts +252 -0
- package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
- package/packages/kernel/scheduler/application/settlement.ts +197 -0
- package/packages/kernel/scheduler/domain/continuation.ts +38 -0
- package/packages/kernel/scheduler/domain/schedule.ts +149 -0
- package/packages/kernel/scheduler/index.ts +1 -0
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
- package/packages/kernel/work/api/index.ts +15 -0
- package/packages/kernel/work/application/work-service.ts +148 -0
- package/packages/kernel/work/domain/admission-policy.ts +34 -0
- package/packages/kernel/work/domain/check-receipt.ts +43 -0
- package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
- package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
- package/packages/kernel/work/domain/engineering-design.ts +281 -0
- package/packages/kernel/work/domain/engineering-profile.ts +242 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
- package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
- package/packages/kernel/work/domain/implementation-review.ts +510 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
- package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
- package/packages/kernel/work/domain/state-machine.ts +259 -0
- package/packages/kernel/work/domain/types.ts +528 -0
- package/packages/kernel/work/index.ts +1 -0
- package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
- package/packages/kernel/work/ports/work-contract-store.ts +18 -0
- package/packages/plugin-runtime/browser/index.ts +3 -0
- package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
- package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
- package/packages/plugin-runtime/browser/session-authority.ts +61 -0
- package/packages/plugin-runtime/computer/index.ts +6 -0
- package/packages/plugin-runtime/computer/provider-error.ts +26 -0
- package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
- package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
- package/packages/plugin-runtime/computer/provider.ts +19 -0
- package/packages/plugin-runtime/computer/target-authority.ts +190 -0
- package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
- package/packages/plugin-runtime/external/index.ts +1 -0
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
- package/packages/plugin-runtime/index.ts +3 -0
- package/packages/protocols/browser/index.ts +1 -0
- package/packages/protocols/browser/session.ts +98 -0
- package/packages/protocols/computer/contract.ts +199 -0
- package/packages/protocols/computer/index.ts +1 -0
- package/packages/protocols/failure/contract.ts +158 -0
- package/packages/protocols/failure/index.ts +1 -0
- package/packages/protocols/handoff/index.ts +1 -0
- package/packages/protocols/handoff/status.ts +22 -0
- package/packages/protocols/mcp/execution-context.ts +11 -0
- package/packages/protocols/mcp/index.ts +2 -0
- package/packages/protocols/mcp/tool-contract.ts +42 -0
- package/packages/workflow-runtime/api/index.ts +2 -0
- package/packages/workflow-runtime/application/interpreter.ts +342 -0
- package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
- package/packages/workflow-runtime/index.ts +1 -0
- package/scripts/assemble-template.ts +1 -1
- package/scripts/benchmark-computer-hotpath.ts +255 -0
- package/scripts/benchmark-controller-round2.ts +54 -2
- package/scripts/benchmark-ios-agent-device.ts +3 -6
- package/scripts/benchmark-mcp-transport.ts +3 -4
- package/scripts/benchmark-operational-memory-activation.ts +235 -0
- package/scripts/benchmark-operational-shadow.ts +28 -0
- package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
- package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
- package/scripts/canary-controller-semantic-wait.ts +195 -0
- package/scripts/canary-global-hook.sh +2 -2
- package/scripts/check-mcp-compatibility.ts +173 -7
- package/scripts/check-platform-support.mjs +28 -2
- package/scripts/check-public-docs.sh +1 -1
- package/scripts/check-release-readiness.sh +1 -1
- package/scripts/check-repository-hygiene.mjs +92 -0
- package/scripts/check-runtime-architecture.mjs +1206 -95
- package/scripts/check-source-duplication.mjs +9 -1
- package/scripts/check-tarball-install-smoke.sh +98 -15
- package/scripts/controller-ngrok-rotation.sh +5 -4
- package/scripts/create-project-dirs.sh +10 -74
- package/scripts/forge-local-recovery-helper.mjs +204 -0
- package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
- package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
- package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
- package/scripts/hook-shim.sh +2 -2
- package/scripts/init-project.sh +12 -70
- package/scripts/install-desktop-operator-registration.ts +4 -2
- package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
- package/scripts/install-standalone-recovery.ts +122 -10
- package/scripts/install-uu-remote-rescue-registration.ts +74 -0
- package/scripts/install-windows-host-recovery-registration.ts +22 -0
- package/scripts/lib/controller-home-env.sh +6 -3
- package/scripts/lib/project-init-lib.sh +39 -582
- package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
- package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
- package/scripts/open-source-audit-allowlist.txt +12 -1
- package/scripts/portability-bindings.mjs +70 -0
- package/scripts/run-bounded-command.mjs +55 -0
- package/scripts/run-bun-test-file.ts +22 -6
- package/scripts/run-governed-gate.ts +4 -1
- package/scripts/smoke-mcp-http-runtime.ts +1 -1
- package/scripts/smoke-runtime-recovery.ts +34 -1
- package/scripts/smoke-schedule-engine.ts +1 -1
- package/scripts/stage-runtime-release.ts +6 -1
- package/scripts/test-governance.ts +51 -2
- package/src/cli/agent-jobs/job-manager.ts +10 -1
- package/src/cli/chatgpt-browser/bind-server.ts +2 -1
- package/src/cli/chatgpt-browser/binding.ts +20 -10
- package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
- package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
- package/src/cli/chatgpt-browser/engine.ts +10 -11
- package/src/cli/chatgpt-browser/native-provider.ts +24 -83
- package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
- package/src/cli/chatgpt-browser/types.ts +1 -0
- package/src/cli/commands/bootstrap-control.ts +334 -0
- package/src/cli/commands/brain-assistant.ts +38 -0
- package/src/cli/commands/brain.ts +193 -40
- package/src/cli/commands/chatgpt.ts +127 -0
- package/src/cli/commands/computer.ts +437 -0
- package/src/cli/commands/doctor.ts +18 -1
- package/src/cli/commands/init-hook.ts +71 -61
- package/src/cli/commands/init.ts +3 -1
- package/src/cli/commands/mcp.ts +16 -10
- package/src/cli/commands/plugin.ts +38 -12
- package/src/cli/commands/recovery.ts +493 -80
- package/src/cli/commands/runtime.ts +9 -4
- package/src/cli/commands/setup-profile.ts +89 -39
- package/src/cli/commands/status.ts +2 -1
- package/src/cli/controller/check-runner.ts +487 -98
- package/src/cli/controller/context/types.ts +7 -1
- package/src/cli/controller/context-pack.ts +23 -3
- package/src/cli/controller/issue-store.ts +1 -1
- package/src/cli/controller/systemd-user.ts +110 -0
- package/src/cli/controller/types.ts +10 -70
- package/src/cli/controller/worklog.ts +67 -13
- package/src/cli/editing/edit-operation-contract.ts +92 -0
- package/src/cli/editing/edit-session.ts +289 -13
- package/src/cli/github/plugin.ts +17 -12
- package/src/cli/hook/route-registry.ts +3 -5
- package/src/cli/hook/runtime.ts +49 -3
- package/src/cli/index.ts +3 -0
- package/src/cli/local-bridge/connector-freshness.ts +2 -2
- package/src/cli/local-bridge/console-automations.ts +2 -2
- package/src/cli/local-bridge/facade-api.ts +41 -14
- package/src/cli/local-bridge/job-store.ts +1 -1
- package/src/cli/local-bridge/server.ts +24 -27
- package/src/cli/mcp/access-mode.ts +2 -132
- package/src/cli/mcp/access-tools.ts +2 -387
- package/src/cli/mcp/audit.ts +2 -32
- package/src/cli/mcp/auth.ts +2 -404
- package/src/cli/mcp/instructions.ts +2 -34
- package/src/cli/mcp/legacy-context.ts +2 -16
- package/src/cli/mcp/legacy-tool-service.ts +2 -5308
- package/src/cli/mcp/multi-repository.ts +2 -436
- package/src/cli/mcp/oauth.ts +2 -375
- package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
- package/src/cli/mcp/paths.ts +2 -140
- package/src/cli/mcp/policy.ts +2 -232
- package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
- package/src/cli/mcp/proxy-env.ts +2 -62
- package/src/cli/mcp/readiness-projection.ts +2 -24
- package/src/cli/mcp/redaction.ts +2 -21
- package/src/cli/mcp/repo.ts +2 -24
- package/src/cli/mcp/repository-tools.ts +2 -1585
- package/src/cli/mcp/server.ts +2 -951
- package/src/cli/mcp/setup.ts +2 -737
- package/src/cli/mcp/tool-capability-cache.ts +2 -87
- package/src/cli/mcp/tool-contract.ts +2 -14
- package/src/cli/mcp/tools.ts +2 -9
- package/src/cli/mcp/toolset-names.ts +2 -70
- package/src/cli/mcp/toolset-selection.ts +2 -41
- package/src/cli/mcp/toolset.ts +2 -336
- package/src/cli/mcp/transports/AGENTS.md +1 -10
- package/src/cli/mcp/transports/CLAUDE.md +1 -10
- package/src/cli/mcp/transports/http.ts +2 -1414
- package/src/cli/mcp/transports/session-registry.ts +2 -490
- package/src/cli/mcp/transports/stdio.ts +2 -8
- package/src/cli/mcp/types.ts +2 -41
- package/src/cli/mcp/umbrella-tools.ts +2 -117
- package/src/cli/repositories/command-executor.ts +64 -18
- package/src/cli/repositories/command-scope.ts +117 -1
- package/src/cli/repositories/controller-home.ts +119 -1
- package/src/cli/repositories/identity.ts +13 -0
- package/src/cli/repositories/registry.ts +68 -49
- package/src/cli/repositories/repository-snapshot.ts +53 -7
- package/src/cli/repositories/runtime-storage.ts +27 -2
- package/src/cli/repositories/safe-patch.ts +34 -38
- package/src/cli/repositories/selected-path-actions.ts +22 -2
- package/src/cli/repositories/structured-git.ts +105 -25
- package/src/cli/runtime/helper-runner.ts +7 -0
- package/src/cli/runtime-invocation.ts +8 -1
- package/src/cli/tools/codegraph.ts +44 -25
- package/src/core/adoption/manifest-templates.ts +1 -1
- package/src/core/adoption/plan.ts +3 -26
- package/src/core/adoption/workflow-contract-plan.ts +17 -9
- package/src/effects/process-runner.ts +8 -14
- package/src/runtime/context/assistant-context.ts +154 -0
- package/src/runtime/context/assistant-work-context.ts +147 -0
- package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
- package/src/runtime/context/codegraph-read-provider.ts +55 -22
- package/src/runtime/context/codegraph-sidecar.cjs +8 -1
- package/src/runtime/context/context-closure.ts +268 -0
- package/src/runtime/context/context-plane.ts +211 -0
- package/src/runtime/context/project-engineering-contract.ts +60 -0
- package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
- package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
- package/src/runtime/control-plane/bootstrap/index.ts +5 -0
- package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
- package/src/runtime/control-plane/bootstrap/store.ts +21 -0
- package/src/runtime/control-plane/bootstrap/types.ts +87 -0
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
- package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +417 -100
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
- package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
- package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
- package/src/runtime/control-plane/execution/validation.ts +28 -3
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
- package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
- package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
- package/src/runtime/control-plane/execution/work-handle-authority.ts +267 -16
- package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
- package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
- package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
- package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
- package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
- package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
- package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
- package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
- package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
- package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
- package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
- package/src/runtime/control-plane/facade/index.ts +4 -2
- package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
- package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
- package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
- package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
- package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
- package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
- package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
- package/src/runtime/control-plane/facade/types.ts +189 -532
- package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
- package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
- package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
- package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
- package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
- package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
- package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
- package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
- package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
- package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
- package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
- package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
- package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
- package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
- package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
- package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
- package/src/runtime/control-plane/release-retention.ts +56 -16
- package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
- package/src/runtime/control-plane/routing/route-policy.ts +19 -0
- package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
- package/src/runtime/control-plane/runtime-generation.ts +6 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
- package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
- package/src/runtime/diagnostics/incident-repair.ts +406 -0
- package/src/runtime/diagnostics/mcp-timing.ts +125 -6
- package/src/runtime/diagnostics/performance.ts +6 -14
- package/src/runtime/diagnostics/read-only-tool.ts +1 -1
- package/src/runtime/evidence/artifact-store.ts +65 -2
- package/src/runtime/evidence/operational-shadow.ts +38 -0
- package/src/runtime/evidence/process-check-receipt.ts +5 -43
- package/src/runtime/evidence/sensitive-output.ts +4 -4
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
- package/src/runtime/execution/jobs/store.ts +121 -2
- package/src/runtime/execution/managed-workspace.ts +55 -5
- package/src/runtime/execution/process-runtime/canary.ts +19 -5
- package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
- package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
- package/src/runtime/execution/process-runtime/check-result.ts +73 -2
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
- package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
- package/src/runtime/execution/process-runtime/index.ts +1 -0
- package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
- package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
- package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
- package/src/runtime/execution/process-runtime/runtime.ts +132 -15
- package/src/runtime/execution/process-runtime/types.ts +22 -0
- package/src/runtime/execution/workers/executor.ts +16 -13
- package/src/runtime/execution/workers/worker-entry.ts +1 -1
- package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
- package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
- package/src/runtime/gateway/mcp/process-tools.ts +2 -289
- package/src/runtime/gateway/mcp/router.ts +2 -1125
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
- package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6651
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
- package/src/runtime/maintenance/cleanup.ts +38 -24
- package/src/runtime/platform/browser-product-discovery.ts +174 -0
- package/src/runtime/platform/computer-platform.ts +14 -0
- package/src/runtime/platform/executable-discovery.ts +54 -0
- package/src/runtime/platform/fetch-http-server.ts +90 -0
- package/src/runtime/platform/service-manager.ts +138 -0
- package/src/runtime/platform/windows-host-discovery.ts +118 -0
- package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
- package/src/runtime/plugins/action-application.ts +135 -0
- package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
- package/src/runtime/plugins/browser-adapter.ts +140 -100
- package/src/runtime/plugins/browser-automation-service.ts +15 -36
- package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
- package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
- package/src/runtime/plugins/browser-native-session-service.ts +1 -1
- package/src/runtime/plugins/browser-provider-registry.ts +2 -109
- package/src/runtime/plugins/browser-registration.ts +16 -0
- package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
- package/src/runtime/plugins/browser-runtime.ts +41 -9
- package/src/runtime/plugins/browser-session-authority.ts +101 -291
- package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
- package/src/runtime/plugins/browser-session-store.ts +229 -36
- package/src/runtime/plugins/browser-session-types.ts +2 -98
- package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
- package/src/runtime/plugins/catalog-trust.ts +82 -0
- package/src/runtime/plugins/computer-registration.ts +839 -0
- package/src/runtime/plugins/config-store.ts +119 -0
- package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
- package/src/runtime/plugins/errors.ts +8 -1
- package/src/runtime/plugins/external-adapter.ts +45 -322
- package/src/runtime/plugins/external-provider-policy.ts +48 -0
- package/src/runtime/plugins/external-registration.ts +9 -1
- package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
- package/src/runtime/plugins/external-unix-socket.ts +64 -193
- package/src/runtime/plugins/first-party-external-registration.ts +163 -0
- package/src/runtime/plugins/first-party-registry.ts +3 -1
- package/src/runtime/plugins/github-adapter.ts +1 -2
- package/src/runtime/plugins/gmail-adapter.ts +6 -6
- package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
- package/src/runtime/plugins/google-shared.ts +31 -46
- package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
- package/src/runtime/plugins/ios-adapter.ts +1 -2
- package/src/runtime/plugins/local-system-adapter.ts +180 -0
- package/src/runtime/plugins/macos-capability-broker.ts +15 -105
- package/src/runtime/plugins/resend-adapter.ts +15 -24
- package/src/runtime/plugins/store.ts +493 -51
- package/src/runtime/plugins/types.ts +8 -1
- package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
- package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
- package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
- package/src/runtime/projections/controller-context.ts +12 -6
- package/src/runtime/projections/git-status-sampler.ts +73 -22
- package/src/runtime/projections/materialized-view.ts +14 -8
- package/src/runtime/recovery/capability-action-application.ts +228 -0
- package/src/runtime/recovery/index.ts +3 -0
- package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
- package/src/runtime/recovery/local-jobs-repair.ts +14 -14
- package/src/runtime/recovery/maintenance-executor.ts +358 -76
- package/src/runtime/recovery/quarantine-retention.ts +256 -0
- package/src/runtime/release/identity.ts +6 -0
- package/src/runtime/resources/leases/store.ts +1 -1
- package/src/runtime/root/active-execution-power-assertion.ts +139 -0
- package/src/runtime/root/assistant-learning-loop.ts +45 -0
- package/src/runtime/root/browser-session-composition.ts +59 -0
- package/src/runtime/root/computer-composition.ts +191 -0
- package/src/runtime/root/computer-target-composition.ts +16 -0
- package/src/runtime/root/computer-target-persistence.ts +39 -0
- package/src/runtime/root/controller-round-composition.ts +107 -0
- package/src/runtime/root/controller-services.ts +2 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/gateway-adapter.ts +3 -3
- package/src/runtime/root/local-bridge.ts +5 -2
- package/src/runtime/root/mcp-transport.ts +5 -5
- package/src/runtime/root/package-connector-service.ts +108 -56
- package/src/runtime/root/package-runtime-release.ts +86 -18
- package/src/runtime/root/package-runtime-service.ts +63 -86
- package/src/runtime/root/release-execution-canary.ts +71 -0
- package/src/runtime/root/release-loader.ts +68 -0
- package/src/runtime/root/release-manifest.ts +106 -2
- package/src/runtime/root/release-materialize.ts +103 -4
- package/src/runtime/root/release-store.ts +31 -2
- package/src/runtime/root/runtime.ts +240 -25
- package/src/runtime/root/scheduled-controller-composition.ts +51 -0
- package/src/runtime/root/scheduler.ts +12 -4
- package/src/runtime/root/service-runner.ts +1 -1
- package/src/runtime/root/service.ts +41 -16
- package/src/runtime/root/status.ts +1 -0
- package/src/runtime/root/types.ts +24 -1
- package/src/runtime/shared/local-bridge-surface.ts +1 -1
- package/src/runtime/shared/process-environment.ts +19 -4
- package/src/runtime/shared/storage-capacity.ts +68 -0
- package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
- package/src/runtime/standalone-recovery/core.ts +984 -230
- package/src/runtime/standalone-recovery/entry.ts +182 -51
- package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
- package/src/runtime/standalone-recovery/installer.ts +212 -104
- package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
- package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
- package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
- package/src/runtime/standalone-recovery/performance.ts +135 -0
- package/src/runtime/standalone-recovery/release.ts +5 -0
- package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
- package/src/runtime/workflow/schedules/engine.ts +191 -343
- package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
- package/src/runtime/workflow/schedules/settlement.ts +2 -191
- package/src/runtime/workflow/schedules/store.ts +2 -607
- package/src/runtime/workflow/schedules/types.ts +2 -127
- package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
- package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
- package/src/runtime/workflows/runtime.ts +486 -0
- package/src/testing/test-governance.ts +90 -29
- package/assets/templates/helpers/archive-architecture-request.sh +0 -244
- package/docs/architecture/history/README.md +0 -7
- package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
- package/docs/architecture/history/global-hook-runtime.md +0 -166
- package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
- package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
- package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
- package/docs/architecture/requests/archive/2026/root.md +0 -68
- package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
- package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
- package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
- package/scripts/archive-architecture-request.sh +0 -4
- package/scripts/run-skill-evals.ts +0 -1022
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type { RepositoryRecord } from '../../../cli/repositories/types';
|
|
12
|
-
import { repositoryGitStatus } from '../../../cli/repositories/structured-git';
|
|
13
12
|
import { classifyRepositoryCommand, fixedShellWrapperCommand, shellSegments, shellWordsPreservingQuotes } from '../../../cli/repositories/command-classifier';
|
|
14
13
|
import {
|
|
15
14
|
executeRepositoryCommandAsync,
|
|
@@ -34,7 +33,7 @@ import { DEFAULT_INTERACTIVE_WAIT_MS } from './types';
|
|
|
34
33
|
import { durationAwareInteractiveWaitMs } from './interactive-admission';
|
|
35
34
|
import { isFocusedCheckCommand } from '../thin-harness/execution-router';
|
|
36
35
|
import { assertExecutionIdentity, type ResolvedExecutionIdentity } from '../../control-plane/execution/execution-identity';
|
|
37
|
-
import {
|
|
36
|
+
import { settleWorkHandleExpectedHeadAfterRepositoryCommand } from '../../control-plane/execution/work-head-settlement';
|
|
38
37
|
import {
|
|
39
38
|
cancelLightweightProcess,
|
|
40
39
|
getLightweightProcessHandle,
|
|
@@ -114,77 +113,6 @@ const emptyEffects = {
|
|
|
114
113
|
projectionUpdateCount: 0,
|
|
115
114
|
};
|
|
116
115
|
|
|
117
|
-
export type WorkHeadSettlementReason =
|
|
118
|
-
| 'settled'
|
|
119
|
-
| 'no_work'
|
|
120
|
-
| 'command_not_successful'
|
|
121
|
-
| 'work_handle_missing'
|
|
122
|
-
| 'identity_mismatch'
|
|
123
|
-
| 'terminal_handle'
|
|
124
|
-
| 'branch_changed'
|
|
125
|
-
| 'head_unavailable'
|
|
126
|
-
| 'head_unchanged'
|
|
127
|
-
| 'concurrent_lifecycle_write';
|
|
128
|
-
|
|
129
|
-
export interface WorkHeadSettlementResult {
|
|
130
|
-
settled: boolean;
|
|
131
|
-
reason: WorkHeadSettlementReason;
|
|
132
|
-
previousHead?: string;
|
|
133
|
-
currentHead?: string;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Settle the one legitimate post-command Work HEAD transition without weakening
|
|
138
|
-
* the pre-command execution identity fence. The command has already been
|
|
139
|
-
* admitted only if repo/checkout/branch/expectedHead matched the WorkHandle.
|
|
140
|
-
* After success, adopt the exact current HEAD only while the same checkout and
|
|
141
|
-
* branch still own the Work. CAS failure is a bounded no-op: finalization keeps
|
|
142
|
-
* failing closed instead of accepting a concurrent lifecycle writer.
|
|
143
|
-
*/
|
|
144
|
-
export function settleWorkHandleExpectedHeadAfterRepositoryCommand(input: {
|
|
145
|
-
controllerHome: string;
|
|
146
|
-
repository: RepositoryRecord;
|
|
147
|
-
executionIdentity: ResolvedExecutionIdentity;
|
|
148
|
-
workId?: string;
|
|
149
|
-
ok?: boolean;
|
|
150
|
-
cancelled?: boolean;
|
|
151
|
-
timedOut?: boolean;
|
|
152
|
-
}): WorkHeadSettlementResult {
|
|
153
|
-
const workId = input.workId?.trim();
|
|
154
|
-
if (!workId) return { settled: false, reason: 'no_work' };
|
|
155
|
-
if (input.ok !== true || input.cancelled === true || input.timedOut === true) {
|
|
156
|
-
return { settled: false, reason: 'command_not_successful' };
|
|
157
|
-
}
|
|
158
|
-
const handle = readWorkHandle(input.controllerHome, input.repository.repoId, workId);
|
|
159
|
-
if (!handle) return { settled: false, reason: 'work_handle_missing' };
|
|
160
|
-
if (
|
|
161
|
-
handle.repositoryId !== input.executionIdentity.repositoryId
|
|
162
|
-
|| handle.checkoutId !== input.executionIdentity.checkoutId
|
|
163
|
-
|| handle.workId !== input.executionIdentity.workId
|
|
164
|
-
) return { settled: false, reason: 'identity_mismatch' };
|
|
165
|
-
if (handle.state === 'merged' || handle.state === 'cleaned' || handle.state === 'failed_terminal_cleanup') {
|
|
166
|
-
return { settled: false, reason: 'terminal_handle' };
|
|
167
|
-
}
|
|
168
|
-
const status = repositoryGitStatus(input.repository);
|
|
169
|
-
if (!status.branch || status.branch !== handle.branch) {
|
|
170
|
-
return { settled: false, reason: 'branch_changed', previousHead: handle.expectedHead, currentHead: status.head ?? undefined };
|
|
171
|
-
}
|
|
172
|
-
const currentHead = status.head?.trim();
|
|
173
|
-
if (!currentHead) return { settled: false, reason: 'head_unavailable', previousHead: handle.expectedHead };
|
|
174
|
-
if (currentHead === handle.expectedHead) {
|
|
175
|
-
return { settled: false, reason: 'head_unchanged', previousHead: handle.expectedHead, currentHead };
|
|
176
|
-
}
|
|
177
|
-
try {
|
|
178
|
-
transitionWorkHandle(input.controllerHome, handle, handle.state, { expectedHead: currentHead });
|
|
179
|
-
return { settled: true, reason: 'settled', previousHead: handle.expectedHead, currentHead };
|
|
180
|
-
} catch (error) {
|
|
181
|
-
if (error instanceof Error && error.message.includes('CONTROL_PLANE_REVISION_CONFLICT')) {
|
|
182
|
-
return { settled: false, reason: 'concurrent_lifecycle_write', previousHead: handle.expectedHead, currentHead };
|
|
183
|
-
}
|
|
184
|
-
throw error;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
116
|
const STANDALONE_RECOVERY_LIFECYCLE_COMMANDS = new Set([
|
|
189
117
|
'restart-runtime',
|
|
190
118
|
'bootstrap-cutover',
|
|
@@ -237,9 +165,15 @@ function repositoryCommandRecoveryLifecycle(command: string | readonly string[])
|
|
|
237
165
|
return wrapped ? recoveryLifecycleFromShell(wrapped) : undefined;
|
|
238
166
|
}
|
|
239
167
|
|
|
240
|
-
|
|
168
|
+
export type RepositoryGitCommitCommandScope =
|
|
169
|
+
| { kind: 'not_commit' }
|
|
170
|
+
| { kind: 'explicit_paths'; paths: string[] }
|
|
171
|
+
| { kind: 'staged_index' }
|
|
172
|
+
| { kind: 'unsafe'; reason: 'scope_widening' | 'compound_unscoped_commit' };
|
|
173
|
+
|
|
174
|
+
function gitCommitWordsScope(words: readonly string[]): RepositoryGitCommitCommandScope {
|
|
241
175
|
const executable = commandBasename(words[0] ?? '');
|
|
242
|
-
if (executable !== 'git') return
|
|
176
|
+
if (executable !== 'git') return { kind: 'not_commit' };
|
|
243
177
|
const args = words.slice(1);
|
|
244
178
|
let index = 0;
|
|
245
179
|
while (index < args.length && args[index]?.startsWith('-')) {
|
|
@@ -248,29 +182,45 @@ function gitCommitWordsRequireExplicitPathScope(words: readonly string[]): boole
|
|
|
248
182
|
else if (['--git-dir=', '--work-tree=', '--namespace='].some((prefix) => option.startsWith(prefix))) index += 1;
|
|
249
183
|
else index += 1;
|
|
250
184
|
}
|
|
251
|
-
if (args[index]?.toLowerCase() !== 'commit') return
|
|
185
|
+
if (args[index]?.toLowerCase() !== 'commit') return { kind: 'not_commit' };
|
|
252
186
|
const commitArgs = args.slice(index + 1);
|
|
253
187
|
const pathSeparator = commitArgs.indexOf('--');
|
|
254
188
|
const paths = pathSeparator >= 0 ? commitArgs.slice(pathSeparator + 1).filter(Boolean) : [];
|
|
255
|
-
const
|
|
256
|
-
|
|
189
|
+
const wideningFlags = ['-a', '--all', '-i', '--include', '--interactive', '-p', '--patch', '--amend', '--pathspec-from-file'];
|
|
190
|
+
const widensScope = commitArgs.some((arg) => wideningFlags.some((flag) => arg === flag || arg.startsWith(`${flag}=`)));
|
|
191
|
+
if (widensScope) return { kind: 'unsafe', reason: 'scope_widening' };
|
|
192
|
+
return paths.length > 0 ? { kind: 'explicit_paths', paths } : { kind: 'staged_index' };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function aggregateShellCommitScope(shellCommand: string): RepositoryGitCommitCommandScope {
|
|
196
|
+
const segments = shellSegments(shellCommand);
|
|
197
|
+
const commits = segments
|
|
198
|
+
.map((segment) => gitCommitWordsScope(shellWordsPreservingQuotes(segment)))
|
|
199
|
+
.filter((scope) => scope.kind !== 'not_commit');
|
|
200
|
+
if (commits.length === 0) return { kind: 'not_commit' };
|
|
201
|
+
const unsafe = commits.find((scope): scope is Extract<RepositoryGitCommitCommandScope, { kind: 'unsafe' }> => scope.kind === 'unsafe');
|
|
202
|
+
if (unsafe) return unsafe;
|
|
203
|
+
if (segments.length > 1 && commits.some((scope) => scope.kind === 'staged_index')) {
|
|
204
|
+
return { kind: 'unsafe', reason: 'compound_unscoped_commit' };
|
|
205
|
+
}
|
|
206
|
+
const staged = commits.find((scope) => scope.kind === 'staged_index');
|
|
207
|
+
if (staged) return staged;
|
|
208
|
+
const paths = commits.flatMap((scope) => scope.kind === 'explicit_paths' ? scope.paths : []);
|
|
209
|
+
return { kind: 'explicit_paths', paths: [...new Set(paths)] };
|
|
257
210
|
}
|
|
258
211
|
|
|
259
|
-
function
|
|
212
|
+
export function classifyRawGitCommitScope(command: string | readonly string[]): RepositoryGitCommitCommandScope {
|
|
260
213
|
const normalized = normalizeRepositoryCommand(command);
|
|
261
214
|
if (normalized.kind === 'argv') {
|
|
262
|
-
const direct =
|
|
215
|
+
const direct = gitCommitWordsScope([
|
|
263
216
|
normalized.executable ?? '',
|
|
264
217
|
...(normalized.args ?? []),
|
|
265
218
|
]);
|
|
266
|
-
if (direct !==
|
|
219
|
+
if (direct.kind !== 'not_commit') return direct;
|
|
267
220
|
const wrapped = fixedShellWrapperCommand(normalized.value as string[]);
|
|
268
|
-
|
|
269
|
-
return shellSegments(wrapped)
|
|
270
|
-
.some((segment) => gitCommitWordsRequireExplicitPathScope(shellWordsPreservingQuotes(segment)) === true);
|
|
221
|
+
return wrapped ? aggregateShellCommitScope(wrapped) : { kind: 'not_commit' };
|
|
271
222
|
}
|
|
272
|
-
return
|
|
273
|
-
.some((segment) => gitCommitWordsRequireExplicitPathScope(shellWordsPreservingQuotes(segment)) === true);
|
|
223
|
+
return aggregateShellCommitScope(normalized.shellCommand ?? '');
|
|
274
224
|
}
|
|
275
225
|
|
|
276
226
|
function toProcessCommand(command: string | readonly string[], cwd: string): ProcessCommandSpec {
|
|
@@ -305,7 +255,8 @@ export function classifyRepositoryCommandRoute(
|
|
|
305
255
|
if (repositoryCommandRecoveryLifecycle(command)) {
|
|
306
256
|
return { route: 'reject', reason: 'standalone_recovery_lifecycle_required' };
|
|
307
257
|
}
|
|
308
|
-
|
|
258
|
+
const commitScope = classifyRawGitCommitScope(command);
|
|
259
|
+
if (commitScope.kind === 'unsafe') {
|
|
309
260
|
return { route: 'reject', reason: 'git_commit_requires_explicit_path_scope' };
|
|
310
261
|
}
|
|
311
262
|
if (options.forceDurable) {
|
|
@@ -28,5 +28,6 @@ export function durationAwareInteractiveWaitMs(
|
|
|
28
28
|
const normalized = normalizeRepositoryCommand(command);
|
|
29
29
|
if (normalized.kind !== 'argv') return DEFAULT_COMPLETION_GRACE_MS;
|
|
30
30
|
const executable = normalized.executable?.split(/[\\/]/).at(-1)?.toLowerCase();
|
|
31
|
-
|
|
31
|
+
const shortGitMerge = executable === 'git' && normalized.args?.[0] === 'merge';
|
|
32
|
+
return executable && (SHORT_COMMANDS.has(executable) || shortGitMerge) ? shortCommandWaitMs : DEFAULT_COMPLETION_GRACE_MS;
|
|
32
33
|
}
|
|
@@ -93,6 +93,12 @@ interface LightweightEntry {
|
|
|
93
93
|
|
|
94
94
|
const entries = new Map<string, LightweightEntry>();
|
|
95
95
|
|
|
96
|
+
export function hasActiveLightweightProcesses(controllerHome: string): boolean {
|
|
97
|
+
return [...entries.values()].some((entry) => (
|
|
98
|
+
entry.controllerHome === controllerHome && entry.result === undefined
|
|
99
|
+
));
|
|
100
|
+
}
|
|
101
|
+
|
|
96
102
|
interface LightweightRunningReceipt {
|
|
97
103
|
schemaVersion: 1;
|
|
98
104
|
repoId: string;
|
|
@@ -740,7 +746,31 @@ export async function startLightweightRepositoryCommand(
|
|
|
740
746
|
// degradation is represented by RepositoryCommandExecution.evidenceError;
|
|
741
747
|
// this catch is the final fail-safe for any later post-processing exception.
|
|
742
748
|
if (entry.exitObservation && entry.result) return entry.result;
|
|
743
|
-
|
|
749
|
+
|
|
750
|
+
// Command preparation can fail before spawn (for example a repository-scope
|
|
751
|
+
// or external-filesystem grant denial). In deferred-start mode that rejection
|
|
752
|
+
// must belong to this lightweight Process; allowing it to escape would become
|
|
753
|
+
// an unhandled Runtime rejection and could terminate unrelated in-flight work.
|
|
754
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
755
|
+
const failed: LightweightExecutionResult = {
|
|
756
|
+
ok: false,
|
|
757
|
+
exitCode: 1,
|
|
758
|
+
timedOut: false,
|
|
759
|
+
cancelled: false,
|
|
760
|
+
stdout: visibleOutput(entry.stdout, maxOutputBytes),
|
|
761
|
+
stderr: visibleOutput([entry.stderr, message].filter(Boolean).join('\n'), maxOutputBytes),
|
|
762
|
+
};
|
|
763
|
+
entry.result = failed;
|
|
764
|
+
entry.finishedAtMs = Date.now();
|
|
765
|
+
input.execution.signal?.removeEventListener('abort', onCallerAbort);
|
|
766
|
+
try {
|
|
767
|
+
input.onCompleted?.(failed);
|
|
768
|
+
} catch (callbackError) {
|
|
769
|
+
const callbackMessage = callbackError instanceof Error ? callbackError.message : String(callbackError);
|
|
770
|
+
failed.stderr = visibleOutput([failed.stderr, callbackMessage].filter(Boolean).join('\n'), maxOutputBytes);
|
|
771
|
+
}
|
|
772
|
+
persistTerminalReceipt(input.controllerHome, entry);
|
|
773
|
+
return failed;
|
|
744
774
|
});
|
|
745
775
|
entry.promise = input.deferStart
|
|
746
776
|
? new Promise<LightweightExecutionResult>((resolve, reject) => {
|
|
@@ -974,6 +1004,7 @@ export async function startLightweightControllerCheck(
|
|
|
974
1004
|
}, { once: true });
|
|
975
1005
|
entry.promise = runControllerCheckAsync(input.repoRoot, input.checkId, {
|
|
976
1006
|
requestedTimeoutMs: input.timeoutMs,
|
|
1007
|
+
storageAuthority: { controllerHome: input.controllerHome, repoId: input.repoId },
|
|
977
1008
|
subscriberId: processId,
|
|
978
1009
|
onSpawn: (pid) => {
|
|
979
1010
|
entry.pid = pid;
|
|
@@ -4,6 +4,7 @@ import { dirname, resolve } from 'path';
|
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import {
|
|
6
6
|
controllerCheckExecutionIdentity,
|
|
7
|
+
controllerCheckLiveExecutionStateFingerprint,
|
|
7
8
|
listControllerChecks,
|
|
8
9
|
snapshotControllerCheck,
|
|
9
10
|
} from '../../../cli/controller/check-runner';
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
} from '../../../cli/runtime-invocation';
|
|
17
18
|
import { readRuntimeGeneration, resolveControllerRuntimeSourceRoot } from '../../control-plane/runtime-generation';
|
|
18
19
|
import { cleanupWorkVerificationSnapshot, materializeWorkVerificationSnapshot } from '../../control-plane/execution/work-verification-snapshot';
|
|
20
|
+
import { resolveBunExecutable } from '../../shared/process-environment';
|
|
19
21
|
import {
|
|
20
22
|
checkRequiresDurableWorkflow,
|
|
21
23
|
processCheckSemanticScopeKey,
|
|
@@ -37,6 +39,7 @@ import { durationAwareInteractiveWaitMs } from './interactive-admission';
|
|
|
37
39
|
export const DEFAULT_WORK_CHECK_LEASE_WAIT_MS = 30_000;
|
|
38
40
|
|
|
39
41
|
const PERSISTED_CHECK_SOURCE_ENTRY = 'src/runtime/execution/process-runtime/check-runner-sidecar.ts';
|
|
42
|
+
const PERSISTED_CHECK_NODE_LOADER = 'src/runtime/shared/node-ts-loader.mjs';
|
|
40
43
|
|
|
41
44
|
export function resolvePersistedCheckCliInvocation(
|
|
42
45
|
cliEntry: string,
|
|
@@ -78,6 +81,52 @@ export function resolveRuntimeCliEntry(controllerHome?: string): string {
|
|
|
78
81
|
return resolveRuntimeCliTarget(controllerHome).entry;
|
|
79
82
|
}
|
|
80
83
|
|
|
84
|
+
export function shouldUseCandidatePersistedCheckRunner(input: {
|
|
85
|
+
repoId: string;
|
|
86
|
+
runtimeSourceRepoId?: string;
|
|
87
|
+
verificationSnapshot: boolean;
|
|
88
|
+
liveCertification: boolean;
|
|
89
|
+
}): boolean {
|
|
90
|
+
return input.verificationSnapshot
|
|
91
|
+
&& !input.liveCertification
|
|
92
|
+
&& Boolean(input.runtimeSourceRepoId && input.runtimeSourceRepoId === input.repoId);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function resolveCandidatePersistedCheckRunnerTarget(
|
|
96
|
+
candidateRoot: string,
|
|
97
|
+
sourceRevision: string,
|
|
98
|
+
options: { bunExecutable?: string; entryExists?: (path: string) => boolean } = {},
|
|
99
|
+
): { cliTarget: CliRuntimeTarget; runtimeExecutable: string; executionStateFingerprint: string } {
|
|
100
|
+
const root = resolve(candidateRoot);
|
|
101
|
+
const revision = sourceRevision.trim();
|
|
102
|
+
if (!revision) throw new Error('PERSISTED_CHECK_CANDIDATE_REVISION_REQUIRED');
|
|
103
|
+
const entryExists = options.entryExists ?? existsSync;
|
|
104
|
+
const sourceEntry = resolve(root, PERSISTED_CHECK_SOURCE_ENTRY);
|
|
105
|
+
if (!entryExists(sourceEntry)) {
|
|
106
|
+
throw new Error(`PERSISTED_CHECK_CANDIDATE_RUNNER_MISSING: ${sourceEntry}`);
|
|
107
|
+
}
|
|
108
|
+
const runtimeExecutable = options.bunExecutable?.trim() || resolveBunExecutable();
|
|
109
|
+
const cliTarget: CliRuntimeTarget = {
|
|
110
|
+
entry: sourceEntry,
|
|
111
|
+
cwd: root,
|
|
112
|
+
runtimeKind: 'bun_source',
|
|
113
|
+
sourceRevision: revision,
|
|
114
|
+
immutable: false,
|
|
115
|
+
explanation: 'self-hosting Work verification snapshot candidate Check Runner',
|
|
116
|
+
};
|
|
117
|
+
const executionStateFingerprint = createHash('sha256')
|
|
118
|
+
.update(JSON.stringify({
|
|
119
|
+
schemaVersion: 1,
|
|
120
|
+
authority: 'self_hosting_work_verification_candidate',
|
|
121
|
+
runnerEntry: PERSISTED_CHECK_SOURCE_ENTRY,
|
|
122
|
+
runtimeKind: cliTarget.runtimeKind,
|
|
123
|
+
sourceRevision: revision,
|
|
124
|
+
}))
|
|
125
|
+
.digest('hex')
|
|
126
|
+
.slice(0, 24);
|
|
127
|
+
return { cliTarget, runtimeExecutable, executionStateFingerprint };
|
|
128
|
+
}
|
|
129
|
+
|
|
81
130
|
export function persistedCheckSemanticScopeKey(
|
|
82
131
|
input: Pick<RunCheckFacadeInput, 'workId' | 'verificationBinding' | 'checkoutId'>,
|
|
83
132
|
reuseScope: 'repository' | 'checkout',
|
|
@@ -108,25 +157,35 @@ export function resolvePersistedCheckProcessInvocation(
|
|
|
108
157
|
if (cliTarget.runtimeKind === 'compiled_bun_release') {
|
|
109
158
|
return { executable, args };
|
|
110
159
|
}
|
|
160
|
+
const entryExists = options.entryExists ?? existsSync;
|
|
111
161
|
const sourceEntry = resolve(cliTarget.cwd, PERSISTED_CHECK_SOURCE_ENTRY);
|
|
112
|
-
if (!
|
|
162
|
+
if (!entryExists(sourceEntry)) {
|
|
113
163
|
throw new Error(`PERSISTED_CHECK_SOURCE_RUNNER_MISSING: ${sourceEntry}`);
|
|
114
164
|
}
|
|
165
|
+
let nodeSourceLoaderEntry: string | undefined;
|
|
166
|
+
if (cliTarget.runtimeKind === 'node_source') {
|
|
167
|
+
nodeSourceLoaderEntry = resolve(cliTarget.cwd, PERSISTED_CHECK_NODE_LOADER);
|
|
168
|
+
if (!entryExists(nodeSourceLoaderEntry)) {
|
|
169
|
+
throw new Error(`PERSISTED_CHECK_NODE_LOADER_MISSING: ${nodeSourceLoaderEntry}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
115
172
|
return resolvePersistedCheckCliInvocation(sourceEntry, args, {
|
|
116
173
|
runtimeExecutable: executable,
|
|
117
174
|
runtimeKind: cliTarget.runtimeKind,
|
|
118
175
|
sourceRevision: cliTarget.sourceRevision,
|
|
119
176
|
immutable: false,
|
|
177
|
+
...(nodeSourceLoaderEntry ? { nodeSourceLoaderEntry } : {}),
|
|
120
178
|
...(cliTarget.runtimeKind === 'package_launcher' ? { launcherEntry: cliTarget.entry } : {}),
|
|
121
179
|
});
|
|
122
180
|
}
|
|
123
181
|
|
|
124
182
|
/**
|
|
125
183
|
* Run a registered check through Process Runtime while keeping check-runner
|
|
126
|
-
* evidence authoritative.
|
|
127
|
-
*
|
|
128
|
-
* executes
|
|
129
|
-
*
|
|
184
|
+
* evidence authoritative. Ordinary repositories and live-runtime certification
|
|
185
|
+
* use the active immutable Runtime runner. Self-hosting Forge Work verification
|
|
186
|
+
* instead executes the exact candidate snapshot sidecar so pre-cutover evidence
|
|
187
|
+
* cannot be interpreted by an older Runtime release. Process/lease/receipt
|
|
188
|
+
* authority remains in the active Runtime in both cases.
|
|
130
189
|
*/
|
|
131
190
|
export async function runPersistedCheckViaProcessRuntime(
|
|
132
191
|
input: RunCheckFacadeInput,
|
|
@@ -169,6 +228,23 @@ export async function runPersistedCheckViaProcessRuntime(
|
|
|
169
228
|
};
|
|
170
229
|
}
|
|
171
230
|
}
|
|
231
|
+
// Check-definition authority belongs to the canonical repository, while Work source
|
|
232
|
+
// verification may execute from an immutable snapshot that intentionally excludes
|
|
233
|
+
// machine-local registry files such as .forge/checks.json. Freeze the exact
|
|
234
|
+
// registered definition before materializing the source-under-test snapshot.
|
|
235
|
+
const check = listControllerChecks(input.repoRoot).find((entry) => entry.id === input.checkId);
|
|
236
|
+
if (!check) {
|
|
237
|
+
return {
|
|
238
|
+
mode: 'durable',
|
|
239
|
+
checkId: input.checkId,
|
|
240
|
+
durable: {
|
|
241
|
+
reason: 'check_not_found_or_requires_registry_lookup',
|
|
242
|
+
suggestedOperation: 'list_checks then run_check with a known check_id',
|
|
243
|
+
},
|
|
244
|
+
durableSideEffects: emptyEffects,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
const checkSnapshot = snapshotControllerCheck(input.repoRoot, input.checkId);
|
|
172
248
|
const verificationSnapshot = input.verificationSnapshot
|
|
173
249
|
? materializeWorkVerificationSnapshot({
|
|
174
250
|
controllerHome: input.controllerHome,
|
|
@@ -181,18 +257,9 @@ export async function runPersistedCheckViaProcessRuntime(
|
|
|
181
257
|
const cleanupVerificationSnapshot = () => {
|
|
182
258
|
if (verificationSnapshot) cleanupWorkVerificationSnapshot(verificationSnapshot.root);
|
|
183
259
|
};
|
|
184
|
-
|
|
185
|
-
if (!check) {
|
|
260
|
+
if (check.id !== checkSnapshot.id) {
|
|
186
261
|
cleanupVerificationSnapshot();
|
|
187
|
-
|
|
188
|
-
mode: 'durable',
|
|
189
|
-
checkId: input.checkId,
|
|
190
|
-
durable: {
|
|
191
|
-
reason: 'check_not_found_or_requires_registry_lookup',
|
|
192
|
-
suggestedOperation: 'list_checks then run_check with a known check_id',
|
|
193
|
-
},
|
|
194
|
-
durableSideEffects: emptyEffects,
|
|
195
|
-
};
|
|
262
|
+
throw new Error(`CHECK_DEFINITION_AUTHORITY_MISMATCH: ${input.checkId}`);
|
|
196
263
|
}
|
|
197
264
|
if (input.forceDurable || (checkRequiresDurableWorkflow(input.checkId, check) && input.allowDurableCheckExecution !== true)) {
|
|
198
265
|
cleanupVerificationSnapshot();
|
|
@@ -237,17 +304,48 @@ export async function runPersistedCheckViaProcessRuntime(
|
|
|
237
304
|
executionIdentity.repositoryId,
|
|
238
305
|
executionIdentity.checkoutId,
|
|
239
306
|
check.effects,
|
|
307
|
+
check.executionAuthority,
|
|
240
308
|
);
|
|
241
|
-
const checkSnapshot = snapshotControllerCheck(executionRoot, input.checkId);
|
|
242
309
|
const checkFingerprint = createHash('sha256')
|
|
243
310
|
.update(JSON.stringify(checkSnapshot))
|
|
244
311
|
.digest('hex');
|
|
245
|
-
const
|
|
312
|
+
const liveCertification = check.executionAuthority === 'live_controller_home';
|
|
313
|
+
if (liveCertification && input.allowDurableCheckExecution !== true) {
|
|
314
|
+
cleanupVerificationSnapshot();
|
|
315
|
+
throw new Error('LIVE_CHECK_CONTROLLER_OWNERSHIP_REQUIRED');
|
|
316
|
+
}
|
|
317
|
+
const liveExecutionStateFingerprint = liveCertification
|
|
318
|
+
? controllerCheckLiveExecutionStateFingerprint(input.controllerHome)
|
|
319
|
+
: undefined;
|
|
320
|
+
const preliminarySemanticCheck = controllerCheckExecutionIdentity(
|
|
246
321
|
executionRoot,
|
|
247
322
|
input.checkId,
|
|
248
323
|
timeoutMs,
|
|
249
324
|
checkSnapshot,
|
|
325
|
+
liveExecutionStateFingerprint,
|
|
250
326
|
);
|
|
327
|
+
const runtimeGeneration = verificationSnapshot && !liveCertification
|
|
328
|
+
? readRuntimeGeneration(input.controllerHome)
|
|
329
|
+
: undefined;
|
|
330
|
+
const candidateRunner = shouldUseCandidatePersistedCheckRunner({
|
|
331
|
+
repoId: input.repoId,
|
|
332
|
+
runtimeSourceRepoId: runtimeGeneration?.source.sourceRepositoryId,
|
|
333
|
+
verificationSnapshot: Boolean(verificationSnapshot),
|
|
334
|
+
liveCertification,
|
|
335
|
+
})
|
|
336
|
+
? resolveCandidatePersistedCheckRunnerTarget(executionRoot, preliminarySemanticCheck.revision)
|
|
337
|
+
: undefined;
|
|
338
|
+
const executionStateFingerprint = candidateRunner?.executionStateFingerprint
|
|
339
|
+
?? liveExecutionStateFingerprint;
|
|
340
|
+
const semanticCheck = candidateRunner
|
|
341
|
+
? controllerCheckExecutionIdentity(
|
|
342
|
+
executionRoot,
|
|
343
|
+
input.checkId,
|
|
344
|
+
timeoutMs,
|
|
345
|
+
checkSnapshot,
|
|
346
|
+
executionStateFingerprint,
|
|
347
|
+
)
|
|
348
|
+
: preliminarySemanticCheck;
|
|
251
349
|
const processCheckExecution = {
|
|
252
350
|
schemaVersion: 1 as const,
|
|
253
351
|
checkId: semanticCheck.checkId,
|
|
@@ -259,7 +357,7 @@ export async function runPersistedCheckViaProcessRuntime(
|
|
|
259
357
|
reuseScope: semanticCheck.reuseScope,
|
|
260
358
|
scopeKey: persistedCheckSemanticScopeKey(input, semanticCheck.reuseScope),
|
|
261
359
|
};
|
|
262
|
-
const cliTarget = resolveRuntimeCliTarget(input.controllerHome);
|
|
360
|
+
const cliTarget = candidateRunner?.cliTarget ?? resolveRuntimeCliTarget(input.controllerHome);
|
|
263
361
|
const checkResultReceiptPath = allocatePersistedCheckResultReceiptPath(
|
|
264
362
|
input.controllerHome,
|
|
265
363
|
input.repoId,
|
|
@@ -268,20 +366,29 @@ export async function runPersistedCheckViaProcessRuntime(
|
|
|
268
366
|
const checkArgs = [
|
|
269
367
|
'--repo',
|
|
270
368
|
executionRoot,
|
|
369
|
+
'--controller-home',
|
|
370
|
+
input.controllerHome,
|
|
371
|
+
'--repo-id',
|
|
372
|
+
input.repoId,
|
|
271
373
|
'--check-id',
|
|
272
374
|
input.checkId,
|
|
273
375
|
'--timeout-ms',
|
|
274
376
|
String(timeoutMs),
|
|
275
377
|
'--expected-check-fingerprint',
|
|
276
378
|
checkFingerprint,
|
|
379
|
+
'--check-snapshot',
|
|
380
|
+
Buffer.from(JSON.stringify(checkSnapshot)).toString('base64url'),
|
|
277
381
|
'--result-receipt',
|
|
278
382
|
checkResultReceiptPath,
|
|
279
383
|
...(verificationSnapshot ? [
|
|
280
|
-
'--isolated-controller-home', verificationSnapshot.isolatedControllerHome,
|
|
384
|
+
...(liveCertification ? ['--live-controller-home'] : ['--isolated-controller-home', verificationSnapshot.isolatedControllerHome]),
|
|
385
|
+
...(executionStateFingerprint ? ['--execution-state-fingerprint', executionStateFingerprint] : []),
|
|
281
386
|
'--cleanup-root', verificationSnapshot.root,
|
|
282
387
|
] : []),
|
|
283
388
|
];
|
|
284
|
-
const invocation = resolvePersistedCheckProcessInvocation(cliTarget, checkArgs
|
|
389
|
+
const invocation = resolvePersistedCheckProcessInvocation(cliTarget, checkArgs, candidateRunner
|
|
390
|
+
? { runtimeExecutable: candidateRunner.runtimeExecutable }
|
|
391
|
+
: {});
|
|
285
392
|
let handle;
|
|
286
393
|
try {
|
|
287
394
|
handle = await spawnManagedProcess({
|
|
@@ -6,8 +6,13 @@
|
|
|
6
6
|
import type { ResourceClaimSpec } from '../jobs/types';
|
|
7
7
|
import { readFileSync } from 'fs';
|
|
8
8
|
import { join } from 'path';
|
|
9
|
-
import type { ControllerCheckEffects } from '../../../cli/controller/check-runner';
|
|
10
|
-
import {
|
|
9
|
+
import type { ControllerCheckEffects, ControllerCheckExecutionAuthority } from '../../../cli/controller/check-runner';
|
|
10
|
+
import {
|
|
11
|
+
classifyRepositoryCommand,
|
|
12
|
+
fixedShellWrapperCommand,
|
|
13
|
+
shellSegments,
|
|
14
|
+
shellWordsPreservingQuotes,
|
|
15
|
+
} from '../../../cli/repositories/command-classifier';
|
|
11
16
|
import { normalizeRepositoryCommand } from '../../../cli/repositories/command-normalization';
|
|
12
17
|
import { isFocusedCheckCommand } from '../thin-harness/execution-router';
|
|
13
18
|
import type { ProcessResourceClaim } from './types';
|
|
@@ -235,6 +240,52 @@ function viteServiceClaims(
|
|
|
235
240
|
]);
|
|
236
241
|
}
|
|
237
242
|
|
|
243
|
+
const HOMEBREW_HOST_MUTATION_SUBCOMMANDS = new Set([
|
|
244
|
+
'install',
|
|
245
|
+
'uninstall',
|
|
246
|
+
'reinstall',
|
|
247
|
+
'upgrade',
|
|
248
|
+
'update',
|
|
249
|
+
'cleanup',
|
|
250
|
+
'autoremove',
|
|
251
|
+
'tap',
|
|
252
|
+
'untap',
|
|
253
|
+
]);
|
|
254
|
+
|
|
255
|
+
function homebrewHostMutationClaims(command: string | readonly string[]): ResourceClaimSpec[] | undefined {
|
|
256
|
+
const canonical = normalizeRepositoryCommand(command);
|
|
257
|
+
let words: string[];
|
|
258
|
+
|
|
259
|
+
if (canonical.kind === 'argv') {
|
|
260
|
+
const argv = [canonical.executable ?? '', ...(canonical.args ?? [])];
|
|
261
|
+
const wrapped = fixedShellWrapperCommand(argv);
|
|
262
|
+
if (wrapped) {
|
|
263
|
+
const segments = shellSegments(wrapped);
|
|
264
|
+
if (segments.length !== 1) return undefined;
|
|
265
|
+
words = shellWordsPreservingQuotes(segments[0]!);
|
|
266
|
+
} else {
|
|
267
|
+
words = argv;
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
const segments = shellSegments(canonical.shellCommand ?? '');
|
|
271
|
+
if (segments.length !== 1) return undefined;
|
|
272
|
+
words = shellWordsPreservingQuotes(segments[0]!);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const program = words[0]?.split(/[\\/]/).at(-1)?.toLowerCase();
|
|
276
|
+
if (program !== 'brew') return undefined;
|
|
277
|
+
const subcommand = words[1]?.toLowerCase();
|
|
278
|
+
if (!subcommand || !HOMEBREW_HOST_MUTATION_SUBCOMMANDS.has(subcommand)) return undefined;
|
|
279
|
+
|
|
280
|
+
// Keep local formula files, Brewfiles, and other path-shaped operands under
|
|
281
|
+
// conservative repository workspace coordination. Formula/cask identifiers
|
|
282
|
+
// are deliberately narrow so an ambiguous command still fails closed.
|
|
283
|
+
const positional = words.slice(2).filter((arg) => arg && !arg.startsWith('-'));
|
|
284
|
+
if (positional.some((arg) => !/^[A-Za-z0-9@+_.-]+$/.test(arg))) return undefined;
|
|
285
|
+
|
|
286
|
+
return [claimHostService('package-manager:homebrew', 'write')];
|
|
287
|
+
}
|
|
288
|
+
|
|
238
289
|
function hostOnlyCommandClaims(command: string | readonly string[], repoId: string, checkoutId?: string, repoRoot?: string): ResourceClaimSpec[] | undefined {
|
|
239
290
|
const localServer = localHttpServerClaims(command);
|
|
240
291
|
if (localServer) return localServer;
|
|
@@ -242,6 +293,8 @@ function hostOnlyCommandClaims(command: string | readonly string[], repoId: stri
|
|
|
242
293
|
if (loopbackCurl) return loopbackCurl;
|
|
243
294
|
const vite = viteServiceClaims(command, repoId, checkoutId, repoRoot);
|
|
244
295
|
if (vite) return vite;
|
|
296
|
+
const homebrew = homebrewHostMutationClaims(command);
|
|
297
|
+
if (homebrew) return homebrew;
|
|
245
298
|
const canonical = normalizeRepositoryCommand(command);
|
|
246
299
|
if (canonical.kind === 'shell') {
|
|
247
300
|
return browserAppleScriptHeredocClaims(canonical.shellCommand ?? '');
|
|
@@ -508,6 +561,7 @@ export function claimsForCheck(
|
|
|
508
561
|
repoId: string,
|
|
509
562
|
checkoutId?: string,
|
|
510
563
|
effects?: ControllerCheckEffects,
|
|
564
|
+
executionAuthority?: ControllerCheckExecutionAuthority,
|
|
511
565
|
): ResourceClaimSpec[] {
|
|
512
566
|
const heavy = /(?:^|:)(?:test(?::coverage)?|check:(?:ci|forge-runtime|public-export|release(?:-[a-z0-9-]+)?))$/.test(checkId)
|
|
513
567
|
|| /release|migration|integrate/i.test(checkId);
|
|
@@ -520,7 +574,10 @@ export function claimsForCheck(
|
|
|
520
574
|
: [claimWorkspaceWrite(checkoutId)];
|
|
521
575
|
// Heavy-check is an additional cross-check serialization fence, not a
|
|
522
576
|
// substitute for the resources the check actually reads or writes.
|
|
523
|
-
|
|
577
|
+
const liveAuthorityClaims = executionAuthority === 'live_controller_home' ? [claimRelease(repoId)] : [];
|
|
578
|
+
return heavy
|
|
579
|
+
? normalizeClaims([claimHeavyCheck(repoId), ...liveAuthorityClaims, ...baseClaims])
|
|
580
|
+
: normalizeClaims([...liveAuthorityClaims, ...baseClaims]);
|
|
524
581
|
}
|
|
525
582
|
|
|
526
583
|
export function scopeResourceClaims(
|