@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,6 +1,6 @@
|
|
|
1
1
|
import type { RepositoryRecord } from '../../../cli/repositories/types';
|
|
2
2
|
import { cleanupRuntimeComputerInteractionTargets } from '../../root/computer-target-composition';
|
|
3
|
-
import { cleanupControllerHomeBrowserArtifacts,
|
|
3
|
+
import { cleanupControllerHomeBrowserArtifacts, cleanupGeneratedRepositoryCheckoutCaches, cleanupIdleXCTestDevices } from '../generated-cache-retention';
|
|
4
4
|
import {
|
|
5
5
|
cleanupRuntimeBrowserSessionTombstones,
|
|
6
6
|
closeRuntimeBrowserSessionLegacyImportCutover,
|
|
@@ -8,18 +8,105 @@ import {
|
|
|
8
8
|
import type { cleanupControllerRuntimeState } from '../runtime-cleanup';
|
|
9
9
|
import type { reconcileTerminalWorkCleanups } from '../execution/work-terminal-cleanup';
|
|
10
10
|
import type { gcTerminalProcesses } from '../../execution/process-runtime/gc';
|
|
11
|
+
import { assertRuntimeMayWrite } from '../../root/write-fence';
|
|
11
12
|
import { cleanupPersistedCheckResults } from '../../execution/process-runtime/check-result-retention';
|
|
12
13
|
import { cleanupRetiredExecutionJobs } from '../../execution/jobs/store';
|
|
13
14
|
import type { reconcilePendingWorkValidations } from '../execution/work-validation-reconciler';
|
|
14
15
|
import type { reconcilePendingEditValidations } from '../execution/edit-validation-coordinator';
|
|
15
16
|
import {
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
controllerRoundBlockerClass,
|
|
18
|
+
listCurrentControllerRoundRelays,
|
|
18
19
|
} from '../../../../packages/kernel/controller/api/index';
|
|
19
|
-
import {
|
|
20
|
-
import { runWorkChatgptContinuation } from '../launcher/chatgpt-work-continuation';
|
|
20
|
+
import { settleWorkChatgptAutomationTab } from '../launcher/chatgpt-work-continuation';
|
|
21
21
|
import { getChatgptWorkConversationBinding } from '../../../../adapters/chatgpt/work-conversation-binding-store';
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
chatgptControllerRoundSettlementAttemptIdentity,
|
|
24
|
+
getChatgptControllerRoundSettlement,
|
|
25
|
+
} from '../../../../adapters/chatgpt/controller-round-settlement-store';
|
|
26
|
+
import { recordChatgptControllerRoundTabSettlement } from '../../root/controller-round-composition';
|
|
27
|
+
import { deriveForgeActionableFailureCode, maybeRegisterFailedReleaseSessionRepairs, maybeRegisterForgeActionableFailureRepair } from '../../diagnostics/incident-repair';
|
|
28
|
+
|
|
29
|
+
const PERIODIC_RETENTION_INTERVAL_MS = 5 * 60_000;
|
|
30
|
+
const PERIODIC_DEEP_RETENTION_INTERVAL_MS = 15 * 60_000;
|
|
31
|
+
// A provider-ambiguous ControllerRound remains durable and claimable, but its
|
|
32
|
+
// Forge-owned Chrome tab is not durable authority. Give an in-flight ChatGPT
|
|
33
|
+
// turn a bounded claim window, then release the ephemeral resource without
|
|
34
|
+
// replaying or clearing the semantic outcome-unknown fence.
|
|
35
|
+
const CHATGPT_OUTCOME_UNKNOWN_TAB_SETTLEMENT_GRACE_MS = 5 * 60_000;
|
|
36
|
+
// Retention is a fallback GC path, not the primary ControllerRound settlement path.
|
|
37
|
+
// Keep its external-effect volume deliberately small so one stale repository set
|
|
38
|
+
// cannot create a provider burst or hold a maintenance worker for hours.
|
|
39
|
+
const CHATGPT_TAB_SETTLEMENT_EFFECT_BUDGET_PER_PASS = 4;
|
|
40
|
+
|
|
41
|
+
function runtimeMaintenanceAuthorityCurrent(controllerHome: string): boolean {
|
|
42
|
+
const fence = assertRuntimeMayWrite('cleanup', controllerHome);
|
|
43
|
+
if (fence.allowed) return true;
|
|
44
|
+
console.error(`[forge cleanup] stale periodic cleanup worker fenced: ${fence.reason ?? 'denied'}`);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function registerSchedulerFailure(input: {
|
|
49
|
+
controllerHome: string;
|
|
50
|
+
source: 'progression' | 'maintenance';
|
|
51
|
+
prefix: string;
|
|
52
|
+
message: string;
|
|
53
|
+
observationId: string;
|
|
54
|
+
repoId?: string;
|
|
55
|
+
workId?: string;
|
|
56
|
+
atMs?: number;
|
|
57
|
+
}): void {
|
|
58
|
+
try {
|
|
59
|
+
maybeRegisterForgeActionableFailureRepair({
|
|
60
|
+
controllerHome: input.controllerHome,
|
|
61
|
+
observation: {
|
|
62
|
+
observationId: input.observationId,
|
|
63
|
+
source: input.source,
|
|
64
|
+
code: deriveForgeActionableFailureCode(input.prefix, input.message),
|
|
65
|
+
message: input.message,
|
|
66
|
+
at: new Date(input.atMs ?? Date.now()).toISOString(),
|
|
67
|
+
repoId: input.repoId,
|
|
68
|
+
workId: input.workId,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
} catch {
|
|
72
|
+
// Repair promotion is evidence-side reconciliation, not the owning maintenance result.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function planSchedulerPeriodicMaintenance(input: {
|
|
77
|
+
nowMs: number;
|
|
78
|
+
cleanupIntervalMs: number;
|
|
79
|
+
repositoryCount: number;
|
|
80
|
+
}): {
|
|
81
|
+
periodicSequence: number;
|
|
82
|
+
deepRetentionSequence: number;
|
|
83
|
+
generatedCacheRepositoryIndex?: number;
|
|
84
|
+
generatedCacheRootStartIndex: number;
|
|
85
|
+
runRetention: boolean;
|
|
86
|
+
runDeepRetention: boolean;
|
|
87
|
+
processGcRepositoryIndex?: number;
|
|
88
|
+
deepRetentionRepositoryIndex?: number;
|
|
89
|
+
} {
|
|
90
|
+
const cleanupIntervalMs = Math.max(1, input.cleanupIntervalMs);
|
|
91
|
+
const periodicSequence = Math.floor(input.nowMs / cleanupIntervalMs);
|
|
92
|
+
const retentionEvery = Math.max(1, Math.ceil(PERIODIC_RETENTION_INTERVAL_MS / cleanupIntervalMs));
|
|
93
|
+
const deepRetentionEvery = Math.max(retentionEvery, Math.ceil(PERIODIC_DEEP_RETENTION_INTERVAL_MS / cleanupIntervalMs));
|
|
94
|
+
const repositoryCount = Math.max(0, Math.trunc(input.repositoryCount));
|
|
95
|
+
const deepRetentionSequence = Math.floor(periodicSequence / deepRetentionEvery);
|
|
96
|
+
return {
|
|
97
|
+
periodicSequence,
|
|
98
|
+
deepRetentionSequence,
|
|
99
|
+
generatedCacheRepositoryIndex: repositoryCount > 0 && periodicSequence % retentionEvery === 0
|
|
100
|
+
? Math.floor(periodicSequence / retentionEvery) % repositoryCount : undefined,
|
|
101
|
+
generatedCacheRootStartIndex: repositoryCount > 0 ? Math.floor(periodicSequence / retentionEvery / repositoryCount) : 0,
|
|
102
|
+
runRetention: periodicSequence % retentionEvery === 0,
|
|
103
|
+
runDeepRetention: periodicSequence % deepRetentionEvery === 0,
|
|
104
|
+
processGcRepositoryIndex: repositoryCount > 0 ? periodicSequence % repositoryCount : undefined,
|
|
105
|
+
deepRetentionRepositoryIndex: repositoryCount > 0 && periodicSequence % deepRetentionEvery === 0
|
|
106
|
+
? deepRetentionSequence % repositoryCount
|
|
107
|
+
: undefined,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
23
110
|
|
|
24
111
|
export async function runSchedulerPeriodicCleanup(input: {
|
|
25
112
|
controllerHome: string;
|
|
@@ -30,59 +117,194 @@ export async function runSchedulerPeriodicCleanup(input: {
|
|
|
30
117
|
runtimeCleanup: typeof cleanupControllerRuntimeState;
|
|
31
118
|
terminalWorkCleanup: typeof reconcileTerminalWorkCleanups;
|
|
32
119
|
processGc: typeof gcTerminalProcesses;
|
|
120
|
+
settleBrowserTab?: typeof settleWorkChatgptAutomationTab;
|
|
33
121
|
}): Promise<void> {
|
|
122
|
+
const plan = planSchedulerPeriodicMaintenance({
|
|
123
|
+
nowMs: input.nowMs,
|
|
124
|
+
cleanupIntervalMs: input.cleanupIntervalMs,
|
|
125
|
+
repositoryCount: input.repositories.length,
|
|
126
|
+
});
|
|
127
|
+
// The cleanup process inherits the spawning Runtime's exact write claim. Re-check
|
|
128
|
+
// that claim throughout a long pass so a detached child cannot survive a Runtime
|
|
129
|
+
// rollover and continue producing effects under retired authority.
|
|
130
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
131
|
+
// Runtime-state phase rotation and terminal Work cleanup are lifecycle
|
|
132
|
+
// reconciliation, not retention. Keep them at the base cleanup cadence.
|
|
34
133
|
try {
|
|
35
134
|
input.runtimeCleanup(input.controllerHome, {
|
|
36
135
|
reason: 'periodic',
|
|
37
136
|
nowMs: input.nowMs,
|
|
38
|
-
periodicSequence:
|
|
137
|
+
periodicSequence: plan.periodicSequence,
|
|
39
138
|
protectedControllerPid: input.controllerPid,
|
|
40
139
|
});
|
|
41
140
|
} catch (error) {
|
|
141
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
142
|
+
registerSchedulerFailure({
|
|
143
|
+
controllerHome: input.controllerHome,
|
|
144
|
+
source: 'maintenance',
|
|
145
|
+
prefix: 'RUNTIME_CLEANUP_FAILED',
|
|
146
|
+
message: reason,
|
|
147
|
+
observationId: `maintenance:runtime-cleanup:${plan.periodicSequence}`,
|
|
148
|
+
atMs: input.nowMs,
|
|
149
|
+
});
|
|
42
150
|
console.error('[forge cleanup] periodic cleanup failed:', error);
|
|
43
151
|
}
|
|
152
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
44
153
|
try {
|
|
45
154
|
await input.terminalWorkCleanup(input.controllerHome, { nowMs: input.nowMs });
|
|
46
155
|
} catch (error) {
|
|
156
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
157
|
+
registerSchedulerFailure({
|
|
158
|
+
controllerHome: input.controllerHome,
|
|
159
|
+
source: 'maintenance',
|
|
160
|
+
prefix: 'TERMINAL_WORK_CLEANUP_FAILED',
|
|
161
|
+
message: reason,
|
|
162
|
+
observationId: `maintenance:terminal-work-cleanup:${plan.periodicSequence}`,
|
|
163
|
+
atMs: input.nowMs,
|
|
164
|
+
});
|
|
47
165
|
console.error('[forge cleanup] terminal Work cleanup failed:', error);
|
|
48
166
|
}
|
|
167
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
168
|
+
|
|
49
169
|
try {
|
|
50
|
-
|
|
51
|
-
if (xctestCleanup.error) console.error('[forge cleanup] XCTest device cleanup failed:', xctestCleanup.error);
|
|
170
|
+
maybeRegisterFailedReleaseSessionRepairs({ controllerHome: input.controllerHome, now: () => input.nowMs });
|
|
52
171
|
} catch (error) {
|
|
53
|
-
console.error('[forge cleanup]
|
|
172
|
+
console.error('[forge cleanup] release failure repair reconciliation failed:', error);
|
|
54
173
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
174
|
+
|
|
175
|
+
// Browser/computer tombstones are retention state. Their lifecycle truth is
|
|
176
|
+
// written synchronously by their owning authorities, so a five-minute sweep
|
|
177
|
+
// is sufficient and avoids repeating controller-wide scans every minute.
|
|
178
|
+
if (plan.runRetention) {
|
|
179
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
180
|
+
try {
|
|
181
|
+
closeRuntimeBrowserSessionLegacyImportCutover(
|
|
182
|
+
input.controllerHome,
|
|
183
|
+
input.repositories.map((repository) => ({ repoId: repository.repoId, repoRoot: repository.canonicalRoot })),
|
|
184
|
+
);
|
|
185
|
+
const browserSessions = cleanupRuntimeBrowserSessionTombstones(input.controllerHome, { nowMs: input.nowMs });
|
|
186
|
+
if (browserSessions.blockers.length > 0 || browserSessions.budgetExhausted) {
|
|
187
|
+
console.error('[forge cleanup] Browser session retention reported bounded blockers');
|
|
188
|
+
}
|
|
189
|
+
} catch (error) {
|
|
190
|
+
console.error('[forge cleanup] Browser session retention failed:', error);
|
|
191
|
+
}
|
|
192
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
193
|
+
try {
|
|
194
|
+
const computerTargets = await cleanupRuntimeComputerInteractionTargets(input.controllerHome, { nowMs: input.nowMs });
|
|
195
|
+
if (computerTargets.blockers.length > 0 || computerTargets.overCapacity || computerTargets.budgetExhausted) {
|
|
196
|
+
console.error('[forge cleanup] Computer interaction-target retention reported bounded blockers');
|
|
197
|
+
}
|
|
198
|
+
} catch (error) {
|
|
199
|
+
console.error('[forge cleanup] Computer interaction-target retention failed:', error);
|
|
200
|
+
}
|
|
201
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
202
|
+
let chatgptTabSettlementEffects = 0;
|
|
203
|
+
chatgptTabSettlementSweep:
|
|
204
|
+
for (const repository of input.repositories) {
|
|
205
|
+
const store = { controllerHome: input.controllerHome, repoId: repository.repoId };
|
|
206
|
+
for (const relay of listCurrentControllerRoundRelays(store, 100)) {
|
|
207
|
+
const blocker = controllerRoundBlockerClass(relay);
|
|
208
|
+
const outcomeUnknown = blocker === 'provider_dispatch_outcome_unknown';
|
|
209
|
+
const durableInactiveRound = ['waiting', 'waiting_for_user', 'goal_complete', 'failed'].includes(relay.status)
|
|
210
|
+
|| (relay.status === 'blocked' && !outcomeUnknown);
|
|
211
|
+
if (!durableInactiveRound && !outcomeUnknown) continue;
|
|
212
|
+
if (outcomeUnknown) {
|
|
213
|
+
const blockedAtMs = Date.parse(relay.updatedAt);
|
|
214
|
+
if (!Number.isFinite(blockedAtMs) || input.nowMs - blockedAtMs < CHATGPT_OUTCOME_UNKNOWN_TAB_SETTLEMENT_GRACE_MS) continue;
|
|
215
|
+
}
|
|
216
|
+
const existingSettlement = getChatgptControllerRoundSettlement(store, {
|
|
217
|
+
workId: relay.originWorkId,
|
|
218
|
+
relayScopeId: relay.relayScopeId,
|
|
219
|
+
});
|
|
220
|
+
if (existingSettlement && ['closed', 'preserved_user_owned', 'session_closed'].includes(existingSettlement.status)) continue;
|
|
221
|
+
const binding = getChatgptWorkConversationBinding(store, relay.originWorkId);
|
|
222
|
+
if (!binding?.latestBrowserSessionId) continue;
|
|
223
|
+
const attemptIdentity = chatgptControllerRoundSettlementAttemptIdentity({
|
|
224
|
+
browserSessionId: binding.latestBrowserSessionId,
|
|
225
|
+
authorizationGrantRefs: binding.authorizationGrantRefs,
|
|
226
|
+
});
|
|
227
|
+
// Failed close_page calls are commonly authorization failures. Retrying
|
|
228
|
+
// the same browser/grant tuple on every retention pass only creates
|
|
229
|
+
// provider traffic and audit churn; a changed resource or grant set is a
|
|
230
|
+
// distinct attempt and remains eligible for recovery.
|
|
231
|
+
if (existingSettlement?.status === 'failed' && existingSettlement.attemptIdentity === attemptIdentity) continue;
|
|
232
|
+
if (chatgptTabSettlementEffects >= CHATGPT_TAB_SETTLEMENT_EFFECT_BUDGET_PER_PASS) {
|
|
233
|
+
console.error('[forge cleanup] ChatGPT tab settlement reached bounded effect budget');
|
|
234
|
+
break chatgptTabSettlementSweep;
|
|
235
|
+
}
|
|
236
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
237
|
+
chatgptTabSettlementEffects += 1;
|
|
238
|
+
const settlement = await (input.settleBrowserTab ?? settleWorkChatgptAutomationTab)({
|
|
239
|
+
controllerHome: input.controllerHome,
|
|
240
|
+
workId: relay.originWorkId,
|
|
241
|
+
browserSessionId: binding.latestBrowserSessionId,
|
|
242
|
+
authorizationGrantRefs: binding.authorizationGrantRefs,
|
|
243
|
+
});
|
|
244
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
245
|
+
recordChatgptControllerRoundTabSettlement(store, {
|
|
246
|
+
workId: relay.originWorkId,
|
|
247
|
+
relayScopeId: relay.relayScopeId,
|
|
248
|
+
status: settlement.status,
|
|
249
|
+
error: settlement.error?.message,
|
|
250
|
+
attemptIdentity,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
63
253
|
}
|
|
64
|
-
} catch (error) {
|
|
65
|
-
console.error('[forge cleanup] Browser session retention failed:', error);
|
|
66
254
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
255
|
+
|
|
256
|
+
// Process GC includes stale-active reconciliation with a five-minute minimum
|
|
257
|
+
// age. Preserve the existing one-repository-per-base-pass round robin so that
|
|
258
|
+
// recovery remains smooth instead of concentrating all repositories in one
|
|
259
|
+
// periodic spike.
|
|
260
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
261
|
+
if (plan.processGcRepositoryIndex !== undefined) {
|
|
262
|
+
const processRepo = input.repositories[plan.processGcRepositoryIndex]!;
|
|
263
|
+
const result = input.processGc({ controllerHome: input.controllerHome, repoId: processRepo.repoId });
|
|
264
|
+
if (!result.ok) {
|
|
265
|
+
const reason = result.error ?? 'unknown error';
|
|
266
|
+
registerSchedulerFailure({
|
|
267
|
+
controllerHome: input.controllerHome,
|
|
268
|
+
source: 'maintenance',
|
|
269
|
+
prefix: 'PROCESS_GC_FAILED',
|
|
270
|
+
message: reason,
|
|
271
|
+
observationId: `maintenance:process-gc:${processRepo.repoId}:${plan.periodicSequence}`,
|
|
272
|
+
repoId: processRepo.repoId,
|
|
273
|
+
atMs: input.nowMs,
|
|
274
|
+
});
|
|
275
|
+
console.error('[forge cleanup] Process GC failed:', reason);
|
|
71
276
|
}
|
|
72
|
-
} catch (error) {
|
|
73
|
-
console.error('[forge cleanup] Computer interaction-target retention failed:', error);
|
|
74
277
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
|
|
278
|
+
|
|
279
|
+
// Cache production is much faster than evidence retention. Reuse the existing
|
|
280
|
+
// five-minute pass, one repository and one bounded budget per pass. The root
|
|
281
|
+
// ordinal advances per repository visit, not by the correlated global index.
|
|
282
|
+
if (plan.generatedCacheRepositoryIndex !== undefined) {
|
|
283
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
284
|
+
const cacheRepo = input.repositories[plan.generatedCacheRepositoryIndex]!;
|
|
285
|
+
try {
|
|
286
|
+
const generated = cleanupGeneratedRepositoryCheckoutCaches(cacheRepo, {
|
|
287
|
+
nowMs: input.nowMs, rootStartIndex: plan.generatedCacheRootStartIndex,
|
|
288
|
+
});
|
|
289
|
+
if (generated.errors.length > 0) console.error(`[forge cleanup] generated-cache retention reported ${generated.errors.length} error(s) for ${cacheRepo.repoId}`);
|
|
290
|
+
} catch (error) {
|
|
291
|
+
console.error(`[forge cleanup] generated-cache retention failed for ${cacheRepo.repoId}:`, error);
|
|
82
292
|
}
|
|
293
|
+
}
|
|
294
|
+
if (!plan.runDeepRetention) return;
|
|
295
|
+
if (!runtimeMaintenanceAuthorityCurrent(input.controllerHome)) return;
|
|
296
|
+
|
|
297
|
+
// Generated caches and persisted artifacts have hour/day-scale retention
|
|
298
|
+
// thresholds. Run one repository per deep-retention pass, and rotate the
|
|
299
|
+
// repository index on the deep cadence rather than the one-minute sequence.
|
|
300
|
+
try {
|
|
301
|
+
const xctestCleanup = cleanupIdleXCTestDevices(input.controllerHome);
|
|
302
|
+
if (xctestCleanup.error) console.error('[forge cleanup] XCTest device cleanup failed:', xctestCleanup.error);
|
|
83
303
|
} catch (error) {
|
|
84
|
-
console.error(
|
|
304
|
+
console.error('[forge cleanup] XCTest device cleanup failed:', error);
|
|
85
305
|
}
|
|
306
|
+
if (plan.deepRetentionRepositoryIndex === undefined) return;
|
|
307
|
+
const repo = input.repositories[plan.deepRetentionRepositoryIndex]!;
|
|
86
308
|
try {
|
|
87
309
|
const browserArtifacts = cleanupControllerHomeBrowserArtifacts(input.controllerHome, repo.repoId, { nowMs: input.nowMs });
|
|
88
310
|
if (browserArtifacts.errors.length > 0 || Object.values(browserArtifacts.classes).some((item) => item.overCapacity)) {
|
|
@@ -91,8 +313,6 @@ export async function runSchedulerPeriodicCleanup(input: {
|
|
|
91
313
|
} catch (error) {
|
|
92
314
|
console.error(`[forge cleanup] Browser artifact retention failed for ${repo.repoId}:`, error);
|
|
93
315
|
}
|
|
94
|
-
const result = input.processGc({ controllerHome: input.controllerHome, repoId: repo.repoId });
|
|
95
|
-
if (!result.ok) console.error('[forge cleanup] Process GC failed:', result.error ?? 'unknown error');
|
|
96
316
|
try {
|
|
97
317
|
const checkResults = cleanupPersistedCheckResults(input.controllerHome, repo.repoId, { nowMs: input.nowMs });
|
|
98
318
|
if (checkResults.blockers.length > 0 || checkResults.budgetExhausted) {
|
|
@@ -132,84 +352,3 @@ export async function runSchedulerValidationReconciliation(input: {
|
|
|
132
352
|
}
|
|
133
353
|
}
|
|
134
354
|
}
|
|
135
|
-
|
|
136
|
-
export async function runSchedulerControllerRoundRecovery(input: {
|
|
137
|
-
controllerHome: string;
|
|
138
|
-
nowMs: number;
|
|
139
|
-
repositories: readonly Pick<RepositoryRecord, 'repoId' | 'canonicalRoot' | 'localRoot'>[];
|
|
140
|
-
graceMs?: number;
|
|
141
|
-
maxRecoveries?: number;
|
|
142
|
-
dispatchPrompt?: typeof runWorkChatgptContinuation;
|
|
143
|
-
authorizeWake?: typeof assertAutomatedOperationAllowed;
|
|
144
|
-
}): Promise<{ claimed: number; dispatched: number; failed: number }> {
|
|
145
|
-
const dispatchPrompt = input.dispatchPrompt ?? runWorkChatgptContinuation;
|
|
146
|
-
const authorizeWake = input.authorizeWake ?? assertAutomatedOperationAllowed;
|
|
147
|
-
const maxRecoveries = Math.max(1, Math.min(Math.trunc(input.maxRecoveries ?? 2), 8));
|
|
148
|
-
let claimed = 0;
|
|
149
|
-
let dispatched = 0;
|
|
150
|
-
let failed = 0;
|
|
151
|
-
|
|
152
|
-
for (const repository of input.repositories) {
|
|
153
|
-
if (claimed >= maxRecoveries) break;
|
|
154
|
-
const store = { controllerHome: input.controllerHome, repoId: repository.repoId };
|
|
155
|
-
let records: ReturnType<typeof claimStalledControllerRoundRelays>;
|
|
156
|
-
try {
|
|
157
|
-
records = claimStalledControllerRoundRelays(store, {
|
|
158
|
-
nowMs: input.nowMs,
|
|
159
|
-
graceMs: input.graceMs,
|
|
160
|
-
limit: maxRecoveries - claimed,
|
|
161
|
-
controllerTypes: ['chatgpt'],
|
|
162
|
-
});
|
|
163
|
-
} catch (error) {
|
|
164
|
-
const reason = error instanceof Error ? error.message : String(error);
|
|
165
|
-
failed += 1;
|
|
166
|
-
console.error(`[forge controller relay] stalled round scan failed for ${repository.repoId}:`, reason);
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
claimed += records.length;
|
|
170
|
-
for (const record of records) {
|
|
171
|
-
try {
|
|
172
|
-
authorizeWake('external_controller_wake', {
|
|
173
|
-
work_id: record.originWorkId,
|
|
174
|
-
controller_type: 'chatgpt',
|
|
175
|
-
relay_scope_id: record.relayScopeId,
|
|
176
|
-
recovery_reason: 'unclosed_dispatched_round',
|
|
177
|
-
});
|
|
178
|
-
const binding = getChatgptWorkConversationBinding(store, record.originWorkId);
|
|
179
|
-
const result = await dispatchPrompt({
|
|
180
|
-
controllerHome: input.controllerHome,
|
|
181
|
-
repoId: repository.repoId,
|
|
182
|
-
repoRoot: repository.canonicalRoot ?? repository.localRoot,
|
|
183
|
-
workId: record.originWorkId,
|
|
184
|
-
prompt: renderChatgptControllerRoundPrompt(store, record, { exactOriginWork: !record.requirementId }),
|
|
185
|
-
browserSessionId: binding?.latestBrowserSessionId,
|
|
186
|
-
conversationUrl: binding?.conversationUrl,
|
|
187
|
-
model: 'gpt-5.6',
|
|
188
|
-
reasoning: 'high',
|
|
189
|
-
tabPolicy: 'auto',
|
|
190
|
-
timeoutMs: 30_000,
|
|
191
|
-
});
|
|
192
|
-
if (result.status === 'failed') throw new Error(result.error?.message ?? 'CHATGPT_CONTROLLER_RELAY_RECOVERY_FAILED');
|
|
193
|
-
const updatedBinding = getChatgptWorkConversationBinding(store, record.originWorkId);
|
|
194
|
-
finishControllerRoundRelayDispatch(store, {
|
|
195
|
-
workId: record.originWorkId,
|
|
196
|
-
ok: true,
|
|
197
|
-
bindingId: updatedBinding?.bindingId,
|
|
198
|
-
});
|
|
199
|
-
dispatched += 1;
|
|
200
|
-
} catch (error) {
|
|
201
|
-
const reason = error instanceof Error ? error.message : String(error);
|
|
202
|
-
finishControllerRoundRelayDispatch(store, {
|
|
203
|
-
workId: record.originWorkId,
|
|
204
|
-
ok: false,
|
|
205
|
-
error: reason,
|
|
206
|
-
recovery: true,
|
|
207
|
-
nowMs: input.nowMs,
|
|
208
|
-
});
|
|
209
|
-
failed += 1;
|
|
210
|
-
console.error(`[forge controller relay] stalled round recovery failed for ${record.relayScopeId}:`, reason);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return { claimed, dispatched, failed };
|
|
215
|
-
}
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
childReferenceFromJob,
|
|
9
9
|
childReferenceFromReceipt,
|
|
10
10
|
hasDurableChildReference,
|
|
11
|
-
|
|
11
|
+
isAgentDelegationJob,
|
|
12
12
|
mergeChildReferences,
|
|
13
13
|
buildDelegatedExecutionResult,
|
|
14
14
|
} from '../../execution/jobs/child-reference';
|
|
@@ -17,6 +17,7 @@ import { operationReceiptMatchesJobOwnership, readOperationReceipt } from '../..
|
|
|
17
17
|
import { releaseExecutionLeases, renewExecutionLeases } from '../../resources/leases/store';
|
|
18
18
|
import { isProcessAlive, terminateProcessTree, terminateProcessTreeSync, type ProcessTreeTerminationResult } from '../../shared/process-tree';
|
|
19
19
|
import { settleScheduledExecution } from '../../../../packages/kernel/scheduler/api/index';
|
|
20
|
+
import { isRuntimeWriteFenceError } from '../../root/write-fence';
|
|
20
21
|
|
|
21
22
|
const WORKER_HEARTBEAT_STALE_MS = 45_000;
|
|
22
23
|
|
|
@@ -33,16 +34,6 @@ function canAutomaticallyReplay(job: ExecutionJob): boolean {
|
|
|
33
34
|
return !hasPotentialSideEffects(job);
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
function isAgentDelegationJob(job: ExecutionJob): boolean {
|
|
37
|
-
return isAgentDelegationOperation(job.payload.operation)
|
|
38
|
-
|| job.type === 'agent-run'
|
|
39
|
-
|| job.type === 'dispatch-task'
|
|
40
|
-
|| job.payload.arguments?.agentDelegation === true
|
|
41
|
-
|| (job.payload.operation === 'legacy-local-job'
|
|
42
|
-
&& typeof job.payload.arguments?.localAction === 'string'
|
|
43
|
-
&& ['launch-task', 'quick-agent-session'].includes(String(job.payload.arguments.localAction)));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
37
|
function ambiguousStartedOperation(controllerHome: string, job: ExecutionJob): boolean {
|
|
47
38
|
const receipt = readOperationReceipt(controllerHome, job.repoId, job.jobId);
|
|
48
39
|
if (!receipt || !operationReceiptMatchesJobOwnership(receipt, job)) return false;
|
|
@@ -64,7 +55,7 @@ function recordIsolatedReconciliationFailure(job: ExecutionJob, error: unknown):
|
|
|
64
55
|
// Losing the canonical write fence is a Runtime-wide invariant violation,
|
|
65
56
|
// not corrupt state owned by one historical Job. Preserve the Scheduler's
|
|
66
57
|
// fatal path so Runtime Root can stop the complete Runtime.
|
|
67
|
-
if (
|
|
58
|
+
if (isRuntimeWriteFenceError(error)) throw error;
|
|
68
59
|
process.stderr.write(`${JSON.stringify({
|
|
69
60
|
event: 'forge_scheduler_execution_job_reconciliation_isolated',
|
|
70
61
|
repoId: job.repoId,
|
|
@@ -23,16 +23,15 @@ import { reconcileTerminalWorkCleanups } from '../execution/work-terminal-cleanu
|
|
|
23
23
|
import { gcTerminalProcesses } from '../../execution/process-runtime/gc';
|
|
24
24
|
import { reconcilePendingWorkValidations } from '../execution/work-validation-reconciler';
|
|
25
25
|
import { reconcilePendingEditValidations } from '../execution/edit-validation-coordinator';
|
|
26
|
-
import { schedulerDispatchAllowed } from '../facade/work-admission-policy';
|
|
27
26
|
import {
|
|
28
|
-
runSchedulerControllerRoundRecovery,
|
|
29
27
|
runSchedulerPeriodicCleanup,
|
|
30
28
|
runSchedulerValidationReconciliation,
|
|
31
29
|
} from './maintenance';
|
|
32
30
|
import { planSchedulerSourceSampling } from './source-scan';
|
|
31
|
+
import { runSchedulerAutonomousContinuationReconciliation } from './autonomous-continuation';
|
|
33
32
|
import {
|
|
34
33
|
runSchedulerDurableAdmission,
|
|
35
|
-
|
|
34
|
+
SCHEDULE_TICK_INTERVAL_MS,
|
|
36
35
|
} from './durable-admission';
|
|
37
36
|
import { sampleRepositoryGitStatusForRepositories } from '../../projections/git-status-sampler';
|
|
38
37
|
import { selectExecutionJobDispatchRepositories } from '../dispatch-priority';
|
|
@@ -98,7 +97,43 @@ export type { SchedulerWorkerCommand, SchedulerWorkerLaunchDescriptor } from './
|
|
|
98
97
|
export { selectSchedulerSourceScanRepositories } from './source-scan';
|
|
99
98
|
|
|
100
99
|
const DARWIN_MEMORY_SAMPLE_TTL_MS = 5_000;
|
|
100
|
+
export const SCHEDULER_RECONCILIATION_INTERVAL_MS = 5_000;
|
|
101
101
|
const RUNTIME_CLEANUP_INTERVAL_MS = Math.max(30_000, Number(process.env.FORGE_RUNTIME_CLEANUP_INTERVAL_MS ?? 60_000));
|
|
102
|
+
|
|
103
|
+
function remainingRecurringDeadlineMs(nowMs: number, lastRanAt: number, intervalMs: number): number {
|
|
104
|
+
if (lastRanAt <= 0) return intervalMs;
|
|
105
|
+
const elapsed = Math.max(0, nowMs - lastRanAt);
|
|
106
|
+
return elapsed < intervalMs ? intervalMs - elapsed : intervalMs;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function schedulerIdleWaitDelayMs(input: {
|
|
110
|
+
nowMs: number;
|
|
111
|
+
lastScheduleTickAt: number;
|
|
112
|
+
}): number {
|
|
113
|
+
// Idle execution is event-driven. ExecutionJob/lease/policy mutations and
|
|
114
|
+
// check Process terminal persistence wake the scheduler immediately through
|
|
115
|
+
// the existing notification revision. The 30-second schedule cadence is the
|
|
116
|
+
// bounded idle lost-event safety deadline.
|
|
117
|
+
return remainingRecurringDeadlineMs(
|
|
118
|
+
input.nowMs,
|
|
119
|
+
input.lastScheduleTickAt,
|
|
120
|
+
SCHEDULE_TICK_INTERVAL_MS,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function schedulerActiveWaitDelayMs(input: {
|
|
125
|
+
nowMs: number;
|
|
126
|
+
lastReconcileAt: number;
|
|
127
|
+
}): number {
|
|
128
|
+
// Active execution uses the same canonical wake notifications as idle
|
|
129
|
+
// execution. A full scheduler tick is only the lost-event safety net, bounded
|
|
130
|
+
// by the existing reconciliation cadence instead of the legacy 250ms poll.
|
|
131
|
+
return remainingRecurringDeadlineMs(
|
|
132
|
+
input.nowMs,
|
|
133
|
+
input.lastReconcileAt,
|
|
134
|
+
SCHEDULER_RECONCILIATION_INTERVAL_MS,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
102
137
|
const DARWIN_RECLAIMABLE_PAGE_LABELS = new Set([
|
|
103
138
|
'Pages free',
|
|
104
139
|
'Pages inactive',
|
|
@@ -510,7 +545,7 @@ export class GlobalScheduler {
|
|
|
510
545
|
this.lastTickAt = this.lastHeartbeatAt;
|
|
511
546
|
this.persistState();
|
|
512
547
|
const repositories = this.repositoryList(this.controllerHome).filter((repo) => repo.enabled && !repo.removedAt);
|
|
513
|
-
let
|
|
548
|
+
let reconciliationRan = false;
|
|
514
549
|
if (now - this.lastCleanupAt >= RUNTIME_CLEANUP_INTERVAL_MS) {
|
|
515
550
|
// Advance the interval before cleanup so a failing pass cannot create a
|
|
516
551
|
// tight retry loop on every scheduler tick. Canonical Runtime launches the
|
|
@@ -531,9 +566,8 @@ export class GlobalScheduler {
|
|
|
531
566
|
processGc: this.processGc,
|
|
532
567
|
});
|
|
533
568
|
}
|
|
534
|
-
periodicCleanupRan = true;
|
|
535
569
|
}
|
|
536
|
-
if (now - this.lastReconcile >=
|
|
570
|
+
if (now - this.lastReconcile >= SCHEDULER_RECONCILIATION_INTERVAL_MS) {
|
|
537
571
|
await reconcileExecutionJobsAsync(this.controllerHome);
|
|
538
572
|
for (const repository of repositories) {
|
|
539
573
|
try {
|
|
@@ -551,6 +585,7 @@ export class GlobalScheduler {
|
|
|
551
585
|
});
|
|
552
586
|
this.lastReconcile = now;
|
|
553
587
|
this.lastReconcileAt = new Date(now).toISOString();
|
|
588
|
+
reconciliationRan = true;
|
|
554
589
|
}
|
|
555
590
|
const activeJobSnapshot = listActiveExecutionJobs(this.controllerHome);
|
|
556
591
|
const activeSourceRepoIds = new Set(activeJobSnapshot.map((job) => job.repoId));
|
|
@@ -587,34 +622,17 @@ export class GlobalScheduler {
|
|
|
587
622
|
.map((repository) => [repository.repoId, repository] as const),
|
|
588
623
|
).values());
|
|
589
624
|
this.sourceScansAvoided += sourceSampling.avoidedRepositoryCount;
|
|
590
|
-
//
|
|
591
|
-
//
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
// existing Work continuations can keep draining the backlog.
|
|
595
|
-
const admissionPolicyRequired = periodicCleanupRan || schedulerDurableAdmissionRequiresPolicy({
|
|
596
|
-
activeJobs: activeJobSnapshot,
|
|
597
|
-
nowMs: now,
|
|
598
|
-
lastScheduleTickAt: this.lastScheduleTick,
|
|
599
|
-
});
|
|
600
|
-
if (admissionPolicyRequired && !schedulerDispatchAllowed(this.controllerHome)) {
|
|
601
|
-
refreshSchedulerRepositoryProjections({
|
|
602
|
-
controllerHome: this.controllerHome,
|
|
603
|
-
repositories,
|
|
604
|
-
sourceScanRepositories: projectionMaintenanceRepositories,
|
|
605
|
-
projectionRefreshRepoIds: [],
|
|
606
|
-
controllerPid: this.controllerPid,
|
|
607
|
-
});
|
|
608
|
-
this.lastHeartbeatAt = new Date().toISOString();
|
|
609
|
-
this.persistState(true);
|
|
610
|
-
return { activeJobs: activeJobSnapshot.length };
|
|
611
|
-
}
|
|
612
|
-
if (periodicCleanupRan) {
|
|
613
|
-
await runSchedulerControllerRoundRecovery({
|
|
625
|
+
// Migration-era global Work admission gates are retired. Scheduler dispatch
|
|
626
|
+
// is constrained by durable admission, placement and concrete resource authority.
|
|
627
|
+
if (reconciliationRan) {
|
|
628
|
+
const liveness = await runSchedulerAutonomousContinuationReconciliation({
|
|
614
629
|
controllerHome: this.controllerHome,
|
|
615
630
|
nowMs: now,
|
|
616
631
|
repositories,
|
|
617
632
|
});
|
|
633
|
+
if (liveness.failed > 0) {
|
|
634
|
+
console.error('[forge liveness] controller progression reconciliation reported ' + liveness.failed + ' failure(s)');
|
|
635
|
+
}
|
|
618
636
|
}
|
|
619
637
|
const durableAdmission = await runSchedulerDurableAdmission({
|
|
620
638
|
controllerHome: this.controllerHome,
|
|
@@ -731,30 +749,38 @@ export class GlobalScheduler {
|
|
|
731
749
|
this.persistState(true);
|
|
732
750
|
}, this.config.heartbeatIntervalMs);
|
|
733
751
|
heartbeatTimer.unref?.();
|
|
734
|
-
let idleStreak = 0;
|
|
735
752
|
let activeJobs = 0;
|
|
736
753
|
try {
|
|
737
754
|
while (!signal?.aborted) {
|
|
755
|
+
let tickFailed = false;
|
|
738
756
|
try {
|
|
739
757
|
activeJobs = (await this.tick()).activeJobs;
|
|
740
|
-
idleStreak = activeJobs === 0 ? idleStreak + 1 : 0;
|
|
741
758
|
} catch (error) {
|
|
742
759
|
if (this.fatalOnTickError) throw error;
|
|
743
|
-
|
|
760
|
+
tickFailed = true;
|
|
744
761
|
this.lastHeartbeatAt = new Date().toISOString();
|
|
745
762
|
this.lastTickAt = this.lastHeartbeatAt;
|
|
746
763
|
this.persistState(true);
|
|
747
764
|
console.error('[forge scheduler] tick failed:', error);
|
|
748
765
|
}
|
|
749
|
-
const
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
766
|
+
const now = Date.now();
|
|
767
|
+
const delayMs = tickFailed
|
|
768
|
+
? this.config.pollIntervalMs
|
|
769
|
+
: activeJobs > 0
|
|
770
|
+
? schedulerActiveWaitDelayMs({
|
|
771
|
+
nowMs: now,
|
|
772
|
+
lastReconcileAt: this.lastReconcile,
|
|
773
|
+
})
|
|
774
|
+
: schedulerIdleWaitDelayMs({
|
|
775
|
+
nowMs: now,
|
|
776
|
+
lastScheduleTickAt: this.lastScheduleTick,
|
|
777
|
+
});
|
|
755
778
|
const wakeRevision = readSchedulerWakeSignal(this.controllerHome).revision;
|
|
756
779
|
const waitResult = await waitForSchedulerWakeSignal(this.controllerHome, wakeRevision, delayMs, signal, {
|
|
757
|
-
|
|
780
|
+
// fs.watch is authoritative for ordinary wakeups. Polling is only a
|
|
781
|
+
// lost-event safety net, so active execution must not regress to a
|
|
782
|
+
// 250ms JSON-read loop after removing the full-tick poll.
|
|
783
|
+
fallbackPollMs: Math.min(5_000, Math.max(1_000, delayMs)),
|
|
758
784
|
});
|
|
759
785
|
if (waitResult === 'aborted') break;
|
|
760
786
|
}
|