@moretea-labs/forge 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +73 -7
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/README.en.md +24 -3
- package/README.md +10 -6
- package/README.zh-CN.md +5 -3
- package/THIRD_PARTY_NOTICES.md +1 -2
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
- package/adapters/chatgpt/controller-binding-store.ts +101 -22
- package/adapters/chatgpt/controller-round-host.ts +15 -25
- package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
- package/adapters/chatgpt/provider-delivery.ts +229 -2
- package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
- package/adapters/computer/chatgpt-extension-target.ts +708 -0
- package/adapters/computer/chrome-extension/background.js +541 -0
- package/adapters/computer/chrome-extension/content.js +402 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +32 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/desktop-operator-provider.ts +18 -6
- package/adapters/computer/interaction-target-authority.ts +178 -24
- package/adapters/mcp/access-mode.ts +18 -39
- package/adapters/mcp/auth.ts +2 -7
- package/adapters/mcp/instructions.ts +6 -5
- package/adapters/mcp/multi-repository.ts +10 -47
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
- package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
- package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
- package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
- package/adapters/mcp/runtime-gateway/router.ts +19 -507
- package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
- package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
- package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
- package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
- package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
- package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
- package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
- package/adapters/mcp/server.ts +91 -26
- package/adapters/mcp/setup.ts +5 -13
- package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
- package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
- package/adapters/mcp/toolset-names.ts +11 -37
- package/adapters/mcp/toolset.ts +19 -92
- package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
- package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
- package/adapters/mcp/transports/http-observation.ts +377 -0
- package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
- package/adapters/mcp/transports/http.ts +200 -683
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +6 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
- package/adapters/mcp/types.ts +0 -6
- package/assets/hooks/lib/session-state.sh +0 -38
- package/assets/hooks/post-bash.sh +1 -1
- package/assets/hooks/post-tool-observer.sh +0 -5
- package/assets/hooks/prompt-guard.sh +0 -55
- package/assets/partials/04-project-structure.partial.md +1 -1
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -1
- package/assets/partials-agents/08-deep-docs.partial.md +1 -1
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +26 -1
- package/assets/reference-configs/external-tooling.md +0 -76
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/reference-configs/release-deploy.md +1 -1
- package/assets/templates/helpers/architecture-queue.sh +1 -1
- package/assets/templates/helpers/check-agent-tooling.sh +1 -327
- package/assets/templates/helpers/check-task-workflow.sh +1 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
- package/assets/templates/helpers/migrate-project-template.sh +2 -2
- package/assets/workflow-contract.v1.json +0 -2
- package/docs/README.md +5 -2
- package/docs/architecture/CURRENT.md +205 -51
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
- package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
- package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
- package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
- package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
- package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
- package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
- package/docs/architecture/domains/public-surface.md +3 -5
- package/docs/architecture/domains/verification.md +6 -5
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
- package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
- package/docs/forge-plugin-management.md +16 -4
- package/docs/operations/controller-browser-plugin.md +23 -0
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +6 -7
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/github-repository.md +4 -4
- package/docs/operations/github-semantic-release-projection.md +20 -0
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +13 -52
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/runtime-performance-diagnostics.md +8 -0
- package/docs/operations/standalone-disaster-recovery.md +15 -7
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/03-first-repository-task.md +2 -0
- package/docs/wiki/Computer-and-Plugins.md +78 -0
- package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
- package/docs/wiki/Home.md +16 -2
- package/docs/wiki/Implementation.md +25 -13
- package/docs/wiki/Installation.md +28 -32
- package/docs/wiki/Integrations.md +4 -0
- package/docs/wiki/Quick-Start.md +35 -22
- package/docs/wiki/Releases-and-Upgrades.md +15 -25
- package/docs/wiki/_Sidebar.md +5 -1
- package/package.json +25 -25
- package/packages/kernel/cognition/api/index.ts +6 -0
- package/packages/kernel/cognition/application/activation-service.ts +451 -0
- package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
- package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
- package/packages/kernel/cognition/application/memory-service.ts +64 -0
- package/packages/kernel/cognition/domain/learning.ts +106 -0
- package/packages/kernel/cognition/domain/memory.ts +254 -0
- package/packages/kernel/controller/api/index.ts +1 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +12 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
- package/packages/kernel/controller/domain/controller-round.ts +4 -1
- package/packages/kernel/controller/domain/execution-quality.ts +3 -1
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
- package/packages/kernel/controller/ports/controller-host.ts +2 -0
- package/packages/kernel/identity/api/index.ts +10 -0
- package/packages/kernel/identity/domain/activity-projection.ts +43 -0
- package/packages/kernel/identity/domain/capability-broker.ts +60 -0
- package/packages/kernel/identity/domain/grant.ts +72 -0
- package/packages/kernel/identity/domain/owned-resource.ts +116 -0
- package/packages/kernel/identity/domain/user-request.ts +93 -0
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
- package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
- package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
- package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/scheduler/api/index.ts +0 -2
- package/packages/kernel/scheduler/application/eligibility.ts +4 -1
- package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
- package/packages/kernel/scheduler/application/settlement.ts +0 -15
- package/packages/kernel/scheduler/domain/schedule.ts +87 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +18 -42
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-design.ts +10 -5
- package/packages/kernel/work/domain/engineering-profile.ts +8 -12
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
- package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
- package/packages/kernel/work/domain/implementation-review.ts +14 -331
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +34 -65
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
- package/packages/plugin-runtime/browser/session-authority.ts +2 -1
- package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
- package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
- package/packages/plugin-runtime/computer/index.ts +2 -0
- package/packages/plugin-runtime/computer/target-authority.ts +26 -1
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
- package/packages/protocols/computer/contract.ts +27 -1
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/assemble-template.ts +11 -72
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +94 -201
- package/scripts/check-package-identity.mjs +0 -5
- package/scripts/check-runtime-architecture.mjs +921 -239
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/init-project.sh +0 -46
- package/scripts/install-ios-hid-toolchain.sh +60 -0
- package/scripts/install-standalone-recovery.ts +1 -1
- package/scripts/lib/project-init-lib.sh +6 -3
- package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
- package/scripts/open-source-audit-allowlist.txt +1 -3
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-ios-physical-device.ts +38 -10
- package/scripts/smoke-mcp-http-runtime.ts +12 -8
- package/scripts/smoke-mcp-tool-surface.ts +27 -41
- package/scripts/smoke-runtime-recovery.ts +12 -43
- package/scripts/smoke-schedule-engine.ts +23 -15
- package/scripts/smoke-unattended-transport-recovery.ts +223 -0
- package/scripts/smoke-user-request-continuation-restart.ts +232 -0
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
- package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
- package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
- package/scripts/smoke-workflow-supervisor.ts +103 -0
- package/scripts/sync-generated-authority.mjs +0 -1
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +12 -35
- package/src/cli/agent-jobs/integration.ts +20 -51
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- package/src/cli/chatgpt-browser/file-policy.ts +2 -2
- package/src/cli/commands/brain-assistant.ts +27 -13
- package/src/cli/commands/brain.ts +13 -15
- package/src/cli/commands/chatgpt.ts +1 -163
- package/src/cli/commands/doctor.ts +1 -143
- package/src/cli/commands/global-runtime.ts +3 -196
- package/src/cli/commands/init-hook.ts +6 -23
- package/src/cli/commands/init.ts +3 -252
- package/src/cli/commands/mcp.ts +0 -5
- package/src/cli/commands/prompt-guard-decision.ts +0 -2
- package/src/cli/commands/recovery.ts +137 -135
- package/src/cli/commands/repository.ts +17 -1
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-execution.ts +41 -0
- package/src/cli/commands/setup-profile.ts +8 -0
- package/src/cli/controller/check-runner.ts +13 -2
- package/src/cli/controller/completion-backlog.ts +3 -3
- package/src/cli/controller/completion-orchestrator.ts +5 -44
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/composite-operations.ts +1 -1
- package/src/cli/controller/context/instruction-context.ts +1 -1
- package/src/cli/controller/context/known-paths.ts +2 -2
- package/src/cli/controller/context/query-planning.ts +11 -4
- package/src/cli/controller/context/rule-resolution.ts +2 -2
- package/src/cli/controller/context/source-materializer.ts +83 -102
- package/src/cli/controller/context/structural-provider.ts +84 -0
- package/src/cli/controller/context/structural.ts +6 -6
- package/src/cli/controller/context/types.ts +8 -9
- package/src/cli/controller/context-pack.ts +107 -84
- package/src/cli/controller/execution-completion.ts +4 -7
- package/src/cli/controller/execution-policy.ts +36 -153
- package/src/cli/controller/governance.ts +2 -3
- package/src/cli/controller/issue-store.ts +4 -99
- package/src/cli/controller/launch-agents.ts +59 -18
- package/src/cli/controller/operational-plan.ts +25 -52
- package/src/cli/controller/runtime-config.ts +5 -1
- package/src/cli/controller/stuck-state-migration.ts +2 -3
- package/src/cli/controller/systemd-user.ts +42 -10
- package/src/cli/editing/edit-session.ts +18 -12
- package/src/cli/github/github.ts +4 -4
- package/src/cli/github/semantic-projection.ts +174 -0
- package/src/cli/hook/prompt-intents.ts +0 -9
- package/src/cli/index.ts +1 -43
- package/src/cli/local-bridge/connector-freshness.ts +1 -12
- package/src/cli/local-bridge/console-automations.ts +19 -14
- package/src/cli/local-bridge/console-view-models.ts +4 -13
- package/src/cli/local-bridge/facade-api.ts +64 -193
- package/src/cli/local-bridge/server.ts +24 -147
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/repositories/command-classifier.ts +0 -9
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +37 -18
- package/src/cli/repositories/controller-home.ts +48 -0
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/locks.ts +20 -0
- package/src/cli/repositories/registry.ts +79 -12
- package/src/cli/repositories/safe-patch.ts +2 -12
- package/src/cli/repositories/structured-git.ts +101 -5
- package/src/cli/repository/inspector.ts +185 -343
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/effects/process-runner.ts +17 -1
- package/src/runtime/context/assistant-context.ts +20 -7
- package/src/runtime/context/assistant-work-context.ts +89 -27
- package/src/runtime/context/automatic-learning.ts +565 -0
- package/src/runtime/context/cognitive-attention.ts +173 -0
- package/src/runtime/context/cognitive-skill-canary.ts +158 -0
- package/src/runtime/context/context-closure.ts +46 -9
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +1 -9
- package/src/runtime/context/direct-controller-learning.ts +298 -0
- package/src/runtime/context/generic-lsp-provider.ts +1 -1
- package/src/runtime/context/semantic-navigation-contract.ts +16 -0
- package/src/runtime/context/semantic-navigation.ts +7 -35
- package/src/runtime/context/typescript-navigation-process.ts +145 -0
- package/src/runtime/context/typescript-navigation.ts +89 -3
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +6 -8
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
- package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
- package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
- package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
- package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
- package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
- package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
- package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
- package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
- package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
- package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
- package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
- package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
- package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
- package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
- package/src/runtime/control-plane/facade/index.ts +0 -1
- package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
- package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
- package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
- package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
- package/src/runtime/control-plane/facade/types.ts +49 -108
- package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
- package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- package/src/runtime/control-plane/governance/access-policy.ts +19 -2
- package/src/runtime/control-plane/governance/authorization.ts +20 -3
- package/src/runtime/control-plane/governance/external-effects.ts +1 -1
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
- package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
- package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
- package/src/runtime/control-plane/release-retention.ts +135 -47
- package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
- package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
- package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
- package/src/runtime/diagnostics/incident-repair.ts +313 -146
- package/src/runtime/diagnostics/mcp-timing.ts +114 -0
- package/src/runtime/evidence/artifact-store.ts +158 -40
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/evidence/sensitive-output.ts +22 -2
- package/src/runtime/execution/jobs/child-reference.ts +11 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
- package/src/runtime/execution/jobs/store.ts +3 -4
- package/src/runtime/execution/managed-workspace.ts +57 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
- package/src/runtime/execution/process-runtime/check-result.ts +105 -1
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
- package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
- package/src/runtime/execution/process-runtime/gc.ts +15 -2
- package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
- package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
- package/src/runtime/execution/process-runtime/index.ts +3 -0
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
- package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
- package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
- package/src/runtime/execution/process-runtime/runtime.ts +55 -18
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
- package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
- package/src/runtime/execution/workers/executor.ts +3 -8
- package/src/runtime/maintenance/cleanup.ts +41 -5
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +8 -0
- package/src/runtime/plugins/action-application.ts +97 -29
- package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
- package/src/runtime/plugins/browser-adapter.ts +1124 -333
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
- package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +18 -0
- package/src/runtime/plugins/browser-runtime.ts +40 -36
- package/src/runtime/plugins/browser-session-authority.ts +2 -2
- package/src/runtime/plugins/browser-session-store.ts +46 -76
- package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
- package/src/runtime/plugins/computer-registration.ts +298 -20
- package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
- package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
- package/src/runtime/plugins/external-adapter.ts +42 -6
- package/src/runtime/plugins/external-registration.ts +21 -1
- package/src/runtime/plugins/github-adapter.ts +30 -3
- package/src/runtime/plugins/gmail-adapter.ts +189 -3
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +24 -12
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
- package/src/runtime/plugins/ios-adapter.ts +46 -41
- package/src/runtime/plugins/ios-agent-device.ts +54 -4
- package/src/runtime/plugins/ios-device-ownership.ts +103 -0
- package/src/runtime/plugins/ios-physical-device.ts +497 -79
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -100
- package/src/runtime/plugins/managed-process-adapter.ts +12 -5
- package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
- package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +682 -435
- package/src/runtime/plugins/types.ts +24 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/git-status-sampler.ts +2 -19
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +4 -4
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/probe.ts +2 -2
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +312 -0
- package/src/runtime/release/release-session.ts +716 -0
- package/src/runtime/release/release-state-migration.ts +25 -0
- package/src/runtime/resources/leases/store.ts +56 -25
- package/src/runtime/root/computer-composition.ts +191 -6
- package/src/runtime/root/controller-progression-composition.ts +254 -0
- package/src/runtime/root/controller-round-composition.ts +20 -1
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +111 -18
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +227 -29
- package/src/runtime/root/package-runtime-release.ts +117 -30
- package/src/runtime/root/package-runtime-service.ts +24 -24
- package/src/runtime/root/release-execution-canary.ts +57 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -40
- package/src/runtime/root/release-materialize.ts +372 -106
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +160 -29
- package/src/runtime/root/scheduled-controller-composition.ts +29 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +126 -44
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -9
- package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/ios-development.ts +22 -8
- package/src/runtime/safe-tooling/job-summary.ts +1 -1
- package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
- package/src/runtime/shared/atomic-text-file.ts +21 -0
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/json-files.ts +8 -3
- package/src/runtime/shared/process-environment.ts +20 -9
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
- package/src/runtime/standalone-recovery/core.ts +3792 -417
- package/src/runtime/standalone-recovery/entry.ts +507 -45
- package/src/runtime/standalone-recovery/installer.ts +262 -148
- package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
- package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
- package/src/runtime/standalone-recovery/performance.ts +54 -16
- package/src/runtime/standalone-recovery/release.ts +53 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
- package/src/runtime/workflow/schedules/engine.ts +166 -178
- package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
- package/src/runtime/workflows/runtime.ts +15 -19
- package/src/testing/test-governance.ts +5 -1
- package/supervisor/chatgpt-conversation.ts +23 -0
- package/supervisor/client.ts +218 -0
- package/supervisor/control-plane.ts +963 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +147 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +1151 -0
- package/supervisor/native-messaging/host.ts +58 -0
- package/supervisor/native-messaging/manifest.ts +26 -0
- package/supervisor/native-messaging/protocol.ts +27 -0
- package/supervisor/paths.ts +18 -0
- package/supervisor/protocol.ts +250 -0
- package/supervisor/server.ts +412 -0
- package/supervisor/store.ts +1870 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +261 -0
- package/SKILL.md +0 -427
- package/adapters/chatgpt/controller-host.ts +0 -119
- package/adapters/mcp/controller-round-compatibility.ts +0 -184
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
- package/adapters/mcp/toolset-selection.ts +0 -41
- package/agents/openai.yaml +0 -4
- package/assets/skill-hooks.json +0 -41
- package/assets/skill-version.json +0 -189
- package/assets/skills/claude-review/SKILL.md +0 -231
- package/assets/skills/codex-review/SKILL.md +0 -103
- package/assets/templates/helpers/check-skill-version.ts +0 -193
- package/packages/kernel/progression/api/index.ts +0 -2
- package/packages/kernel/progression/application/projector.ts +0 -211
- package/packages/kernel/progression/domain/types.ts +0 -116
- package/packages/kernel/progression/index.ts +0 -1
- package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
- package/packages/kernel/scheduler/domain/continuation.ts +0 -38
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
- package/packages/kernel/work/domain/admission-policy.ts +0 -34
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-computer-hotpath.ts +0 -255
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -191
- package/scripts/benchmark-ios-agent-device.ts +0 -511
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -169
- package/scripts/benchmark-operational-memory-activation.ts +0 -235
- package/scripts/benchmark-operational-shadow.ts +0 -28
- package/scripts/benchmark-quality-harness.ts +0 -146
- package/scripts/benchmark-route-session-concurrency.ts +0 -915
- package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
- package/scripts/benchmark-thin-harness.ts +0 -251
- package/scripts/benchmark-typescript-navigation.ts +0 -186
- package/scripts/benchmark-work-efficiency.ts +0 -334
- package/scripts/build-controller-ui.ts +0 -28
- package/scripts/check-npm-release.sh +0 -32
- package/scripts/check-public-release-surface.sh +0 -19
- package/scripts/check-release-published.sh +0 -57
- package/scripts/check-release-readiness.sh +0 -37
- package/scripts/check-release-version.mjs +0 -74
- package/scripts/check-skill-version.ts +0 -5
- package/scripts/check-tarball-install-smoke.sh +0 -150
- package/scripts/ensure-codegraph.sh +0 -16
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/run-skill-hook.ts +0 -244
- package/scripts/stage-runtime-release.ts +0 -44
- package/scripts/sync-codex-installed-copies.sh +0 -182
- package/src/cli/commands/tools.ts +0 -167
- package/src/cli/controller/progress.ts +0 -656
- package/src/cli/controller/work-mode.ts +0 -181
- package/src/cli/local-bridge/console-assets.ts +0 -17
- package/src/cli/local-bridge/dashboard.ts +0 -17
- package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
- package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
- package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
- package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
- package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/styles.css +0 -28
- package/src/cli/local-bridge/frontend/src/types.ts +0 -15
- package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
- package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
- package/src/cli/local-bridge/ui-dist/app.css +0 -1
- package/src/cli/local-bridge/ui-dist/app.js +0 -11228
- package/src/cli/mcp/access-mode.ts +0 -2
- package/src/cli/mcp/access-tools.ts +0 -2
- package/src/cli/mcp/audit.ts +0 -2
- package/src/cli/mcp/auth.ts +0 -2
- package/src/cli/mcp/instructions.ts +0 -2
- package/src/cli/mcp/legacy-context.ts +0 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -2
- package/src/cli/mcp/multi-repository.ts +0 -2
- package/src/cli/mcp/oauth.ts +0 -2
- package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
- package/src/cli/mcp/paths.ts +0 -2
- package/src/cli/mcp/policy.ts +0 -2
- package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
- package/src/cli/mcp/proxy-env.ts +0 -2
- package/src/cli/mcp/readiness-projection.ts +0 -2
- package/src/cli/mcp/redaction.ts +0 -2
- package/src/cli/mcp/repo.ts +0 -2
- package/src/cli/mcp/repository-tools.ts +0 -2
- package/src/cli/mcp/server.ts +0 -2
- package/src/cli/mcp/setup.ts +0 -2
- package/src/cli/mcp/tool-capability-cache.ts +0 -2
- package/src/cli/mcp/tool-contract.ts +0 -2
- package/src/cli/mcp/tools.ts +0 -2
- package/src/cli/mcp/toolset-names.ts +0 -2
- package/src/cli/mcp/toolset-selection.ts +0 -2
- package/src/cli/mcp/toolset.ts +0 -2
- package/src/cli/mcp/transports/http.ts +0 -2
- package/src/cli/mcp/transports/session-registry.ts +0 -2
- package/src/cli/mcp/transports/stdio.ts +0 -2
- package/src/cli/mcp/types.ts +0 -2
- package/src/cli/mcp/umbrella-tools.ts +0 -2
- package/src/cli/tools/codegraph.ts +0 -695
- package/src/core/adoption/helper-wrapper-plan.ts +0 -159
- package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
- package/src/runtime/context/codegraph-read-provider.ts +0 -611
- package/src/runtime/context/codegraph-sidecar.cjs +0 -248
- package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
- package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
- package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
- package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
- package/src/runtime/control-plane/routing/index.ts +0 -1
- package/src/runtime/control-plane/routing/route-policy.ts +0 -401
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
- package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
- package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
- package/src/runtime/gateway/mcp/process-tools.ts +0 -2
- package/src/runtime/gateway/mcp/router.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
- package/src/runtime/plugins/browser-provider-registry.ts +0 -2
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createHash } from 'crypto';
|
|
2
|
-
import { getWorkContract,
|
|
3
|
-
import { getRetainedControllerSession, type ControllerRoundRelayRecord, type ControllerType } from '../../../../packages/kernel/controller/api/index';
|
|
2
|
+
import { getWorkContract, semanticWorkState, type WorkContract } from '../../../../packages/kernel/work/api/index';
|
|
3
|
+
import { getControllerRoundRelay, getRetainedControllerSession, rearmControllerRoundAfterProviderUserAction, type ControllerRoundRelayRecord, type ControllerType } from '../../../../packages/kernel/controller/api/index';
|
|
4
4
|
import { ensureScheduledControllerBinding } from '../../root/scheduled-controller-composition';
|
|
5
5
|
import { resolveHandoffItem } from '../../control-plane/facade/handoff-inbox-store';
|
|
6
6
|
import type { HandoffItem } from '../../control-plane/facade/types';
|
|
7
7
|
import { readWorkHandle, type WorkHandleState } from '../../control-plane/execution/work-handle-store';
|
|
8
|
+
import { touchSchedulerWakeSignal } from '../../control-plane/global-scheduler/wake-signal';
|
|
8
9
|
|
|
9
10
|
import { assertAutomatedOperationAllowed } from '../../control-plane/governance/external-effects';
|
|
10
11
|
import { evaluateSchedule } from './engine';
|
|
@@ -27,10 +28,19 @@ import type {
|
|
|
27
28
|
export type ContinuationControllerType = Exclude<ControllerType, 'human'>;
|
|
28
29
|
export type WorkScheduleMode = 'continuation' | 'browser_watch' | 'browser_keepalive';
|
|
29
30
|
|
|
31
|
+
const CONTROLLER_PROGRESSION_OPERATION = 'controller_progression';
|
|
32
|
+
const LEGACY_EXTERNAL_CONTROLLER_WAKE_OPERATION = 'external_controller_wake';
|
|
33
|
+
|
|
34
|
+
function isWorkContinuationOperation(operation: string): boolean {
|
|
35
|
+
return operation === CONTROLLER_PROGRESSION_OPERATION || operation === LEGACY_EXTERNAL_CONTROLLER_WAKE_OPERATION;
|
|
36
|
+
}
|
|
37
|
+
|
|
30
38
|
export interface WorkContinuationScheduleInput {
|
|
31
39
|
workId?: string;
|
|
32
40
|
scheduleMode?: WorkScheduleMode;
|
|
33
41
|
controllerType?: ContinuationControllerType;
|
|
42
|
+
/** Exact interactive Browser grants to carry into the scheduled Controller binding. */
|
|
43
|
+
authorizationGrantRefs?: string[];
|
|
34
44
|
executable?: string;
|
|
35
45
|
launchArgs?: string[];
|
|
36
46
|
launchReservationMs?: number;
|
|
@@ -85,12 +95,12 @@ function requiredWork(controllerHome: string, repoId: string, workId: string): W
|
|
|
85
95
|
|
|
86
96
|
function activeWork(controllerHome: string, repoId: string, workId: string): WorkContract {
|
|
87
97
|
const work = requiredWork(controllerHome, repoId, workId);
|
|
88
|
-
if (
|
|
98
|
+
if (semanticWorkState(work) !== 'open') throw new Error(`WORK_ALREADY_TERMINAL: ${work.workId}:${semanticWorkState(work)}`);
|
|
89
99
|
return work;
|
|
90
100
|
}
|
|
91
101
|
|
|
92
102
|
function continuationSchedule(schedule: RepositorySchedule): RepositorySchedule {
|
|
93
|
-
if (!
|
|
103
|
+
if (!isWorkContinuationOperation(schedule.action.operation) && schedule.action.operation !== 'browser_probe') {
|
|
94
104
|
throw new Error(`SCHEDULE_NOT_WORK_CONTINUATION: ${schedule.scheduleId}`);
|
|
95
105
|
}
|
|
96
106
|
return schedule;
|
|
@@ -116,6 +126,9 @@ function providerSeedArguments(input: WorkContinuationScheduleInput, controllerT
|
|
|
116
126
|
return {
|
|
117
127
|
...(workId ? { work_id: workId } : {}),
|
|
118
128
|
controller_type: controllerType,
|
|
129
|
+
...(input.authorizationGrantRefs?.length
|
|
130
|
+
? { authorization_grant_refs: [...new Set(input.authorizationGrantRefs.map(String).map(value => value.trim()).filter(Boolean))] }
|
|
131
|
+
: {}),
|
|
119
132
|
...(input.executable?.trim() ? { executable: input.executable.trim() } : {}),
|
|
120
133
|
...(input.launchArgs ? { launch_args: input.launchArgs.map(String) } : {}),
|
|
121
134
|
...(input.launchReservationMs !== undefined ? { launch_reservation_ms: input.launchReservationMs } : {}),
|
|
@@ -188,7 +201,7 @@ export function createWorkContinuationSchedule(
|
|
|
188
201
|
}
|
|
189
202
|
if (!requestedWorkId && scheduleMode === 'browser_keepalive' && controllerType !== 'chatgpt') throw new Error('STANDALONE_BROWSER_KEEPALIVE_CHATGPT_REQUIRED');
|
|
190
203
|
const trigger = normalizedTrigger(input);
|
|
191
|
-
const operation = scheduleMode === 'continuation' ?
|
|
204
|
+
const operation = scheduleMode === 'continuation' ? CONTROLLER_PROGRESSION_OPERATION : 'browser_probe';
|
|
192
205
|
const name = input.scheduleName?.trim()
|
|
193
206
|
|| (scheduleMode === 'browser_watch' ? `Watch external state for Work ${work!.workId}`
|
|
194
207
|
: scheduleMode === 'browser_keepalive'
|
|
@@ -234,7 +247,7 @@ export function createWorkContinuationSchedule(
|
|
|
234
247
|
// Work may legitimately observe several independent external targets.
|
|
235
248
|
if (scheduleMode === 'continuation') {
|
|
236
249
|
const existing = listSchedules(controllerHome, repoId)
|
|
237
|
-
.filter((candidate) => candidate.action.operation
|
|
250
|
+
.filter((candidate) => isWorkContinuationOperation(candidate.action.operation))
|
|
238
251
|
.filter((candidate) => candidate.action.arguments?.work_id === work!.workId);
|
|
239
252
|
const authoritative = [...existing].reverse().find((candidate) => candidate.enabled) ?? existing.at(-1);
|
|
240
253
|
if (authoritative) {
|
|
@@ -296,7 +309,7 @@ export function listWorkContinuationSchedules(
|
|
|
296
309
|
options: WorkContinuationScheduleListOptions = {},
|
|
297
310
|
): { schedules: RepositorySchedule[]; occurrences?: ScheduleOccurrence[] } {
|
|
298
311
|
const schedules = listSchedules(controllerHome, repoId)
|
|
299
|
-
.filter((entry) =>
|
|
312
|
+
.filter((entry) => isWorkContinuationOperation(entry.action.operation) || entry.action.operation === 'browser_probe')
|
|
300
313
|
.filter((entry) => !options.workId || entry.action.arguments?.work_id === options.workId);
|
|
301
314
|
if (!options.includeOccurrences) return { schedules };
|
|
302
315
|
const scheduleIds = new Set(schedules.map((entry) => entry.scheduleId));
|
|
@@ -336,6 +349,44 @@ export function resumeWorkContinuationSchedule(controllerHome: string, repoId: s
|
|
|
336
349
|
const schedule = continuationSchedule(getSchedule(controllerHome, repoId, scheduleId));
|
|
337
350
|
const workId = typeof schedule.action.arguments?.work_id === 'string' ? schedule.action.arguments.work_id : '';
|
|
338
351
|
activeWork(controllerHome, repoId, workId);
|
|
352
|
+
if (schedule.action.operation === LEGACY_EXTERNAL_CONTROLLER_WAKE_OPERATION) {
|
|
353
|
+
const trigger = schedule.trigger;
|
|
354
|
+
const migrated = createWorkContinuationSchedule(controllerHome, repoId, {
|
|
355
|
+
workId,
|
|
356
|
+
scheduleName: schedule.name,
|
|
357
|
+
controllerType: typeof schedule.action.arguments?.controller_type === 'string'
|
|
358
|
+
? schedule.action.arguments.controller_type as ContinuationControllerType
|
|
359
|
+
: undefined,
|
|
360
|
+
continuationPrompt: typeof schedule.action.arguments?.continuation_hint === 'string'
|
|
361
|
+
? schedule.action.arguments.continuation_hint
|
|
362
|
+
: typeof schedule.action.arguments?.continuation_prompt === 'string'
|
|
363
|
+
? schedule.action.arguments.continuation_prompt
|
|
364
|
+
: undefined,
|
|
365
|
+
triggerType: trigger.type,
|
|
366
|
+
everyMinutes: trigger.everyMinutes,
|
|
367
|
+
cronExpression: trigger.cronExpression,
|
|
368
|
+
timezone: trigger.timezone,
|
|
369
|
+
catchUpMinutes: trigger.catchUpMinutes,
|
|
370
|
+
calendarAt: trigger.calendarAt,
|
|
371
|
+
condition: trigger.condition,
|
|
372
|
+
eventName: trigger.eventName,
|
|
373
|
+
dependencyJobIds: trigger.dependencyJobIds,
|
|
374
|
+
maxFailures: schedule.policy.maxFailures,
|
|
375
|
+
cooldownMinutes: schedule.policy.cooldownMinutes,
|
|
376
|
+
dailyBudgetMinutes: schedule.policy.dailyBudgetMinutes,
|
|
377
|
+
shadowMode: schedule.policy.shadowMode,
|
|
378
|
+
backoffBaseMinutes: schedule.policy.backoffBaseMinutes,
|
|
379
|
+
backoffMaxMinutes: schedule.policy.backoffMaxMinutes,
|
|
380
|
+
stopConditions: schedule.stopConditions,
|
|
381
|
+
}).schedule;
|
|
382
|
+
return saveSchedule(controllerHome, {
|
|
383
|
+
...migrated,
|
|
384
|
+
enabled: true,
|
|
385
|
+
pausedReason: undefined,
|
|
386
|
+
consecutiveFailures: 0,
|
|
387
|
+
nextEligibleAt: undefined,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
339
390
|
return saveSchedule(controllerHome, {
|
|
340
391
|
...schedule,
|
|
341
392
|
enabled: true,
|
|
@@ -372,7 +423,7 @@ export async function triggerWorkContinuationRepositoryEvent(
|
|
|
372
423
|
): Promise<Array<{ scheduleId: string; occurrenceId?: string; status?: string }>> {
|
|
373
424
|
const schedules = listWorkContinuationSchedules(controllerHome, repoId, { workId: input.workId }).schedules
|
|
374
425
|
.filter((schedule) => schedule.enabled)
|
|
375
|
-
.filter((schedule) => schedule.action.operation
|
|
426
|
+
.filter((schedule) => isWorkContinuationOperation(schedule.action.operation))
|
|
376
427
|
.filter((schedule) => schedule.trigger.type === 'repository-event' && schedule.trigger.eventName === eventName);
|
|
377
428
|
const triggered: Array<{ scheduleId: string; occurrenceId?: string; status?: string }> = [];
|
|
378
429
|
for (const schedule of schedules) {
|
|
@@ -398,7 +449,7 @@ export function eventDrivenContinuationSchedule(
|
|
|
398
449
|
): RepositorySchedule {
|
|
399
450
|
const workSchedules = listWorkContinuationSchedules(controllerHome, repoId, { workId: input.workId }).schedules;
|
|
400
451
|
const existing = workSchedules
|
|
401
|
-
.filter((schedule) => schedule.action.operation
|
|
452
|
+
.filter((schedule) => isWorkContinuationOperation(schedule.action.operation))
|
|
402
453
|
.reverse()
|
|
403
454
|
.find((schedule) => schedule.enabled)
|
|
404
455
|
?? workSchedules.at(-1);
|
|
@@ -456,14 +507,47 @@ export async function resolveHandoffAndTriggerContinuation(
|
|
|
456
507
|
input: { decision: string; resolver: string },
|
|
457
508
|
): Promise<{ item: HandoffItem; continuationOccurrences: Array<{ scheduleId: string; occurrenceId?: string; status?: string }> }> {
|
|
458
509
|
const item = resolveHandoffItem({ controllerHome, repoId }, handoffId, input);
|
|
510
|
+
const continuationOccurrences = await triggerResolvedHandoffContinuation(controllerHome, repoId, item);
|
|
511
|
+
return { item, continuationOccurrences };
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* The Inbox application resolves persistence before it calls its continuation
|
|
516
|
+
* port. Keep the post-resolution transition here so every transport re-arms
|
|
517
|
+
* the exact ControllerRound before it can wake its Work schedule.
|
|
518
|
+
*/
|
|
519
|
+
export async function triggerResolvedHandoffContinuation(
|
|
520
|
+
controllerHome: string,
|
|
521
|
+
repoId: string,
|
|
522
|
+
item: HandoffItem,
|
|
523
|
+
): Promise<Array<{ scheduleId: string; occurrenceId?: string; status?: string }>> {
|
|
524
|
+
const relay = item.workId ? getControllerRoundRelay({ controllerHome, repoId }, item.workId) : undefined;
|
|
525
|
+
const rearmedRelay = item.workId && relay?.status === 'waiting_for_user' && relay.blockedReason === 'provider_user_action_required' && relay.handoffId === item.id
|
|
526
|
+
? rearmControllerRoundAfterProviderUserAction({ controllerHome, repoId }, { workId: item.workId, handoffId: item.id })
|
|
527
|
+
: undefined;
|
|
528
|
+
if (rearmedRelay) {
|
|
529
|
+
// The ControllerRound itself is the continuation authority. A repository-event
|
|
530
|
+
// Schedule is optional policy, not the wake mechanism for an already rearmed
|
|
531
|
+
// provider dispatch. Wake the canonical Scheduler immediately so a resolved
|
|
532
|
+
// provider blocker resumes the same occurrence even when no Schedule exists.
|
|
533
|
+
touchSchedulerWakeSignal(controllerHome, `provider-user-action-resolved:${item.workId}`);
|
|
534
|
+
}
|
|
459
535
|
const continuationOccurrences = item.workId
|
|
460
536
|
? await triggerWorkContinuationRepositoryEvent(
|
|
461
537
|
controllerHome,
|
|
462
538
|
repoId,
|
|
463
539
|
handoffResolvedContinuationEventName(item.id),
|
|
464
540
|
`handoff:${item.id}:${item.updatedAt}`,
|
|
465
|
-
{
|
|
541
|
+
{
|
|
542
|
+
workId: item.workId,
|
|
543
|
+
data: {
|
|
544
|
+
handoffId: item.id,
|
|
545
|
+
status: item.status,
|
|
546
|
+
decision: item.decision,
|
|
547
|
+
...(rearmedRelay?.occurrenceId ? { controllerRoundOccurrenceId: rearmedRelay.occurrenceId } : {}),
|
|
548
|
+
},
|
|
549
|
+
},
|
|
466
550
|
)
|
|
467
551
|
: [];
|
|
468
|
-
return
|
|
552
|
+
return continuationOccurrences;
|
|
469
553
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { withControllerLock, withControllerLockAsync } from '../../cli/repositories/locks';
|
|
2
|
-
import { getWorkContract,
|
|
3
|
-
import { getControllerSession, getControllerRoundRelay, controllerSessionAuthorityMatches } from '../../../packages/kernel/controller/api/index';
|
|
2
|
+
import { getWorkContract, semanticWorkState } from '../../../packages/kernel/work/api/index';
|
|
4
3
|
import { readRequirement } from '../control-plane/persistence/requirement-store';
|
|
5
4
|
import { createHash } from 'crypto';
|
|
6
5
|
import type { RepositoryRecord } from '../../cli/repositories/types';
|
|
@@ -56,7 +55,8 @@ export interface ExecuteRegisteredWorkflowInput {
|
|
|
56
55
|
repository: RepositoryRecord;
|
|
57
56
|
executionIdentity: ResolvedExecutionIdentity;
|
|
58
57
|
workId: string;
|
|
59
|
-
|
|
58
|
+
/** Legacy provenance only. Workflow execution authority comes from typed Work/target/effect identities, not Controller ownership. */
|
|
59
|
+
controller?: { controllerId: string; authorityId: string };
|
|
60
60
|
runId: string;
|
|
61
61
|
registryScope: WorkflowRegistryScope;
|
|
62
62
|
workflowId: string;
|
|
@@ -64,20 +64,16 @@ export interface ExecuteRegisteredWorkflowInput {
|
|
|
64
64
|
timeoutMs?: number;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
function
|
|
67
|
+
function assertWorkflowExecutionScope(input: ExecuteRegisteredWorkflowInput, reconciliation = false): void {
|
|
68
68
|
const store = { controllerHome: input.controllerHome, repoId: input.repository.repoId };
|
|
69
69
|
const work = getWorkContract(store, input.workId);
|
|
70
|
-
if (!work ||
|
|
71
|
-
|
|
70
|
+
if (!work || work.supersededBy || (!reconciliation && semanticWorkState(work) !== 'open')) {
|
|
71
|
+
throw new Error('WORKFLOW_WORK_NOT_EXECUTABLE');
|
|
72
|
+
}
|
|
72
73
|
if (work.repoId !== input.executionIdentity.repositoryId || work.checkoutId !== input.executionIdentity.checkoutId
|
|
73
74
|
|| input.executionIdentity.workId !== work.workId) throw new Error('WORKFLOW_EXECUTION_IDENTITY_MISMATCH');
|
|
74
75
|
if (input.registryScope.kind === 'project' && (work.scopeRef?.kind !== 'project' || work.scopeRef.id !== input.registryScope.projectId)
|
|
75
76
|
&& work.engineeringContext?.projectContractReceipt?.projectId !== input.registryScope.projectId) throw new Error('WORKFLOW_PROJECT_MISMATCH');
|
|
76
|
-
const owner = getControllerSession(store, input.workId);
|
|
77
|
-
if (!input.controller || !owner || owner.controllerId !== input.controller.controllerId) throw new Error('WORKFLOW_CONTROLLER_NOT_OWNER');
|
|
78
|
-
const relay = getControllerRoundRelay(store, input.workId);
|
|
79
|
-
if (relay ? relay.status !== 'claimed' || relay.authorityId !== input.controller.authorityId || relay.claimGeneration !== owner.claimGeneration
|
|
80
|
-
: !controllerSessionAuthorityMatches(owner, input.controller.authorityId)) throw new Error('WORKFLOW_CONTROLLER_AUTHORITY_STALE');
|
|
81
77
|
if (!reconciliation && work.requirementId) {
|
|
82
78
|
const requirement = readRequirement({ controllerHome: input.controllerHome }, work.requirementId)?.value;
|
|
83
79
|
if (!requirement || !['planned', 'active'].includes(requirement.state)) throw new Error('WORKFLOW_REQUIREMENT_NOT_ACTIVE');
|
|
@@ -152,7 +148,7 @@ async function completedCommandResult(
|
|
|
152
148
|
|
|
153
149
|
/** Hold the existing Work resource lock across read, dispatch and checkpoint, including distinct run IDs. */
|
|
154
150
|
export async function executeRegisteredWorkflow(input: ExecuteRegisteredWorkflowInput, dependencies: WorkflowRuntimeExecutionDependencies = {}): Promise<WorkflowRunResult> {
|
|
155
|
-
|
|
151
|
+
assertWorkflowExecutionScope(input);
|
|
156
152
|
return withControllerLockAsync(input.controllerHome, { scope: 'task', repoId: input.repository.repoId, taskId: `workflow:${input.workId}` },
|
|
157
153
|
`workflow:${input.runId}`, () => executeRegisteredWorkflowLocked(input, dependencies), undefined, 0);
|
|
158
154
|
}
|
|
@@ -163,7 +159,7 @@ async function executeRegisteredWorkflowLocked(
|
|
|
163
159
|
): Promise<WorkflowRunResult> {
|
|
164
160
|
if (!input.workId.trim()) throw new Error('WORKFLOW_RUNTIME_WORK_ID_REQUIRED');
|
|
165
161
|
if (!input.runId.trim()) throw new Error('WORKFLOW_RUNTIME_RUN_ID_REQUIRED');
|
|
166
|
-
|
|
162
|
+
assertWorkflowExecutionScope(input);
|
|
167
163
|
const registry = readWorkflowRegistryEntry(input.controllerHome, input.registryScope, input.workflowId);
|
|
168
164
|
if (!registry) throw new Error(`WORKFLOW_REGISTRY_ENTRY_REQUIRED: ${input.workflowId}`);
|
|
169
165
|
if (registry.value.status !== 'active') throw new Error(`WORKFLOW_REGISTRY_ENTRY_NOT_ACTIVE: ${input.workflowId}`);
|
|
@@ -242,7 +238,7 @@ async function executeRegisteredWorkflowLocked(
|
|
|
242
238
|
if (JSON.stringify(canonicalOutput) !== JSON.stringify(output)) throw new Error(`WORKFLOW_RETAINED_OUTPUT_MISMATCH: ${step.stepId}`);
|
|
243
239
|
},
|
|
244
240
|
executeCapability: async ({ step, arguments: args }) => {
|
|
245
|
-
|
|
241
|
+
assertWorkflowExecutionScope(input);
|
|
246
242
|
const binding = capabilityBinding(registry.value.bindings, step.capabilityId);
|
|
247
243
|
try {
|
|
248
244
|
const submitted = await submitPluginAction(input.controllerHome, input.repository, {
|
|
@@ -266,7 +262,7 @@ async function executeRegisteredWorkflowLocked(
|
|
|
266
262
|
}
|
|
267
263
|
},
|
|
268
264
|
executeScript: async ({ step, script, arguments: args }) => {
|
|
269
|
-
|
|
265
|
+
assertWorkflowExecutionScope(input);
|
|
270
266
|
try {
|
|
271
267
|
const process = await executeCommand({
|
|
272
268
|
controllerHome: input.controllerHome,
|
|
@@ -320,7 +316,7 @@ export async function reconcileRegisteredWorkflow(
|
|
|
320
316
|
input: ExecuteRegisteredWorkflowInput & { reconciliationRequestId?: string },
|
|
321
317
|
dependencies: WorkflowRuntimeExecutionDependencies = {},
|
|
322
318
|
): Promise<WorkflowRunRecord> {
|
|
323
|
-
|
|
319
|
+
assertWorkflowExecutionScope(input, true);
|
|
324
320
|
return withControllerLockAsync(
|
|
325
321
|
input.controllerHome,
|
|
326
322
|
{ scope: 'task', repoId: input.repository.repoId, taskId: `workflow:${input.workId}` },
|
|
@@ -335,7 +331,7 @@ async function reconcileRegisteredWorkflowLocked(
|
|
|
335
331
|
input: ExecuteRegisteredWorkflowInput & { reconciliationRequestId?: string },
|
|
336
332
|
dependencies: WorkflowRuntimeExecutionDependencies = {},
|
|
337
333
|
): Promise<WorkflowRunRecord> {
|
|
338
|
-
|
|
334
|
+
assertWorkflowExecutionScope(input, true);
|
|
339
335
|
const stored = readWorkflowRun(input.controllerHome, input.workId, input.runId);
|
|
340
336
|
if (!stored || !(stored.value.inFlightStepId || stored.value.status === 'reconcile_required')) throw new Error('WORKFLOW_RECONCILIATION_NOT_REQUIRED');
|
|
341
337
|
const registry = readWorkflowRegistryEntry(input.controllerHome, input.registryScope, input.workflowId);
|
|
@@ -447,13 +443,13 @@ export async function observeAndReconcileRegisteredWorkflow(
|
|
|
447
443
|
dependencies: WorkflowRuntimeExecutionDependencies = {},
|
|
448
444
|
): Promise<WorkflowRunRecord> {
|
|
449
445
|
if (!input.reconciliationRequestId.trim()) throw new Error('WORKFLOW_RECONCILIATION_REQUEST_ID_REQUIRED');
|
|
450
|
-
|
|
446
|
+
assertWorkflowExecutionScope(input, true);
|
|
451
447
|
return withControllerLockAsync(
|
|
452
448
|
input.controllerHome,
|
|
453
449
|
{ scope: 'task', repoId: input.repository.repoId, taskId: `workflow:${input.workId}` },
|
|
454
450
|
`workflow-reconcile-observe:${input.runId}`,
|
|
455
451
|
async () => {
|
|
456
|
-
|
|
452
|
+
assertWorkflowExecutionScope(input, true);
|
|
457
453
|
const stored = readWorkflowRun(input.controllerHome, input.workId, input.runId);
|
|
458
454
|
if (!stored || !(stored.value.inFlightStepId || stored.value.status === 'reconcile_required')) throw new Error('WORKFLOW_RECONCILIATION_NOT_REQUIRED');
|
|
459
455
|
const registry = readWorkflowRegistryEntry(input.controllerHome, input.registryScope, input.workflowId);
|
|
@@ -324,7 +324,11 @@ export function selectTests(
|
|
|
324
324
|
files: selected,
|
|
325
325
|
reason: explicitTestFiles.length > 0
|
|
326
326
|
? 'explicit test files'
|
|
327
|
-
:
|
|
327
|
+
: gate === 'full' ? 'full non-destructive suite'
|
|
328
|
+
: gate === 'infrastructure' ? 'infrastructure suite'
|
|
329
|
+
: gate === 'fault' ? 'fault-injection suite'
|
|
330
|
+
: noChanges ? 'no changes detected; core smoke only'
|
|
331
|
+
: `changed paths mapped to ${[...changedModules].sort().join(', ')}`,
|
|
328
332
|
};
|
|
329
333
|
}
|
|
330
334
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { parseCanonicalChatgptConversationIdentity } from '../packages/plugin-runtime/computer';
|
|
2
|
+
|
|
3
|
+
export interface ChatgptConversationIdentity {
|
|
4
|
+
conversationId: string;
|
|
5
|
+
canonicalUrl: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function parseChatgptConversationIdentity(value: string): ChatgptConversationIdentity {
|
|
9
|
+
try {
|
|
10
|
+
const identity = parseCanonicalChatgptConversationIdentity(value);
|
|
11
|
+
let decodedConversationId = identity.conversationId;
|
|
12
|
+
try { decodedConversationId = decodeURIComponent(identity.conversationId); } catch { /* keep raw identity for validation below */ }
|
|
13
|
+
if (decodedConversationId.startsWith('local-chatgpt:')) {
|
|
14
|
+
throw new Error('CHATGPT_CONVERSATION_ID_INVALID');
|
|
15
|
+
}
|
|
16
|
+
return { conversationId: identity.conversationId, canonicalUrl: identity.conversationUrl };
|
|
17
|
+
} catch (error) {
|
|
18
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
19
|
+
if (message === 'CHATGPT_CONVERSATION_URL_INVALID') throw new Error('WORKFLOW_SUPERVISOR_CHATGPT_URL_INVALID');
|
|
20
|
+
if (message === 'CHATGPT_CONVERSATION_ID_MISSING') throw new Error('WORKFLOW_SUPERVISOR_CHATGPT_CONVERSATION_URL_REQUIRED');
|
|
21
|
+
throw new Error('WORKFLOW_SUPERVISOR_CHATGPT_CONVERSATION_ID_INVALID');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { createConnection } from 'node:net';
|
|
3
|
+
import { workflowSupervisorSocketPath } from './paths';
|
|
4
|
+
import type { WorkflowSupervisorConsumerStatus, WorkflowSupervisorContinuationProof, WorkflowSupervisorDiscoveredConversation, WorkflowSupervisorEffect, WorkflowSupervisorTask, WorkflowSupervisorTaskInput, WorkflowSupervisorTaskStall, WorkflowSupervisorTerminalState } from './types';
|
|
5
|
+
|
|
6
|
+
interface RpcResponse<T> { id: string; ok: boolean; result?: T; error?: { code?: string; message?: string } }
|
|
7
|
+
|
|
8
|
+
// The Supervisor daemon is single-threaded and shares its event loop with the
|
|
9
|
+
// canonical Runtime's own scheduler/maintenance passes. A short read budget is
|
|
10
|
+
// enough for cheap lookups, but a mutating call must not be reported as failed
|
|
11
|
+
// merely because the Runtime was busy for a moment: `task_register` and the
|
|
12
|
+
// reservation calls are idempotent upserts, and treating ordinary contention as
|
|
13
|
+
// failure stranded ControllerRounds in `dispatching`
|
|
14
|
+
// (live evidence: `WORKFLOW_SUPERVISOR_RPC_TIMEOUT:task_register` in the Runtime
|
|
15
|
+
// stderr while the daemon was healthy). Keep both budgets bounded.
|
|
16
|
+
const SUPERVISOR_RPC_READ_TIMEOUT_MS = 2_000;
|
|
17
|
+
const SUPERVISOR_RPC_MUTATION_TIMEOUT_MS = 15_000;
|
|
18
|
+
|
|
19
|
+
async function rpc<T>(forgeHome: string, method: string, params: Record<string, unknown>, timeoutMs = SUPERVISOR_RPC_READ_TIMEOUT_MS): Promise<T> {
|
|
20
|
+
const socketPath = workflowSupervisorSocketPath(forgeHome);
|
|
21
|
+
return await new Promise<T>((resolve, reject) => {
|
|
22
|
+
const socket = createConnection(socketPath);
|
|
23
|
+
const id = `forge-${randomUUID()}`;
|
|
24
|
+
let buffer = '';
|
|
25
|
+
let settled = false;
|
|
26
|
+
const finish = (error?: Error, value?: T): void => {
|
|
27
|
+
if (settled) return;
|
|
28
|
+
settled = true;
|
|
29
|
+
clearTimeout(timer);
|
|
30
|
+
socket.destroy();
|
|
31
|
+
if (error) reject(error); else resolve(value as T);
|
|
32
|
+
};
|
|
33
|
+
const timer = setTimeout(() => finish(new Error(`WORKFLOW_SUPERVISOR_RPC_TIMEOUT:${method}`)), timeoutMs);
|
|
34
|
+
socket.once('error', (error) => finish(error instanceof Error ? error : new Error(String(error))));
|
|
35
|
+
socket.on('data', (chunk) => {
|
|
36
|
+
buffer += chunk.toString('utf8');
|
|
37
|
+
const newline = buffer.indexOf('\n');
|
|
38
|
+
if (newline < 0) return;
|
|
39
|
+
let response: RpcResponse<T>;
|
|
40
|
+
try { response = JSON.parse(buffer.slice(0, newline)) as RpcResponse<T>; }
|
|
41
|
+
catch { finish(new Error('WORKFLOW_SUPERVISOR_RPC_RESPONSE_INVALID')); return; }
|
|
42
|
+
if (response.id !== id) { finish(new Error('WORKFLOW_SUPERVISOR_RPC_RESPONSE_ID_MISMATCH')); return; }
|
|
43
|
+
if (!response.ok) { finish(new Error(response.error?.message ?? response.error?.code ?? 'WORKFLOW_SUPERVISOR_RPC_FAILED')); return; }
|
|
44
|
+
finish(undefined, response.result as T);
|
|
45
|
+
});
|
|
46
|
+
socket.once('connect', () => socket.write(`${JSON.stringify({ id, method, params })}\n`));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function getWorkflowSupervisorConsumerStatus(forgeHome: string): Promise<WorkflowSupervisorConsumerStatus> {
|
|
51
|
+
return await rpc<WorkflowSupervisorConsumerStatus>(forgeHome, 'consumer_status', {});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function getWorkflowSupervisorCurrentConversation(forgeHome: string): Promise<WorkflowSupervisorDiscoveredConversation | undefined> {
|
|
55
|
+
const result = await rpc<{ conversation?: WorkflowSupervisorDiscoveredConversation }>(forgeHome, 'browser_current_conversation', {});
|
|
56
|
+
return result.conversation;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function getWorkflowSupervisorTask(forgeHome: string, taskId: string): Promise<WorkflowSupervisorTask | undefined> {
|
|
60
|
+
const task = await rpc<WorkflowSupervisorTask | null>(forgeHome, 'task_get', { task_id: taskId });
|
|
61
|
+
return task ?? undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function reviseWorkflowSupervisorTaskObjective(forgeHome: string, input: {
|
|
65
|
+
taskId: string; objective: string; expectedObjectiveSha256: string; requestId: string; authorizedBy?: string;
|
|
66
|
+
workId?: string; requirementId?: string; expectedCompletionContractSha256?: string;
|
|
67
|
+
}): Promise<{ task: WorkflowSupervisorTask; changed: boolean; deduplicated: boolean; objectiveSha256: string; completionContractSha256: string; semanticBindingChanged: boolean; refreshedEffect?: WorkflowSupervisorEffect }> {
|
|
68
|
+
return await rpc(forgeHome, 'task_revise_objective', {
|
|
69
|
+
task_id: input.taskId,
|
|
70
|
+
objective: input.objective,
|
|
71
|
+
expected_objective_sha256: input.expectedObjectiveSha256,
|
|
72
|
+
request_id: input.requestId,
|
|
73
|
+
...(input.workId?.trim() ? { work_id: input.workId.trim() } : {}),
|
|
74
|
+
...(input.requirementId?.trim() ? { requirement_id: input.requirementId.trim() } : {}),
|
|
75
|
+
...(input.expectedCompletionContractSha256?.trim() ? { expected_completion_contract_sha256: input.expectedCompletionContractSha256.trim() } : {}),
|
|
76
|
+
...(input.authorizedBy?.trim() ? { authorized_by: input.authorizedBy.trim() } : {}),
|
|
77
|
+
}, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export async function getWorkflowSupervisorTaskByConversationId(
|
|
81
|
+
forgeHome: string,
|
|
82
|
+
conversationId: string,
|
|
83
|
+
): Promise<{ task: WorkflowSupervisorTask; terminal?: WorkflowSupervisorTerminalState } | undefined> {
|
|
84
|
+
const result = await rpc<{ task: WorkflowSupervisorTask; terminal?: WorkflowSupervisorTerminalState } | null>(
|
|
85
|
+
forgeHome,
|
|
86
|
+
'task_get_by_conversation',
|
|
87
|
+
{ conversation_id: conversationId },
|
|
88
|
+
);
|
|
89
|
+
return result ?? undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export async function listWorkflowSupervisorTasks(forgeHome: string, activeOnly = false): Promise<WorkflowSupervisorTask[]> {
|
|
93
|
+
const result = await rpc<{ tasks: WorkflowSupervisorTask[] }>(forgeHome, 'task_list', { active_only: activeOnly });
|
|
94
|
+
return result.tasks;
|
|
95
|
+
}
|
|
96
|
+
/** Explicit read-only terminal history. Native ChatGPT archive is not inferred. */
|
|
97
|
+
export async function listWorkflowSupervisorTerminalTasks(forgeHome: string): Promise<Array<{ task: WorkflowSupervisorTask; terminal: WorkflowSupervisorTerminalState }>> {
|
|
98
|
+
const result = await rpc<{ terminalTasks: Array<{ task: WorkflowSupervisorTask; terminal: WorkflowSupervisorTerminalState }> }>(
|
|
99
|
+
forgeHome, 'task_list', { terminal_only: true },
|
|
100
|
+
);
|
|
101
|
+
return result.terminalTasks;
|
|
102
|
+
}
|
|
103
|
+
/** Operator-only recovery; never exposed to the browser Native Messaging host. */
|
|
104
|
+
export async function recoverWorkflowSupervisorTask(forgeHome: string, input: { taskId: string; sourceEffectId?: string; requestId: string; reason: string; supersedeUnknown?: boolean; authorizedBy?: string }): Promise<{ recoveryEffect: WorkflowSupervisorEffect; action: 'retry_authorized' | 'recovery_reserved' | 'unknown_superseded' }> {
|
|
105
|
+
return await rpc(forgeHome, 'task_recover', {
|
|
106
|
+
task_id: input.taskId,
|
|
107
|
+
...(input.sourceEffectId?.trim() ? { source_effect_id: input.sourceEffectId.trim() } : {}),
|
|
108
|
+
request_id: input.requestId,
|
|
109
|
+
reason: input.reason,
|
|
110
|
+
...(input.supersedeUnknown === true ? { supersede_unknown: true } : {}),
|
|
111
|
+
...(input.authorizedBy?.trim() ? { authorized_by: input.authorizedBy.trim() } : {}),
|
|
112
|
+
}, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Read-only stall classification; derived from the effect ledger, not new state. */
|
|
116
|
+
export async function getWorkflowSupervisorTaskStall(forgeHome: string, taskId: string): Promise<WorkflowSupervisorTaskStall> {
|
|
117
|
+
return await rpc<WorkflowSupervisorTaskStall>(forgeHome, 'task_stall', { task_id: taskId });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** One-way binding of a Work-owned Supervisor task to its canonical Scheduler lane. */
|
|
121
|
+
export async function bindWorkflowSupervisorScheduledWake(forgeHome: string, input: {
|
|
122
|
+
taskId: string; repoId: string; workId: string; scheduleId: string;
|
|
123
|
+
}): Promise<{ task: WorkflowSupervisorTask; changed: boolean; deduplicated: boolean }> {
|
|
124
|
+
return await rpc(forgeHome, 'task_bind_scheduled_wake', {
|
|
125
|
+
task_id: input.taskId, repo_id: input.repoId, work_id: input.workId, schedule_id: input.scheduleId,
|
|
126
|
+
}, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Scheduler occurrence is the idempotency identity; an unknown send outcome is never replayed. */
|
|
130
|
+
export async function wakeWorkflowSupervisorScheduledTask(forgeHome: string, input: {
|
|
131
|
+
taskId: string; scheduleId: string; occurrenceId: string;
|
|
132
|
+
}): Promise<{ effect: WorkflowSupervisorEffect; deduplicated: boolean }> {
|
|
133
|
+
return await rpc(forgeHome, 'task_wake_scheduled', {
|
|
134
|
+
task_id: input.taskId, schedule_id: input.scheduleId, occurrence_id: input.occurrenceId,
|
|
135
|
+
}, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Operator-only conversation migration for a standalone Supervisor task whose
|
|
140
|
+
* exact conversation became permanently unusable. It is explicit and bounded by
|
|
141
|
+
* design: it is never triggered automatically by provider backpressure.
|
|
142
|
+
*/
|
|
143
|
+
export async function migrateWorkflowSupervisorConversation(forgeHome: string, input: {
|
|
144
|
+
taskId: string; expectedConversationId: string; requestId: string; reason: string; authorizedBy?: string;
|
|
145
|
+
} & ({ conversationId: string; conversationUrl: string; fresh?: false } | { fresh: true; conversationId?: never; conversationUrl?: never })
|
|
146
|
+
): Promise<{ taskId: string; conversationId: string; conversationUrl: string; migrated: boolean; freshConversation?: boolean }> {
|
|
147
|
+
return await rpc(forgeHome, 'task_migrate_conversation', {
|
|
148
|
+
task_id: input.taskId,
|
|
149
|
+
expected_conversation_id: input.expectedConversationId,
|
|
150
|
+
...(input.fresh === true ? { fresh: true } : { conversation_id: input.conversationId, conversation_url: input.conversationUrl }),
|
|
151
|
+
request_id: input.requestId,
|
|
152
|
+
reason: input.reason,
|
|
153
|
+
...(input.authorizedBy?.trim() ? { authorized_by: input.authorizedBy.trim() } : {}),
|
|
154
|
+
}, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export async function stopWorkflowSupervisorTask(
|
|
158
|
+
forgeHome: string,
|
|
159
|
+
taskId: string,
|
|
160
|
+
reason = 'Stopped by operator request.',
|
|
161
|
+
): Promise<{ taskId: string; terminal: 'STOPPED'; deduplicated: boolean }> {
|
|
162
|
+
return await rpc(forgeHome, 'task_stop', { task_id: taskId, reason }, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export async function registerWorkflowSupervisorTask(forgeHome: string, input: WorkflowSupervisorTaskInput): Promise<WorkflowSupervisorTask> {
|
|
166
|
+
return await rpc<WorkflowSupervisorTask>(forgeHome, 'task_register', {
|
|
167
|
+
task_id: input.taskId,
|
|
168
|
+
conversation_id: input.conversationId,
|
|
169
|
+
conversation_url: input.conversationUrl,
|
|
170
|
+
objective: input.objective,
|
|
171
|
+
completion_contract: input.completionContract,
|
|
172
|
+
continuation_policy: input.continuationPolicy,
|
|
173
|
+
user_blocker_policy: input.userBlockerPolicy,
|
|
174
|
+
}, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export async function bindWorkflowSupervisorBootstrapConversation(
|
|
178
|
+
forgeHome: string,
|
|
179
|
+
input: { taskId: string; conversationId: string; conversationUrl: string },
|
|
180
|
+
): Promise<WorkflowSupervisorTask> {
|
|
181
|
+
return await rpc<WorkflowSupervisorTask>(forgeHome, 'bootstrap_bind_conversation', {
|
|
182
|
+
task_id: input.taskId,
|
|
183
|
+
conversation_id: input.conversationId,
|
|
184
|
+
conversation_url: input.conversationUrl,
|
|
185
|
+
}, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export async function reserveWorkflowSupervisorEnrollment(forgeHome: string, taskId: string, canonicalEffectId?: string): Promise<WorkflowSupervisorEffect> {
|
|
189
|
+
return await rpc<WorkflowSupervisorEffect>(forgeHome, 'reserve_enrollment', {
|
|
190
|
+
task_id: taskId,
|
|
191
|
+
...(canonicalEffectId?.trim() ? { effect_id: canonicalEffectId.trim() } : {}),
|
|
192
|
+
}, SUPERVISOR_RPC_MUTATION_TIMEOUT_MS);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export interface WorkflowSupervisorEffectDispatchBudget {
|
|
196
|
+
effectId: string;
|
|
197
|
+
generations: number;
|
|
198
|
+
maxGenerations: number;
|
|
199
|
+
lastDispatchedAtMs?: number;
|
|
200
|
+
retryDelayMs?: number;
|
|
201
|
+
exhausted: boolean;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export async function getWorkflowSupervisorEffectDispatchBudget(
|
|
205
|
+
forgeHome: string,
|
|
206
|
+
effectId: string,
|
|
207
|
+
): Promise<WorkflowSupervisorEffectDispatchBudget> {
|
|
208
|
+
return await rpc<WorkflowSupervisorEffectDispatchBudget>(forgeHome, 'effect_dispatch_budget', { effect_id: effectId });
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export async function getWorkflowSupervisorContinuationProof(forgeHome: string, input: { repoId?: string; activeReleaseId: string; notBefore: string }): Promise<WorkflowSupervisorContinuationProof | undefined> {
|
|
212
|
+
const proof = await rpc<WorkflowSupervisorContinuationProof | null>(forgeHome, 'continuation_proof', {
|
|
213
|
+
...(input.repoId?.trim() ? { repo_id: input.repoId.trim() } : {}),
|
|
214
|
+
active_release_id: input.activeReleaseId,
|
|
215
|
+
not_before: input.notBefore,
|
|
216
|
+
});
|
|
217
|
+
return proof ?? undefined;
|
|
218
|
+
}
|