@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
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
export type WorkflowSupervisorAction = 'CONTINUE' | 'DONE' | 'NEEDS_USER';
|
|
2
|
+
export type WorkflowSupervisorState = 'running' | 'done' | 'needs_user';
|
|
3
|
+
export type WorkflowSupervisorTerminalState = 'DONE' | 'NEEDS_USER' | 'STOPPED';
|
|
4
|
+
/** Machine receipt attached to Forge MCP calls made by an autonomous ChatGPT turn. */
|
|
5
|
+
export type WorkflowSupervisorAutomationStatus = 'working' | 'continue' | 'done' | 'needs_user';
|
|
6
|
+
export type WorkflowEffectKind = 'enrollment' | 'continuation' | 'correction' | 'recovery';
|
|
7
|
+
export type WorkflowEffectOutcome = 'applied' | 'not_applied' | 'unknown';
|
|
8
|
+
|
|
9
|
+
/** Minimal machine-readable context carried into one autonomous provider turn. */
|
|
10
|
+
export interface WorkflowSupervisorTurnEnvelope {
|
|
11
|
+
schema_version: 2;
|
|
12
|
+
identity: {
|
|
13
|
+
task_id: string;
|
|
14
|
+
effect_id: string;
|
|
15
|
+
kind: WorkflowEffectKind;
|
|
16
|
+
};
|
|
17
|
+
/** Semantic outcome to pursue. It is context, not an execution-plan DSL. */
|
|
18
|
+
goal: {
|
|
19
|
+
role: 'outcome';
|
|
20
|
+
objective: string;
|
|
21
|
+
};
|
|
22
|
+
/** Prior-turn continuity is evidence for orientation, never an execution constraint. */
|
|
23
|
+
continuity?: {
|
|
24
|
+
role: 'advisory';
|
|
25
|
+
summary: string;
|
|
26
|
+
};
|
|
27
|
+
repository?: {
|
|
28
|
+
repo_id: string;
|
|
29
|
+
checkout_id?: string;
|
|
30
|
+
};
|
|
31
|
+
cognition?: {
|
|
32
|
+
role: 'advisory';
|
|
33
|
+
projection: string;
|
|
34
|
+
};
|
|
35
|
+
automation: {
|
|
36
|
+
automation_task_id: string;
|
|
37
|
+
automation_type: 'autonomous_continuation';
|
|
38
|
+
intermediate_status: 'working';
|
|
39
|
+
final_statuses: ['continue', 'done', 'needs_user'];
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface WorkflowSupervisorProposal {
|
|
44
|
+
action: WorkflowSupervisorAction;
|
|
45
|
+
sourceEffectId: string;
|
|
46
|
+
checkpoint: string;
|
|
47
|
+
reason: string;
|
|
48
|
+
evidence: string[];
|
|
49
|
+
/** Required by newly-rendered prompts; optional only for already-reserved legacy effects. */
|
|
50
|
+
conversationId?: string;
|
|
51
|
+
/** Stable Supervisor task identity, distinct from lower-layer Work authority. */
|
|
52
|
+
taskId?: string;
|
|
53
|
+
/** Redundant with action by design so a response carries an explicit machine state. */
|
|
54
|
+
supervisorState?: WorkflowSupervisorState;
|
|
55
|
+
/** Exact durable lower-layer relay scope such as requirement:<id> or goal:<id>. */
|
|
56
|
+
activeScope?: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface WorkflowSupervisorTaskInput {
|
|
60
|
+
taskId: string;
|
|
61
|
+
conversationId: string;
|
|
62
|
+
conversationUrl: string;
|
|
63
|
+
objective: string;
|
|
64
|
+
completionContract: Record<string, unknown>;
|
|
65
|
+
continuationPolicy: Record<string, unknown>;
|
|
66
|
+
userBlockerPolicy: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface WorkflowSupervisorTask extends WorkflowSupervisorTaskInput {
|
|
70
|
+
createdAt: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface WorkflowSupervisorEffect {
|
|
74
|
+
effectId: string;
|
|
75
|
+
taskId: string;
|
|
76
|
+
kind: WorkflowEffectKind;
|
|
77
|
+
sourceCompletionFingerprint?: string;
|
|
78
|
+
prompt: string;
|
|
79
|
+
createdAt: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface WorkflowSupervisorCompletion {
|
|
83
|
+
completionFingerprint: string;
|
|
84
|
+
taskId: string;
|
|
85
|
+
sourceEffectId: string;
|
|
86
|
+
action: WorkflowSupervisorAction;
|
|
87
|
+
responseSha256: string;
|
|
88
|
+
controlBlockSha256: string;
|
|
89
|
+
proposal: WorkflowSupervisorProposal;
|
|
90
|
+
committedAt: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Read-only proof derived from the existing effect/completion ledger. */
|
|
94
|
+
export interface WorkflowSupervisorContinuationProof {
|
|
95
|
+
taskId: string;
|
|
96
|
+
conversationId: string;
|
|
97
|
+
activeReleaseId: string;
|
|
98
|
+
actions: ['CONTINUE', 'CONTINUE'];
|
|
99
|
+
completionFingerprints: [string, string];
|
|
100
|
+
sourceEffectIds: [string, string];
|
|
101
|
+
runtimeInstanceIds: string[];
|
|
102
|
+
firstCommittedAt: string;
|
|
103
|
+
lastCommittedAt: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Ephemeral operational projection for the single native Supervisor effect consumer. */
|
|
107
|
+
export interface WorkflowSupervisorConsumerStatus {
|
|
108
|
+
enabled: boolean;
|
|
109
|
+
running: boolean;
|
|
110
|
+
observedAt: string;
|
|
111
|
+
lastTickStartedAt?: string;
|
|
112
|
+
lastTickCompletedAt?: string;
|
|
113
|
+
lastCommandAttemptAt?: string;
|
|
114
|
+
nextAttemptAt?: string;
|
|
115
|
+
transportFailureStreak: number;
|
|
116
|
+
providerBackpressureMs: number;
|
|
117
|
+
stalled: boolean;
|
|
118
|
+
dueCommand?: {
|
|
119
|
+
taskId: string;
|
|
120
|
+
conversationId: string;
|
|
121
|
+
effectId: string;
|
|
122
|
+
mode: 'send' | 'reconcile';
|
|
123
|
+
kind: WorkflowEffectKind;
|
|
124
|
+
createdAt?: string;
|
|
125
|
+
ageMs?: number;
|
|
126
|
+
};
|
|
127
|
+
lastFailure?: {
|
|
128
|
+
code: string;
|
|
129
|
+
observedAt: string;
|
|
130
|
+
taskId?: string;
|
|
131
|
+
effectId?: string;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface WorkflowContractValidation {
|
|
136
|
+
valid: boolean;
|
|
137
|
+
reason: string;
|
|
138
|
+
evidence?: string[];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Derived, read-only classification of a non-terminal task's causal position.
|
|
143
|
+
* A mechanically exhausted effect used to make its task silently leave the
|
|
144
|
+
* delivery queue with no durable projection; this makes that state visible and
|
|
145
|
+
* names the exact operator action that can move the task forward.
|
|
146
|
+
*/
|
|
147
|
+
export type WorkflowSupervisorTaskStall =
|
|
148
|
+
| { state: 'terminal' }
|
|
149
|
+
| { state: 'deliverable'; effectId: string; mode: 'send' | 'reconcile'; generation: number }
|
|
150
|
+
| { state: 'spaced'; effectId?: string; reason: 'retry_spacing' | 'unknown_observation_spacing' | 'awaiting_completion_receipt' | 'pre_send_infrastructure_blocked' }
|
|
151
|
+
| { state: 'retryable'; effectId: string; generations: number; maxGenerations: number }
|
|
152
|
+
| { state: 'provider_resume_exhausted'; effectId: string }
|
|
153
|
+
| { state: 'inert' };
|
|
154
|
+
|
|
155
|
+
export interface WorkflowSupervisorValidators {
|
|
156
|
+
completionContract(task: WorkflowSupervisorTask, proposal: WorkflowSupervisorProposal): Promise<WorkflowContractValidation>;
|
|
157
|
+
userBlockerPolicy(task: WorkflowSupervisorTask, proposal: WorkflowSupervisorProposal): Promise<WorkflowContractValidation>;
|
|
158
|
+
}
|
|
159
|
+
export interface WorkflowSupervisorLifecycleHooks {
|
|
160
|
+
/** Resolve the current canonical Work objective at prompt generation time. */
|
|
161
|
+
canonicalObjectiveForTask?(task: WorkflowSupervisorTask): string | undefined;
|
|
162
|
+
/** Bounded cognition only; never carries lower-layer authority or lifecycle state. */
|
|
163
|
+
advisoryCognitionForTask?(task: WorkflowSupervisorTask): string | undefined;
|
|
164
|
+
/** Derived project identity used only for browser discovery; never a lifecycle authority. */
|
|
165
|
+
projectScopeForTask?(task: WorkflowSupervisorTask): WorkflowSupervisorProjectScope | undefined;
|
|
166
|
+
/** Build the one bounded enrollment task for a newly discovered project conversation. */
|
|
167
|
+
discoveredConversationTask?(conversation: WorkflowSupervisorDiscoveredConversation, scope: WorkflowSupervisorProjectScope): WorkflowSupervisorTaskInput | undefined;
|
|
168
|
+
/** Admission for a new send only. Never suppress observation of an already-started effect. */
|
|
169
|
+
browserTaskActive?(task: WorkflowSupervisorTask): boolean;
|
|
170
|
+
/** Mechanical provenance attached to outbound effect dispatch evidence. */
|
|
171
|
+
effectDispatchEvidence?(input: { task: WorkflowSupervisorTask; effectId: string }): Record<string, unknown>;
|
|
172
|
+
/**
|
|
173
|
+
* Mechanical projection of the canonical Work the turn is meant to advance.
|
|
174
|
+
* Comparison of the value captured at dispatch with the value observed at
|
|
175
|
+
* receipt is the only structural proof that a provider turn changed anything.
|
|
176
|
+
* Absent means the lower layer exposes no such signal, which is never treated
|
|
177
|
+
* as progress or as its absence.
|
|
178
|
+
*/
|
|
179
|
+
workProgressFingerprint?(task: WorkflowSupervisorTask): string | undefined;
|
|
180
|
+
/** Existing lower-layer evidence that this exact reserved effect may already have been dispatched outside Supervisor. */
|
|
181
|
+
inheritedEffectDispatch?(
|
|
182
|
+
task: WorkflowSupervisorTask,
|
|
183
|
+
effect: WorkflowSupervisorEffect,
|
|
184
|
+
): { generation: number; dispatchId: string; evidence: Record<string, unknown> } | undefined;
|
|
185
|
+
/** Idempotent: browser delivery observation may replay the same applied effect. */
|
|
186
|
+
effectApplied?(
|
|
187
|
+
task: WorkflowSupervisorTask,
|
|
188
|
+
effect: WorkflowSupervisorEffect,
|
|
189
|
+
observation: { observationId: string; evidence?: Record<string, unknown> },
|
|
190
|
+
): void;
|
|
191
|
+
/** Atomically project a newly-created Computer conversation into Work binding authority. */
|
|
192
|
+
bootstrapConversationBound?(
|
|
193
|
+
task: WorkflowSupervisorTask,
|
|
194
|
+
context?: { migratedFromConversationId?: string; migrationRequestId?: string },
|
|
195
|
+
): void;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface WorkflowAssistantObservation {
|
|
199
|
+
taskId: string;
|
|
200
|
+
conversationId: string;
|
|
201
|
+
responseText: string;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export interface WorkflowAssistantObservationResult {
|
|
205
|
+
action: WorkflowSupervisorAction;
|
|
206
|
+
completionFingerprint: string;
|
|
207
|
+
terminal: boolean;
|
|
208
|
+
successorEffect?: WorkflowSupervisorEffect;
|
|
209
|
+
validation?: WorkflowContractValidation;
|
|
210
|
+
deduplicated: boolean;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export interface WorkflowSupervisorBrowserTask {
|
|
214
|
+
taskId: string;
|
|
215
|
+
conversationId: string;
|
|
216
|
+
conversationUrl: string;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export interface WorkflowSupervisorDiscoveredConversation {
|
|
220
|
+
conversationId: string;
|
|
221
|
+
canonicalUrl: string;
|
|
222
|
+
title?: string;
|
|
223
|
+
projectTitle?: string;
|
|
224
|
+
projectUrl?: string;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export interface WorkflowSupervisorDiscoverySnapshot {
|
|
228
|
+
observedAt: string;
|
|
229
|
+
conversations: WorkflowSupervisorDiscoveredConversation[];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export interface WorkflowSupervisorProjectScope {
|
|
233
|
+
title: string;
|
|
234
|
+
/** Additional stable names used by the external Project surface. */
|
|
235
|
+
aliases?: string[];
|
|
236
|
+
repoId?: string;
|
|
237
|
+
controllerHome?: string;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export interface WorkflowSupervisorBrowserCommand {
|
|
241
|
+
mode: 'send' | 'reconcile';
|
|
242
|
+
effectId: string;
|
|
243
|
+
kind: WorkflowEffectKind;
|
|
244
|
+
prompt: string;
|
|
245
|
+
dispatchGeneration: number;
|
|
246
|
+
conversationId: string;
|
|
247
|
+
conversationUrl: string;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export interface WorkflowSupervisorBrowserPollResult {
|
|
251
|
+
authorized: true;
|
|
252
|
+
task: WorkflowSupervisorBrowserTask;
|
|
253
|
+
terminal?: WorkflowSupervisorTerminalState;
|
|
254
|
+
command?: WorkflowSupervisorBrowserCommand;
|
|
255
|
+
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'crypto';
|
|
2
|
-
import {
|
|
3
|
-
getControllerRoundRelay,
|
|
4
|
-
type ControllerBinding,
|
|
5
|
-
type ControllerHost,
|
|
6
|
-
type ControllerRoundContext,
|
|
7
|
-
} from '../../packages/kernel/controller/api/index';
|
|
8
|
-
import { runWorkChatgptContinuation } from '../../src/runtime/control-plane/launcher/chatgpt-work-continuation';
|
|
9
|
-
import { renderChatgptControllerRoundPrompt } from '../../src/runtime/root/controller-round-composition';
|
|
10
|
-
import { getChatgptControllerBindingPayload } from './controller-binding-store';
|
|
11
|
-
import { getChatgptWorkConversationBinding } from './work-conversation-binding-store';
|
|
12
|
-
import { chatgptProviderDispatchReceiptId, classifyChatgptProviderFailure } from './provider-delivery';
|
|
13
|
-
import { createHandoffItem, getHandoffItem } from '../../src/runtime/control-plane/facade/handoff-inbox-store';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
function providerUserActionHandoffId(repoId: string, workId: string, relayScopeId: string, authorityId: string): string {
|
|
17
|
-
const digest = createHash('sha256').update(`${repoId}\n${workId}\n${relayScopeId}\n${authorityId}`).digest('hex').slice(0, 20);
|
|
18
|
-
return `hnd-chatgpt-provider-auth-${digest}`;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function ensureChatgptProviderUserActionHandoff(
|
|
22
|
-
options: { controllerHome: string; repoId: string },
|
|
23
|
-
roundContext: ControllerRoundContext,
|
|
24
|
-
code: string,
|
|
25
|
-
message: string,
|
|
26
|
-
): string {
|
|
27
|
-
const id = providerUserActionHandoffId(options.repoId, roundContext.workId, roundContext.relayScopeId, roundContext.authorityId);
|
|
28
|
-
const existing = getHandoffItem(options, id);
|
|
29
|
-
if (existing && existing.status === 'pending') return existing.id;
|
|
30
|
-
if (existing) return existing.id;
|
|
31
|
-
return createHandoffItem(options, {
|
|
32
|
-
id,
|
|
33
|
-
repoId: options.repoId,
|
|
34
|
-
workId: roundContext.workId,
|
|
35
|
-
title: 'ChatGPT provider authorization required',
|
|
36
|
-
severity: 'needs_review',
|
|
37
|
-
reason: message,
|
|
38
|
-
creationReason: 'missing_authorization',
|
|
39
|
-
summary: `Provider delivery is blocked until the user completes ChatGPT authentication or permission: ${code}`,
|
|
40
|
-
currentState: {
|
|
41
|
-
repoId: options.repoId,
|
|
42
|
-
workId: roundContext.workId,
|
|
43
|
-
statusSummary: 'ControllerRound is waiting for an explicit provider authentication/permission action.',
|
|
44
|
-
blockedBy: [code],
|
|
45
|
-
nextSafeAction: 'Complete the provider login/permission action, then resolve this Handoff to trigger a fresh continuation occurrence.',
|
|
46
|
-
},
|
|
47
|
-
evidenceRefs: [],
|
|
48
|
-
blockingDecision: 'Complete the required ChatGPT login or permission action.',
|
|
49
|
-
recommendedDecision: 'Complete provider authentication/permission and resume the same durable Work.',
|
|
50
|
-
recommendedPrompt: `Resume exact Work ${roundContext.workId} after provider authentication is complete.`,
|
|
51
|
-
suggestedNextActions: [],
|
|
52
|
-
}).id;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function createChatgptControllerHost(options: {
|
|
56
|
-
controllerHome: string;
|
|
57
|
-
repoId: string;
|
|
58
|
-
repoRoot: string;
|
|
59
|
-
}): ControllerHost {
|
|
60
|
-
return {
|
|
61
|
-
async resume(binding: ControllerBinding, roundContext: ControllerRoundContext) {
|
|
62
|
-
if (binding.hostKind !== 'chatgpt') return { accepted: false, reason: `CONTROLLER_HOST_KIND_MISMATCH:${binding.hostKind}` };
|
|
63
|
-
const payload = getChatgptControllerBindingPayload(options, binding.adapterRef);
|
|
64
|
-
if (!payload || payload.bindingId !== binding.bindingId || payload.workId !== roundContext.workId) {
|
|
65
|
-
return { accepted: false, reason: `CHATGPT_CONTROLLER_BINDING_NOT_FOUND:${binding.bindingId}` };
|
|
66
|
-
}
|
|
67
|
-
const relayStore = { controllerHome: options.controllerHome, repoId: options.repoId };
|
|
68
|
-
const relay = getControllerRoundRelay(relayStore, roundContext.workId);
|
|
69
|
-
if (!relay || relay.relayScopeId !== roundContext.relayScopeId || relay.authorityId !== roundContext.authorityId) {
|
|
70
|
-
return { accepted: false, reason: `CONTROLLER_ROUND_CONTEXT_STALE:${roundContext.workId}` };
|
|
71
|
-
}
|
|
72
|
-
const durableConversation = getChatgptWorkConversationBinding(relayStore, roundContext.workId);
|
|
73
|
-
const prompt = [
|
|
74
|
-
renderChatgptControllerRoundPrompt(relayStore, relay, { exactOriginWork: roundContext.exactOriginWork === true }),
|
|
75
|
-
roundContext.continuationHint?.trim() ? `Continuation hint: ${roundContext.continuationHint.trim()}` : '',
|
|
76
|
-
].filter(Boolean).join('\n\n');
|
|
77
|
-
const result = await runWorkChatgptContinuation({
|
|
78
|
-
controllerHome: options.controllerHome,
|
|
79
|
-
repoId: options.repoId,
|
|
80
|
-
repoRoot: options.repoRoot,
|
|
81
|
-
workId: roundContext.workId,
|
|
82
|
-
prompt,
|
|
83
|
-
controllerAuthorityId: roundContext.authorityId,
|
|
84
|
-
relayScopeId: roundContext.relayScopeId,
|
|
85
|
-
title: payload.title,
|
|
86
|
-
browserSessionId: durableConversation?.latestBrowserSessionId ?? payload.browserSessionId,
|
|
87
|
-
conversationUrl: durableConversation?.conversationUrl ?? payload.conversationUrl,
|
|
88
|
-
model: payload.model ?? 'gpt-5.6',
|
|
89
|
-
reasoning: payload.reasoning ?? 'high',
|
|
90
|
-
tabPolicy: payload.tabPolicy ?? 'auto',
|
|
91
|
-
timeoutMs: payload.timeoutMs,
|
|
92
|
-
originSurface: 'schedule',
|
|
93
|
-
});
|
|
94
|
-
if (result.status === 'failed') {
|
|
95
|
-
const code = result.error?.code ?? 'CHATGPT_WORK_CONTINUATION_FAILED';
|
|
96
|
-
const message = result.error?.message ?? code;
|
|
97
|
-
const disposition = classifyChatgptProviderFailure(code, message);
|
|
98
|
-
if (disposition === 'outcome_unknown') {
|
|
99
|
-
throw new Error(`CONTROLLER_HOST_PROVIDER_DISPATCH_OUTCOME_UNKNOWN:${code}:${message}`);
|
|
100
|
-
}
|
|
101
|
-
if (disposition === 'wait_for_user') {
|
|
102
|
-
const handoffId = ensureChatgptProviderUserActionHandoff(options, roundContext, code, message);
|
|
103
|
-
return { accepted: false, waitForUser: true, handoffId, reason: message };
|
|
104
|
-
}
|
|
105
|
-
return { accepted: false, reason: message };
|
|
106
|
-
}
|
|
107
|
-
return {
|
|
108
|
-
accepted: true,
|
|
109
|
-
dispatchId: chatgptProviderDispatchReceiptId({
|
|
110
|
-
repoId: options.repoId,
|
|
111
|
-
workId: roundContext.workId,
|
|
112
|
-
relayScopeId: roundContext.relayScopeId,
|
|
113
|
-
controllerAuthorityId: roundContext.authorityId,
|
|
114
|
-
provider: result.provider,
|
|
115
|
-
}),
|
|
116
|
-
};
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
}
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CONTROLLER_ROUND_DISPOSITIONS,
|
|
3
|
-
type ControllerRoundDisposition,
|
|
4
|
-
} from '../../packages/kernel/controller/api/index';
|
|
5
|
-
|
|
6
|
-
const CONTROLLER_DISPOSITION_COMPATIBILITY_PREFIX = 'controller.disposition:';
|
|
7
|
-
const CONTROLLER_ROUND_COMPATIBILITY_PREFIX = 'controller.round:';
|
|
8
|
-
export const CONTROLLER_ROUND_COMPATIBILITY_OPERATIONS = [
|
|
9
|
-
'controller_claim',
|
|
10
|
-
'plan_accept_step',
|
|
11
|
-
'continue',
|
|
12
|
-
'verify',
|
|
13
|
-
'review',
|
|
14
|
-
'finalize',
|
|
15
|
-
'stop',
|
|
16
|
-
'controller_release',
|
|
17
|
-
] as const;
|
|
18
|
-
export type ControllerRoundCompatibilityOperation = (typeof CONTROLLER_ROUND_COMPATIBILITY_OPERATIONS)[number];
|
|
19
|
-
export const CONTROLLER_ROUND_REVIEW_DECISIONS = ['approved', 'changes_required', 'blocked'] as const;
|
|
20
|
-
export type ControllerRoundReviewDecision = (typeof CONTROLLER_ROUND_REVIEW_DECISIONS)[number];
|
|
21
|
-
|
|
22
|
-
export function parseControllerDispositionCompatibilityCapability(
|
|
23
|
-
operation: string,
|
|
24
|
-
capabilityId: unknown,
|
|
25
|
-
): { disposition: ControllerRoundDisposition; relayScopeId: string; authorityId?: string } | undefined {
|
|
26
|
-
if (operation !== 'repair' || typeof capabilityId !== 'string') return undefined;
|
|
27
|
-
const normalized = capabilityId.trim();
|
|
28
|
-
if (!normalized.startsWith(CONTROLLER_DISPOSITION_COMPATIBILITY_PREFIX)) return undefined;
|
|
29
|
-
const payload = normalized.slice(CONTROLLER_DISPOSITION_COMPATIBILITY_PREFIX.length);
|
|
30
|
-
const separator = payload.indexOf(':');
|
|
31
|
-
if (separator <= 0) throw new Error('CONTROLLER_RELAY_DISPOSITION_COMPATIBILITY_INVALID');
|
|
32
|
-
const disposition = payload.slice(0, separator) as ControllerRoundDisposition;
|
|
33
|
-
const remainder = payload.slice(separator + 1).trim();
|
|
34
|
-
let authorityId: string | undefined;
|
|
35
|
-
let relayScopeId = remainder;
|
|
36
|
-
if (remainder.startsWith('cra_')) {
|
|
37
|
-
const authoritySeparator = remainder.indexOf(':');
|
|
38
|
-
if (authoritySeparator <= 0) throw new Error('CONTROLLER_RELAY_DISPOSITION_COMPATIBILITY_INVALID');
|
|
39
|
-
authorityId = remainder.slice(0, authoritySeparator).trim();
|
|
40
|
-
relayScopeId = remainder.slice(authoritySeparator + 1).trim();
|
|
41
|
-
if (!/^cra_[0-9a-f]{32}$/i.test(authorityId)) throw new Error('CONTROLLER_RELAY_DISPOSITION_COMPATIBILITY_INVALID');
|
|
42
|
-
}
|
|
43
|
-
if (!CONTROLLER_ROUND_DISPOSITIONS.includes(disposition) || !relayScopeId) {
|
|
44
|
-
throw new Error('CONTROLLER_RELAY_DISPOSITION_COMPATIBILITY_INVALID');
|
|
45
|
-
}
|
|
46
|
-
return { disposition, relayScopeId, ...(authorityId ? { authorityId } : {}) };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function parseControllerRoundCompatibilityCapability(
|
|
50
|
-
operation: string,
|
|
51
|
-
capabilityId: unknown,
|
|
52
|
-
): { operation: ControllerRoundCompatibilityOperation; authorityId: string; relayScopeId: string; reviewDecision?: ControllerRoundReviewDecision } | undefined {
|
|
53
|
-
if (operation !== 'repair' || typeof capabilityId !== 'string') return undefined;
|
|
54
|
-
const normalized = capabilityId.trim();
|
|
55
|
-
if (!normalized.startsWith(CONTROLLER_ROUND_COMPATIBILITY_PREFIX)) return undefined;
|
|
56
|
-
const payload = normalized.slice(CONTROLLER_ROUND_COMPATIBILITY_PREFIX.length);
|
|
57
|
-
const operationSeparator = payload.indexOf(':');
|
|
58
|
-
if (operationSeparator <= 0) throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
59
|
-
const canonicalOperation = payload.slice(0, operationSeparator) as ControllerRoundCompatibilityOperation;
|
|
60
|
-
if (!CONTROLLER_ROUND_COMPATIBILITY_OPERATIONS.includes(canonicalOperation)) {
|
|
61
|
-
throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
let cursor = operationSeparator + 1;
|
|
65
|
-
let reviewDecision: ControllerRoundReviewDecision | undefined;
|
|
66
|
-
if (canonicalOperation === 'review') {
|
|
67
|
-
const decisionSeparator = payload.indexOf(':', cursor);
|
|
68
|
-
if (decisionSeparator <= cursor) throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
69
|
-
const decision = payload.slice(cursor, decisionSeparator).trim() as ControllerRoundReviewDecision;
|
|
70
|
-
if (!CONTROLLER_ROUND_REVIEW_DECISIONS.includes(decision)) throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
71
|
-
reviewDecision = decision;
|
|
72
|
-
cursor = decisionSeparator + 1;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const authoritySeparator = payload.indexOf(':', cursor);
|
|
76
|
-
if (authoritySeparator <= cursor) throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
77
|
-
const authorityId = payload.slice(cursor, authoritySeparator).trim();
|
|
78
|
-
const relayScopeId = payload.slice(authoritySeparator + 1).trim();
|
|
79
|
-
if (!/^cra_[0-9a-f]{32}$/i.test(authorityId) || !relayScopeId) {
|
|
80
|
-
throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
81
|
-
}
|
|
82
|
-
return { operation: canonicalOperation, authorityId, relayScopeId, ...(reviewDecision ? { reviewDecision } : {}) };
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const PLAN_OBLIGATION_COMPATIBILITY_PREFIX = 'plan.obligations.v1:';
|
|
87
|
-
const PLAN_OBLIGATION_COMPATIBILITY_MAX_ENCODED_CHARS = 96_000;
|
|
88
|
-
const PLAN_OBLIGATION_COMPATIBILITY_MAX_DECODED_BYTES = 64 * 1024;
|
|
89
|
-
const PLAN_OBLIGATION_COMPATIBILITY_MAX_DISPOSITIONS = 512;
|
|
90
|
-
const PLAN_OBLIGATION_COMPATIBILITY_MAX_SUCCESSOR_REFS = 32;
|
|
91
|
-
|
|
92
|
-
export type PlanObligationCompatibilityDispositionKind = 'keep' | 'change' | 'defer' | 'drop';
|
|
93
|
-
|
|
94
|
-
export interface PlanObligationCompatibilityDisposition {
|
|
95
|
-
predecessor_plan_id: string;
|
|
96
|
-
obligation_id: string;
|
|
97
|
-
disposition: PlanObligationCompatibilityDispositionKind;
|
|
98
|
-
successor_refs: string[];
|
|
99
|
-
rationale?: string;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function boundedCompatibilityText(value: unknown, maximum: number): string {
|
|
103
|
-
const normalized = typeof value === 'string' ? value.trim() : '';
|
|
104
|
-
if (!normalized || normalized.length > maximum) throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
105
|
-
return normalized;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Encode only the field missing from older frozen rh_work schemas. This is a
|
|
110
|
-
* transport compatibility envelope, never Plan state or semantic authority.
|
|
111
|
-
*/
|
|
112
|
-
export function buildPlanObligationCompatibilityCapability(
|
|
113
|
-
dispositions: readonly PlanObligationCompatibilityDisposition[],
|
|
114
|
-
): string {
|
|
115
|
-
if (dispositions.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_DISPOSITIONS) {
|
|
116
|
-
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_TOO_LARGE');
|
|
117
|
-
}
|
|
118
|
-
const payload = {
|
|
119
|
-
v: 1,
|
|
120
|
-
d: dispositions.map((entry) => ({
|
|
121
|
-
p: boundedCompatibilityText(entry.predecessor_plan_id, 256),
|
|
122
|
-
o: boundedCompatibilityText(entry.obligation_id, 512),
|
|
123
|
-
d: entry.disposition,
|
|
124
|
-
s: entry.successor_refs.map((ref) => boundedCompatibilityText(ref, 512)),
|
|
125
|
-
...(entry.rationale?.trim() ? { r: boundedCompatibilityText(entry.rationale, 4_000) } : {}),
|
|
126
|
-
})),
|
|
127
|
-
};
|
|
128
|
-
for (const entry of payload.d) {
|
|
129
|
-
if (!['keep', 'change', 'defer', 'drop'].includes(entry.d) || entry.s.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_SUCCESSOR_REFS) {
|
|
130
|
-
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
const encoded = Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url');
|
|
134
|
-
if (encoded.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_ENCODED_CHARS) {
|
|
135
|
-
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_TOO_LARGE');
|
|
136
|
-
}
|
|
137
|
-
return `${PLAN_OBLIGATION_COMPATIBILITY_PREFIX}${encoded}`;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export function parsePlanObligationCompatibilityCapability(
|
|
141
|
-
operation: string,
|
|
142
|
-
capabilityId: unknown,
|
|
143
|
-
): PlanObligationCompatibilityDisposition[] | undefined {
|
|
144
|
-
if (operation !== 'plan_create' || typeof capabilityId !== 'string') return undefined;
|
|
145
|
-
const normalized = capabilityId.trim();
|
|
146
|
-
if (!normalized.startsWith(PLAN_OBLIGATION_COMPATIBILITY_PREFIX)) return undefined;
|
|
147
|
-
const encoded = normalized.slice(PLAN_OBLIGATION_COMPATIBILITY_PREFIX.length);
|
|
148
|
-
if (!encoded || encoded.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_ENCODED_CHARS || !/^[A-Za-z0-9_-]+$/.test(encoded)) {
|
|
149
|
-
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
150
|
-
}
|
|
151
|
-
let decoded: Buffer;
|
|
152
|
-
let parsed: unknown;
|
|
153
|
-
try {
|
|
154
|
-
decoded = Buffer.from(encoded, 'base64url');
|
|
155
|
-
if (decoded.byteLength > PLAN_OBLIGATION_COMPATIBILITY_MAX_DECODED_BYTES) throw new Error('too_large');
|
|
156
|
-
parsed = JSON.parse(decoded.toString('utf8'));
|
|
157
|
-
} catch (error) {
|
|
158
|
-
if (error instanceof Error && error.message === 'too_large') throw new Error('PLAN_OBLIGATION_COMPATIBILITY_TOO_LARGE');
|
|
159
|
-
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
160
|
-
}
|
|
161
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
162
|
-
const envelope = parsed as Record<string, unknown>;
|
|
163
|
-
if (envelope.v !== 1 || !Array.isArray(envelope.d) || envelope.d.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_DISPOSITIONS) {
|
|
164
|
-
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
165
|
-
}
|
|
166
|
-
return envelope.d.map((value) => {
|
|
167
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
168
|
-
const entry = value as Record<string, unknown>;
|
|
169
|
-
const disposition = boundedCompatibilityText(entry.d, 16) as PlanObligationCompatibilityDispositionKind;
|
|
170
|
-
const successorRefs = Array.isArray(entry.s) ? entry.s : [];
|
|
171
|
-
if (!['keep', 'change', 'defer', 'drop'].includes(disposition) || successorRefs.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_SUCCESSOR_REFS) {
|
|
172
|
-
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
173
|
-
}
|
|
174
|
-
return {
|
|
175
|
-
predecessor_plan_id: boundedCompatibilityText(entry.p, 256),
|
|
176
|
-
obligation_id: boundedCompatibilityText(entry.o, 512),
|
|
177
|
-
disposition,
|
|
178
|
-
successor_refs: successorRefs.map((ref) => boundedCompatibilityText(ref, 512)),
|
|
179
|
-
...(typeof entry.r === 'string' && entry.r.trim()
|
|
180
|
-
? { rationale: boundedCompatibilityText(entry.r, 4_000) }
|
|
181
|
-
: {}),
|
|
182
|
-
};
|
|
183
|
-
});
|
|
184
|
-
}
|