@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
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
previewAutomaticRuntimeMaintenance,
|
|
11
11
|
type RuntimeMaintenanceActionId,
|
|
12
12
|
} from '../../recovery/maintenance-executor';
|
|
13
|
-
import { appendWorkEvidence, getWorkContract,
|
|
13
|
+
import { appendWorkEvidence, getWorkContract, semanticWorkState } from '../../../../packages/kernel/work/api/index';
|
|
14
14
|
import {
|
|
15
15
|
controllerSessionBlocksRecovery,
|
|
16
16
|
getControllerSession,
|
|
@@ -27,16 +27,16 @@ import {
|
|
|
27
27
|
getSchedule,
|
|
28
28
|
listActiveOccurrences,
|
|
29
29
|
listOccurrences,
|
|
30
|
-
|
|
31
|
-
resumeScheduledControllerContinuation,
|
|
30
|
+
reclaimStaleCreatedOccurrences,
|
|
32
31
|
listSchedules,
|
|
33
32
|
saveOccurrence,
|
|
34
33
|
saveScheduleDecision,
|
|
35
34
|
updateSchedule,
|
|
36
35
|
} from '../../../../packages/kernel/scheduler/api/index';
|
|
37
36
|
export { cronDue };
|
|
38
|
-
import { ensureScheduledControllerBinding
|
|
39
|
-
import {
|
|
37
|
+
import { ensureScheduledControllerBinding } from '../../root/scheduled-controller-composition';
|
|
38
|
+
import { reconcileControllerProgression } from '../../root/controller-progression-composition';
|
|
39
|
+
import { listUserRequests } from '../../../../packages/kernel/identity/api/index';
|
|
40
40
|
import { runStandaloneChatgptPrompt } from '../../control-plane/launcher/chatgpt-work-continuation';
|
|
41
41
|
|
|
42
42
|
import { classifyScheduledBrowserObservation, executeScheduledBrowserProbe } from './browser-probe';
|
|
@@ -51,6 +51,7 @@ import type {
|
|
|
51
51
|
const execFileAsync = promisify(execFile);
|
|
52
52
|
const LIVE_MAINTENANCE_OPERATION = 'runtime_maintenance_apply';
|
|
53
53
|
const EXTERNAL_CONTROLLER_WAKE_OPERATION = 'external_controller_wake';
|
|
54
|
+
const CONTROLLER_PROGRESSION_OPERATION = 'controller_progression';
|
|
54
55
|
const BROWSER_PROBE_OPERATION = 'browser_probe';
|
|
55
56
|
const GITHUB_ISSUE_WATCH_OPERATION = 'github_issue_watch';
|
|
56
57
|
const DEFAULT_EXTERNAL_CONTROLLER_WAKE_TIMEOUT_MS = 60_000;
|
|
@@ -60,6 +61,7 @@ function isDeterministicSchedule(schedule: RepositorySchedule): boolean {
|
|
|
60
61
|
// Kernel executes only typed, bounded dispatch operations.
|
|
61
62
|
return schedule.action.operation === LIVE_MAINTENANCE_OPERATION
|
|
62
63
|
|| schedule.action.operation === EXTERNAL_CONTROLLER_WAKE_OPERATION
|
|
64
|
+
|| schedule.action.operation === CONTROLLER_PROGRESSION_OPERATION
|
|
63
65
|
|| schedule.action.operation === BROWSER_PROBE_OPERATION
|
|
64
66
|
|| schedule.action.operation === GITHUB_ISSUE_WATCH_OPERATION;
|
|
65
67
|
}
|
|
@@ -87,35 +89,24 @@ async function workspaceDirty(controllerHome: string, repoId: string): Promise<b
|
|
|
87
89
|
|
|
88
90
|
function workBoundScheduleWorkId(schedule: RepositorySchedule): string | undefined {
|
|
89
91
|
if (schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION
|
|
92
|
+
&& schedule.action.operation !== CONTROLLER_PROGRESSION_OPERATION
|
|
90
93
|
&& schedule.action.operation !== BROWSER_PROBE_OPERATION) return undefined;
|
|
91
94
|
const value = schedule.action.arguments?.work_id;
|
|
92
95
|
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
93
96
|
}
|
|
94
97
|
|
|
95
|
-
const HUMAN_ONLY_HANDOFF_REASONS = new Set([
|
|
96
|
-
'policy_approval_required',
|
|
97
|
-
'missing_authorization',
|
|
98
|
-
'invalid_objective',
|
|
99
|
-
'destructive_action_requires_confirmation',
|
|
100
|
-
]);
|
|
101
|
-
|
|
102
|
-
function handoffRequiresHumanReview(item: ReturnType<typeof listHandoffItems>[number]): boolean {
|
|
103
|
-
if (item.approvalAction) return true;
|
|
104
|
-
if (!item.creationReason) return true;
|
|
105
|
-
return HUMAN_ONLY_HANDOFF_REASONS.has(item.creationReason);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
98
|
async function stopReason(controllerHome: string, schedule: RepositorySchedule): Promise<string | undefined> {
|
|
109
99
|
const projection = readRepositoryProjection(controllerHome, schedule.repoId);
|
|
110
100
|
const workId = workBoundScheduleWorkId(schedule);
|
|
111
101
|
const work = workId ? getWorkContract({ controllerHome, repoId: schedule.repoId }, workId) : undefined;
|
|
112
102
|
if (schedule.stopConditions.includes('human_review_required')) {
|
|
103
|
+
const pendingUserRequests = listUserRequests(controllerHome, 'pending');
|
|
113
104
|
if (workId) {
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return
|
|
105
|
+
const request = pendingUserRequests.find((item) => item.targetScope?.workId === workId);
|
|
106
|
+
if (request) return `Work ${workId} has pending UserRequest ${request.requestId} requiring human action.`;
|
|
107
|
+
} else {
|
|
108
|
+
const request = pendingUserRequests.find((item) => item.targetScope?.repoId === schedule.repoId);
|
|
109
|
+
if (request) return `Repository ${schedule.repoId} has pending UserRequest ${request.requestId}.`;
|
|
119
110
|
}
|
|
120
111
|
}
|
|
121
112
|
if (schedule.stopConditions.includes('release_ready') && projection.releaseFrozen) return 'Repository is in release freeze.';
|
|
@@ -258,7 +249,7 @@ export function classifyChatgptWakeFailure(reason: string): ChatgptWakeFailureCl
|
|
|
258
249
|
return 'ordinary_failure';
|
|
259
250
|
}
|
|
260
251
|
|
|
261
|
-
async function
|
|
252
|
+
async function executeControllerProgression(
|
|
262
253
|
controllerHome: string,
|
|
263
254
|
schedule: RepositorySchedule,
|
|
264
255
|
occurrence: ScheduleOccurrence,
|
|
@@ -277,9 +268,9 @@ async function executeExternalControllerWake(
|
|
|
277
268
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} no longer exists.`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
|
|
278
269
|
return decideOccurrence(controllerHome, schedule, occurrence, 'operation_blocked', 'skipped', `EXTERNAL_CONTROLLER_WAKE_WORK_NOT_FOUND:${workId}`);
|
|
279
270
|
}
|
|
280
|
-
if (
|
|
281
|
-
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} is terminal (${work.
|
|
282
|
-
return decideOccurrence(controllerHome, schedule, occurrence, 'nothing_to_do', 'skipped', `Work ${workId} is terminal (${work.
|
|
271
|
+
if (semanticWorkState(work) !== 'open') {
|
|
272
|
+
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} is terminal (${work.semanticState}).`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
|
|
273
|
+
return decideOccurrence(controllerHome, schedule, occurrence, 'nothing_to_do', 'skipped', `Work ${workId} is terminal (${work.semanticState}); automatic continuation stopped.`);
|
|
283
274
|
}
|
|
284
275
|
|
|
285
276
|
const retainedSession = getRetainedControllerSession(workStore, workId);
|
|
@@ -323,12 +314,20 @@ async function executeExternalControllerWake(
|
|
|
323
314
|
);
|
|
324
315
|
}
|
|
325
316
|
|
|
317
|
+
if (schedule.action.operation === CONTROLLER_PROGRESSION_OPERATION
|
|
318
|
+
&& (typeof args.controller_binding_id !== 'string' || !args.controller_binding_id.trim())) {
|
|
319
|
+
throw new Error(`SCHEDULE_CONTROLLER_PROGRESSION_BINDING_REQUIRED:${workId}`);
|
|
320
|
+
}
|
|
321
|
+
|
|
326
322
|
const hadLegacySessionIdentity = typeof args.controller_session_id === 'string' && args.controller_session_id.trim().length > 0;
|
|
327
323
|
|
|
328
324
|
// Explicit compatibility migration for schedules written before Kernel V2 B4.
|
|
329
325
|
// Provider metadata is copied once into the adapter-owned binding and the
|
|
330
326
|
// Schedule is rewritten to exact Work/ControllerSession/ControllerBinding ids.
|
|
331
327
|
if (!bindingRecord) {
|
|
328
|
+
if (schedule.action.operation === CONTROLLER_PROGRESSION_OPERATION) {
|
|
329
|
+
throw new Error(`SCHEDULE_CONTROLLER_PROGRESSION_BINDING_NOT_FOUND:${workId}`);
|
|
330
|
+
}
|
|
332
331
|
const binding = ensureScheduledControllerBinding(
|
|
333
332
|
{ controllerHome, repoId: schedule.repoId },
|
|
334
333
|
{ workId, session: retainedSession, scheduleName: schedule.name, args },
|
|
@@ -369,6 +368,10 @@ async function executeExternalControllerWake(
|
|
|
369
368
|
const relayScopeId = typeof schedule.action.arguments?.relay_scope_id === 'string'
|
|
370
369
|
? schedule.action.arguments.relay_scope_id
|
|
371
370
|
: undefined;
|
|
371
|
+
const controllerRoundOccurrenceId = typeof occurrence.triggerContext?.data?.controllerRoundOccurrenceId === 'string'
|
|
372
|
+
&& occurrence.triggerContext.data.controllerRoundOccurrenceId.trim()
|
|
373
|
+
? occurrence.triggerContext.data.controllerRoundOccurrenceId.trim()
|
|
374
|
+
: occurrence.occurrenceId;
|
|
372
375
|
const wakeDecision = decideOccurrence(
|
|
373
376
|
controllerHome,
|
|
374
377
|
schedule,
|
|
@@ -387,23 +390,40 @@ async function executeExternalControllerWake(
|
|
|
387
390
|
);
|
|
388
391
|
|
|
389
392
|
try {
|
|
390
|
-
const
|
|
393
|
+
const progression = await reconcileControllerProgression(
|
|
391
394
|
{ controllerHome, repoId: schedule.repoId, repoRoot: repository.canonicalRoot },
|
|
392
|
-
bindingRecord.binding,
|
|
393
|
-
);
|
|
394
|
-
const resumed = await resumeScheduledControllerContinuation(
|
|
395
|
-
workStore,
|
|
396
395
|
{
|
|
397
|
-
|
|
398
|
-
occurrenceId: occurrence.occurrenceId,
|
|
396
|
+
occurrenceId: controllerRoundOccurrenceId,
|
|
399
397
|
workId,
|
|
400
|
-
controllerBindingId: bindingRecord.binding.bindingId,
|
|
401
398
|
relayScopeId,
|
|
402
399
|
continuationHint,
|
|
400
|
+
allowSemanticWaitRecovery: controllerType === 'chatgpt',
|
|
401
|
+
scheduleName: schedule.name,
|
|
402
|
+
scheduleId: schedule.scheduleId,
|
|
403
|
+
scheduleOccurrenceId: occurrence.occurrenceId,
|
|
404
|
+
bindingArgs: args,
|
|
403
405
|
},
|
|
404
|
-
host,
|
|
405
406
|
);
|
|
406
|
-
|
|
407
|
+
|
|
408
|
+
if (progression.status === 'terminal_or_missing') {
|
|
409
|
+
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({
|
|
410
|
+
enabled: false,
|
|
411
|
+
pausedReason: progression.reason,
|
|
412
|
+
lastTriggeredAt: timestamp,
|
|
413
|
+
lastOccurrenceId: occurrence.occurrenceId,
|
|
414
|
+
}));
|
|
415
|
+
return saveOccurrence(controllerHome, {
|
|
416
|
+
...wakeDecision,
|
|
417
|
+
status: 'skipped',
|
|
418
|
+
decision: 'nothing_to_do',
|
|
419
|
+
reason: progression.reason,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (progression.status === 'semantic_wait'
|
|
424
|
+
|| progression.status === 'wait_for_user'
|
|
425
|
+
|| progression.status === 'retained_session_missing'
|
|
426
|
+
|| progression.status === 'human_controller') {
|
|
407
427
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({
|
|
408
428
|
lastTriggeredAt: timestamp,
|
|
409
429
|
lastOccurrenceId: occurrence.occurrenceId,
|
|
@@ -412,37 +432,70 @@ async function executeExternalControllerWake(
|
|
|
412
432
|
...wakeDecision,
|
|
413
433
|
status: 'skipped',
|
|
414
434
|
decision: 'nothing_to_do',
|
|
415
|
-
reason:
|
|
435
|
+
reason: progression.reason ?? `Work ${workId} is not currently eligible for provider progression.`,
|
|
416
436
|
});
|
|
417
437
|
}
|
|
418
|
-
if (resumed.dispatch.status === 'rejected') {
|
|
419
|
-
throw new Error(resumed.dispatch.reason ?? 'CONTROLLER_HOST_RESUME_REJECTED');
|
|
420
438
|
|
|
439
|
+
if (progression.status === 'rejected') {
|
|
440
|
+
throw new Error(progression.reason ?? 'CONTROLLER_HOST_RESUME_REJECTED');
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
if (progression.status === 'chatgpt_not_enrolled') {
|
|
444
|
+
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({
|
|
445
|
+
lastTriggeredAt: timestamp,
|
|
446
|
+
lastOccurrenceId: occurrence.occurrenceId,
|
|
447
|
+
}));
|
|
448
|
+
return saveOccurrence(controllerHome, {
|
|
449
|
+
...wakeDecision,
|
|
450
|
+
status: 'skipped',
|
|
451
|
+
decision: 'nothing_to_do',
|
|
452
|
+
reason: `Workflow Supervisor enrollment is not yet ready (${progression.supervisorEnrollment.status}); no ChatGPT provider attempt was consumed.`,
|
|
453
|
+
});
|
|
421
454
|
}
|
|
455
|
+
|
|
456
|
+
const supervisorEnrollment = progression.status === 'chatgpt_enrolled'
|
|
457
|
+
? progression.supervisorEnrollment
|
|
458
|
+
: progression.status === 'scheduled_supervisor_woken'
|
|
459
|
+
? { status: 'enrolled' as const, taskId: progression.taskId, effectId: progression.effectId }
|
|
460
|
+
: { status: 'not_eligible' as const };
|
|
461
|
+
const supervisorOwnsTurn = progression.status === 'chatgpt_enrolled' || progression.status === 'scheduled_supervisor_woken';
|
|
422
462
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, (current) => ({
|
|
423
463
|
lastTriggeredAt: timestamp,
|
|
424
464
|
lastOccurrenceId: occurrence.occurrenceId,
|
|
425
465
|
consecutiveFailures: 0,
|
|
426
466
|
nextEligibleAt: undefined,
|
|
427
|
-
...(
|
|
467
|
+
...(supervisorEnrollment.status === 'enrolled'
|
|
468
|
+
&& schedule.action.operation !== CONTROLLER_PROGRESSION_OPERATION
|
|
469
|
+
? { enabled: false, pausedReason: 'workflow_supervisor_owns_outer_turn' }
|
|
470
|
+
: current.enabled ? { pausedReason: undefined } : {}),
|
|
428
471
|
}));
|
|
429
472
|
const dispatchedOccurrence = saveOccurrence(controllerHome, {
|
|
430
473
|
...wakeDecision,
|
|
431
474
|
status: 'dispatched',
|
|
432
|
-
reason:
|
|
433
|
-
? `
|
|
434
|
-
:
|
|
475
|
+
reason: progression.status === 'chatgpt_enrolled'
|
|
476
|
+
? `Workflow Supervisor reserved the exact ChatGPT effect ${progression.supervisorEnrollment.effectId ?? progression.relayScopeId}; Scheduler issued no provider send.`
|
|
477
|
+
: progression.status === 'scheduled_supervisor_woken'
|
|
478
|
+
? `Scheduler occurrence ${occurrence.occurrenceId} woke the same Workflow Supervisor task and reserved effect ${progression.effectId}; Scheduler issued no provider send.`
|
|
479
|
+
: progression.reused
|
|
480
|
+
? `Controller continuation occurrence ${occurrence.occurrenceId} was already durably dispatched; external replay suppressed and semantic round closure is still pending.`
|
|
481
|
+
: `ControllerHost accepted durable binding ${bindingRecord.binding.bindingId} for Work ${workId}; dispatch ${progression.providerDispatchReceiptId ?? progression.relayScopeId}; semantic round closure is still pending.`,
|
|
435
482
|
});
|
|
436
483
|
appendWorkEvidence(workStore, workId, {
|
|
437
484
|
evidenceId: dispatchedOccurrence.occurrenceId,
|
|
438
|
-
title:
|
|
439
|
-
|
|
485
|
+
title: supervisorOwnsTurn
|
|
486
|
+
? 'scheduled Workflow Supervisor effect reserved'
|
|
487
|
+
: 'scheduled Controller continuation dispatched',
|
|
488
|
+
summary: progression.status === 'scheduled_supervisor_woken'
|
|
489
|
+
? `Schedule ${schedule.scheduleId} occurrence ${dispatchedOccurrence.occurrenceId} woke the same Work-bound Supervisor task; Supervisor owns ChatGPT delivery.`
|
|
490
|
+
: progression.status === 'chatgpt_enrolled'
|
|
491
|
+
? `Schedule ${schedule.scheduleId} materialized the exact ControllerRound occurrence and Supervisor effect; Supervisor owns ChatGPT delivery.`
|
|
492
|
+
: `Schedule ${schedule.scheduleId} occurrence ${dispatchedOccurrence.occurrenceId} resumed the exact Work-bound ControllerSession through ControllerHost.`,
|
|
440
493
|
detailLevel: 'summary',
|
|
441
494
|
});
|
|
442
495
|
return dispatchedOccurrence;
|
|
443
496
|
} catch (error) {
|
|
444
497
|
const reason = error instanceof Error ? error.message : String(error);
|
|
445
|
-
if (reason.startsWith('
|
|
498
|
+
if (reason.startsWith('CONTROLLER_CONTINUATION_ROUND_ALREADY_OPEN:') || reason.startsWith('CONTROLLER_CONTINUATION_ALREADY_DISPATCHING:')) {
|
|
446
499
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
|
|
447
500
|
return decideOccurrence(controllerHome, schedule, wakeDecision, 'nothing_to_do', 'skipped', `Work ${workId} already has an open Controller round awaiting claim or disposition.`);
|
|
448
501
|
}
|
|
@@ -473,20 +526,20 @@ async function executeExternalControllerWake(
|
|
|
473
526
|
decision: 'execute',
|
|
474
527
|
reason,
|
|
475
528
|
...(failureClass === 'user_action_required' ? { pauseReason: reason } : {}),
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
: '
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
},
|
|
529
|
+
...(failureClass === 'user_action_required' ? {
|
|
530
|
+
handoff: {
|
|
531
|
+
title: `External Controller wake ${occurrence.occurrenceId} requires user authorization`,
|
|
532
|
+
summary: 'Forge cannot resume the configured ControllerSession until the required user authorization is restored.',
|
|
533
|
+
reason,
|
|
534
|
+
creationReason: 'missing_authorization' as const,
|
|
535
|
+
blockingDecision: 'Restore the required authenticated/authorized controller capability, then retry the same scheduled Work.',
|
|
536
|
+
recommendedDecision: 'Restore authorization only; do not create replacement Work or replay an unknown external effect.',
|
|
537
|
+
recommendedPrompt: `Restore authorization for Work ${workId} and retry scheduled continuation ${occurrence.occurrenceId}.`,
|
|
538
|
+
statusSummary: 'Scheduled Controller continuation is waiting on user authorization.',
|
|
539
|
+
blockedBy: ['controller_authorization_required'],
|
|
540
|
+
attemptedActions: [`schedule:${schedule.scheduleId}`, `work:${workId}`, `controller:${controllerType}`, `session:${retainedSession.sessionId}`, `binding:${bindingRecord.binding.bindingId}`],
|
|
541
|
+
},
|
|
542
|
+
} : {}),
|
|
490
543
|
});
|
|
491
544
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ lastTriggeredAt: timestamp, lastOccurrenceId: occurrence.occurrenceId }));
|
|
492
545
|
return failed.occurrence ?? saveOccurrence(controllerHome, { ...wakeDecision, status: 'failed', reason });
|
|
@@ -541,39 +594,25 @@ export async function evaluateSchedule(
|
|
|
541
594
|
updatedAt: timestamp,
|
|
542
595
|
});
|
|
543
596
|
|
|
544
|
-
// Semantic
|
|
545
|
-
//
|
|
597
|
+
// Semantic/model-owned schedule actions record the trigger only. A trigger is
|
|
598
|
+
// continuation input for the external Controller/Supervisor, not a human
|
|
599
|
+
// blocker and therefore must not manufacture Handoff/UserRequest state.
|
|
546
600
|
if (!isDeterministicSchedule(schedule)) {
|
|
547
|
-
const
|
|
601
|
+
const recorded = decideOccurrence(
|
|
548
602
|
controllerHome,
|
|
549
603
|
schedule,
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
'skipped',
|
|
556
|
-
'Schedule execution is external-controller-owned; no ExecutionJob was created.',
|
|
557
|
-
occurrenceDecisionEvidence({ operation: schedule.action.operation, trigger: occurrence.triggerContext?.source }),
|
|
558
|
-
),
|
|
559
|
-
{
|
|
560
|
-
title: `Schedule ${schedule.name} requires an external Controller`,
|
|
561
|
-
summary: 'The scheduled trigger was recorded without dispatching a Kernel Job.',
|
|
562
|
-
reason: 'Schedule execution is external-controller-owned.',
|
|
563
|
-
creationReason: 'ambiguous_outcome',
|
|
564
|
-
blockingDecision: 'Claim or create the related Work before executing the scheduled operation.',
|
|
565
|
-
recommendedDecision: 'Review the trigger evidence and continue it through an explicitly claimed external Controller session.',
|
|
566
|
-
recommendedPrompt: `Review schedule ${schedule.scheduleId} occurrence ${occurrence.occurrenceId}; create or claim Work for ${schedule.action.operation} and continue through Process Runtime or Thin Launcher.`,
|
|
567
|
-
statusSummary: 'Schedule trigger is waiting for external Controller ownership.',
|
|
568
|
-
blockedBy: ['external_controller_required'],
|
|
569
|
-
attemptedActions: [`operation:${schedule.action.operation}`],
|
|
570
|
-
},
|
|
604
|
+
occurrence,
|
|
605
|
+
'operation_blocked',
|
|
606
|
+
'skipped',
|
|
607
|
+
'Schedule trigger recorded for external Controller continuation; no Kernel ExecutionJob or human Handoff was created.',
|
|
608
|
+
occurrenceDecisionEvidence({ operation: schedule.action.operation, trigger: occurrence.triggerContext?.source }),
|
|
571
609
|
);
|
|
572
610
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
|
|
573
|
-
return
|
|
611
|
+
return recorded;
|
|
574
612
|
}
|
|
575
613
|
|
|
576
614
|
const recent = listOccurrences(controllerHome, schedule.repoId, schedule.scheduleId, 1000);
|
|
615
|
+
reclaimStaleCreatedOccurrences(controllerHome, schedule.repoId, schedule.scheduleId);
|
|
577
616
|
const active = listActiveOccurrences(controllerHome, schedule.repoId, schedule.scheduleId)
|
|
578
617
|
.filter((entry) => entry.occurrenceId !== occurrence.occurrenceId);
|
|
579
618
|
const admission = evaluateScheduleOccurrenceAdmission(schedule, {
|
|
@@ -593,18 +632,7 @@ export async function evaluateSchedule(
|
|
|
593
632
|
reason: stop,
|
|
594
633
|
countFailure: false,
|
|
595
634
|
pauseReason: stop,
|
|
596
|
-
|
|
597
|
-
title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} stopped`,
|
|
598
|
-
summary: 'A live maintenance occurrence was blocked by an explicit schedule stop condition and requires review before automation resumes.',
|
|
599
|
-
reason: stop,
|
|
600
|
-
creationReason: 'ambiguous_outcome',
|
|
601
|
-
blockingDecision: 'Review the stop condition and decide whether automatic maintenance should stay paused.',
|
|
602
|
-
recommendedDecision: 'Resolve the stop condition, then explicitly re-enable or retrigger the maintenance schedule.',
|
|
603
|
-
recommendedPrompt: `Review maintenance schedule ${schedule.scheduleId} for repo ${schedule.repoId}, inspect stop condition ${stop}, and decide whether to resume the schedule.`,
|
|
604
|
-
statusSummary: 'Scheduled maintenance occurrence stopped before dispatch.',
|
|
605
|
-
blockedBy: ['schedule_stop_condition'],
|
|
606
|
-
attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
|
|
607
|
-
},
|
|
635
|
+
|
|
608
636
|
});
|
|
609
637
|
return failed.occurrence ?? stopped;
|
|
610
638
|
}
|
|
@@ -641,22 +669,20 @@ export async function evaluateSchedule(
|
|
|
641
669
|
reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
|
|
642
670
|
countFailure: !preview.blockedPermanently,
|
|
643
671
|
pauseReason: preview.blockedPermanently ? preview.blockedReason : undefined,
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
: '
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
:
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
|
|
659
|
-
},
|
|
672
|
+
...(preview.blockedPermanently ? {
|
|
673
|
+
handoff: {
|
|
674
|
+
title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} needs a user decision`,
|
|
675
|
+
summary: 'Automatic maintenance is permanently blocked and requires an explicit user decision before the schedule can resume.',
|
|
676
|
+
reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
|
|
677
|
+
creationReason: 'ambiguous_outcome' as const,
|
|
678
|
+
blockingDecision: 'Correct the configuration/authorization or intentionally keep this schedule paused.',
|
|
679
|
+
recommendedDecision: 'Review the permanent blocker and explicitly decide whether to repair configuration and resume.',
|
|
680
|
+
recommendedPrompt: `Review permanently blocked maintenance occurrence ${occurrence.occurrenceId} for schedule ${schedule.scheduleId} and decide whether to repair and resume it.`,
|
|
681
|
+
statusSummary: 'Scheduled maintenance is permanently blocked pending a user decision.',
|
|
682
|
+
blockedBy: [decision],
|
|
683
|
+
attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
|
|
684
|
+
},
|
|
685
|
+
} : {}),
|
|
660
686
|
});
|
|
661
687
|
return failed.occurrence ?? blocked;
|
|
662
688
|
}
|
|
@@ -693,22 +719,20 @@ export async function evaluateSchedule(
|
|
|
693
719
|
reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
|
|
694
720
|
countFailure: !preview.blockedPermanently,
|
|
695
721
|
pauseReason: preview.blockedPermanently ? preview.blockedReason : undefined,
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
: '
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
:
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
|
|
711
|
-
},
|
|
722
|
+
...(preview.blockedPermanently ? {
|
|
723
|
+
handoff: {
|
|
724
|
+
title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} needs a user decision`,
|
|
725
|
+
summary: 'Automatic maintenance is permanently blocked and requires an explicit user decision before the schedule can resume.',
|
|
726
|
+
reason: preview.blockedReason ?? 'Automatic maintenance preview blocked the occurrence.',
|
|
727
|
+
creationReason: 'ambiguous_outcome' as const,
|
|
728
|
+
blockingDecision: 'Correct the configuration/authorization or intentionally keep this schedule paused.',
|
|
729
|
+
recommendedDecision: 'Review the permanent blocker and explicitly decide whether to repair configuration and resume.',
|
|
730
|
+
recommendedPrompt: `Review permanently blocked maintenance occurrence ${occurrence.occurrenceId} for schedule ${schedule.scheduleId} and decide whether to repair and resume it.`,
|
|
731
|
+
statusSummary: 'Scheduled maintenance is permanently blocked pending a user decision.',
|
|
732
|
+
blockedBy: [decision],
|
|
733
|
+
attemptedActions: [`schedule:${schedule.scheduleId}`, `operation:${schedule.action.operation}`],
|
|
734
|
+
},
|
|
735
|
+
} : {}),
|
|
712
736
|
});
|
|
713
737
|
return failed.occurrence ?? blocked;
|
|
714
738
|
}
|
|
@@ -721,8 +745,9 @@ export async function evaluateSchedule(
|
|
|
721
745
|
}
|
|
722
746
|
|
|
723
747
|
const args = schedule.action.arguments ?? {};
|
|
724
|
-
if (schedule.action.operation === EXTERNAL_CONTROLLER_WAKE_OPERATION
|
|
725
|
-
|
|
748
|
+
if (schedule.action.operation === EXTERNAL_CONTROLLER_WAKE_OPERATION
|
|
749
|
+
|| schedule.action.operation === CONTROLLER_PROGRESSION_OPERATION) {
|
|
750
|
+
return executeControllerProgression(controllerHome, schedule, occurrence, timestamp, args);
|
|
726
751
|
}
|
|
727
752
|
|
|
728
753
|
if (schedule.action.operation === GITHUB_ISSUE_WATCH_OPERATION) {
|
|
@@ -769,7 +794,7 @@ export async function evaluateSchedule(
|
|
|
769
794
|
? `${args.continuation_prompt}\n\nGitHub issue watcher detected: ${issueSummary}`
|
|
770
795
|
: `GitHub issue watcher detected actionable issue changes: ${issueSummary}. Read current Work/Plan/evidence and process these issues through the bounded repair workflow.`,
|
|
771
796
|
};
|
|
772
|
-
const wake = await
|
|
797
|
+
const wake = await executeControllerProgression(controllerHome, schedule, occurrence, timestamp, wakeArgs, evidence, { transientWakeFailure: true });
|
|
773
798
|
if (wake.status !== 'failed') persistObservation();
|
|
774
799
|
return wake;
|
|
775
800
|
} catch (error) {
|
|
@@ -778,18 +803,7 @@ export async function evaluateSchedule(
|
|
|
778
803
|
outcome: 'failed',
|
|
779
804
|
decision: 'execute',
|
|
780
805
|
reason,
|
|
781
|
-
|
|
782
|
-
title: `GitHub issue watcher occurrence ${occurrence.occurrenceId} failed`,
|
|
783
|
-
summary: 'The local GitHub issue poll failed before Forge could compare issue state.',
|
|
784
|
-
reason,
|
|
785
|
-
creationReason: 'repeated_infrastructure_failure',
|
|
786
|
-
blockingDecision: 'Repair GitHub CLI authentication/connectivity before unattended issue monitoring resumes.',
|
|
787
|
-
recommendedDecision: 'Restore gh read access, then retrigger the watcher.',
|
|
788
|
-
recommendedPrompt: `Inspect GitHub issue watcher occurrence ${occurrence.occurrenceId} and restore the local read-only gh issue polling path.`,
|
|
789
|
-
statusSummary: 'GitHub issue watcher poll failed.',
|
|
790
|
-
blockedBy: ['github_issue_watch_failed'],
|
|
791
|
-
attemptedActions: [`schedule:${schedule.scheduleId}`, 'gh:api:issues'],
|
|
792
|
-
},
|
|
806
|
+
|
|
793
807
|
});
|
|
794
808
|
return failed.occurrence ?? occurrence;
|
|
795
809
|
}
|
|
@@ -808,9 +822,9 @@ export async function evaluateSchedule(
|
|
|
808
822
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} no longer exists.`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
|
|
809
823
|
return decideOccurrence(controllerHome, schedule, occurrence, 'operation_blocked', 'skipped', `SCHEDULE_BROWSER_PROBE_WORK_NOT_FOUND:${workId}`);
|
|
810
824
|
}
|
|
811
|
-
if (
|
|
812
|
-
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} is terminal (${work.
|
|
813
|
-
return decideOccurrence(controllerHome, schedule, occurrence, 'nothing_to_do', 'skipped', `Work ${workId} is terminal (${work.
|
|
825
|
+
if (semanticWorkState(work) !== 'open') {
|
|
826
|
+
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ enabled: false, pausedReason: `Work ${workId} is terminal (${work.semanticState}).`, lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
|
|
827
|
+
return decideOccurrence(controllerHome, schedule, occurrence, 'nothing_to_do', 'skipped', `Work ${workId} is terminal (${work.semanticState}); browser watcher stopped before probing.`);
|
|
814
828
|
}
|
|
815
829
|
}
|
|
816
830
|
|
|
@@ -844,7 +858,7 @@ export async function evaluateSchedule(
|
|
|
844
858
|
: `Scheduled browser watcher ${schedule.scheduleId} detected that authentication is required (${probe.authReason ?? 'login marker'}). Inspect the external dependency and request user login only if it cannot be restored safely.`;
|
|
845
859
|
if (workId) {
|
|
846
860
|
const wakeArgs = { ...args, continuation_prompt: authPrompt };
|
|
847
|
-
return
|
|
861
|
+
return executeControllerProgression(controllerHome, observedSchedule, occurrence, timestamp, wakeArgs, { ...observationEvidence, authReason: probe.authReason });
|
|
848
862
|
}
|
|
849
863
|
const controllerType = typeof args.controller_type === 'string' ? args.controller_type.trim() : 'chatgpt';
|
|
850
864
|
if (controllerType !== 'chatgpt') {
|
|
@@ -925,25 +939,14 @@ export async function evaluateSchedule(
|
|
|
925
939
|
? args.continuation_prompt
|
|
926
940
|
: `Scheduled browser watcher ${schedule.scheduleId} detected a changed external observation. Read the current external state, correlate it with Work ${workId}, and continue only the bounded Work objective.`,
|
|
927
941
|
};
|
|
928
|
-
return
|
|
942
|
+
return executeControllerProgression(controllerHome, observedSchedule, occurrence, timestamp, wakeArgs, { ...observationEvidence, observationStatus });
|
|
929
943
|
} catch (error) {
|
|
930
944
|
const reason = error instanceof Error ? error.message : String(error);
|
|
931
945
|
const failed = applyScheduleFailure(controllerHome, schedule.scheduleId, schedule.repoId, occurrence.occurrenceId, {
|
|
932
946
|
outcome: 'failed',
|
|
933
947
|
decision: 'execute',
|
|
934
948
|
reason,
|
|
935
|
-
|
|
936
|
-
title: `Browser watcher occurrence ${occurrence.occurrenceId} failed`,
|
|
937
|
-
summary: 'A bounded browser probe failed before Forge could compare the external observation.',
|
|
938
|
-
reason,
|
|
939
|
-
creationReason: 'repeated_infrastructure_failure',
|
|
940
|
-
blockingDecision: 'Repair browser/session readiness or update the watcher target before unattended probing resumes.',
|
|
941
|
-
recommendedDecision: 'Inspect the browser plugin/session and retrigger the watcher after the target is readable.',
|
|
942
|
-
recommendedPrompt: `Inspect browser watcher schedule ${schedule.scheduleId} for Work ${workId}, repair the failed browser probe, then retrigger one bounded occurrence.`,
|
|
943
|
-
statusSummary: 'Scheduled browser watcher failed.',
|
|
944
|
-
blockedBy: ['browser_probe_failed'],
|
|
945
|
-
attemptedActions: [`schedule:${schedule.scheduleId}`, `work:${workId}`, 'operation:browser_probe'],
|
|
946
|
-
},
|
|
949
|
+
|
|
947
950
|
});
|
|
948
951
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({ lastTriggeredAt: timestamp, lastOccurrenceId: occurrenceId }));
|
|
949
952
|
return failed.occurrence ?? saveOccurrence(controllerHome, { ...occurrence, status: 'failed', decision: 'execute', reason });
|
|
@@ -1008,22 +1011,7 @@ export async function evaluateSchedule(
|
|
|
1008
1011
|
outcome: 'failed',
|
|
1009
1012
|
decision: 'execute',
|
|
1010
1013
|
reason,
|
|
1011
|
-
|
|
1012
|
-
title: `Scheduled maintenance occurrence ${occurrence.occurrenceId} failed`,
|
|
1013
|
-
summary: 'A bounded live maintenance occurrence failed during deterministic apply and requires review before the schedule continues unattended.',
|
|
1014
|
-
reason,
|
|
1015
|
-
creationReason: 'repeated_infrastructure_failure',
|
|
1016
|
-
blockingDecision: 'Review the failed maintenance occurrence and decide whether the schedule should continue automatically.',
|
|
1017
|
-
recommendedDecision: 'Inspect the failed occurrence, fix the runtime blocker, then re-enable or retrigger the schedule intentionally.',
|
|
1018
|
-
recommendedPrompt: `Review schedule occurrence ${occurrence.occurrenceId} for ${schedule.scheduleId}, inspect the failed runtime maintenance action, and decide whether to resume automatic maintenance.`,
|
|
1019
|
-
statusSummary: 'Scheduled maintenance execution failed.',
|
|
1020
|
-
blockedBy: ['scheduled_execution_failed'],
|
|
1021
|
-
attemptedActions: [
|
|
1022
|
-
`schedule:${schedule.scheduleId}`,
|
|
1023
|
-
`operation:${schedule.action.operation}`,
|
|
1024
|
-
actionIdRaw ? `action:${actionIdRaw}` : 'action:unknown',
|
|
1025
|
-
],
|
|
1026
|
-
},
|
|
1014
|
+
|
|
1027
1015
|
});
|
|
1028
1016
|
updateSchedule(controllerHome, schedule.repoId, schedule.scheduleId, () => ({
|
|
1029
1017
|
lastTriggeredAt: timestamp,
|
|
@@ -5,6 +5,7 @@ import { resolveControllerHome } from '../../../cli/repositories/controller-home
|
|
|
5
5
|
import { getSchedule, saveSchedule } from '../../../../packages/kernel/scheduler/api/index';
|
|
6
6
|
|
|
7
7
|
const EXTERNAL_CONTROLLER_WAKE_OPERATION = 'external_controller_wake';
|
|
8
|
+
const CONTROLLER_PROGRESSION_OPERATION = 'controller_progression';
|
|
8
9
|
|
|
9
10
|
export interface PendingContinuationActivationMarker {
|
|
10
11
|
schemaVersion: 1;
|
|
@@ -53,8 +54,9 @@ export function queuePendingContinuationActivation(
|
|
|
53
54
|
scheduleId: string,
|
|
54
55
|
): PendingContinuationActivationMarker {
|
|
55
56
|
const schedule = getSchedule(controllerHome, repoId, scheduleId);
|
|
56
|
-
if (schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION
|
|
57
|
-
|
|
57
|
+
if (schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION
|
|
58
|
+
&& schedule.action.operation !== CONTROLLER_PROGRESSION_OPERATION) {
|
|
59
|
+
throw new Error('PENDING_CONTINUATION_ACTIVATION_REQUIRES_WORK_CONTINUATION');
|
|
58
60
|
}
|
|
59
61
|
const workId = schedule.action.arguments?.work_id;
|
|
60
62
|
if (typeof workId !== 'string' || !workId.trim()) {
|
|
@@ -108,7 +110,8 @@ export function applyPendingContinuationActivations(controllerHome: string): Pen
|
|
|
108
110
|
const marker = readMarker(path);
|
|
109
111
|
const schedule = getSchedule(controllerHome, marker.repoId, marker.scheduleId);
|
|
110
112
|
const workId = schedule.action.arguments?.work_id;
|
|
111
|
-
if (schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION
|
|
113
|
+
if ((schedule.action.operation !== EXTERNAL_CONTROLLER_WAKE_OPERATION
|
|
114
|
+
&& schedule.action.operation !== CONTROLLER_PROGRESSION_OPERATION) || workId !== marker.workId) {
|
|
112
115
|
results.push({ ...marker, status: 'failed', reason: 'Schedule no longer targets the queued Work continuation.' });
|
|
113
116
|
continue;
|
|
114
117
|
}
|
|
@@ -122,7 +125,11 @@ export function applyPendingContinuationActivations(controllerHome: string): Pen
|
|
|
122
125
|
results.push({ ...marker, status: 'already_active' });
|
|
123
126
|
continue;
|
|
124
127
|
}
|
|
125
|
-
saveSchedule(controllerHome, {
|
|
128
|
+
saveSchedule(controllerHome, {
|
|
129
|
+
...schedule,
|
|
130
|
+
action: { ...schedule.action, operation: CONTROLLER_PROGRESSION_OPERATION },
|
|
131
|
+
policy: { ...schedule.policy, shadowMode: false },
|
|
132
|
+
});
|
|
126
133
|
rmSync(path, { force: true });
|
|
127
134
|
results.push({ ...marker, status: 'activated' });
|
|
128
135
|
} catch (error) {
|