cloving 0.3.20 → 1.0.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/{LICENSE.md → LICENSE} +1 -1
- package/README.md +475 -182
- package/dist/src/authority/budgets.d.ts +12 -0
- package/dist/src/authority/budgets.js +42 -0
- package/dist/src/authority/commands.d.ts +7 -0
- package/dist/src/authority/commands.js +263 -0
- package/dist/src/authority/details.d.ts +28 -0
- package/dist/src/authority/details.js +33 -0
- package/dist/src/authority/dispatch-decision.d.ts +40 -0
- package/dist/src/authority/dispatch-decision.js +47 -0
- package/dist/src/authority/effect-requests.d.ts +2 -0
- package/dist/src/authority/effect-requests.js +139 -0
- package/dist/src/authority/effect-results.d.ts +4 -0
- package/dist/src/authority/effect-results.js +236 -0
- package/dist/src/authority/events.d.ts +2 -0
- package/dist/src/authority/events.js +45 -0
- package/dist/src/authority/gate-reduction.d.ts +8 -0
- package/dist/src/authority/gate-reduction.js +109 -0
- package/dist/src/authority/gates.d.ts +48 -0
- package/dist/src/authority/gates.js +77 -0
- package/dist/src/authority/history-state.d.ts +15 -0
- package/dist/src/authority/history-state.js +61 -0
- package/dist/src/authority/history.d.ts +13 -0
- package/dist/src/authority/history.js +37 -0
- package/dist/src/authority/instants.d.ts +3 -0
- package/dist/src/authority/instants.js +38 -0
- package/dist/src/authority/leases.d.ts +15 -0
- package/dist/src/authority/leases.js +113 -0
- package/dist/src/authority/operations.d.ts +101 -0
- package/dist/src/authority/operations.js +75 -0
- package/dist/src/authority/reconciliation.d.ts +27 -0
- package/dist/src/authority/reconciliation.js +147 -0
- package/dist/src/authority/reducer.d.ts +41 -0
- package/dist/src/authority/reducer.js +139 -0
- package/dist/src/authority/reduction-state.d.ts +36 -0
- package/dist/src/authority/reduction-state.js +68 -0
- package/dist/src/authority/reduction.d.ts +6 -0
- package/dist/src/authority/reduction.js +160 -0
- package/dist/src/authority/status-closure.d.ts +4 -0
- package/dist/src/authority/status-closure.js +57 -0
- package/dist/src/authority/status-effects.d.ts +17 -0
- package/dist/src/authority/status-effects.js +43 -0
- package/dist/src/authority/status-input.d.ts +45 -0
- package/dist/src/authority/status-input.js +9 -0
- package/dist/src/authority/status.d.ts +32 -0
- package/dist/src/authority/status.js +256 -0
- package/dist/src/authority/stop-sequence.d.ts +37 -0
- package/dist/src/authority/stop-sequence.js +91 -0
- package/dist/src/authority/transitions.d.ts +63 -0
- package/dist/src/authority/transitions.js +122 -0
- package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
- package/dist/src/broker/actor/adapter-calls.js +34 -0
- package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
- package/dist/src/broker/actor/adapter-outcomes.js +80 -0
- package/dist/src/broker/actor/authority-actor.d.ts +25 -0
- package/dist/src/broker/actor/authority-actor.js +169 -0
- package/dist/src/broker/actor/authority-changes.d.ts +31 -0
- package/dist/src/broker/actor/authority-changes.js +46 -0
- package/dist/src/broker/actor/authority-connection.d.ts +15 -0
- package/dist/src/broker/actor/authority-connection.js +44 -0
- package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
- package/dist/src/broker/actor/authority-conversion.js +72 -0
- package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
- package/dist/src/broker/actor/authority-delivery.js +162 -0
- package/dist/src/broker/actor/authority-logger.d.ts +2 -0
- package/dist/src/broker/actor/authority-logger.js +19 -0
- package/dist/src/broker/actor/authority-policy.d.ts +9 -0
- package/dist/src/broker/actor/authority-policy.js +11 -0
- package/dist/src/broker/actor/authority-queries.d.ts +45 -0
- package/dist/src/broker/actor/authority-queries.js +85 -0
- package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
- package/dist/src/broker/actor/authority-receipts.js +84 -0
- package/dist/src/broker/actor/authority-release.d.ts +13 -0
- package/dist/src/broker/actor/authority-release.js +69 -0
- package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
- package/dist/src/broker/actor/authority-runtime.js +204 -0
- package/dist/src/broker/actor/authority-session.d.ts +65 -0
- package/dist/src/broker/actor/authority-session.js +252 -0
- package/dist/src/broker/actor/authority-settings.d.ts +33 -0
- package/dist/src/broker/actor/authority-settings.js +63 -0
- package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
- package/dist/src/broker/actor/authority-upgrades.js +12 -0
- package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
- package/dist/src/broker/actor/authority-watchdog.js +41 -0
- package/dist/src/broker/actor/authority.d.ts +14 -0
- package/dist/src/broker/actor/authority.js +115 -0
- package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
- package/dist/src/broker/actor/delivery-intents.js +77 -0
- package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
- package/dist/src/broker/actor/delivery-plan.js +109 -0
- package/dist/src/broker/actor/delivery-results.d.ts +11 -0
- package/dist/src/broker/actor/delivery-results.js +63 -0
- package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
- package/dist/src/broker/actor/effect-delivery.js +118 -0
- package/dist/src/broker/actor/effect-plan.d.ts +41 -0
- package/dist/src/broker/actor/effect-plan.js +173 -0
- package/dist/src/broker/actor/effect-queries.d.ts +27 -0
- package/dist/src/broker/actor/effect-queries.js +80 -0
- package/dist/src/broker/actor/effect-turn.d.ts +25 -0
- package/dist/src/broker/actor/effect-turn.js +84 -0
- package/dist/src/broker/actor/pin-check.d.ts +6 -0
- package/dist/src/broker/actor/pin-check.js +12 -0
- package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
- package/dist/src/broker/actor/runtime-parts.js +34 -0
- package/dist/src/broker/actor/stop-plan.d.ts +20 -0
- package/dist/src/broker/actor/stop-plan.js +46 -0
- package/dist/src/broker/actor/stop-turn.d.ts +17 -0
- package/dist/src/broker/actor/stop-turn.js +42 -0
- package/dist/src/broker/actor/turn-draft.d.ts +31 -0
- package/dist/src/broker/actor/turn-draft.js +138 -0
- package/dist/src/broker/actor/turn-plan.d.ts +17 -0
- package/dist/src/broker/actor/turn-plan.js +136 -0
- package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
- package/dist/src/broker/actor/turn-refusals.js +35 -0
- package/dist/src/broker/actor/turn-staging.d.ts +78 -0
- package/dist/src/broker/actor/turn-staging.js +34 -0
- package/dist/src/broker/actor/turn-state.d.ts +34 -0
- package/dist/src/broker/actor/turn-state.js +208 -0
- package/dist/src/broker/authority-admission.d.ts +21 -0
- package/dist/src/broker/authority-admission.js +70 -0
- package/dist/src/broker/authority-restore.d.ts +30 -0
- package/dist/src/broker/authority-restore.js +165 -0
- package/dist/src/broker/decision-restore.d.ts +16 -0
- package/dist/src/broker/decision-restore.js +158 -0
- package/dist/src/broker/decision-upgrade.d.ts +3 -0
- package/dist/src/broker/decision-upgrade.js +12 -0
- package/dist/src/broker/effect-restore.d.ts +20 -0
- package/dist/src/broker/effect-restore.js +111 -0
- package/dist/src/broker/effect-upgrade.d.ts +3 -0
- package/dist/src/broker/effect-upgrade.js +9 -0
- package/dist/src/broker/operation-digest.d.ts +1 -0
- package/dist/src/broker/operation-digest.js +4 -0
- package/dist/src/broker/socket-address.d.ts +9 -0
- package/dist/src/broker/socket-address.js +14 -0
- package/dist/src/broker/workflow-pin.d.ts +2 -0
- package/dist/src/broker/workflow-pin.js +5 -0
- package/dist/src/chats/destination.d.ts +4 -0
- package/dist/src/chats/destination.js +94 -0
- package/dist/src/chats/import.d.ts +13 -0
- package/dist/src/chats/import.js +71 -0
- package/dist/src/chats/normalize.d.ts +20 -0
- package/dist/src/chats/normalize.js +139 -0
- package/dist/src/chats/reader.d.ts +15 -0
- package/dist/src/chats/reader.js +87 -0
- package/dist/src/cli/arguments.d.ts +23 -0
- package/dist/src/cli/arguments.js +154 -0
- package/dist/src/cli/client.d.ts +15 -0
- package/dist/src/cli/client.js +122 -0
- package/dist/src/cli/commands.d.ts +14 -0
- package/dist/src/cli/commands.js +253 -0
- package/dist/src/cli/main.d.ts +1 -0
- package/dist/src/cli/main.js +80 -0
- package/dist/src/cli/render.d.ts +8 -0
- package/dist/src/cli/render.js +186 -0
- package/dist/src/cli/runtime-arguments.d.ts +73 -0
- package/dist/src/cli/runtime-arguments.js +248 -0
- package/dist/src/cli/runtime-directory.d.ts +4 -0
- package/dist/src/cli/runtime-directory.js +25 -0
- package/dist/src/cli/toolchain.d.ts +3 -0
- package/dist/src/cli/toolchain.js +74 -0
- package/dist/src/cli/usage.d.ts +4 -0
- package/dist/src/cli/usage.js +124 -0
- package/dist/src/cli/validate.d.ts +38 -0
- package/dist/src/cli/validate.js +116 -0
- package/dist/src/cli/watch-board-view.d.ts +22 -0
- package/dist/src/cli/watch-board-view.js +128 -0
- package/dist/src/cli/watch-board.d.ts +15 -0
- package/dist/src/cli/watch-board.js +174 -0
- package/dist/src/cli/watch-element.d.ts +11 -0
- package/dist/src/cli/watch-element.js +6 -0
- package/dist/src/cli/watch-model.d.ts +29 -0
- package/dist/src/cli/watch-model.js +261 -0
- package/dist/src/cli/watch-navigation.d.ts +9 -0
- package/dist/src/cli/watch-navigation.js +40 -0
- package/dist/src/cli/watch-page.d.ts +1 -0
- package/dist/src/cli/watch-page.js +272 -0
- package/dist/src/cli/watch-paths.d.ts +2 -0
- package/dist/src/cli/watch-paths.js +52 -0
- package/dist/src/cli/watch-phases.d.ts +7 -0
- package/dist/src/cli/watch-phases.js +148 -0
- package/dist/src/cli/watch-reads.d.ts +28 -0
- package/dist/src/cli/watch-reads.js +244 -0
- package/dist/src/cli/watch-render.d.ts +139 -0
- package/dist/src/cli/watch-render.js +95 -0
- package/dist/src/cli/watch-server.d.ts +10 -0
- package/dist/src/cli/watch-server.js +176 -0
- package/dist/src/cli/watch-stream.d.ts +11 -0
- package/dist/src/cli/watch-stream.js +128 -0
- package/dist/src/cli/watch-turn.d.ts +29 -0
- package/dist/src/cli/watch-turn.js +130 -0
- package/dist/src/cli/watch-view.d.ts +39 -0
- package/dist/src/cli/watch-view.js +223 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +62 -0
- package/dist/src/daemon/claude-turn.d.ts +28 -0
- package/dist/src/daemon/claude-turn.js +135 -0
- package/dist/src/daemon/claude-worker.d.ts +26 -0
- package/dist/src/daemon/claude-worker.js +224 -0
- package/dist/src/daemon/codex-stream.d.ts +4 -0
- package/dist/src/daemon/codex-stream.js +113 -0
- package/dist/src/daemon/daemon.d.ts +46 -0
- package/dist/src/daemon/daemon.js +186 -0
- package/dist/src/daemon/delivery-router.d.ts +10 -0
- package/dist/src/daemon/delivery-router.js +34 -0
- package/dist/src/daemon/github-calls.d.ts +29 -0
- package/dist/src/daemon/github-calls.js +127 -0
- package/dist/src/daemon/github-issue-methods.d.ts +3 -0
- package/dist/src/daemon/github-issue-methods.js +99 -0
- package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
- package/dist/src/daemon/github-issue-privacy.js +131 -0
- package/dist/src/daemon/github-merge.d.ts +18 -0
- package/dist/src/daemon/github-merge.js +259 -0
- package/dist/src/daemon/github-methods.d.ts +5 -0
- package/dist/src/daemon/github-methods.js +198 -0
- package/dist/src/daemon/github-operation.d.ts +38 -0
- package/dist/src/daemon/github-operation.js +57 -0
- package/dist/src/daemon/github-worker.d.ts +17 -0
- package/dist/src/daemon/github-worker.js +281 -0
- package/dist/src/daemon/host-environment.d.ts +8 -0
- package/dist/src/daemon/host-environment.js +14 -0
- package/dist/src/daemon/issue-queue.d.ts +9 -0
- package/dist/src/daemon/issue-queue.js +163 -0
- package/dist/src/daemon/notify-message.d.ts +14 -0
- package/dist/src/daemon/notify-message.js +48 -0
- package/dist/src/daemon/notify.d.ts +12 -0
- package/dist/src/daemon/notify.js +161 -0
- package/dist/src/daemon/operation-journal.d.ts +42 -0
- package/dist/src/daemon/operation-journal.js +53 -0
- package/dist/src/daemon/ticket-registration.d.ts +33 -0
- package/dist/src/daemon/ticket-registration.js +177 -0
- package/dist/src/daemon/ticket-source.d.ts +17 -0
- package/dist/src/daemon/ticket-source.js +36 -0
- package/dist/src/daemon/work-tree.d.ts +26 -0
- package/dist/src/daemon/work-tree.js +206 -0
- package/dist/src/effect-authorization.d.ts +21 -0
- package/dist/src/effect-authorization.js +14 -0
- package/dist/src/execution-pin.d.ts +4 -0
- package/dist/src/execution-pin.js +68 -0
- package/dist/src/host/start-delivery.d.ts +41 -0
- package/dist/src/host/start-delivery.js +68 -0
- package/dist/src/host/step-bridge-host.d.ts +79 -0
- package/dist/src/host/step-bridge-host.js +205 -0
- package/dist/src/host/step-claims.d.ts +31 -0
- package/dist/src/host/step-claims.js +85 -0
- package/dist/src/host/world-host.d.ts +21 -0
- package/dist/src/host/world-host.js +51 -0
- package/dist/src/host/world-reconciliation.d.ts +37 -0
- package/dist/src/host/world-reconciliation.js +75 -0
- package/dist/src/host/world-runs.d.ts +14 -0
- package/dist/src/host/world-runs.js +61 -0
- package/dist/src/operation-identity.d.ts +7 -0
- package/dist/src/operation-identity.js +59 -0
- package/dist/src/protocol.d.ts +35 -0
- package/dist/src/protocol.js +64 -0
- package/dist/src/resource-files.d.ts +1 -0
- package/dist/src/resource-files.js +29 -0
- package/dist/src/service/changes.d.ts +11 -0
- package/dist/src/service/changes.js +32 -0
- package/dist/src/service/decision-handler.d.ts +9 -0
- package/dist/src/service/decision-handler.js +233 -0
- package/dist/src/service/event-handler.d.ts +10 -0
- package/dist/src/service/event-handler.js +70 -0
- package/dist/src/service/expiry.d.ts +13 -0
- package/dist/src/service/expiry.js +53 -0
- package/dist/src/service/gateway.d.ts +21 -0
- package/dist/src/service/gateway.js +120 -0
- package/dist/src/service/registry.d.ts +40 -0
- package/dist/src/service/registry.js +13 -0
- package/dist/src/service/replies.d.ts +26 -0
- package/dist/src/service/replies.js +56 -0
- package/dist/src/service/run-handlers.d.ts +4 -0
- package/dist/src/service/run-handlers.js +271 -0
- package/dist/src/service/service.d.ts +58 -0
- package/dist/src/service/service.js +212 -0
- package/dist/src/service/submission-handler.d.ts +4 -0
- package/dist/src/service/submission-handler.js +206 -0
- package/dist/src/service/transport.d.ts +16 -0
- package/dist/src/service/transport.js +141 -0
- package/dist/src/service/worker-port.d.ts +85 -0
- package/dist/src/service/worker-port.js +126 -0
- package/dist/src/step-bridge.d.ts +57 -0
- package/dist/src/step-bridge.js +4 -0
- package/dist/src/steps/decision-gate.d.ts +2 -0
- package/dist/src/steps/decision-gate.js +8 -0
- package/dist/src/steps/load-cycle.d.ts +10 -0
- package/dist/src/steps/load-cycle.js +11 -0
- package/dist/src/steps/protected-effect.d.ts +2 -0
- package/dist/src/steps/protected-effect.js +8 -0
- package/dist/src/storage/decision-rows.d.ts +54 -0
- package/dist/src/storage/decision-rows.js +72 -0
- package/dist/src/storage/decision-snapshots.d.ts +17 -0
- package/dist/src/storage/decision-snapshots.js +25 -0
- package/dist/src/storage/domain-changes.d.ts +48 -0
- package/dist/src/storage/domain-changes.js +213 -0
- package/dist/src/storage/domain-rows.d.ts +85 -0
- package/dist/src/storage/domain-rows.js +129 -0
- package/dist/src/storage/domain-schema.d.ts +32 -0
- package/dist/src/storage/domain-schema.js +193 -0
- package/dist/src/storage/effect-changes.d.ts +5 -0
- package/dist/src/storage/effect-changes.js +105 -0
- package/dist/src/storage/effect-rows.d.ts +67 -0
- package/dist/src/storage/effect-rows.js +74 -0
- package/dist/src/storage/effect-schema.d.ts +1 -0
- package/dist/src/storage/effect-schema.js +59 -0
- package/dist/src/storage/statements.d.ts +9 -0
- package/dist/src/storage/statements.js +8 -0
- package/dist/src/submission.d.ts +42 -0
- package/dist/src/submission.js +71 -0
- package/dist/src/turn-profile.d.ts +13 -0
- package/dist/src/turn-profile.js +100 -0
- package/dist/src/workflow-admission.d.ts +45 -0
- package/dist/src/workflow-admission.js +151 -0
- package/dist/src/workflow-contracts.d.ts +27 -0
- package/dist/src/workflow-contracts.js +88 -0
- package/dist/src/workflow-declaration.d.ts +11 -0
- package/dist/src/workflow-declaration.js +57 -0
- package/dist/src/workflow-resources.d.ts +8 -0
- package/dist/src/workflow-resources.js +14 -0
- package/dist/src/workflows.d.ts +5 -0
- package/dist/src/workflows.js +3 -0
- package/dist/tools/compile-workflows.d.ts +1 -0
- package/dist/tools/compile-workflows.js +33 -0
- package/dist/tools/self-host-processes.d.ts +10 -0
- package/dist/tools/self-host-processes.js +151 -0
- package/dist/tools/self-host-workflows.d.ts +15 -0
- package/dist/tools/self-host-workflows.js +78 -0
- package/dist/tools/self-host.d.ts +1 -0
- package/dist/tools/self-host.js +261 -0
- package/dist/tools/self-update-host.d.ts +6 -0
- package/dist/tools/self-update-host.js +41 -0
- package/dist/tools/self-update.d.ts +10 -0
- package/dist/tools/self-update.js +105 -0
- package/dist/tools/workflow-manifest.d.ts +3 -0
- package/dist/tools/workflow-manifest.js +34 -0
- package/dist/workflows/develop-prd.d.ts +7 -0
- package/dist/workflows/develop-prd.js +97 -0
- package/dist/workflows/develop-ticket.d.ts +15 -0
- package/dist/workflows/develop-ticket.js +301 -0
- package/dist/workflows/issue-labels.d.ts +14 -0
- package/dist/workflows/issue-labels.js +36 -0
- package/package.json +82 -75
- package/dist/abstract_gpt/index.js +0 -55
- package/dist/cloving_gpt/adapters/Adapter.js +0 -2
- package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
- package/dist/cloving_gpt/adapters/claude.js +0 -128
- package/dist/cloving_gpt/adapters/gemini.js +0 -135
- package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
- package/dist/cloving_gpt/adapters/index.js +0 -2
- package/dist/cloving_gpt/adapters/mistral.js +0 -128
- package/dist/cloving_gpt/adapters/ollama.js +0 -128
- package/dist/cloving_gpt/adapters/openai.js +0 -100
- package/dist/cloving_gpt/index.js +0 -192
- package/dist/commands/analyze.js +0 -47
- package/dist/commands/chat.js +0 -14
- package/dist/commands/check.js +0 -7
- package/dist/commands/commit.js +0 -44
- package/dist/commands/config.js +0 -167
- package/dist/commands/describe.js +0 -235
- package/dist/commands/generate/code.js +0 -21
- package/dist/commands/generate/commit.js +0 -11
- package/dist/commands/generate/context.js +0 -82
- package/dist/commands/generate/docs.js +0 -11
- package/dist/commands/generate/documentation.js +0 -11
- package/dist/commands/generate/fizzbuzz.js +0 -35
- package/dist/commands/generate/init.js +0 -15
- package/dist/commands/generate/review.js +0 -11
- package/dist/commands/generate/sh.js +0 -95
- package/dist/commands/generate/shell.js +0 -11
- package/dist/commands/generate/unit_tests.js +0 -11
- package/dist/commands/init.js +0 -13
- package/dist/commands/models.js +0 -22
- package/dist/commands/project/build.js +0 -88
- package/dist/commands/project/complete.js +0 -12
- package/dist/commands/project/init.js +0 -82
- package/dist/commands/project/plan.js +0 -108
- package/dist/commands/proxy.js +0 -11
- package/dist/commands/review.js +0 -50
- package/dist/commands/tokens.js +0 -75
- package/dist/commands/unit_tests.js +0 -150
- package/dist/commands/update.js +0 -7
- package/dist/file2.js +0 -4
- package/dist/index.js +0 -136
- package/dist/managers/BlockManager.js +0 -120
- package/dist/managers/ChatManager.js +0 -653
- package/dist/managers/ChunkManager.js +0 -32
- package/dist/managers/CodeManager.js +0 -185
- package/dist/managers/CommitManager.js +0 -78
- package/dist/managers/DocsManager.js +0 -88
- package/dist/managers/DocumentationManager.js +0 -114
- package/dist/managers/InitManager.js +0 -230
- package/dist/managers/ProxyManager.js +0 -210
- package/dist/managers/ReviewManager.js +0 -131
- package/dist/managers/ShellManager.js +0 -163
- package/dist/managers/StreamManager.js +0 -308
- package/dist/managers/UnitTestManager.js +0 -243
- package/dist/managers/src/managers/ProxyManager.js +0 -1
- package/dist/newfile.js +0 -2
- package/dist/package.json +0 -86
- package/dist/utils/command_utils.js +0 -384
- package/dist/utils/config_utils.js +0 -249
- package/dist/utils/gitUtils.js +0 -42
- package/dist/utils/git_utils.js +0 -217
- package/dist/utils/modelUtils.js +0 -7
- package/dist/utils/model_utils.js +0 -7
- package/dist/utils/prompt_utils.js +0 -333
- package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
- package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
- package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
- package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
- package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
- package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
- package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
- package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
- package/dist/utils/prompts/index.js +0 -27
- package/dist/utils/string_utils.js +0 -505
- package/dist/utils/types.js +0 -2
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { current, ownedLease } from "./leases.js";
|
|
2
|
+
import { cancelledOperation, count, field, isFinal, isHolding, namesRunIntent, rejected, withOperation, } from "./operations.js";
|
|
3
|
+
const terminalStatuses = ["completed", "failed", "cancelled"];
|
|
4
|
+
function disposition(operation, reason) {
|
|
5
|
+
return {
|
|
6
|
+
operationId: operation.operationId,
|
|
7
|
+
disposition: reason === null ? "applied" : "rejected",
|
|
8
|
+
reason,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function released(effects, operation) {
|
|
12
|
+
const lease = ownedLease(effects, operation);
|
|
13
|
+
return {
|
|
14
|
+
...effects,
|
|
15
|
+
leases: lease === undefined
|
|
16
|
+
? effects.leases
|
|
17
|
+
: {
|
|
18
|
+
...effects.leases,
|
|
19
|
+
[lease.resourceKey]: { ...lease, state: "released" },
|
|
20
|
+
},
|
|
21
|
+
holding: effects.holding - (isHolding(operation) ? 1 : 0),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function settled(effects, settlement) {
|
|
25
|
+
const { operation, event, status } = settlement;
|
|
26
|
+
return {
|
|
27
|
+
kind: "changed",
|
|
28
|
+
effects: withOperation(released(effects, operation), {
|
|
29
|
+
...operation,
|
|
30
|
+
status,
|
|
31
|
+
receipt: operation.receipt ?? event.payload["receipt"] ?? null,
|
|
32
|
+
worker: operation.worker ?? event.payload["worker"] ?? null,
|
|
33
|
+
reason: event.payload["reason"] ?? null,
|
|
34
|
+
result: event.payload["result"] ?? null,
|
|
35
|
+
waitSequence: null,
|
|
36
|
+
settledSequence: event.sequence,
|
|
37
|
+
}),
|
|
38
|
+
released: [operation.operationId],
|
|
39
|
+
disposition: disposition(operation, null),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function reportRefusal(effects, subject) {
|
|
43
|
+
const { operation, event } = subject;
|
|
44
|
+
if (operation.inputDigest !== field(event, "inputDigest"))
|
|
45
|
+
return "input-mismatch";
|
|
46
|
+
if (isFinal(operation))
|
|
47
|
+
return "operation-settled";
|
|
48
|
+
const lease = ownedLease(effects, operation);
|
|
49
|
+
if (lease?.generation !== count(event, "leaseGeneration"))
|
|
50
|
+
return "retired-lease-generation";
|
|
51
|
+
if (!current(lease, event))
|
|
52
|
+
return "lease-expired";
|
|
53
|
+
if (operation.worker === null)
|
|
54
|
+
return "acceptance-not-recorded";
|
|
55
|
+
if (operation.worker !== field(event, "worker"))
|
|
56
|
+
return "worker-mismatch";
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const reportedStatuses = {
|
|
60
|
+
completed: "completed",
|
|
61
|
+
failed: "failed",
|
|
62
|
+
stopped: "stopped",
|
|
63
|
+
};
|
|
64
|
+
export function reported(effects, context) {
|
|
65
|
+
const { event } = context;
|
|
66
|
+
const operation = effects.operations[field(event, "operationId")];
|
|
67
|
+
if (operation?.runId !== event.runId)
|
|
68
|
+
return rejected("unknown-operation");
|
|
69
|
+
const refusal = reportRefusal(effects, { ...context, operation });
|
|
70
|
+
if (refusal !== undefined)
|
|
71
|
+
return {
|
|
72
|
+
kind: "changed",
|
|
73
|
+
effects,
|
|
74
|
+
disposition: disposition(operation, refusal),
|
|
75
|
+
};
|
|
76
|
+
return settled(effects, {
|
|
77
|
+
...context,
|
|
78
|
+
operation,
|
|
79
|
+
status: reportedStatuses[field(event, "outcome")] ?? "failed",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function formRefusal(subject) {
|
|
83
|
+
const { operation, event } = subject;
|
|
84
|
+
const outcome = field(event, "outcome");
|
|
85
|
+
if (outcome === "not-started" && operation.receipt !== null)
|
|
86
|
+
return "acceptance-recorded";
|
|
87
|
+
const identified = event.payload["receipt"] !== undefined &&
|
|
88
|
+
event.payload["worker"] !== undefined;
|
|
89
|
+
return outcome === "accepted" && !identified ? "invalid-outcome" : undefined;
|
|
90
|
+
}
|
|
91
|
+
function outcomeRefusal(effects, subject) {
|
|
92
|
+
const { operation, event } = subject;
|
|
93
|
+
if (isFinal(operation))
|
|
94
|
+
return "operation-settled";
|
|
95
|
+
if (ownedLease(effects, operation)?.generation !==
|
|
96
|
+
count(event, "leaseGeneration"))
|
|
97
|
+
return "retired-lease-generation";
|
|
98
|
+
const worker = event.payload["worker"];
|
|
99
|
+
const bound = operation.worker ?? worker;
|
|
100
|
+
if (worker !== undefined && worker !== bound)
|
|
101
|
+
return "worker-mismatch";
|
|
102
|
+
return formRefusal(subject);
|
|
103
|
+
}
|
|
104
|
+
function counted(operation) {
|
|
105
|
+
const attempts = operation.attempts + 1;
|
|
106
|
+
if (attempts < operation.recoveryLimit)
|
|
107
|
+
return { ...operation, attempts };
|
|
108
|
+
return {
|
|
109
|
+
...operation,
|
|
110
|
+
attempts,
|
|
111
|
+
status: "blocked",
|
|
112
|
+
reason: "outcome-unknown",
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function accepted(effects, subject) {
|
|
116
|
+
const { operation, event } = subject;
|
|
117
|
+
const lease = ownedLease(effects, operation);
|
|
118
|
+
const live = lease !== undefined && current(lease, event);
|
|
119
|
+
return {
|
|
120
|
+
kind: "changed",
|
|
121
|
+
effects: withOperation(effects, {
|
|
122
|
+
...operation,
|
|
123
|
+
receipt: operation.receipt ?? field(event, "receipt"),
|
|
124
|
+
worker: operation.worker ?? field(event, "worker"),
|
|
125
|
+
status: live ? "running" : "recovering",
|
|
126
|
+
reason: live ? null : "lease-expired",
|
|
127
|
+
}),
|
|
128
|
+
released: [operation.operationId],
|
|
129
|
+
disposition: disposition(operation, null),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function statedReason(event) {
|
|
133
|
+
const stated = field(event, "reason");
|
|
134
|
+
return stated === "" ? "not-started" : stated;
|
|
135
|
+
}
|
|
136
|
+
function notStarted(effects, subject) {
|
|
137
|
+
const { operation, event, runStatus } = subject;
|
|
138
|
+
const exhausted = (effects.budgets[operation.runId]?.exhaustedSequence ?? null) !== null ||
|
|
139
|
+
field(event, "reason") === "budget-exhausted";
|
|
140
|
+
const ended = terminalStatuses.includes(runStatus);
|
|
141
|
+
const waiting = {
|
|
142
|
+
...operation,
|
|
143
|
+
status: "waiting",
|
|
144
|
+
reason: runStatus === "running" ? "ready" : "run-not-running",
|
|
145
|
+
waitSequence: event.sequence,
|
|
146
|
+
};
|
|
147
|
+
const cancelled = cancelledOperation(operation, {
|
|
148
|
+
reason: exhausted ? "budget-exhausted" : statedReason(event),
|
|
149
|
+
sequence: event.sequence,
|
|
150
|
+
});
|
|
151
|
+
const final = ended || exhausted;
|
|
152
|
+
return {
|
|
153
|
+
kind: "changed",
|
|
154
|
+
effects: withOperation(released(effects, operation), final ? cancelled : waiting),
|
|
155
|
+
...(final ? { released: [operation.operationId] } : {}),
|
|
156
|
+
disposition: disposition(operation, null),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function unknown(effects, subject) {
|
|
160
|
+
const { operation } = subject;
|
|
161
|
+
const attempted = counted(operation);
|
|
162
|
+
return {
|
|
163
|
+
kind: "changed",
|
|
164
|
+
effects: withOperation(effects, {
|
|
165
|
+
...attempted,
|
|
166
|
+
status: attempted.status === "blocked" ? "blocked" : "recovering",
|
|
167
|
+
reason: "outcome-unknown",
|
|
168
|
+
}),
|
|
169
|
+
disposition: disposition(operation, null),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function final(status) {
|
|
173
|
+
return (effects, subject) => settled(effects, { ...subject, status });
|
|
174
|
+
}
|
|
175
|
+
const outcomes = {
|
|
176
|
+
accepted,
|
|
177
|
+
"not-started": notStarted,
|
|
178
|
+
unknown,
|
|
179
|
+
completed: final("completed"),
|
|
180
|
+
failed: final("failed"),
|
|
181
|
+
stopped: final("stopped"),
|
|
182
|
+
};
|
|
183
|
+
function stoppedIntent(effects, event) {
|
|
184
|
+
const operationId = field(event, "operationId");
|
|
185
|
+
const known = field(event, "outcome") === "stopped" &&
|
|
186
|
+
namesRunIntent(operationId, event.runId);
|
|
187
|
+
if (!known)
|
|
188
|
+
return rejected("unknown-operation");
|
|
189
|
+
return {
|
|
190
|
+
kind: "changed",
|
|
191
|
+
effects: {
|
|
192
|
+
...effects,
|
|
193
|
+
stops: {
|
|
194
|
+
...effects.stops,
|
|
195
|
+
[operationId]: { runId: event.runId, sequence: event.sequence },
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
disposition: { operationId, disposition: "applied", reason: null },
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
export function stopReported(effects, event) {
|
|
202
|
+
const operationId = event.payload["operationId"];
|
|
203
|
+
const named = field(event, "condition") === "stopped" &&
|
|
204
|
+
operationId !== undefined &&
|
|
205
|
+
namesRunIntent(operationId, event.runId);
|
|
206
|
+
if (!named)
|
|
207
|
+
return effects;
|
|
208
|
+
return {
|
|
209
|
+
...effects,
|
|
210
|
+
stops: {
|
|
211
|
+
...effects.stops,
|
|
212
|
+
[operationId]: { runId: event.runId, sequence: event.sequence },
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
export function reconciled(effects, context) {
|
|
217
|
+
const { event } = context;
|
|
218
|
+
const operation = effects.operations[field(event, "operationId")];
|
|
219
|
+
if (operation === undefined)
|
|
220
|
+
return stoppedIntent(effects, event);
|
|
221
|
+
if (operation.runId !== event.runId)
|
|
222
|
+
return rejected("unknown-operation");
|
|
223
|
+
const subject = { ...context, operation };
|
|
224
|
+
const refusal = outcomeRefusal(effects, subject);
|
|
225
|
+
const apply = outcomes[field(event, "outcome")];
|
|
226
|
+
if (refusal === undefined && apply !== undefined)
|
|
227
|
+
return apply(effects, subject);
|
|
228
|
+
const reason = refusal ?? "invalid-outcome";
|
|
229
|
+
return {
|
|
230
|
+
kind: "changed",
|
|
231
|
+
effects: isHolding(operation)
|
|
232
|
+
? withOperation(effects, counted(operation))
|
|
233
|
+
: effects,
|
|
234
|
+
disposition: disposition(operation, reason),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isRecordKey } from "./commands.js";
|
|
2
|
+
import { eventTypes } from "./transitions.js";
|
|
3
|
+
export function parseEvent(value) {
|
|
4
|
+
const fields = record(value);
|
|
5
|
+
if (!fields)
|
|
6
|
+
return null;
|
|
7
|
+
const { sequence, type, runId, commandId, recordedAt, request } = fields;
|
|
8
|
+
const payload = textRecord(fields["payload"]);
|
|
9
|
+
const eventType = eventTypes.find((item) => item === type);
|
|
10
|
+
if (typeof sequence !== "number" ||
|
|
11
|
+
!Number.isSafeInteger(sequence) ||
|
|
12
|
+
eventType === undefined ||
|
|
13
|
+
!isRecordKey(runId) ||
|
|
14
|
+
!isRecordKey(commandId) ||
|
|
15
|
+
typeof recordedAt !== "string" ||
|
|
16
|
+
typeof request !== "string" ||
|
|
17
|
+
!payload)
|
|
18
|
+
return null;
|
|
19
|
+
return {
|
|
20
|
+
sequence,
|
|
21
|
+
type: eventType,
|
|
22
|
+
runId,
|
|
23
|
+
commandId,
|
|
24
|
+
recordedAt,
|
|
25
|
+
request,
|
|
26
|
+
payload,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function textRecord(value) {
|
|
30
|
+
const fields = record(value);
|
|
31
|
+
if (!fields)
|
|
32
|
+
return null;
|
|
33
|
+
const entries = [];
|
|
34
|
+
for (const [key, item] of Object.entries(fields)) {
|
|
35
|
+
if (typeof item !== "string")
|
|
36
|
+
return null;
|
|
37
|
+
entries.push([key, item]);
|
|
38
|
+
}
|
|
39
|
+
return Object.fromEntries(entries);
|
|
40
|
+
}
|
|
41
|
+
function record(value) {
|
|
42
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
43
|
+
return null;
|
|
44
|
+
return Object.fromEntries(Object.entries(value));
|
|
45
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type SettledGate } from "./gates.ts";
|
|
2
|
+
import { type Recorded, type Reduction } from "./reduction-state.ts";
|
|
3
|
+
import { type AuthorityState, type EffectIntent } from "./transitions.ts";
|
|
4
|
+
export declare function gateContinuation(gate: SettledGate): EffectIntent;
|
|
5
|
+
export declare function opened(state: AuthorityState, recorded: Recorded): Reduction;
|
|
6
|
+
export declare function decided(state: AuthorityState, recorded: Recorded): Reduction;
|
|
7
|
+
export declare function expired(state: AuthorityState, recorded: Recorded): Reduction;
|
|
8
|
+
export declare function registered(state: AuthorityState, recorded: Recorded): Reduction;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { continues, decisionRefusal, expiryRefusal, gateKey, openedGate, reusable, settled, } from "./gates.js";
|
|
2
|
+
import { applied, identity, invalid, text, } from "./reduction-state.js";
|
|
3
|
+
import { terminal, transition, } from "./transitions.js";
|
|
4
|
+
export function gateContinuation(gate) {
|
|
5
|
+
return {
|
|
6
|
+
kind: "continue-run",
|
|
7
|
+
runId: gate.runId,
|
|
8
|
+
operationId: identity({
|
|
9
|
+
run: gate.runId,
|
|
10
|
+
phase: "gate",
|
|
11
|
+
round: gate.outcome.sequence,
|
|
12
|
+
operation: "continue-run",
|
|
13
|
+
key: gate.gateId,
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function continuations(gate) {
|
|
18
|
+
return continues(gate) ? [gateContinuation(gate)] : [];
|
|
19
|
+
}
|
|
20
|
+
export function opened(state, recorded) {
|
|
21
|
+
const { event, run } = recorded;
|
|
22
|
+
const result = transition(run, {
|
|
23
|
+
type: "gate.opened",
|
|
24
|
+
gateId: text(event, "gateId"),
|
|
25
|
+
});
|
|
26
|
+
if (result.kind === "invalid")
|
|
27
|
+
return result;
|
|
28
|
+
const question = event.payload["gateKind"] === "question";
|
|
29
|
+
const questions = state.questions + (question ? 1 : 0);
|
|
30
|
+
const gate = openedGate({
|
|
31
|
+
runId: event.runId,
|
|
32
|
+
sequence: event.sequence,
|
|
33
|
+
payload: event.payload,
|
|
34
|
+
generation: recorded.details.generation,
|
|
35
|
+
label: question ? questions : null,
|
|
36
|
+
});
|
|
37
|
+
if (!reusable(gateOf(state, event), gate))
|
|
38
|
+
return invalid("existing-gate");
|
|
39
|
+
return applied(state, {
|
|
40
|
+
...recorded,
|
|
41
|
+
moved: result.run,
|
|
42
|
+
questions,
|
|
43
|
+
gates: [gate],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function concluded(state, conclusion) {
|
|
47
|
+
const { run, gate, outcome } = conclusion;
|
|
48
|
+
const result = transition(run, { type: "gate.decided", gateId: gate.gateId });
|
|
49
|
+
if (result.kind === "invalid")
|
|
50
|
+
return result;
|
|
51
|
+
const next = settled(gate, outcome);
|
|
52
|
+
return applied(state, {
|
|
53
|
+
...conclusion,
|
|
54
|
+
moved: result.run,
|
|
55
|
+
gates: [next],
|
|
56
|
+
added: continuations(next),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function gateOf(state, event) {
|
|
60
|
+
return state.gates[gateKey(event.runId, text(event, "gateId"))];
|
|
61
|
+
}
|
|
62
|
+
export function decided(state, recorded) {
|
|
63
|
+
const { event } = recorded;
|
|
64
|
+
const gate = gateOf(state, event);
|
|
65
|
+
if (gate === undefined)
|
|
66
|
+
return invalid("unknown-gate");
|
|
67
|
+
const refusal = decisionRefusal(gate, event);
|
|
68
|
+
if (refusal !== undefined)
|
|
69
|
+
return invalid(refusal);
|
|
70
|
+
return concluded(state, {
|
|
71
|
+
...recorded,
|
|
72
|
+
gate,
|
|
73
|
+
outcome: {
|
|
74
|
+
decision: text(event, "decision"),
|
|
75
|
+
answer: event.payload["answer"] ?? null,
|
|
76
|
+
sequence: event.sequence,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
export function expired(state, recorded) {
|
|
81
|
+
const { event } = recorded;
|
|
82
|
+
const gate = gateOf(state, event);
|
|
83
|
+
if (gate === undefined)
|
|
84
|
+
return invalid("unknown-gate");
|
|
85
|
+
const refusal = expiryRefusal(gate, event.recordedAt);
|
|
86
|
+
if (refusal !== undefined)
|
|
87
|
+
return invalid(refusal);
|
|
88
|
+
return concluded(state, {
|
|
89
|
+
...recorded,
|
|
90
|
+
gate,
|
|
91
|
+
outcome: { decision: "expired", answer: null, sequence: event.sequence },
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function registered(state, recorded) {
|
|
95
|
+
const { event, run } = recorded;
|
|
96
|
+
if (terminal.includes(run.status))
|
|
97
|
+
return invalid("terminal-run");
|
|
98
|
+
const gate = gateOf(state, event);
|
|
99
|
+
if (gate === undefined)
|
|
100
|
+
return invalid("unknown-gate");
|
|
101
|
+
if (gate.wait === "registered")
|
|
102
|
+
return invalid("wait-already-registered");
|
|
103
|
+
const next = { ...gate, wait: "registered" };
|
|
104
|
+
return applied(state, {
|
|
105
|
+
...recorded,
|
|
106
|
+
gates: [next],
|
|
107
|
+
added: continuations(next),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type GateKind = "question" | "approval" | "untyped";
|
|
2
|
+
export interface GateOutcome {
|
|
3
|
+
readonly decision: string | null;
|
|
4
|
+
readonly answer: string | null;
|
|
5
|
+
readonly sequence: number;
|
|
6
|
+
}
|
|
7
|
+
export interface GateState {
|
|
8
|
+
readonly runId: string;
|
|
9
|
+
readonly gateId: string;
|
|
10
|
+
readonly kind: GateKind;
|
|
11
|
+
readonly label: number | null;
|
|
12
|
+
readonly subject: string | null;
|
|
13
|
+
readonly prompt: string | null;
|
|
14
|
+
readonly expiresAt: string | null;
|
|
15
|
+
readonly generation: number;
|
|
16
|
+
readonly revision: number;
|
|
17
|
+
readonly wait: "registered" | "pending";
|
|
18
|
+
readonly outcome: GateOutcome | null;
|
|
19
|
+
readonly openedSequence: number;
|
|
20
|
+
}
|
|
21
|
+
type Payload = Readonly<Record<string, string>>;
|
|
22
|
+
export declare function allowedDecisions(kind: GateKind): readonly string[] | null;
|
|
23
|
+
export declare function reusable(existing: GateState | undefined, next: GateState): boolean;
|
|
24
|
+
export declare function gateKey(runId: string, gateId: string): string;
|
|
25
|
+
export declare function openedGate(opening: {
|
|
26
|
+
readonly runId: string;
|
|
27
|
+
readonly sequence: number;
|
|
28
|
+
readonly payload: Payload;
|
|
29
|
+
readonly generation: number;
|
|
30
|
+
readonly label: number | null;
|
|
31
|
+
}): GateState;
|
|
32
|
+
export declare function decisionRefusal(gate: GateState, decision: {
|
|
33
|
+
readonly payload: Payload;
|
|
34
|
+
readonly recordedAt: string;
|
|
35
|
+
}): string | undefined;
|
|
36
|
+
export declare function expiryRefusal(gate: GateState, recordedAt: string): string | undefined;
|
|
37
|
+
export declare function settled(gate: GateState, outcome: GateOutcome): GateState;
|
|
38
|
+
export type SettledGate = GateState & {
|
|
39
|
+
readonly outcome: GateOutcome;
|
|
40
|
+
};
|
|
41
|
+
export declare function isSettled(gate: GateState): gate is SettledGate;
|
|
42
|
+
export type ContinuingGate = GateState & {
|
|
43
|
+
readonly outcome: GateOutcome & {
|
|
44
|
+
readonly decision: string;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export declare function continues(gate: GateState): gate is ContinuingGate;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { notBefore } from "./instants.js";
|
|
2
|
+
const allowed = {
|
|
3
|
+
question: ["answered"],
|
|
4
|
+
approval: ["approved", "denied"],
|
|
5
|
+
untyped: null,
|
|
6
|
+
};
|
|
7
|
+
const kinds = {
|
|
8
|
+
question: "question",
|
|
9
|
+
approval: "approval",
|
|
10
|
+
};
|
|
11
|
+
export function allowedDecisions(kind) {
|
|
12
|
+
return allowed[kind];
|
|
13
|
+
}
|
|
14
|
+
export function reusable(existing, next) {
|
|
15
|
+
if (existing === undefined)
|
|
16
|
+
return true;
|
|
17
|
+
return existing.kind === "untyped" && next.kind === "untyped";
|
|
18
|
+
}
|
|
19
|
+
export function gateKey(runId, gateId) {
|
|
20
|
+
return `${runId} ${gateId}`;
|
|
21
|
+
}
|
|
22
|
+
export function openedGate(opening) {
|
|
23
|
+
const { payload } = opening;
|
|
24
|
+
const kind = kinds[payload["gateKind"] ?? ""] ?? "untyped";
|
|
25
|
+
return {
|
|
26
|
+
runId: opening.runId,
|
|
27
|
+
gateId: payload["gateId"] ?? "",
|
|
28
|
+
kind,
|
|
29
|
+
label: opening.label,
|
|
30
|
+
subject: payload["subject"] ?? null,
|
|
31
|
+
prompt: payload["prompt"] ?? null,
|
|
32
|
+
expiresAt: payload["expiresAt"] ?? null,
|
|
33
|
+
generation: opening.generation,
|
|
34
|
+
revision: 1,
|
|
35
|
+
wait: kind === "untyped" ? "registered" : "pending",
|
|
36
|
+
outcome: null,
|
|
37
|
+
openedSequence: opening.sequence,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function untypedRefusal(payload) {
|
|
41
|
+
const bound = payload["generation"] !== undefined || payload["subject"] !== undefined;
|
|
42
|
+
return bound ? "decision-not-allowed" : undefined;
|
|
43
|
+
}
|
|
44
|
+
export function decisionRefusal(gate, decision) {
|
|
45
|
+
const { payload, recordedAt } = decision;
|
|
46
|
+
if (gate.kind === "untyped")
|
|
47
|
+
return untypedRefusal(payload);
|
|
48
|
+
if (gate.outcome !== null)
|
|
49
|
+
return "decision-not-pending";
|
|
50
|
+
if (payload["generation"] !== String(gate.generation))
|
|
51
|
+
return "stale-generation";
|
|
52
|
+
if (payload["subject"] !== gate.subject)
|
|
53
|
+
return "subject-mismatch";
|
|
54
|
+
if (!allowed[gate.kind]?.includes(payload["decision"] ?? ""))
|
|
55
|
+
return "decision-not-allowed";
|
|
56
|
+
if (gate.expiresAt !== null && notBefore(recordedAt, gate.expiresAt))
|
|
57
|
+
return "decision-expired";
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
export function expiryRefusal(gate, recordedAt) {
|
|
61
|
+
if (gate.outcome !== null)
|
|
62
|
+
return "decision-not-pending";
|
|
63
|
+
if (gate.expiresAt === null || !notBefore(recordedAt, gate.expiresAt))
|
|
64
|
+
return "not-expired";
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
export function settled(gate, outcome) {
|
|
68
|
+
return { ...gate, outcome, revision: gate.revision + 1 };
|
|
69
|
+
}
|
|
70
|
+
export function isSettled(gate) {
|
|
71
|
+
return gate.outcome !== null;
|
|
72
|
+
}
|
|
73
|
+
export function continues(gate) {
|
|
74
|
+
return (gate.wait === "registered" &&
|
|
75
|
+
isSettled(gate) &&
|
|
76
|
+
gate.outcome.decision !== null);
|
|
77
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AuthorityState } from "./transitions.ts";
|
|
2
|
+
export declare class HistoryState {
|
|
3
|
+
private state;
|
|
4
|
+
private readonly runs;
|
|
5
|
+
private readonly commands;
|
|
6
|
+
private readonly details;
|
|
7
|
+
private readonly gates;
|
|
8
|
+
private readonly budgets;
|
|
9
|
+
private readonly runGates;
|
|
10
|
+
private readonly intents;
|
|
11
|
+
private readonly pending;
|
|
12
|
+
scope(value: unknown): AuthorityState;
|
|
13
|
+
record(state: AuthorityState, runId: string): void;
|
|
14
|
+
finish(): AuthorityState;
|
|
15
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { parseEvent } from "./events.js";
|
|
2
|
+
import { emptyAuthority } from "./reducer.js";
|
|
3
|
+
function entry(values, key) {
|
|
4
|
+
const value = values[key];
|
|
5
|
+
return value === undefined ? {} : { [key]: value };
|
|
6
|
+
}
|
|
7
|
+
export class HistoryState {
|
|
8
|
+
state = emptyAuthority;
|
|
9
|
+
runs = {};
|
|
10
|
+
commands = {};
|
|
11
|
+
details = {};
|
|
12
|
+
gates = {};
|
|
13
|
+
budgets = {};
|
|
14
|
+
runGates = new Map();
|
|
15
|
+
intents = new Map();
|
|
16
|
+
pending = new Set();
|
|
17
|
+
scope(value) {
|
|
18
|
+
const event = parseEvent(value);
|
|
19
|
+
if (event === null)
|
|
20
|
+
return this.state;
|
|
21
|
+
return {
|
|
22
|
+
...this.state,
|
|
23
|
+
runs: entry(this.runs, event.runId),
|
|
24
|
+
commands: entry(this.commands, event.commandId),
|
|
25
|
+
details: entry(this.details, event.runId),
|
|
26
|
+
gates: this.runGates.get(event.runId) ?? {},
|
|
27
|
+
effects: {
|
|
28
|
+
...this.state.effects,
|
|
29
|
+
budgets: entry(this.budgets, event.runId),
|
|
30
|
+
},
|
|
31
|
+
intents: this.intents.get(event.runId) ?? [],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
record(state, runId) {
|
|
35
|
+
Object.assign(this.runs, state.runs);
|
|
36
|
+
Object.assign(this.commands, state.commands);
|
|
37
|
+
Object.assign(this.details, state.details);
|
|
38
|
+
Object.assign(this.gates, state.gates);
|
|
39
|
+
Object.assign(this.budgets, state.effects.budgets);
|
|
40
|
+
this.runGates.set(runId, state.gates);
|
|
41
|
+
const remaining = new Set(state.intents);
|
|
42
|
+
for (const intent of this.intents.get(runId) ?? [])
|
|
43
|
+
if (!remaining.has(intent))
|
|
44
|
+
this.pending.delete(intent);
|
|
45
|
+
for (const intent of remaining)
|
|
46
|
+
this.pending.add(intent);
|
|
47
|
+
this.intents.set(runId, state.intents);
|
|
48
|
+
this.state = state;
|
|
49
|
+
}
|
|
50
|
+
finish() {
|
|
51
|
+
return {
|
|
52
|
+
...this.state,
|
|
53
|
+
runs: this.runs,
|
|
54
|
+
commands: this.commands,
|
|
55
|
+
details: this.details,
|
|
56
|
+
gates: this.gates,
|
|
57
|
+
effects: { ...this.state.effects, budgets: this.budgets },
|
|
58
|
+
intents: [...this.pending],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Evidence } from "./operations.ts";
|
|
2
|
+
import { type AuthorityState, type EffectIntent } from "./reducer.ts";
|
|
3
|
+
export interface OutboxEntry extends EffectIntent {
|
|
4
|
+
readonly createdSequence: number;
|
|
5
|
+
readonly releasedSequence: number | null;
|
|
6
|
+
}
|
|
7
|
+
export interface History {
|
|
8
|
+
readonly state: AuthorityState;
|
|
9
|
+
readonly outbox: readonly OutboxEntry[];
|
|
10
|
+
readonly runSequences: Readonly<Record<string, number>>;
|
|
11
|
+
readonly evidence: readonly Evidence[];
|
|
12
|
+
}
|
|
13
|
+
export declare function rebuildHistory(events: readonly unknown[]): History;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { HistoryState } from "./history-state.js";
|
|
2
|
+
import { applyEvent, } from "./reducer.js";
|
|
3
|
+
export function rebuildHistory(events) {
|
|
4
|
+
const replay = new HistoryState();
|
|
5
|
+
const created = [];
|
|
6
|
+
const released = new Map();
|
|
7
|
+
const runSequences = {};
|
|
8
|
+
const evidence = [];
|
|
9
|
+
for (const [index, value] of events.entries()) {
|
|
10
|
+
const state = replay.scope(value);
|
|
11
|
+
const applied = applyEvent(state, { value, index });
|
|
12
|
+
const before = new Set(state.intents.map((intent) => intent.operationId));
|
|
13
|
+
const after = new Set(applied.state.intents.map((intent) => intent.operationId));
|
|
14
|
+
for (const intent of applied.state.intents)
|
|
15
|
+
if (!before.has(intent.operationId))
|
|
16
|
+
created.push({
|
|
17
|
+
...intent,
|
|
18
|
+
createdSequence: applied.event.sequence,
|
|
19
|
+
releasedSequence: null,
|
|
20
|
+
});
|
|
21
|
+
for (const operationId of before)
|
|
22
|
+
if (!after.has(operationId))
|
|
23
|
+
released.set(operationId, applied.event.sequence);
|
|
24
|
+
runSequences[applied.event.runId] = applied.event.sequence;
|
|
25
|
+
evidence.push(...applied.evidence);
|
|
26
|
+
replay.record(applied.state, applied.event.runId);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
state: replay.finish(),
|
|
30
|
+
outbox: created.map((entry) => ({
|
|
31
|
+
...entry,
|
|
32
|
+
releasedSequence: released.get(entry.operationId) ?? null,
|
|
33
|
+
})),
|
|
34
|
+
runSequences,
|
|
35
|
+
evidence,
|
|
36
|
+
};
|
|
37
|
+
}
|