@moretea-labs/forge 1.8.0 → 1.8.1
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 +70 -7
- package/CHANGELOG.md +14 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +529 -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 +228 -1
- package/adapters/chatgpt/work-conversation-binding-store.ts +79 -53
- package/adapters/computer/chatgpt-extension-target.ts +463 -0
- package/adapters/computer/chatgpt-target-router.ts +103 -0
- package/adapters/computer/chrome-extension/background.js +385 -0
- package/adapters/computer/chrome-extension/content.js +378 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +30 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/interaction-target-authority.ts +142 -18
- package/adapters/mcp/auth.ts +0 -1
- package/adapters/mcp/instructions.ts +5 -4
- package/adapters/mcp/multi-repository.ts +3 -19
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/automation-receipt-adapter.ts +87 -0
- 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 +411 -73
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +91 -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 +8 -42
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +117 -45
- package/adapters/mcp/runtime-gateway/process-tools.ts +190 -22
- 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 +18 -504
- package/adapters/mcp/runtime-gateway/routing-policy.ts +499 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +14 -65
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +113 -173
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +15 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +1 -0
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +358 -266
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +136 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +261 -3122
- 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 +246 -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 +263 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +156 -0
- package/adapters/mcp/server.ts +67 -23
- package/adapters/mcp/setup.ts +1 -3
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +44 -170
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +4 -9
- package/adapters/mcp/tool-mapping/repository-tools.ts +133 -142
- package/adapters/mcp/toolset-names.ts +5 -0
- package/adapters/mcp/toolset.ts +6 -5
- package/adapters/mcp/transports/http-observation.ts +365 -0
- package/adapters/mcp/transports/http.ts +154 -677
- 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/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +25 -0
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/skill-version.json +2 -2
- package/docs/architecture/CURRENT.md +111 -41
- 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/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 +221 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +72 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +237 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/domains/verification.md +1 -0
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
- package/docs/forge-plugin-management.md +2 -2
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +1 -1
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +2 -0
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/standalone-disaster-recovery.md +14 -6
- package/docs/wiki/Implementation.md +1 -1
- package/package.json +25 -14
- 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 +297 -71
- 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 +77 -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/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 +153 -133
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +17 -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 +25 -63
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +819 -728
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- 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 +143 -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/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +48 -136
- package/scripts/check-runtime-architecture.mjs +622 -217
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/lib/project-init-lib.sh +3 -0
- package/scripts/open-source-audit-allowlist.txt +1 -2
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +0 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-mcp-http-runtime.ts +5 -0
- 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 +92 -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/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +11 -34
- package/src/cli/agent-jobs/integration.ts +18 -49
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- 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/recovery.ts +135 -121
- package/src/cli/commands/runtime.ts +3 -3
- 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 +4 -43
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/context/source-materializer.ts +81 -100
- package/src/cli/controller/context-pack.ts +10 -8
- 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 +24 -51
- 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 +39 -1
- package/src/cli/editing/edit-session.ts +1 -7
- package/src/cli/local-bridge/console-automations.ts +18 -13
- package/src/cli/local-bridge/console-view-models.ts +3 -12
- package/src/cli/local-bridge/facade-api.ts +64 -191
- 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-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +35 -16
- 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/registry.ts +77 -11
- package/src/cli/repositories/structured-git.ts +62 -2
- package/src/cli/repository/session-cache.ts +92 -6
- 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/semantic-navigation-contract.ts +9 -0
- package/src/runtime/context/semantic-navigation.ts +6 -34
- 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 +212 -9
- 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 +497 -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 +188 -109
- package/src/runtime/control-plane/execution/work-handle-store.ts +19 -43
- 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 +43 -27
- package/src/runtime/control-plane/execution/work-preparation-service.ts +126 -266
- 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 +173 -186
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -84
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +5 -1
- package/src/runtime/control-plane/facade/capability-registry.ts +362 -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 +8 -8
- package/src/runtime/control-plane/generated-cache-retention.ts +97 -1
- 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 +239 -112
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +2 -1
- 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/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +28 -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 +290 -21
- 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/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 +79 -27
- 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 +35 -2
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/workers/executor.ts +2 -6
- 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 +85 -28
- package/src/runtime/plugins/app-store-connect-adapter.ts +38 -14
- package/src/runtime/plugins/browser-adapter.ts +757 -34
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +321 -29
- package/src/runtime/plugins/browser-manifest-surface.ts +45 -11
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +16 -0
- package/src/runtime/plugins/browser-runtime.ts +14 -1
- 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 +219 -0
- package/src/runtime/plugins/computer-chatgpt-macos-target.ts +891 -0
- package/src/runtime/plugins/computer-registration.ts +222 -11
- 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/gmail-adapter.ts +23 -2
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +14 -7
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios-adapter.ts +1 -1
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -2
- 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 +602 -428
- package/src/runtime/plugins/types.ts +20 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +3 -3
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +29 -29
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +296 -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 +192 -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 +105 -19
- package/src/runtime/root/package-runtime-release.ts +117 -18
- package/src/runtime/root/package-runtime-service.ts +17 -11
- package/src/runtime/root/release-execution-canary.ts +44 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -6
- package/src/runtime/root/release-materialize.ts +372 -28
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +159 -27
- package/src/runtime/root/scheduled-controller-composition.ts +28 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +36 -33
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -3
- package/src/runtime/root/workflow-supervisor-composition.ts +493 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +209 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +76 -21
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/workspace-auth.ts +1 -1
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- 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 +3702 -342
- package/src/runtime/standalone-recovery/entry.ts +469 -39
- 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 +1 -1
- 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 +10 -3
- package/src/runtime/workflow/schedules/engine.ts +138 -172
- package/src/runtime/workflow/schedules/work-continuation.ts +44 -5
- 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 +201 -0
- package/supervisor/control-plane.ts +868 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +80 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +786 -0
- package/supervisor/native-messaging/host.ts +39 -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 +202 -0
- package/supervisor/server.ts +404 -0
- package/supervisor/store.ts +1451 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +255 -0
- 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/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-tarball-install-smoke.sh +0 -150
- 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/stage-runtime-release.ts +0 -44
- 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/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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash, randomUUID } from 'crypto';
|
|
2
2
|
import { existsSync, readdirSync, rmSync, statSync } from 'fs';
|
|
3
3
|
import { join } from 'path';
|
|
4
|
-
import { repositoryControllerRoot } from '../../../../src/cli/repositories/controller-home';
|
|
4
|
+
import { controllerSystemRoot, repositoryControllerRoot } from '../../../../src/cli/repositories/controller-home';
|
|
5
5
|
import { withControllerLock } from '../../../../src/cli/repositories/locks';
|
|
6
6
|
import {
|
|
7
7
|
createHandoffItem,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from '../../../../src/runtime/control-plane/facade/handoff-inbox-store';
|
|
12
12
|
import { readJsonFile, writeJsonAtomic } from '../../../../src/runtime/shared/json-files';
|
|
13
13
|
import { appendRuntimeEvent } from '../../../../src/runtime/evidence/event-ledger';
|
|
14
|
-
import type
|
|
14
|
+
import { type RepositorySchedule, type ScheduleDecision, type ScheduleOccurrence, type ScheduleDefinition, type ScheduleRuntimeState, extractScheduleDefinition, extractScheduleRuntimeState } from '../domain/schedule';
|
|
15
15
|
|
|
16
16
|
interface OccurrenceIndex {
|
|
17
17
|
schemaVersion: 1;
|
|
@@ -27,6 +27,19 @@ interface ScheduleRequestRecord {
|
|
|
27
27
|
repoId: string;
|
|
28
28
|
createdAt: string;
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
class ScheduleStoreError extends Error {
|
|
32
|
+
readonly code: 'SCHEDULE_REPOSITORY_PROVENANCE_MISMATCH';
|
|
33
|
+
readonly scheduleId: string;
|
|
34
|
+
|
|
35
|
+
constructor(scheduleId: string) {
|
|
36
|
+
super(`SCHEDULE_REPOSITORY_PROVENANCE_MISMATCH: ${scheduleId}`);
|
|
37
|
+
this.name = 'ScheduleStoreError';
|
|
38
|
+
this.code = 'SCHEDULE_REPOSITORY_PROVENANCE_MISMATCH';
|
|
39
|
+
this.scheduleId = scheduleId;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
30
43
|
type CreateScheduleInput = Omit<RepositorySchedule, 'schemaVersion' | 'revision' | 'scheduleId' | 'createdAt' | 'updatedAt' | 'consecutiveFailures'>;
|
|
31
44
|
type ScheduleMutableUpdate = Partial<Omit<RepositorySchedule, 'schemaVersion' | 'revision' | 'scheduleId' | 'repoId' | 'requestId' | 'createdAt' | 'updatedAt'>>;
|
|
32
45
|
|
|
@@ -34,7 +47,7 @@ export interface ScheduleOccurrenceHandoffInput {
|
|
|
34
47
|
title: string;
|
|
35
48
|
summary: string;
|
|
36
49
|
reason: string;
|
|
37
|
-
creationReason: 'ambiguous_outcome' | 'missing_authorization'
|
|
50
|
+
creationReason: 'ambiguous_outcome' | 'missing_authorization';
|
|
38
51
|
blockingDecision: string;
|
|
39
52
|
recommendedDecision: string;
|
|
40
53
|
recommendedPrompt: string;
|
|
@@ -44,27 +57,49 @@ export interface ScheduleOccurrenceHandoffInput {
|
|
|
44
57
|
evidenceRefs?: Array<{ title: string; summary?: string; detailLevel?: 'summary' | 'detail' | 'raw' }>;
|
|
45
58
|
}
|
|
46
59
|
|
|
47
|
-
function schedulesRoot(controllerHome: string
|
|
60
|
+
function schedulesRoot(controllerHome: string): string {
|
|
61
|
+
return join(controllerSystemRoot(controllerHome), 'schedules');
|
|
62
|
+
}
|
|
63
|
+
function legacySchedulesRoot(controllerHome: string, repoId: string): string {
|
|
48
64
|
return join(repositoryControllerRoot(controllerHome, repoId), 'schedules');
|
|
49
65
|
}
|
|
50
|
-
function schedulePath(controllerHome: string,
|
|
51
|
-
return join(schedulesRoot(controllerHome
|
|
66
|
+
function schedulePath(controllerHome: string, _repoId: string, scheduleId: string): string {
|
|
67
|
+
return join(schedulesRoot(controllerHome), 'records', `${scheduleId}.json`);
|
|
52
68
|
}
|
|
53
|
-
function
|
|
54
|
-
return join(
|
|
69
|
+
function legacySchedulePath(controllerHome: string, repoId: string, scheduleId: string): string {
|
|
70
|
+
return join(legacySchedulesRoot(controllerHome, repoId), 'records', `${scheduleId}.json`);
|
|
55
71
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
72
|
+
function occurrencePath(controllerHome: string, _repoId: string, occurrenceId: string): string {
|
|
73
|
+
return join(schedulesRoot(controllerHome), 'occurrences', `${occurrenceId}.json`);
|
|
74
|
+
}
|
|
75
|
+
function legacyOccurrencePath(controllerHome: string, repoId: string, occurrenceId: string): string {
|
|
76
|
+
return join(legacySchedulesRoot(controllerHome, repoId), 'occurrences', `${occurrenceId}.json`);
|
|
77
|
+
}
|
|
78
|
+
function decisionPath(controllerHome: string, _repoId: string, decisionId: string): string {
|
|
79
|
+
return join(schedulesRoot(controllerHome), 'decisions', `${decisionId}.json`);
|
|
80
|
+
}
|
|
81
|
+
function legacyDecisionPath(controllerHome: string, repoId: string, decisionId: string): string {
|
|
82
|
+
return join(legacySchedulesRoot(controllerHome, repoId), 'decisions', `${decisionId}.json`);
|
|
59
83
|
}
|
|
60
84
|
function occurrenceIndexPath(controllerHome: string, repoId: string): string {
|
|
61
|
-
|
|
85
|
+
const key = createHash('sha256').update(repoId).digest('hex').slice(0, 24);
|
|
86
|
+
return join(schedulesRoot(controllerHome), 'indexes', 'occurrences', `${key}.json`);
|
|
62
87
|
}
|
|
63
|
-
function
|
|
64
|
-
return
|
|
88
|
+
function requestTargetKey(input: Pick<RepositorySchedule, 'repoId' | 'scopeRef' | 'executionPlacement' | 'action'>): string {
|
|
89
|
+
return createHash('sha256').update(JSON.stringify(canonical({
|
|
90
|
+
scopeRef: input.scopeRef,
|
|
91
|
+
executionPlacement: input.executionPlacement,
|
|
92
|
+
repoId: input.repoId,
|
|
93
|
+
actionTarget: input.action.target,
|
|
94
|
+
operation: input.action.operation,
|
|
95
|
+
}))).digest('hex');
|
|
96
|
+
}
|
|
97
|
+
function requestPath(controllerHome: string, targetKey: string, requestId: string): string {
|
|
98
|
+
return join(schedulesRoot(controllerHome), 'indexes', 'requests', targetKey, `${createHash('sha256').update(requestId).digest('hex')}.json`);
|
|
65
99
|
}
|
|
66
100
|
|
|
67
101
|
export const SCHEDULE_OCCURRENCE_RECENT_LIMIT = 5_000;
|
|
102
|
+
export const SCHEDULE_CREATED_OCCURRENCE_STALE_MS = 5 * 60 * 1_000;
|
|
68
103
|
|
|
69
104
|
const EXTERNAL_CONTROLLER_WAKE_MAX_FAILURES = 3;
|
|
70
105
|
const EXTERNAL_CONTROLLER_WAKE_DAILY_BUDGET_MINUTES = 60;
|
|
@@ -131,8 +166,9 @@ export function createSchedule(controllerHome: string, input: CreateScheduleInpu
|
|
|
131
166
|
const requestId = input.requestId.trim();
|
|
132
167
|
if (!requestId) throw new Error('SCHEDULE_REQUEST_ID_REQUIRED');
|
|
133
168
|
const semanticKey = scheduleSemanticKey(input);
|
|
134
|
-
|
|
135
|
-
|
|
169
|
+
const targetKey = requestTargetKey(input);
|
|
170
|
+
return withControllerLock(controllerHome, { scope: 'global', resource: `schedule-request:${targetKey}:${createHash('sha256').update(requestId).digest('hex').slice(0, 16)}` }, `create-schedule:${requestId}`, () => {
|
|
171
|
+
const requestRecordPath = requestPath(controllerHome, targetKey, requestId);
|
|
136
172
|
if (existsSync(requestRecordPath)) {
|
|
137
173
|
const record = readJsonFile<ScheduleRequestRecord>(requestRecordPath);
|
|
138
174
|
if (record.semanticKey !== semanticKey) throw new Error(`SCHEDULE_REQUEST_ID_CONFLICT: ${requestId}`);
|
|
@@ -157,8 +193,18 @@ export function createSchedule(controllerHome: string, input: CreateScheduleInpu
|
|
|
157
193
|
}
|
|
158
194
|
|
|
159
195
|
export function getSchedule(controllerHome: string, repoId: string, scheduleId: string): RepositorySchedule {
|
|
160
|
-
const
|
|
161
|
-
|
|
196
|
+
const canonicalPath = schedulePath(controllerHome, repoId, scheduleId);
|
|
197
|
+
const legacyPath = legacySchedulePath(controllerHome, repoId, scheduleId);
|
|
198
|
+
const canonicalSchedule = existsSync(canonicalPath) ? readJsonFile<RepositorySchedule>(canonicalPath) : undefined;
|
|
199
|
+
const legacySchedule = existsSync(legacyPath) ? readJsonFile<RepositorySchedule>(legacyPath) : undefined;
|
|
200
|
+
if (canonicalSchedule && legacySchedule && JSON.stringify(canonicalSchedule) !== JSON.stringify(legacySchedule)) {
|
|
201
|
+
const canonicalRevision = Number.isFinite(canonicalSchedule.revision) ? canonicalSchedule.revision : 1;
|
|
202
|
+
const legacyRevision = Number.isFinite(legacySchedule.revision) ? legacySchedule.revision : 1;
|
|
203
|
+
if (canonicalRevision <= legacyRevision) throw new Error(`SCHEDULE_ID_COLLISION: ${scheduleId}`);
|
|
204
|
+
}
|
|
205
|
+
const schedule = canonicalSchedule ?? legacySchedule;
|
|
206
|
+
if (!schedule) throw new Error(`SCHEDULE_NOT_FOUND: ${scheduleId}`);
|
|
207
|
+
if (schedule.repoId !== repoId) throw new ScheduleStoreError(scheduleId);
|
|
162
208
|
return {
|
|
163
209
|
...schedule,
|
|
164
210
|
revision: Number.isFinite(schedule.revision) ? schedule.revision : 1,
|
|
@@ -194,7 +240,7 @@ function persistScheduleRevision(
|
|
|
194
240
|
* writers fail closed instead of overwriting a newer decision.
|
|
195
241
|
*/
|
|
196
242
|
export function saveSchedule(controllerHome: string, schedule: RepositorySchedule): RepositorySchedule {
|
|
197
|
-
return withControllerLock(controllerHome, { scope: '
|
|
243
|
+
return withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${schedule.scheduleId}` }, `save-schedule:${schedule.scheduleId}`, () => {
|
|
198
244
|
const current = getSchedule(controllerHome, schedule.repoId, schedule.scheduleId);
|
|
199
245
|
if (schedule.revision !== current.revision) {
|
|
200
246
|
throw new Error(`SCHEDULE_REVISION_CONFLICT: ${schedule.scheduleId}:expected=${schedule.revision}:actual=${current.revision}`);
|
|
@@ -215,7 +261,7 @@ export function updateSchedule(
|
|
|
215
261
|
scheduleId: string,
|
|
216
262
|
update: (current: RepositorySchedule) => ScheduleMutableUpdate,
|
|
217
263
|
): RepositorySchedule {
|
|
218
|
-
return withControllerLock(controllerHome, { scope: '
|
|
264
|
+
return withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${scheduleId}` }, `update-schedule:${scheduleId}`, () => {
|
|
219
265
|
const current = getSchedule(controllerHome, repoId, scheduleId);
|
|
220
266
|
const changes = update(current);
|
|
221
267
|
return persistScheduleRevision(controllerHome, current, { ...current, ...changes });
|
|
@@ -223,23 +269,34 @@ export function updateSchedule(
|
|
|
223
269
|
}
|
|
224
270
|
|
|
225
271
|
export function listSchedules(controllerHome: string, repoId: string): RepositorySchedule[] {
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
272
|
+
const ids = new Set<string>();
|
|
273
|
+
for (const root of [join(schedulesRoot(controllerHome), 'records'), join(legacySchedulesRoot(controllerHome, repoId), 'records')]) {
|
|
274
|
+
try {
|
|
275
|
+
for (const name of readdirSync(root)) if (name.endsWith('.json')) ids.add(name.slice(0, -'.json'.length));
|
|
276
|
+
} catch { /* missing storage root is empty */ }
|
|
277
|
+
}
|
|
278
|
+
return [...ids]
|
|
279
|
+
.flatMap((scheduleId) => {
|
|
280
|
+
try {
|
|
281
|
+
const schedule = getSchedule(controllerHome, repoId, scheduleId);
|
|
282
|
+
return schedule.repoId === repoId ? [schedule] : [];
|
|
283
|
+
} catch (error) {
|
|
284
|
+
if (error instanceof ScheduleStoreError && error.code === 'SCHEDULE_REPOSITORY_PROVENANCE_MISMATCH') return [];
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
})
|
|
288
|
+
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
232
289
|
}
|
|
233
290
|
|
|
234
291
|
export function deleteSchedule(controllerHome: string, repoId: string, scheduleId: string): RepositorySchedule {
|
|
235
|
-
return withControllerLock(controllerHome, { scope: '
|
|
292
|
+
return withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${scheduleId}` }, `delete-schedule:${scheduleId}`, () => {
|
|
236
293
|
const current = getSchedule(controllerHome, repoId, scheduleId);
|
|
237
294
|
if (current.enabled) throw new Error(`SCHEDULE_DELETE_REQUIRES_PAUSED: ${scheduleId}`);
|
|
238
295
|
if (listActiveOccurrences(controllerHome, repoId, scheduleId).length > 0) {
|
|
239
296
|
throw new Error(`SCHEDULE_DELETE_ACTIVE_OCCURRENCE: ${scheduleId}`);
|
|
240
297
|
}
|
|
241
298
|
rmSync(schedulePath(controllerHome, repoId, scheduleId), { force: true });
|
|
242
|
-
const requestRecordPath = requestPath(controllerHome,
|
|
299
|
+
const requestRecordPath = requestPath(controllerHome, requestTargetKey(current), current.requestId);
|
|
243
300
|
if (existsSync(requestRecordPath)) {
|
|
244
301
|
const record = readJsonFile<ScheduleRequestRecord>(requestRecordPath);
|
|
245
302
|
if (record.scheduleId === scheduleId) rmSync(requestRecordPath, { force: true });
|
|
@@ -257,83 +314,8 @@ export function deleteSchedule(controllerHome: string, repoId: string, scheduleI
|
|
|
257
314
|
}, 10_000);
|
|
258
315
|
}
|
|
259
316
|
|
|
260
|
-
function scheduleFailureClass(reason: string): string {
|
|
261
|
-
const trimmed = reason.trim();
|
|
262
|
-
const explicitCode = trimmed.match(/^([A-Z][A-Z0-9_]{2,})(?::|\b)/)?.[1];
|
|
263
|
-
if (explicitCode) return explicitCode;
|
|
264
|
-
const prefix = (trimmed.split(':', 1)[0] ?? trimmed)
|
|
265
|
-
.replace(/\s+/g, ' ')
|
|
266
|
-
.trim()
|
|
267
|
-
.toLowerCase()
|
|
268
|
-
.slice(0, 120);
|
|
269
|
-
return prefix || 'unknown_failure';
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
function activeScheduleFailureHandoff(
|
|
273
|
-
controllerHome: string,
|
|
274
|
-
repoId: string,
|
|
275
|
-
scheduleId: string,
|
|
276
|
-
creationReason: ScheduleOccurrenceHandoffInput['creationReason'],
|
|
277
|
-
reason: string,
|
|
278
|
-
) {
|
|
279
|
-
const failureClass = scheduleFailureClass(reason);
|
|
280
|
-
return listHandoffItems({ controllerHome, repoId, status: 'active', limit: 100 }).find((item) => (
|
|
281
|
-
item.currentState?.taskId === scheduleId
|
|
282
|
-
&& item.creationReason === creationReason
|
|
283
|
-
&& scheduleFailureClass(item.reason) === failureClass
|
|
284
|
-
));
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
function stableScheduleFailureHandoffId(
|
|
288
|
-
controllerHome: string,
|
|
289
|
-
repoId: string,
|
|
290
|
-
scheduleId: string,
|
|
291
|
-
creationReason: ScheduleOccurrenceHandoffInput['creationReason'],
|
|
292
|
-
reason: string,
|
|
293
|
-
occurrenceId: string,
|
|
294
|
-
): string {
|
|
295
|
-
const digest = createHash('sha256')
|
|
296
|
-
.update(`${scheduleId}:${creationReason}:${scheduleFailureClass(reason)}`)
|
|
297
|
-
.digest('hex')
|
|
298
|
-
.slice(0, 20);
|
|
299
|
-
const baseId = `schedule-failure-${digest}`;
|
|
300
|
-
if (!getHandoffItem({ controllerHome, repoId }, baseId)) return baseId;
|
|
301
|
-
// A previous failure streak may already have resolved the stable item. Handoff
|
|
302
|
-
// records are immutable apart from lifecycle status, so use one new epoch id;
|
|
303
|
-
// subsequent failures in this streak will discover and reuse the active item.
|
|
304
|
-
const epoch = createHash('sha256').update(occurrenceId).digest('hex').slice(0, 8);
|
|
305
|
-
return `${baseId}-${epoch}`;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
function resolveRecoveredScheduleFailureHandoffs(controllerHome: string, occurrence: ScheduleOccurrence): void {
|
|
309
|
-
try {
|
|
310
|
-
const active = listHandoffItems({ controllerHome, repoId: occurrence.repoId, status: 'active', limit: 100 })
|
|
311
|
-
.filter((item) => (
|
|
312
|
-
item.currentState?.taskId === occurrence.scheduleId
|
|
313
|
-
&& item.creationReason === 'repeated_infrastructure_failure'
|
|
314
|
-
));
|
|
315
|
-
for (const item of active) {
|
|
316
|
-
try {
|
|
317
|
-
resolveHandoffItem(
|
|
318
|
-
{ controllerHome, repoId: occurrence.repoId },
|
|
319
|
-
item.id,
|
|
320
|
-
{
|
|
321
|
-
decision: `Schedule ${occurrence.scheduleId} recovered on occurrence ${occurrence.occurrenceId}.`,
|
|
322
|
-
resolver: 'schedule-runtime',
|
|
323
|
-
},
|
|
324
|
-
);
|
|
325
|
-
} catch {
|
|
326
|
-
// The succeeded occurrence remains authoritative. Inbox cleanup is
|
|
327
|
-
// best-effort and must never turn schedule recovery into a failure.
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
} catch {
|
|
331
|
-
// Preserve successful Schedule settlement even if Inbox storage is unavailable.
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
317
|
export function saveOccurrence(controllerHome: string, occurrence: ScheduleOccurrence): ScheduleOccurrence {
|
|
336
|
-
const next = withControllerLock(controllerHome, { scope: '
|
|
318
|
+
const next = withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${occurrence.scheduleId}` }, `save-occurrence:${occurrence.occurrenceId}`, () => {
|
|
337
319
|
const existingPath = occurrencePath(controllerHome, occurrence.repoId, occurrence.occurrenceId);
|
|
338
320
|
const previous = existsSync(existingPath) ? readJsonFile<ScheduleOccurrence>(existingPath) : undefined;
|
|
339
321
|
const expectedRevision = previous?.revision ?? 0;
|
|
@@ -347,13 +329,17 @@ export function saveOccurrence(controllerHome: string, occurrence: ScheduleOccur
|
|
|
347
329
|
appendRuntimeEvent(controllerHome, { repoId: saved.repoId, entityType: 'occurrence', entityId: saved.occurrenceId, eventType: `occurrence_${saved.status}`, requestId: `${schedule.requestId}:${saved.windowKey}`, revision: saved.revision, correlationId: saved.scheduleId, data: { decision: saved.decision, jobId: saved.jobId, reason: saved.reason } });
|
|
348
330
|
return saved;
|
|
349
331
|
}, 10_000);
|
|
350
|
-
if (next.status === 'succeeded' || next.status === 'dispatched') resolveRecoveredScheduleFailureHandoffs(controllerHome, next);
|
|
351
332
|
return next;
|
|
352
333
|
}
|
|
353
334
|
|
|
354
335
|
export function getOccurrence(controllerHome: string, repoId: string, occurrenceId: string): ScheduleOccurrence | undefined {
|
|
355
|
-
const
|
|
356
|
-
|
|
336
|
+
const canonicalPath = occurrencePath(controllerHome, repoId, occurrenceId);
|
|
337
|
+
if (existsSync(canonicalPath)) {
|
|
338
|
+
const occurrence = readJsonFile<ScheduleOccurrence>(canonicalPath);
|
|
339
|
+
return occurrence.repoId === repoId ? occurrence : undefined;
|
|
340
|
+
}
|
|
341
|
+
const legacyPath = legacyOccurrencePath(controllerHome, repoId, occurrenceId);
|
|
342
|
+
return existsSync(legacyPath) ? readJsonFile<ScheduleOccurrence>(legacyPath) : undefined;
|
|
357
343
|
}
|
|
358
344
|
|
|
359
345
|
export function recordScheduleOccurrenceHandoff(
|
|
@@ -363,20 +349,7 @@ export function recordScheduleOccurrenceHandoff(
|
|
|
363
349
|
input: ScheduleOccurrenceHandoffInput,
|
|
364
350
|
): ScheduleOccurrence {
|
|
365
351
|
if (occurrence.handoffId) return occurrence;
|
|
366
|
-
const
|
|
367
|
-
? activeScheduleFailureHandoff(controllerHome, occurrence.repoId, schedule.scheduleId, input.creationReason, input.reason)
|
|
368
|
-
: undefined;
|
|
369
|
-
if (reusable) return saveOccurrence(controllerHome, { ...occurrence, handoffId: reusable.id });
|
|
370
|
-
const handoffId = input.creationReason === 'repeated_infrastructure_failure'
|
|
371
|
-
? stableScheduleFailureHandoffId(
|
|
372
|
-
controllerHome,
|
|
373
|
-
occurrence.repoId,
|
|
374
|
-
schedule.scheduleId,
|
|
375
|
-
input.creationReason,
|
|
376
|
-
input.reason,
|
|
377
|
-
occurrence.occurrenceId,
|
|
378
|
-
)
|
|
379
|
-
: `schedule-${occurrence.occurrenceId}`;
|
|
352
|
+
const handoffId = `schedule-${occurrence.occurrenceId}`;
|
|
380
353
|
const evidenceRefs: NonNullable<ScheduleOccurrenceHandoffInput['evidenceRefs']> = [
|
|
381
354
|
{ title: `Occurrence ${occurrence.occurrenceId}`, summary: occurrence.reason ?? input.reason, detailLevel: 'summary' as const },
|
|
382
355
|
];
|
|
@@ -434,6 +407,36 @@ export function listActiveOccurrences(controllerHome: string, repoId: string, sc
|
|
|
434
407
|
});
|
|
435
408
|
}
|
|
436
409
|
|
|
410
|
+
/**
|
|
411
|
+
* A created occurrence must be settled by the same evaluateSchedule call that
|
|
412
|
+
* creates it. If the process dies or an early Controller/Supervisor exception
|
|
413
|
+
* escapes before that settlement, leaving it active permanently blocks the
|
|
414
|
+
* schedule's maxActiveOccurrences admission. Reclaim only old `created`
|
|
415
|
+
* records; queued/running work remains owned by the normal worker recovery
|
|
416
|
+
* path.
|
|
417
|
+
*/
|
|
418
|
+
export function reclaimStaleCreatedOccurrences(
|
|
419
|
+
controllerHome: string,
|
|
420
|
+
repoId: string,
|
|
421
|
+
scheduleId: string,
|
|
422
|
+
nowMs = Date.now(),
|
|
423
|
+
staleAfterMs = SCHEDULE_CREATED_OCCURRENCE_STALE_MS,
|
|
424
|
+
): ScheduleOccurrence[] {
|
|
425
|
+
const threshold = Math.max(1_000, staleAfterMs);
|
|
426
|
+
return listActiveOccurrences(controllerHome, repoId, scheduleId)
|
|
427
|
+
.filter((occurrence) => occurrence.status === 'created')
|
|
428
|
+
.filter((occurrence) => {
|
|
429
|
+
const createdAt = Date.parse(occurrence.createdAt);
|
|
430
|
+
return Number.isFinite(createdAt) && nowMs - createdAt >= threshold;
|
|
431
|
+
})
|
|
432
|
+
.map((occurrence) => saveOccurrence(controllerHome, {
|
|
433
|
+
...occurrence,
|
|
434
|
+
status: 'skipped',
|
|
435
|
+
decision: 'operation_blocked',
|
|
436
|
+
reason: `Orphaned created occurrence reclaimed after ${threshold}ms without Scheduler settlement.`,
|
|
437
|
+
}));
|
|
438
|
+
}
|
|
439
|
+
|
|
437
440
|
export function listOccurrences(controllerHome: string, repoId: string, scheduleId?: string, limit = 100): ScheduleOccurrence[] {
|
|
438
441
|
const bounded = Math.max(1, Math.min(limit, 1000));
|
|
439
442
|
const index = readOccurrenceIndex(controllerHome, repoId);
|
|
@@ -446,15 +449,17 @@ export function listOccurrences(controllerHome: string, repoId: string, schedule
|
|
|
446
449
|
});
|
|
447
450
|
if (indexed.length > 0) return indexed;
|
|
448
451
|
|
|
449
|
-
const
|
|
452
|
+
const roots = [join(schedulesRoot(controllerHome), 'occurrences'), join(legacySchedulesRoot(controllerHome, repoId), 'occurrences')];
|
|
450
453
|
try {
|
|
451
|
-
const legacy =
|
|
452
|
-
.map((name) => readJsonFile<ScheduleOccurrence>(join(root, name)))
|
|
454
|
+
const legacy = roots.flatMap((root) => {
|
|
455
|
+
try { return readdirSync(root).filter((name) => name.endsWith('.json')).map((name) => readJsonFile<ScheduleOccurrence>(join(root, name))); }
|
|
456
|
+
catch { return []; }
|
|
457
|
+
})
|
|
453
458
|
.filter((entry) => !scheduleId || entry.scheduleId === scheduleId)
|
|
454
459
|
.sort((a, b) => b.createdAt.localeCompare(a.createdAt))
|
|
455
460
|
.slice(0, bounded);
|
|
456
461
|
if (legacy.length > 0) {
|
|
457
|
-
withControllerLock(controllerHome, { scope: '
|
|
462
|
+
withControllerLock(controllerHome, { scope: 'global', resource: `schedule-index:${repoId}` }, `schedule-index-backfill:${repoId}`, () => {
|
|
458
463
|
for (const occurrence of legacy) upsertOccurrenceIndexUnlocked(controllerHome, occurrence);
|
|
459
464
|
}, 10_000);
|
|
460
465
|
}
|
|
@@ -543,7 +548,7 @@ export function cleanupScheduleOccurrenceHistory(
|
|
|
543
548
|
return true;
|
|
544
549
|
};
|
|
545
550
|
|
|
546
|
-
const occurrenceRoot = join(schedulesRoot(controllerHome
|
|
551
|
+
const occurrenceRoot = join(schedulesRoot(controllerHome), 'occurrences');
|
|
547
552
|
let occurrenceNames: string[] = [];
|
|
548
553
|
try { occurrenceNames = readdirSync(occurrenceRoot).filter((name) => name.endsWith('.json')).sort(); }
|
|
549
554
|
catch { occurrenceNames = []; }
|
|
@@ -568,7 +573,7 @@ export function cleanupScheduleOccurrenceHistory(
|
|
|
568
573
|
}
|
|
569
574
|
if (!canRemove()) break;
|
|
570
575
|
try {
|
|
571
|
-
withControllerLock(controllerHome, { scope: '
|
|
576
|
+
withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${occurrence.scheduleId}` }, `cleanup-schedule-occurrence:${occurrence.occurrenceId}`, () => {
|
|
572
577
|
if (retainedOccurrenceIds(readOccurrenceIndex(controllerHome, repoId)).has(occurrence.occurrenceId)) {
|
|
573
578
|
skip('indexed_occurrence_recheck');
|
|
574
579
|
return;
|
|
@@ -588,7 +593,7 @@ export function cleanupScheduleOccurrenceHistory(
|
|
|
588
593
|
}
|
|
589
594
|
}
|
|
590
595
|
|
|
591
|
-
const decisionRoot = join(schedulesRoot(controllerHome
|
|
596
|
+
const decisionRoot = join(schedulesRoot(controllerHome), 'decisions');
|
|
592
597
|
let decisionNames: string[] = [];
|
|
593
598
|
try { decisionNames = readdirSync(decisionRoot).filter((name) => name.endsWith('.json')).sort(); }
|
|
594
599
|
catch { decisionNames = []; }
|
|
@@ -615,7 +620,7 @@ export function cleanupScheduleOccurrenceHistory(
|
|
|
615
620
|
}
|
|
616
621
|
if (!canRemove()) break;
|
|
617
622
|
try {
|
|
618
|
-
withControllerLock(controllerHome, { scope: '
|
|
623
|
+
withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${decision.scheduleId}` }, `cleanup-schedule-decision:${decision.decisionId}`, () => {
|
|
619
624
|
if (retainedOccurrenceIds(readOccurrenceIndex(controllerHome, repoId)).has(decision.occurrenceId)) {
|
|
620
625
|
skip('indexed_decision_recheck');
|
|
621
626
|
return;
|
|
@@ -640,7 +645,7 @@ export function cleanupScheduleOccurrenceHistory(
|
|
|
640
645
|
|
|
641
646
|
|
|
642
647
|
export function saveScheduleDecision(controllerHome: string, decision: ScheduleDecision): ScheduleDecision {
|
|
643
|
-
return withControllerLock(controllerHome, { scope: '
|
|
648
|
+
return withControllerLock(controllerHome, { scope: 'global', resource: `schedule:${decision.scheduleId}` }, `save-schedule-decision:${decision.decisionId}`, () => {
|
|
644
649
|
const path = decisionPath(controllerHome, decision.repoId, decision.decisionId);
|
|
645
650
|
if (existsSync(path)) return readJsonFile<ScheduleDecision>(path);
|
|
646
651
|
writeJsonAtomic(path, decision);
|
|
@@ -659,8 +664,13 @@ export function saveScheduleDecision(controllerHome: string, decision: ScheduleD
|
|
|
659
664
|
}
|
|
660
665
|
|
|
661
666
|
export function getScheduleDecision(controllerHome: string, repoId: string, decisionId: string): ScheduleDecision | undefined {
|
|
662
|
-
const
|
|
663
|
-
|
|
667
|
+
const canonicalPath = decisionPath(controllerHome, repoId, decisionId);
|
|
668
|
+
if (existsSync(canonicalPath)) {
|
|
669
|
+
const decision = readJsonFile<ScheduleDecision>(canonicalPath);
|
|
670
|
+
return decision.repoId === repoId ? decision : undefined;
|
|
671
|
+
}
|
|
672
|
+
const legacyPath = legacyDecisionPath(controllerHome, repoId, decisionId);
|
|
673
|
+
return existsSync(legacyPath) ? readJsonFile<ScheduleDecision>(legacyPath) : undefined;
|
|
664
674
|
}
|
|
665
675
|
|
|
666
676
|
|
|
@@ -765,7 +775,7 @@ export function buildScheduleDedupeReport(controllerHome: string, repoId: string
|
|
|
765
775
|
export function applyScheduleDedupe(controllerHome: string, repoId: string, input: { dryRun?: unknown; confirmAuthorization?: unknown } = {}): ScheduleDedupeApplyResult {
|
|
766
776
|
const dryRun = input.dryRun === true;
|
|
767
777
|
if (!dryRun && input.confirmAuthorization !== true) throw new Error('SCHEDULE_DEDUPE_AUTHORIZATION_REQUIRED: confirm_authorization must be true to pause duplicate schedules');
|
|
768
|
-
return withControllerLock(controllerHome, { scope: '
|
|
778
|
+
return withControllerLock(controllerHome, { scope: 'global', resource: `schedule-dedupe:${repoId}` }, `schedule-dedupe:${repoId}`, () => {
|
|
769
779
|
const report = buildScheduleDedupeReport(controllerHome, repoId);
|
|
770
780
|
const disabled: ScheduleDedupeApplyResult['disabled'] = [];
|
|
771
781
|
if (!dryRun) {
|
|
@@ -783,3 +793,13 @@ export function applyScheduleDedupe(controllerHome: string, repoId: string, inpu
|
|
|
783
793
|
return { repoId, appliedAt: new Date().toISOString(), dryRun, report, disabled };
|
|
784
794
|
}, 10_000);
|
|
785
795
|
}
|
|
796
|
+
|
|
797
|
+
export function getScheduleDefinition(controllerHome: string, repoId: string, scheduleId: string): ScheduleDefinition {
|
|
798
|
+
const schedule = getSchedule(controllerHome, repoId, scheduleId);
|
|
799
|
+
return extractScheduleDefinition(schedule);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
export function getScheduleRuntimeState(controllerHome: string, repoId: string, scheduleId: string): ScheduleRuntimeState {
|
|
803
|
+
const schedule = getSchedule(controllerHome, repoId, scheduleId);
|
|
804
|
+
return extractScheduleRuntimeState(schedule);
|
|
805
|
+
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/** Stable in-process API for the Kernel Work module. */
|
|
2
2
|
export * from '../application/work-service';
|
|
3
3
|
export * from '../domain/implementation-review';
|
|
4
|
-
export * from '../domain/admission-policy';
|
|
5
4
|
export * from '../domain/check-receipt';
|
|
6
5
|
export * from '../domain/context-closure-receipt';
|
|
6
|
+
export * from '../domain/current-task-lineage';
|
|
7
|
+
export * from '../domain/objective-graph';
|
|
7
8
|
export * from '../domain/execution-snapshot';
|
|
8
9
|
export * from '../domain/execution-concurrency';
|
|
9
10
|
export * from '../domain/engineering-contracts';
|
|
10
11
|
export * from '../domain/engineering-design';
|
|
11
12
|
export * from '../domain/engineering-profile';
|
|
13
|
+
export * from '../domain/evaluation-promotion-receipt';
|
|
12
14
|
export * from '../domain/project-engineering-contract';
|
|
13
15
|
export * from '../domain/repository-completion-receipt';
|
|
14
|
-
export * from '../domain/state-machine';
|
|
15
16
|
export * from '../domain/types';
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
appendWorkEvidence as persistWorkEvidence,
|
|
3
3
|
getWorkContract as readWorkContract,
|
|
4
|
-
recordWorkCompletionReceipt as
|
|
4
|
+
recordWorkCompletionReceipt as persistWorkDeliveryReceipt,
|
|
5
5
|
canonicalizeWorkContractForAuthority,
|
|
6
|
-
rebindPlanBoundWorkContract as buildPlanBoundWorkRebind,
|
|
7
|
-
refreshPlanBoundWorkRevision as buildPlanBoundWorkRevisionRefresh,
|
|
8
|
-
retirePlanBoundWorkContract as buildPlanBoundWorkRetirement,
|
|
9
6
|
} from '../infrastructure/work-contract-store';
|
|
10
7
|
import type { WorkContract } from '../domain/types';
|
|
11
8
|
import type { WorkContractStoreOptions } from '../ports/work-contract-store';
|
|
@@ -20,11 +17,10 @@ export interface CompleteRemoteEffectProcessInput {
|
|
|
20
17
|
}
|
|
21
18
|
|
|
22
19
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* kind checks, evidence append, and terminal lifecycle mutation stay here.
|
|
20
|
+
* Record one trusted repository remote-effect Process receipt as Work evidence.
|
|
21
|
+
* This never changes semantic Work state; the model/user decides completion via complete.
|
|
26
22
|
*/
|
|
27
|
-
export function
|
|
23
|
+
export function recordRemoteEffectWorkProcessReceipt(
|
|
28
24
|
options: WorkContractStoreOptions,
|
|
29
25
|
workId: string,
|
|
30
26
|
input: CompleteRemoteEffectProcessInput,
|
|
@@ -34,7 +30,7 @@ export function completeRemoteEffectWorkFromProcessReceipt(
|
|
|
34
30
|
if (work.workKind !== 'remote_effect') {
|
|
35
31
|
throw new Error(`WORK_REMOTE_EFFECT_PROCESS_KIND_MISMATCH: ${workId} is ${work.workKind}, expected remote_effect`);
|
|
36
32
|
}
|
|
37
|
-
if (work.
|
|
33
|
+
if (work.completionReceipt?.source === 'remote_effect') return work;
|
|
38
34
|
if (!work.evidenceRefs.some((candidate) => candidate.evidenceId === input.processId)) {
|
|
39
35
|
persistWorkEvidence(options, workId, {
|
|
40
36
|
evidenceId: input.processId,
|
|
@@ -43,7 +39,7 @@ export function completeRemoteEffectWorkFromProcessReceipt(
|
|
|
43
39
|
detailLevel: 'summary',
|
|
44
40
|
});
|
|
45
41
|
}
|
|
46
|
-
return
|
|
42
|
+
return persistWorkDeliveryReceipt(
|
|
47
43
|
options,
|
|
48
44
|
workId,
|
|
49
45
|
{
|
|
@@ -77,15 +73,21 @@ export {
|
|
|
77
73
|
emptyWorkContractStore,
|
|
78
74
|
readWorkContractStore,
|
|
79
75
|
writeWorkContractStore,
|
|
76
|
+
createWorkSemanticContext,
|
|
80
77
|
createWorkContract,
|
|
81
78
|
getWorkContractByRequestId,
|
|
82
79
|
acceptSubmittedWorkContract,
|
|
83
80
|
listWorkContracts,
|
|
84
81
|
readActiveWorkCandidates,
|
|
82
|
+
readWorkContractLineageSnapshot,
|
|
85
83
|
initializeWorkCandidateIndex,
|
|
86
84
|
isCurrentWorkContract,
|
|
87
85
|
supersedeWorkContract,
|
|
88
86
|
getWorkContract,
|
|
87
|
+
semanticWorkState,
|
|
88
|
+
workSemanticView,
|
|
89
|
+
listWorkSemanticRevisionRecords,
|
|
90
|
+
reviseWorkSemanticContext,
|
|
89
91
|
summarizeWorkContract,
|
|
90
92
|
updateWorkContract,
|
|
91
93
|
promoteWorkToRepositoryChange,
|
|
@@ -93,13 +95,10 @@ export {
|
|
|
93
95
|
activateWorkContract,
|
|
94
96
|
failWorkContract,
|
|
95
97
|
cancelWorkContract,
|
|
96
|
-
|
|
98
|
+
recordCancelledWorkCleanupCompleted,
|
|
97
99
|
recordWorkScopeEvidence,
|
|
98
100
|
transitionWorkContractPhase,
|
|
99
|
-
requestWorkImplementationReview,
|
|
100
101
|
recordWorkImplementationReview,
|
|
101
|
-
recordContentEquivalentCommitAuthorityTransfer,
|
|
102
|
-
reconcileApprovedWorkImplementationReviewProjection,
|
|
103
102
|
appendWorkEvidence,
|
|
104
103
|
appendWorkHandoffRef,
|
|
105
104
|
appendVerificationRecord,
|
|
@@ -107,42 +106,18 @@ export {
|
|
|
107
106
|
canonicalizeWorkContractForAuthority,
|
|
108
107
|
} from '../infrastructure/work-contract-store';
|
|
109
108
|
export type {
|
|
109
|
+
CreateWorkSemanticInput,
|
|
110
110
|
CreateWorkContractInput,
|
|
111
111
|
ListWorkContractOptions,
|
|
112
112
|
InvalidActiveWorkCandidate,
|
|
113
113
|
ActiveWorkCandidateSnapshot,
|
|
114
|
+
WorkContractLineageSnapshot,
|
|
114
115
|
SupersedeWorkContractInput,
|
|
115
116
|
WorkContractSummary,
|
|
117
|
+
WorkSemanticRevisionRecord,
|
|
118
|
+
ReviseWorkSemanticInput,
|
|
116
119
|
AcceptSubmittedWorkInput,
|
|
117
120
|
WorkContractStoreLocation,
|
|
118
121
|
WorkContractStoreOptions,
|
|
119
122
|
WorkContractMetadataPatch,
|
|
120
123
|
} from '../infrastructure/work-contract-store';
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Public Work application command for constructing a validated scope-only
|
|
124
|
-
* successor-Plan binding. Persistence remains with the caller so a higher-level
|
|
125
|
-
* control-plane transaction can atomically update Plan + Work authority.
|
|
126
|
-
*/
|
|
127
|
-
export function rebindPlanBoundWorkContract(
|
|
128
|
-
current: WorkContract,
|
|
129
|
-
input: Parameters<typeof buildPlanBoundWorkRebind>[1],
|
|
130
|
-
): WorkContract {
|
|
131
|
-
return buildPlanBoundWorkRebind(current, input);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** Build a validated terminal authority-retirement transition for a Work whose Plan is no longer current. */
|
|
135
|
-
/** Refresh a Work against a newer revision of the same stable Plan identity. */
|
|
136
|
-
export function refreshPlanBoundWorkRevision(
|
|
137
|
-
current: WorkContract,
|
|
138
|
-
input: Parameters<typeof buildPlanBoundWorkRevisionRefresh>[1],
|
|
139
|
-
): WorkContract {
|
|
140
|
-
return buildPlanBoundWorkRevisionRefresh(current, input);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export function retirePlanBoundWorkContract(
|
|
144
|
-
current: WorkContract,
|
|
145
|
-
input: Parameters<typeof buildPlanBoundWorkRetirement>[1],
|
|
146
|
-
): WorkContract {
|
|
147
|
-
return buildPlanBoundWorkRetirement(current, input);
|
|
148
|
-
}
|