@moretea-labs/forge 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +73 -7
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/README.en.md +24 -3
- package/README.md +10 -6
- package/README.zh-CN.md +5 -3
- package/THIRD_PARTY_NOTICES.md +1 -2
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
- package/adapters/chatgpt/controller-binding-store.ts +101 -22
- package/adapters/chatgpt/controller-round-host.ts +15 -25
- package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
- package/adapters/chatgpt/provider-delivery.ts +229 -2
- package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
- package/adapters/computer/chatgpt-extension-target.ts +708 -0
- package/adapters/computer/chrome-extension/background.js +541 -0
- package/adapters/computer/chrome-extension/content.js +402 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +32 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/desktop-operator-provider.ts +18 -6
- package/adapters/computer/interaction-target-authority.ts +178 -24
- package/adapters/mcp/access-mode.ts +18 -39
- package/adapters/mcp/auth.ts +2 -7
- package/adapters/mcp/instructions.ts +6 -5
- package/adapters/mcp/multi-repository.ts +10 -47
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
- package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
- package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
- package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
- package/adapters/mcp/runtime-gateway/router.ts +19 -507
- package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
- package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
- package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
- package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
- package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
- package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
- package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
- package/adapters/mcp/server.ts +91 -26
- package/adapters/mcp/setup.ts +5 -13
- package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
- package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
- package/adapters/mcp/toolset-names.ts +11 -37
- package/adapters/mcp/toolset.ts +19 -92
- package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
- package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
- package/adapters/mcp/transports/http-observation.ts +377 -0
- package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
- package/adapters/mcp/transports/http.ts +200 -683
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +6 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
- package/adapters/mcp/types.ts +0 -6
- package/assets/hooks/lib/session-state.sh +0 -38
- package/assets/hooks/post-bash.sh +1 -1
- package/assets/hooks/post-tool-observer.sh +0 -5
- package/assets/hooks/prompt-guard.sh +0 -55
- package/assets/partials/04-project-structure.partial.md +1 -1
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -1
- package/assets/partials-agents/08-deep-docs.partial.md +1 -1
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +26 -1
- package/assets/reference-configs/external-tooling.md +0 -76
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/reference-configs/release-deploy.md +1 -1
- package/assets/templates/helpers/architecture-queue.sh +1 -1
- package/assets/templates/helpers/check-agent-tooling.sh +1 -327
- package/assets/templates/helpers/check-task-workflow.sh +1 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
- package/assets/templates/helpers/migrate-project-template.sh +2 -2
- package/assets/workflow-contract.v1.json +0 -2
- package/docs/README.md +5 -2
- package/docs/architecture/CURRENT.md +205 -51
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
- package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
- package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
- package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
- package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
- package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
- package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
- package/docs/architecture/domains/public-surface.md +3 -5
- package/docs/architecture/domains/verification.md +6 -5
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
- package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
- package/docs/forge-plugin-management.md +16 -4
- package/docs/operations/controller-browser-plugin.md +23 -0
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +6 -7
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/github-repository.md +4 -4
- package/docs/operations/github-semantic-release-projection.md +20 -0
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +13 -52
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/runtime-performance-diagnostics.md +8 -0
- package/docs/operations/standalone-disaster-recovery.md +15 -7
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/03-first-repository-task.md +2 -0
- package/docs/wiki/Computer-and-Plugins.md +78 -0
- package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
- package/docs/wiki/Home.md +16 -2
- package/docs/wiki/Implementation.md +25 -13
- package/docs/wiki/Installation.md +28 -32
- package/docs/wiki/Integrations.md +4 -0
- package/docs/wiki/Quick-Start.md +35 -22
- package/docs/wiki/Releases-and-Upgrades.md +15 -25
- package/docs/wiki/_Sidebar.md +5 -1
- package/package.json +25 -25
- package/packages/kernel/cognition/api/index.ts +6 -0
- package/packages/kernel/cognition/application/activation-service.ts +451 -0
- package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
- package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
- package/packages/kernel/cognition/application/memory-service.ts +64 -0
- package/packages/kernel/cognition/domain/learning.ts +106 -0
- package/packages/kernel/cognition/domain/memory.ts +254 -0
- package/packages/kernel/controller/api/index.ts +1 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +12 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
- package/packages/kernel/controller/domain/controller-round.ts +4 -1
- package/packages/kernel/controller/domain/execution-quality.ts +3 -1
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
- package/packages/kernel/controller/ports/controller-host.ts +2 -0
- package/packages/kernel/identity/api/index.ts +10 -0
- package/packages/kernel/identity/domain/activity-projection.ts +43 -0
- package/packages/kernel/identity/domain/capability-broker.ts +60 -0
- package/packages/kernel/identity/domain/grant.ts +72 -0
- package/packages/kernel/identity/domain/owned-resource.ts +116 -0
- package/packages/kernel/identity/domain/user-request.ts +93 -0
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
- package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
- package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
- package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/scheduler/api/index.ts +0 -2
- package/packages/kernel/scheduler/application/eligibility.ts +4 -1
- package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
- package/packages/kernel/scheduler/application/settlement.ts +0 -15
- package/packages/kernel/scheduler/domain/schedule.ts +87 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +18 -42
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-design.ts +10 -5
- package/packages/kernel/work/domain/engineering-profile.ts +8 -12
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
- package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
- package/packages/kernel/work/domain/implementation-review.ts +14 -331
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +34 -65
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
- package/packages/plugin-runtime/browser/session-authority.ts +2 -1
- package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
- package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
- package/packages/plugin-runtime/computer/index.ts +2 -0
- package/packages/plugin-runtime/computer/target-authority.ts +26 -1
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
- package/packages/protocols/computer/contract.ts +27 -1
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/assemble-template.ts +11 -72
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +94 -201
- package/scripts/check-package-identity.mjs +0 -5
- package/scripts/check-runtime-architecture.mjs +921 -239
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/init-project.sh +0 -46
- package/scripts/install-ios-hid-toolchain.sh +60 -0
- package/scripts/install-standalone-recovery.ts +1 -1
- package/scripts/lib/project-init-lib.sh +6 -3
- package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
- package/scripts/open-source-audit-allowlist.txt +1 -3
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-ios-physical-device.ts +38 -10
- package/scripts/smoke-mcp-http-runtime.ts +12 -8
- package/scripts/smoke-mcp-tool-surface.ts +27 -41
- package/scripts/smoke-runtime-recovery.ts +12 -43
- package/scripts/smoke-schedule-engine.ts +23 -15
- package/scripts/smoke-unattended-transport-recovery.ts +223 -0
- package/scripts/smoke-user-request-continuation-restart.ts +232 -0
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
- package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
- package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
- package/scripts/smoke-workflow-supervisor.ts +103 -0
- package/scripts/sync-generated-authority.mjs +0 -1
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +12 -35
- package/src/cli/agent-jobs/integration.ts +20 -51
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- package/src/cli/chatgpt-browser/file-policy.ts +2 -2
- package/src/cli/commands/brain-assistant.ts +27 -13
- package/src/cli/commands/brain.ts +13 -15
- package/src/cli/commands/chatgpt.ts +1 -163
- package/src/cli/commands/doctor.ts +1 -143
- package/src/cli/commands/global-runtime.ts +3 -196
- package/src/cli/commands/init-hook.ts +6 -23
- package/src/cli/commands/init.ts +3 -252
- package/src/cli/commands/mcp.ts +0 -5
- package/src/cli/commands/prompt-guard-decision.ts +0 -2
- package/src/cli/commands/recovery.ts +137 -135
- package/src/cli/commands/repository.ts +17 -1
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-execution.ts +41 -0
- package/src/cli/commands/setup-profile.ts +8 -0
- package/src/cli/controller/check-runner.ts +13 -2
- package/src/cli/controller/completion-backlog.ts +3 -3
- package/src/cli/controller/completion-orchestrator.ts +5 -44
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/composite-operations.ts +1 -1
- package/src/cli/controller/context/instruction-context.ts +1 -1
- package/src/cli/controller/context/known-paths.ts +2 -2
- package/src/cli/controller/context/query-planning.ts +11 -4
- package/src/cli/controller/context/rule-resolution.ts +2 -2
- package/src/cli/controller/context/source-materializer.ts +83 -102
- package/src/cli/controller/context/structural-provider.ts +84 -0
- package/src/cli/controller/context/structural.ts +6 -6
- package/src/cli/controller/context/types.ts +8 -9
- package/src/cli/controller/context-pack.ts +107 -84
- package/src/cli/controller/execution-completion.ts +4 -7
- package/src/cli/controller/execution-policy.ts +36 -153
- package/src/cli/controller/governance.ts +2 -3
- package/src/cli/controller/issue-store.ts +4 -99
- package/src/cli/controller/launch-agents.ts +59 -18
- package/src/cli/controller/operational-plan.ts +25 -52
- package/src/cli/controller/runtime-config.ts +5 -1
- package/src/cli/controller/stuck-state-migration.ts +2 -3
- package/src/cli/controller/systemd-user.ts +42 -10
- package/src/cli/editing/edit-session.ts +18 -12
- package/src/cli/github/github.ts +4 -4
- package/src/cli/github/semantic-projection.ts +174 -0
- package/src/cli/hook/prompt-intents.ts +0 -9
- package/src/cli/index.ts +1 -43
- package/src/cli/local-bridge/connector-freshness.ts +1 -12
- package/src/cli/local-bridge/console-automations.ts +19 -14
- package/src/cli/local-bridge/console-view-models.ts +4 -13
- package/src/cli/local-bridge/facade-api.ts +64 -193
- package/src/cli/local-bridge/server.ts +24 -147
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/repositories/command-classifier.ts +0 -9
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +37 -18
- package/src/cli/repositories/controller-home.ts +48 -0
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/locks.ts +20 -0
- package/src/cli/repositories/registry.ts +79 -12
- package/src/cli/repositories/safe-patch.ts +2 -12
- package/src/cli/repositories/structured-git.ts +101 -5
- package/src/cli/repository/inspector.ts +185 -343
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/effects/process-runner.ts +17 -1
- package/src/runtime/context/assistant-context.ts +20 -7
- package/src/runtime/context/assistant-work-context.ts +89 -27
- package/src/runtime/context/automatic-learning.ts +565 -0
- package/src/runtime/context/cognitive-attention.ts +173 -0
- package/src/runtime/context/cognitive-skill-canary.ts +158 -0
- package/src/runtime/context/context-closure.ts +46 -9
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +1 -9
- package/src/runtime/context/direct-controller-learning.ts +298 -0
- package/src/runtime/context/generic-lsp-provider.ts +1 -1
- package/src/runtime/context/semantic-navigation-contract.ts +16 -0
- package/src/runtime/context/semantic-navigation.ts +7 -35
- package/src/runtime/context/typescript-navigation-process.ts +145 -0
- package/src/runtime/context/typescript-navigation.ts +89 -3
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +6 -8
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
- package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
- package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
- package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
- package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
- package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
- package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
- package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
- package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
- package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
- package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
- package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
- package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
- package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
- package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
- package/src/runtime/control-plane/facade/index.ts +0 -1
- package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
- package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
- package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
- package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
- package/src/runtime/control-plane/facade/types.ts +49 -108
- package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
- package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- package/src/runtime/control-plane/governance/access-policy.ts +19 -2
- package/src/runtime/control-plane/governance/authorization.ts +20 -3
- package/src/runtime/control-plane/governance/external-effects.ts +1 -1
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
- package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
- package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
- package/src/runtime/control-plane/release-retention.ts +135 -47
- package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
- package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
- package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
- package/src/runtime/diagnostics/incident-repair.ts +313 -146
- package/src/runtime/diagnostics/mcp-timing.ts +114 -0
- package/src/runtime/evidence/artifact-store.ts +158 -40
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/evidence/sensitive-output.ts +22 -2
- package/src/runtime/execution/jobs/child-reference.ts +11 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
- package/src/runtime/execution/jobs/store.ts +3 -4
- package/src/runtime/execution/managed-workspace.ts +57 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
- package/src/runtime/execution/process-runtime/check-result.ts +105 -1
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
- package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
- package/src/runtime/execution/process-runtime/gc.ts +15 -2
- package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
- package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
- package/src/runtime/execution/process-runtime/index.ts +3 -0
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
- package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
- package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
- package/src/runtime/execution/process-runtime/runtime.ts +55 -18
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
- package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
- package/src/runtime/execution/workers/executor.ts +3 -8
- package/src/runtime/maintenance/cleanup.ts +41 -5
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +8 -0
- package/src/runtime/plugins/action-application.ts +97 -29
- package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
- package/src/runtime/plugins/browser-adapter.ts +1124 -333
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
- package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +18 -0
- package/src/runtime/plugins/browser-runtime.ts +40 -36
- package/src/runtime/plugins/browser-session-authority.ts +2 -2
- package/src/runtime/plugins/browser-session-store.ts +46 -76
- package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
- package/src/runtime/plugins/computer-registration.ts +298 -20
- package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
- package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
- package/src/runtime/plugins/external-adapter.ts +42 -6
- package/src/runtime/plugins/external-registration.ts +21 -1
- package/src/runtime/plugins/github-adapter.ts +30 -3
- package/src/runtime/plugins/gmail-adapter.ts +189 -3
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +24 -12
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
- package/src/runtime/plugins/ios-adapter.ts +46 -41
- package/src/runtime/plugins/ios-agent-device.ts +54 -4
- package/src/runtime/plugins/ios-device-ownership.ts +103 -0
- package/src/runtime/plugins/ios-physical-device.ts +497 -79
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -100
- package/src/runtime/plugins/managed-process-adapter.ts +12 -5
- package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
- package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +682 -435
- package/src/runtime/plugins/types.ts +24 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/git-status-sampler.ts +2 -19
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +4 -4
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/probe.ts +2 -2
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +312 -0
- package/src/runtime/release/release-session.ts +716 -0
- package/src/runtime/release/release-state-migration.ts +25 -0
- package/src/runtime/resources/leases/store.ts +56 -25
- package/src/runtime/root/computer-composition.ts +191 -6
- package/src/runtime/root/controller-progression-composition.ts +254 -0
- package/src/runtime/root/controller-round-composition.ts +20 -1
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +111 -18
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +227 -29
- package/src/runtime/root/package-runtime-release.ts +117 -30
- package/src/runtime/root/package-runtime-service.ts +24 -24
- package/src/runtime/root/release-execution-canary.ts +57 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -40
- package/src/runtime/root/release-materialize.ts +372 -106
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +160 -29
- package/src/runtime/root/scheduled-controller-composition.ts +29 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +126 -44
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -9
- package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/ios-development.ts +22 -8
- package/src/runtime/safe-tooling/job-summary.ts +1 -1
- package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
- package/src/runtime/shared/atomic-text-file.ts +21 -0
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/json-files.ts +8 -3
- package/src/runtime/shared/process-environment.ts +20 -9
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
- package/src/runtime/standalone-recovery/core.ts +3792 -417
- package/src/runtime/standalone-recovery/entry.ts +507 -45
- package/src/runtime/standalone-recovery/installer.ts +262 -148
- package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
- package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
- package/src/runtime/standalone-recovery/performance.ts +54 -16
- package/src/runtime/standalone-recovery/release.ts +53 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
- package/src/runtime/workflow/schedules/engine.ts +166 -178
- package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
- package/src/runtime/workflows/runtime.ts +15 -19
- package/src/testing/test-governance.ts +5 -1
- package/supervisor/chatgpt-conversation.ts +23 -0
- package/supervisor/client.ts +218 -0
- package/supervisor/control-plane.ts +963 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +147 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +1151 -0
- package/supervisor/native-messaging/host.ts +58 -0
- package/supervisor/native-messaging/manifest.ts +26 -0
- package/supervisor/native-messaging/protocol.ts +27 -0
- package/supervisor/paths.ts +18 -0
- package/supervisor/protocol.ts +250 -0
- package/supervisor/server.ts +412 -0
- package/supervisor/store.ts +1870 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +261 -0
- package/SKILL.md +0 -427
- package/adapters/chatgpt/controller-host.ts +0 -119
- package/adapters/mcp/controller-round-compatibility.ts +0 -184
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
- package/adapters/mcp/toolset-selection.ts +0 -41
- package/agents/openai.yaml +0 -4
- package/assets/skill-hooks.json +0 -41
- package/assets/skill-version.json +0 -189
- package/assets/skills/claude-review/SKILL.md +0 -231
- package/assets/skills/codex-review/SKILL.md +0 -103
- package/assets/templates/helpers/check-skill-version.ts +0 -193
- package/packages/kernel/progression/api/index.ts +0 -2
- package/packages/kernel/progression/application/projector.ts +0 -211
- package/packages/kernel/progression/domain/types.ts +0 -116
- package/packages/kernel/progression/index.ts +0 -1
- package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
- package/packages/kernel/scheduler/domain/continuation.ts +0 -38
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
- package/packages/kernel/work/domain/admission-policy.ts +0 -34
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-computer-hotpath.ts +0 -255
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -191
- package/scripts/benchmark-ios-agent-device.ts +0 -511
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -169
- package/scripts/benchmark-operational-memory-activation.ts +0 -235
- package/scripts/benchmark-operational-shadow.ts +0 -28
- package/scripts/benchmark-quality-harness.ts +0 -146
- package/scripts/benchmark-route-session-concurrency.ts +0 -915
- package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
- package/scripts/benchmark-thin-harness.ts +0 -251
- package/scripts/benchmark-typescript-navigation.ts +0 -186
- package/scripts/benchmark-work-efficiency.ts +0 -334
- package/scripts/build-controller-ui.ts +0 -28
- package/scripts/check-npm-release.sh +0 -32
- package/scripts/check-public-release-surface.sh +0 -19
- package/scripts/check-release-published.sh +0 -57
- package/scripts/check-release-readiness.sh +0 -37
- package/scripts/check-release-version.mjs +0 -74
- package/scripts/check-skill-version.ts +0 -5
- package/scripts/check-tarball-install-smoke.sh +0 -150
- package/scripts/ensure-codegraph.sh +0 -16
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/run-skill-hook.ts +0 -244
- package/scripts/stage-runtime-release.ts +0 -44
- package/scripts/sync-codex-installed-copies.sh +0 -182
- package/src/cli/commands/tools.ts +0 -167
- package/src/cli/controller/progress.ts +0 -656
- package/src/cli/controller/work-mode.ts +0 -181
- package/src/cli/local-bridge/console-assets.ts +0 -17
- package/src/cli/local-bridge/dashboard.ts +0 -17
- package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
- package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
- package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
- package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
- package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/styles.css +0 -28
- package/src/cli/local-bridge/frontend/src/types.ts +0 -15
- package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
- package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
- package/src/cli/local-bridge/ui-dist/app.css +0 -1
- package/src/cli/local-bridge/ui-dist/app.js +0 -11228
- package/src/cli/mcp/access-mode.ts +0 -2
- package/src/cli/mcp/access-tools.ts +0 -2
- package/src/cli/mcp/audit.ts +0 -2
- package/src/cli/mcp/auth.ts +0 -2
- package/src/cli/mcp/instructions.ts +0 -2
- package/src/cli/mcp/legacy-context.ts +0 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -2
- package/src/cli/mcp/multi-repository.ts +0 -2
- package/src/cli/mcp/oauth.ts +0 -2
- package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
- package/src/cli/mcp/paths.ts +0 -2
- package/src/cli/mcp/policy.ts +0 -2
- package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
- package/src/cli/mcp/proxy-env.ts +0 -2
- package/src/cli/mcp/readiness-projection.ts +0 -2
- package/src/cli/mcp/redaction.ts +0 -2
- package/src/cli/mcp/repo.ts +0 -2
- package/src/cli/mcp/repository-tools.ts +0 -2
- package/src/cli/mcp/server.ts +0 -2
- package/src/cli/mcp/setup.ts +0 -2
- package/src/cli/mcp/tool-capability-cache.ts +0 -2
- package/src/cli/mcp/tool-contract.ts +0 -2
- package/src/cli/mcp/tools.ts +0 -2
- package/src/cli/mcp/toolset-names.ts +0 -2
- package/src/cli/mcp/toolset-selection.ts +0 -2
- package/src/cli/mcp/toolset.ts +0 -2
- package/src/cli/mcp/transports/http.ts +0 -2
- package/src/cli/mcp/transports/session-registry.ts +0 -2
- package/src/cli/mcp/transports/stdio.ts +0 -2
- package/src/cli/mcp/types.ts +0 -2
- package/src/cli/mcp/umbrella-tools.ts +0 -2
- package/src/cli/tools/codegraph.ts +0 -695
- package/src/core/adoption/helper-wrapper-plan.ts +0 -159
- package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
- package/src/runtime/context/codegraph-read-provider.ts +0 -611
- package/src/runtime/context/codegraph-sidecar.cjs +0 -248
- package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
- package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
- package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
- package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
- package/src/runtime/control-plane/routing/index.ts +0 -1
- package/src/runtime/control-plane/routing/route-policy.ts +0 -401
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
- package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
- package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
- package/src/runtime/gateway/mcp/process-tools.ts +0 -2
- package/src/runtime/gateway/mcp/router.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
- package/src/runtime/plugins/browser-provider-registry.ts +0 -2
|
@@ -1,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
|
-
}
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
const FROZEN_SEMANTIC_COMPATIBILITY_PREFIX = 'semantic.v1:';
|
|
2
|
-
const MAX_FROZEN_SEMANTIC_ENCODED_CHARS = 96 * 1024;
|
|
3
|
-
const MAX_FROZEN_SEMANTIC_DECODED_BYTES = 64 * 1024;
|
|
4
|
-
const MAX_FROZEN_SEMANTIC_ARRAY_ITEMS = 128;
|
|
5
|
-
const MAX_FROZEN_PLAN_OBLIGATION_DISPOSITIONS = 512;
|
|
6
|
-
const MAX_FROZEN_PLAN_SUCCESSOR_REFS = 32;
|
|
7
|
-
const MAX_FROZEN_SEMANTIC_STRING_CHARS = 16 * 1024;
|
|
8
|
-
|
|
9
|
-
export const FROZEN_SEMANTIC_COMPATIBILITY_OPERATIONS = ['requirement_create', 'plan_create', 'start', 'work_review'] as const;
|
|
10
|
-
export type FrozenSemanticCompatibilityOperation = (typeof FROZEN_SEMANTIC_COMPATIBILITY_OPERATIONS)[number];
|
|
11
|
-
|
|
12
|
-
export interface FrozenRequirementCreateCompatibilityArgs {
|
|
13
|
-
requirement_title: string;
|
|
14
|
-
requirement_outcome: string;
|
|
15
|
-
requirement_acceptance_criteria?: string[];
|
|
16
|
-
requirement_delivery_references?: string[];
|
|
17
|
-
requirement_legacy_aliases?: string[];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface FrozenRequirementCreateCompatibilityEnvelope {
|
|
21
|
-
operation: 'requirement_create';
|
|
22
|
-
args: FrozenRequirementCreateCompatibilityArgs;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface FrozenPlanObligationDispositionCompatibilityArgs {
|
|
26
|
-
predecessor_plan_id: string;
|
|
27
|
-
obligation_id: string;
|
|
28
|
-
disposition: 'keep' | 'change' | 'defer' | 'drop';
|
|
29
|
-
successor_refs: string[];
|
|
30
|
-
rationale?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface FrozenPlanCreateCompatibilityArgs {
|
|
34
|
-
obligation_dispositions: FrozenPlanObligationDispositionCompatibilityArgs[];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface FrozenPlanCreateCompatibilityEnvelope {
|
|
38
|
-
operation: 'plan_create';
|
|
39
|
-
args: FrozenPlanCreateCompatibilityArgs;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export const FROZEN_WORK_START_KINDS = [
|
|
43
|
-
'repository_change',
|
|
44
|
-
'completed_no_change',
|
|
45
|
-
'read_only_review',
|
|
46
|
-
'investigation',
|
|
47
|
-
'local_effect',
|
|
48
|
-
'remote_effect',
|
|
49
|
-
'reconciliation',
|
|
50
|
-
] as const;
|
|
51
|
-
export type FrozenWorkStartKind = (typeof FROZEN_WORK_START_KINDS)[number];
|
|
52
|
-
|
|
53
|
-
export interface FrozenWorkStartCompatibilityArgs {
|
|
54
|
-
work_kind: FrozenWorkStartKind;
|
|
55
|
-
engineering_preconditions?: Record<string, unknown>;
|
|
56
|
-
controller_authority_id?: string;
|
|
57
|
-
relay_scope_id?: string;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface FrozenWorkStartCompatibilityEnvelope {
|
|
61
|
-
operation: 'start';
|
|
62
|
-
args: FrozenWorkStartCompatibilityArgs;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface FrozenWorkReviewCompatibilityArgs {
|
|
66
|
-
decision: 'approved' | 'changes_required' | 'blocked';
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export interface FrozenWorkReviewCompatibilityEnvelope {
|
|
70
|
-
operation: 'work_review';
|
|
71
|
-
args: FrozenWorkReviewCompatibilityArgs;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export type FrozenSemanticCompatibilityEnvelope =
|
|
75
|
-
| FrozenRequirementCreateCompatibilityEnvelope
|
|
76
|
-
| FrozenPlanCreateCompatibilityEnvelope
|
|
77
|
-
| FrozenWorkStartCompatibilityEnvelope
|
|
78
|
-
| FrozenWorkReviewCompatibilityEnvelope;
|
|
79
|
-
|
|
80
|
-
const REQUIREMENT_CREATE_KEYS = new Set([
|
|
81
|
-
'requirement_title',
|
|
82
|
-
'requirement_outcome',
|
|
83
|
-
'requirement_acceptance_criteria',
|
|
84
|
-
'requirement_delivery_references',
|
|
85
|
-
'requirement_legacy_aliases',
|
|
86
|
-
]);
|
|
87
|
-
|
|
88
|
-
function fail(message: string): never {
|
|
89
|
-
throw new Error(`FROZEN_SEMANTIC_COMPATIBILITY_INVALID: ${message}`);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function assertExactKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>, label: string): void {
|
|
93
|
-
for (const key of Object.keys(value)) {
|
|
94
|
-
if (!allowed.has(key)) fail(`${label} contains unsupported field ${key}`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function boundedString(value: unknown, field: string): string {
|
|
99
|
-
if (typeof value !== 'string') fail(`${field} must be a string`);
|
|
100
|
-
if (value.length > MAX_FROZEN_SEMANTIC_STRING_CHARS) fail(`${field} exceeds transport bound`);
|
|
101
|
-
return value;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function boundedStringArray(value: unknown, field: string): string[] | undefined {
|
|
105
|
-
if (value === undefined) return undefined;
|
|
106
|
-
if (!Array.isArray(value) || value.length > MAX_FROZEN_SEMANTIC_ARRAY_ITEMS) {
|
|
107
|
-
fail(`${field} must be a bounded string array`);
|
|
108
|
-
}
|
|
109
|
-
return value.map((entry, index) => boundedString(entry, `${field}[${index}]`));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function normalizeRequirementCreateArgs(value: unknown): FrozenRequirementCreateCompatibilityArgs {
|
|
113
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) fail('requirement_create args must be an object');
|
|
114
|
-
const args = value as Record<string, unknown>;
|
|
115
|
-
assertExactKeys(args, REQUIREMENT_CREATE_KEYS, 'requirement_create args');
|
|
116
|
-
const acceptanceCriteria = boundedStringArray(args.requirement_acceptance_criteria, 'requirement_acceptance_criteria');
|
|
117
|
-
const deliveryReferences = boundedStringArray(args.requirement_delivery_references, 'requirement_delivery_references');
|
|
118
|
-
const legacyAliases = boundedStringArray(args.requirement_legacy_aliases, 'requirement_legacy_aliases');
|
|
119
|
-
return {
|
|
120
|
-
requirement_title: boundedString(args.requirement_title, 'requirement_title'),
|
|
121
|
-
requirement_outcome: boundedString(args.requirement_outcome, 'requirement_outcome'),
|
|
122
|
-
...(acceptanceCriteria !== undefined ? { requirement_acceptance_criteria: acceptanceCriteria } : {}),
|
|
123
|
-
...(deliveryReferences !== undefined ? { requirement_delivery_references: deliveryReferences } : {}),
|
|
124
|
-
...(legacyAliases !== undefined ? { requirement_legacy_aliases: legacyAliases } : {}),
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const PLAN_CREATE_KEYS = new Set(['obligation_dispositions']);
|
|
129
|
-
const PLAN_OBLIGATION_DISPOSITION_KEYS = new Set([
|
|
130
|
-
'predecessor_plan_id',
|
|
131
|
-
'obligation_id',
|
|
132
|
-
'disposition',
|
|
133
|
-
'successor_refs',
|
|
134
|
-
'rationale',
|
|
135
|
-
]);
|
|
136
|
-
|
|
137
|
-
function normalizePlanObligationDisposition(value: unknown, index: number): FrozenPlanObligationDispositionCompatibilityArgs {
|
|
138
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) fail(`obligation_dispositions[${index}] must be an object`);
|
|
139
|
-
const entry = value as Record<string, unknown>;
|
|
140
|
-
assertExactKeys(entry, PLAN_OBLIGATION_DISPOSITION_KEYS, `obligation_dispositions[${index}]`);
|
|
141
|
-
const disposition = boundedString(entry.disposition, `obligation_dispositions[${index}].disposition`);
|
|
142
|
-
if (!['keep', 'change', 'defer', 'drop'].includes(disposition)) fail(`obligation_dispositions[${index}].disposition is invalid`);
|
|
143
|
-
const successorRefs = boundedStringArray(entry.successor_refs, `obligation_dispositions[${index}].successor_refs`) ?? [];
|
|
144
|
-
if (successorRefs.length > MAX_FROZEN_PLAN_SUCCESSOR_REFS) fail(`obligation_dispositions[${index}].successor_refs exceeds transport bound`);
|
|
145
|
-
return {
|
|
146
|
-
predecessor_plan_id: boundedString(entry.predecessor_plan_id, `obligation_dispositions[${index}].predecessor_plan_id`),
|
|
147
|
-
obligation_id: boundedString(entry.obligation_id, `obligation_dispositions[${index}].obligation_id`),
|
|
148
|
-
disposition: disposition as FrozenPlanObligationDispositionCompatibilityArgs['disposition'],
|
|
149
|
-
successor_refs: successorRefs,
|
|
150
|
-
...(entry.rationale !== undefined ? { rationale: boundedString(entry.rationale, `obligation_dispositions[${index}].rationale`) } : {}),
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function normalizePlanCreateArgs(value: unknown): FrozenPlanCreateCompatibilityArgs {
|
|
155
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) fail('plan_create args must be an object');
|
|
156
|
-
const args = value as Record<string, unknown>;
|
|
157
|
-
assertExactKeys(args, PLAN_CREATE_KEYS, 'plan_create args');
|
|
158
|
-
if (!Array.isArray(args.obligation_dispositions) || args.obligation_dispositions.length > MAX_FROZEN_PLAN_OBLIGATION_DISPOSITIONS) {
|
|
159
|
-
fail('obligation_dispositions must be a bounded array');
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
obligation_dispositions: args.obligation_dispositions.map(normalizePlanObligationDisposition),
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Retirement boundary: remove the start envelope only after the oldest supported
|
|
167
|
-
// frozen rh_work schema exposes work_kind, engineering_preconditions,
|
|
168
|
-
// controller_authority_id and relay_scope_id together. Until then this remains a
|
|
169
|
-
// bounded transport carrier only; canonical GoalWorkloop/ControllerRound handlers
|
|
170
|
-
// still own validation, admission and mutation.
|
|
171
|
-
const WORK_START_KEYS = new Set(['work_kind', 'engineering_preconditions', 'controller_authority_id', 'relay_scope_id']);
|
|
172
|
-
|
|
173
|
-
function boundedObject(value: unknown, field: string): Record<string, unknown> | undefined {
|
|
174
|
-
if (value === undefined) return undefined;
|
|
175
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) fail(`${field} must be an object`);
|
|
176
|
-
let encoded: string;
|
|
177
|
-
try { encoded = JSON.stringify(value); } catch { return fail(`${field} must be JSON serializable`); }
|
|
178
|
-
if (Buffer.byteLength(encoded, 'utf8') > MAX_FROZEN_SEMANTIC_DECODED_BYTES) fail(`${field} exceeds transport bound`);
|
|
179
|
-
return JSON.parse(encoded) as Record<string, unknown>;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function normalizeWorkStartArgs(value: unknown): FrozenWorkStartCompatibilityArgs {
|
|
183
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) fail('start args must be an object');
|
|
184
|
-
const args = value as Record<string, unknown>;
|
|
185
|
-
assertExactKeys(args, WORK_START_KEYS, 'start args');
|
|
186
|
-
const workKind = boundedString(args.work_kind, 'work_kind');
|
|
187
|
-
if (!FROZEN_WORK_START_KINDS.includes(workKind as FrozenWorkStartKind)) fail('work_kind is invalid');
|
|
188
|
-
const engineeringPreconditions = boundedObject(args.engineering_preconditions, 'engineering_preconditions');
|
|
189
|
-
const authorityId = args.controller_authority_id === undefined
|
|
190
|
-
? undefined
|
|
191
|
-
: boundedString(args.controller_authority_id, 'controller_authority_id').trim();
|
|
192
|
-
const relayScopeId = args.relay_scope_id === undefined
|
|
193
|
-
? undefined
|
|
194
|
-
: boundedString(args.relay_scope_id, 'relay_scope_id').trim();
|
|
195
|
-
if ((authorityId === undefined) !== (relayScopeId === undefined)) fail('controller_authority_id and relay_scope_id must be paired');
|
|
196
|
-
if (authorityId !== undefined && !/^cra_[0-9a-f]{32}$/i.test(authorityId)) fail('controller_authority_id is invalid');
|
|
197
|
-
if (relayScopeId !== undefined && !relayScopeId) fail('relay_scope_id is invalid');
|
|
198
|
-
return {
|
|
199
|
-
work_kind: workKind as FrozenWorkStartKind,
|
|
200
|
-
...(engineeringPreconditions !== undefined ? { engineering_preconditions: engineeringPreconditions } : {}),
|
|
201
|
-
...(authorityId !== undefined ? { controller_authority_id: authorityId, relay_scope_id: relayScopeId! } : {}),
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
function normalizeWorkReviewArgs(value: unknown): FrozenWorkReviewCompatibilityArgs {
|
|
207
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) fail('work_review args must be an object');
|
|
208
|
-
const args = value as Record<string, unknown>;
|
|
209
|
-
assertExactKeys(args, new Set(['decision']), 'work_review args');
|
|
210
|
-
const decision = boundedString(args.decision, 'decision');
|
|
211
|
-
if (!['approved', 'changes_required', 'blocked'].includes(decision)) fail('decision is invalid');
|
|
212
|
-
return { decision: decision as FrozenWorkReviewCompatibilityArgs['decision'] };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function normalizeEnvelopeArgs(input: FrozenSemanticCompatibilityEnvelope): FrozenSemanticCompatibilityEnvelope['args'] {
|
|
216
|
-
if (input.operation === 'requirement_create') return normalizeRequirementCreateArgs(input.args);
|
|
217
|
-
if (input.operation === 'plan_create') return normalizePlanCreateArgs(input.args);
|
|
218
|
-
if (input.operation === 'start') return normalizeWorkStartArgs(input.args);
|
|
219
|
-
if (input.operation === 'work_review') return normalizeWorkReviewArgs(input.args);
|
|
220
|
-
return fail('operation is not allowlisted');
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
function parsePayload(capabilityId: string): Record<string, unknown> {
|
|
224
|
-
const encoded = capabilityId.slice(FROZEN_SEMANTIC_COMPATIBILITY_PREFIX.length);
|
|
225
|
-
if (!encoded || encoded.length > MAX_FROZEN_SEMANTIC_ENCODED_CHARS || !/^[A-Za-z0-9_-]+$/.test(encoded)) {
|
|
226
|
-
fail('payload encoding is invalid or oversized');
|
|
227
|
-
}
|
|
228
|
-
const decoded = Buffer.from(encoded, 'base64url');
|
|
229
|
-
if (decoded.length === 0 || decoded.length > MAX_FROZEN_SEMANTIC_DECODED_BYTES) fail('payload exceeds decoded transport bound');
|
|
230
|
-
let parsed: unknown;
|
|
231
|
-
try {
|
|
232
|
-
parsed = JSON.parse(decoded.toString('utf8'));
|
|
233
|
-
} catch {
|
|
234
|
-
fail('payload is not valid JSON');
|
|
235
|
-
}
|
|
236
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) fail('payload must be an object');
|
|
237
|
-
return parsed as Record<string, unknown>;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
export function buildFrozenSemanticCompatibilityCapability(input: FrozenSemanticCompatibilityEnvelope): string {
|
|
241
|
-
const args = normalizeEnvelopeArgs(input);
|
|
242
|
-
const json = JSON.stringify({ v: 1, op: input.operation, a: args });
|
|
243
|
-
if (Buffer.byteLength(json, 'utf8') > MAX_FROZEN_SEMANTIC_DECODED_BYTES) fail('payload exceeds decoded transport bound');
|
|
244
|
-
const encoded = Buffer.from(json, 'utf8').toString('base64url');
|
|
245
|
-
if (encoded.length > MAX_FROZEN_SEMANTIC_ENCODED_CHARS) fail('payload exceeds encoded transport bound');
|
|
246
|
-
return `${FROZEN_SEMANTIC_COMPATIBILITY_PREFIX}${encoded}`;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Decode a forward-compatible semantic operation from an already-stable frozen
|
|
251
|
-
* rh_work carrier. This function owns transport validation only. It never writes
|
|
252
|
-
* Requirement/Plan/Work state and every returned operation must re-enter the
|
|
253
|
-
* current canonical Runtime facade handler.
|
|
254
|
-
*/
|
|
255
|
-
export function parseFrozenSemanticCompatibilityCapability(
|
|
256
|
-
requestedOperation: string,
|
|
257
|
-
capabilityId: unknown,
|
|
258
|
-
): FrozenSemanticCompatibilityEnvelope | undefined {
|
|
259
|
-
if (typeof capabilityId !== 'string') return undefined;
|
|
260
|
-
const normalized = capabilityId.trim();
|
|
261
|
-
if (!normalized.startsWith(FROZEN_SEMANTIC_COMPATIBILITY_PREFIX)) return undefined;
|
|
262
|
-
if (requestedOperation !== 'repair') fail('semantic envelope requires the stable repair transport operation');
|
|
263
|
-
|
|
264
|
-
const payload = parsePayload(normalized);
|
|
265
|
-
assertExactKeys(payload, new Set(['v', 'op', 'a']), 'payload');
|
|
266
|
-
if (payload.v !== 1) fail('unsupported envelope version');
|
|
267
|
-
if (payload.op === 'requirement_create') {
|
|
268
|
-
return {
|
|
269
|
-
operation: 'requirement_create',
|
|
270
|
-
args: normalizeRequirementCreateArgs(payload.a),
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
if (payload.op === 'plan_create') {
|
|
274
|
-
return {
|
|
275
|
-
operation: 'plan_create',
|
|
276
|
-
args: normalizePlanCreateArgs(payload.a),
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
if (payload.op === 'start') {
|
|
280
|
-
return {
|
|
281
|
-
operation: 'start',
|
|
282
|
-
args: normalizeWorkStartArgs(payload.a),
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
if (payload.op === 'work_review') {
|
|
286
|
-
return {
|
|
287
|
-
operation: 'work_review',
|
|
288
|
-
args: normalizeWorkReviewArgs(payload.a),
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
return fail('operation is not allowlisted');
|
|
292
|
-
}
|