@claudexor/daemon 3.24.0 → 4.0.0
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/dist/account-resets.d.ts +39 -0
- package/dist/account-resets.d.ts.map +1 -0
- package/dist/account-resets.js +174 -0
- package/dist/account-resets.js.map +1 -0
- package/dist/client.d.ts +25 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +55 -51
- package/dist/client.js.map +1 -1
- package/dist/command-authority.d.ts +11 -8
- package/dist/command-authority.d.ts.map +1 -1
- package/dist/command-authority.js +5 -6
- package/dist/command-authority.js.map +1 -1
- package/dist/command-list-projection.d.ts +0 -1
- package/dist/command-list-projection.d.ts.map +1 -1
- package/dist/command-list-projection.js +0 -6
- package/dist/command-list-projection.js.map +1 -1
- package/dist/command-list-select.d.ts +0 -4
- package/dist/command-list-select.d.ts.map +1 -1
- package/dist/command-list-select.js +1 -115
- package/dist/command-list-select.js.map +1 -1
- package/dist/command-retention.d.ts +7 -19
- package/dist/command-retention.d.ts.map +1 -1
- package/dist/command-retention.js +1 -117
- package/dist/command-retention.js.map +1 -1
- package/dist/command-rpc.d.ts +4 -1
- package/dist/command-rpc.d.ts.map +1 -1
- package/dist/command-rpc.js +12 -1
- package/dist/command-rpc.js.map +1 -1
- package/dist/command-store.d.ts +15 -52
- package/dist/command-store.d.ts.map +1 -1
- package/dist/command-store.js +5 -493
- package/dist/command-store.js.map +1 -1
- package/dist/daemon-health.d.ts +56 -8
- package/dist/daemon-health.d.ts.map +1 -1
- package/dist/daemon-health.js +44 -9
- package/dist/daemon-health.js.map +1 -1
- package/dist/daemon-local-client.d.ts +28 -0
- package/dist/daemon-local-client.d.ts.map +1 -0
- package/dist/daemon-local-client.js +55 -0
- package/dist/daemon-local-client.js.map +1 -0
- package/dist/delivery-command.d.ts +4 -4
- package/dist/delivery-command.d.ts.map +1 -1
- package/dist/delivery-command.js.map +1 -1
- package/dist/index.d.ts +24 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -8
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts +12 -28
- package/dist/interactions.d.ts.map +1 -1
- package/dist/interactions.js +22 -123
- package/dist/interactions.js.map +1 -1
- package/dist/job-admission.d.ts +26 -0
- package/dist/job-admission.d.ts.map +1 -0
- package/dist/job-admission.js +67 -0
- package/dist/job-admission.js.map +1 -0
- package/dist/job-record.d.ts.map +1 -1
- package/dist/job-record.js +5 -1
- package/dist/job-record.js.map +1 -1
- package/dist/journal-fold-policy.d.ts +1 -1
- package/dist/journal-fold-policy.d.ts.map +1 -1
- package/dist/journal-fold-policy.js +26 -2
- package/dist/journal-fold-policy.js.map +1 -1
- package/dist/journal-recovery-files.d.ts +1 -41
- package/dist/journal-recovery-files.d.ts.map +1 -1
- package/dist/journal-recovery-files.js +2 -340
- package/dist/journal-recovery-files.js.map +1 -1
- package/dist/loop-facts.d.ts +28 -0
- package/dist/loop-facts.d.ts.map +1 -0
- package/dist/loop-facts.js +97 -0
- package/dist/loop-facts.js.map +1 -0
- package/dist/memory-facts.d.ts +2 -0
- package/dist/memory-facts.d.ts.map +1 -1
- package/dist/memory-facts.js +5 -0
- package/dist/memory-facts.js.map +1 -1
- package/dist/model-operations.d.ts +11 -4
- package/dist/model-operations.d.ts.map +1 -1
- package/dist/model-operations.js +68 -38
- package/dist/model-operations.js.map +1 -1
- package/dist/operator-decisions.d.ts +15 -25
- package/dist/operator-decisions.d.ts.map +1 -1
- package/dist/operator-decisions.js +5 -84
- package/dist/operator-decisions.js.map +1 -1
- package/dist/projects.d.ts +42 -41
- package/dist/projects.d.ts.map +1 -1
- package/dist/projects.js +46 -184
- package/dist/projects.js.map +1 -1
- package/dist/quota-poll-lanes.d.ts +5 -3
- package/dist/quota-poll-lanes.d.ts.map +1 -1
- package/dist/quota-poll-lanes.js +16 -6
- package/dist/quota-poll-lanes.js.map +1 -1
- package/dist/quota-refresh-batches.d.ts +26 -0
- package/dist/quota-refresh-batches.d.ts.map +1 -0
- package/dist/quota-refresh-batches.js +83 -0
- package/dist/quota-refresh-batches.js.map +1 -0
- package/dist/quota-registry-replay.d.ts +19 -0
- package/dist/quota-registry-replay.d.ts.map +1 -0
- package/dist/quota-registry-replay.js +106 -0
- package/dist/quota-registry-replay.js.map +1 -0
- package/dist/quota-registry-support.d.ts +4 -1
- package/dist/quota-registry-support.d.ts.map +1 -1
- package/dist/quota-registry-support.js +15 -2
- package/dist/quota-registry-support.js.map +1 -1
- package/dist/quota-registry.d.ts +381 -7
- package/dist/quota-registry.d.ts.map +1 -1
- package/dist/quota-registry.js +111 -149
- package/dist/quota-registry.js.map +1 -1
- package/dist/quota-resources.d.ts +105 -0
- package/dist/quota-resources.d.ts.map +1 -0
- package/dist/quota-resources.js +153 -0
- package/dist/quota-resources.js.map +1 -0
- package/dist/runless-turn-recovery.d.ts +2 -9
- package/dist/runless-turn-recovery.d.ts.map +1 -1
- package/dist/runless-turn-recovery.js +0 -14
- package/dist/runless-turn-recovery.js.map +1 -1
- package/dist/server.d.ts +23 -22
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +74 -84
- package/dist/server.js.map +1 -1
- package/dist/store/blob-files.d.ts +71 -0
- package/dist/store/blob-files.d.ts.map +1 -0
- package/dist/store/blob-files.js +160 -0
- package/dist/store/blob-files.js.map +1 -0
- package/dist/store/command-prune.d.ts +37 -0
- package/dist/store/command-prune.d.ts.map +1 -0
- package/dist/store/command-prune.js +123 -0
- package/dist/store/command-prune.js.map +1 -0
- package/dist/store/command-queries.d.ts +41 -0
- package/dist/store/command-queries.d.ts.map +1 -0
- package/dist/store/command-queries.js +186 -0
- package/dist/store/command-queries.js.map +1 -0
- package/dist/store/command-rows.d.ts +66 -0
- package/dist/store/command-rows.d.ts.map +1 -0
- package/dist/store/command-rows.js +141 -0
- package/dist/store/command-rows.js.map +1 -0
- package/dist/store/commands.d.ts +49 -0
- package/dist/store/commands.d.ts.map +1 -0
- package/dist/store/commands.js +247 -0
- package/dist/store/commands.js.map +1 -0
- package/dist/store/cursors.d.ts +33 -0
- package/dist/store/cursors.d.ts.map +1 -0
- package/dist/store/cursors.js +82 -0
- package/dist/store/cursors.js.map +1 -0
- package/dist/store/engine-recovery-files.d.ts +14 -0
- package/dist/store/engine-recovery-files.d.ts.map +1 -0
- package/dist/store/engine-recovery-files.js +53 -0
- package/dist/store/engine-recovery-files.js.map +1 -0
- package/dist/store/engine-state-recovery.d.ts +71 -0
- package/dist/store/engine-state-recovery.d.ts.map +1 -0
- package/dist/store/engine-state-recovery.js +318 -0
- package/dist/store/engine-state-recovery.js.map +1 -0
- package/dist/store/errors.d.ts +80 -0
- package/dist/store/errors.d.ts.map +1 -0
- package/dist/store/errors.js +130 -0
- package/dist/store/errors.js.map +1 -0
- package/dist/store/event-store.d.ts +52 -0
- package/dist/store/event-store.d.ts.map +1 -0
- package/dist/store/event-store.js +117 -0
- package/dist/store/event-store.js.map +1 -0
- package/dist/store/external-files.d.ts +40 -0
- package/dist/store/external-files.d.ts.map +1 -0
- package/dist/store/external-files.js +90 -0
- package/dist/store/external-files.js.map +1 -0
- package/dist/store/flusher-protocol.d.ts +82 -0
- package/dist/store/flusher-protocol.d.ts.map +1 -0
- package/dist/store/flusher-protocol.js +23 -0
- package/dist/store/flusher-protocol.js.map +1 -0
- package/dist/store/flusher-worker.d.ts +24 -0
- package/dist/store/flusher-worker.d.ts.map +1 -0
- package/dist/store/flusher-worker.js +185 -0
- package/dist/store/flusher-worker.js.map +1 -0
- package/dist/store/flusher.d.ts +87 -0
- package/dist/store/flusher.d.ts.map +1 -0
- package/dist/store/flusher.js +264 -0
- package/dist/store/flusher.js.map +1 -0
- package/dist/store/generations.d.ts +43 -0
- package/dist/store/generations.d.ts.map +1 -0
- package/dist/store/generations.js +143 -0
- package/dist/store/generations.js.map +1 -0
- package/dist/store/idempotency.d.ts +25 -0
- package/dist/store/idempotency.d.ts.map +1 -0
- package/dist/store/idempotency.js +53 -0
- package/dist/store/idempotency.js.map +1 -0
- package/dist/store/import-context.d.ts +22 -0
- package/dist/store/import-context.d.ts.map +1 -0
- package/dist/store/import-context.js +87 -0
- package/dist/store/import-context.js.map +1 -0
- package/dist/store/import-discovery.d.ts +6 -0
- package/dist/store/import-discovery.d.ts.map +1 -0
- package/dist/store/import-discovery.js +66 -0
- package/dist/store/import-discovery.js.map +1 -0
- package/dist/store/import-records.d.ts +6 -0
- package/dist/store/import-records.d.ts.map +1 -0
- package/dist/store/import-records.js +191 -0
- package/dist/store/import-records.js.map +1 -0
- package/dist/store/import-resources.d.ts +14 -0
- package/dist/store/import-resources.d.ts.map +1 -0
- package/dist/store/import-resources.js +197 -0
- package/dist/store/import-resources.js.map +1 -0
- package/dist/store/import-source.d.ts +24 -0
- package/dist/store/import-source.d.ts.map +1 -0
- package/dist/store/import-source.js +65 -0
- package/dist/store/import-source.js.map +1 -0
- package/dist/store/import-verify.d.ts +6 -0
- package/dist/store/import-verify.d.ts.map +1 -0
- package/dist/store/import-verify.js +97 -0
- package/dist/store/import-verify.js.map +1 -0
- package/dist/store/import-worker.d.ts +18 -0
- package/dist/store/import-worker.d.ts.map +1 -0
- package/dist/store/import-worker.js +69 -0
- package/dist/store/import-worker.js.map +1 -0
- package/dist/store/importer.d.ts +42 -0
- package/dist/store/importer.d.ts.map +1 -0
- package/dist/store/importer.js +239 -0
- package/dist/store/importer.js.map +1 -0
- package/dist/store/interactions.d.ts +22 -0
- package/dist/store/interactions.d.ts.map +1 -0
- package/dist/store/interactions.js +82 -0
- package/dist/store/interactions.js.map +1 -0
- package/dist/store/legacy-journal/frame-codec.d.ts +94 -0
- package/dist/store/legacy-journal/frame-codec.d.ts.map +1 -0
- package/dist/store/legacy-journal/frame-codec.js +352 -0
- package/dist/store/legacy-journal/frame-codec.js.map +1 -0
- package/dist/store/legacy-journal/frame-reader.d.ts +30 -0
- package/dist/store/legacy-journal/frame-reader.d.ts.map +1 -0
- package/dist/store/legacy-journal/frame-reader.js +97 -0
- package/dist/store/legacy-journal/frame-reader.js.map +1 -0
- package/dist/store/legacy-journal/journal-fold.d.ts +47 -0
- package/dist/store/legacy-journal/journal-fold.d.ts.map +1 -0
- package/dist/store/legacy-journal/journal-fold.js +81 -0
- package/dist/store/legacy-journal/journal-fold.js.map +1 -0
- package/dist/store/legacy-journal/journal-partition.d.ts +2 -0
- package/dist/store/legacy-journal/journal-partition.d.ts.map +1 -0
- package/dist/store/legacy-journal/journal-partition.js +10 -0
- package/dist/store/legacy-journal/journal-partition.js.map +1 -0
- package/dist/store/legacy-journal/read-only-preparation.d.ts +48 -0
- package/dist/store/legacy-journal/read-only-preparation.d.ts.map +1 -0
- package/dist/store/legacy-journal/read-only-preparation.js +430 -0
- package/dist/store/legacy-journal/read-only-preparation.js.map +1 -0
- package/dist/store/maintenance-worker.d.ts +5 -0
- package/dist/store/maintenance-worker.d.ts.map +1 -0
- package/dist/store/maintenance-worker.js +175 -0
- package/dist/store/maintenance-worker.js.map +1 -0
- package/dist/store/maintenance.d.ts +124 -0
- package/dist/store/maintenance.d.ts.map +1 -0
- package/dist/store/maintenance.js +197 -0
- package/dist/store/maintenance.js.map +1 -0
- package/dist/store/mutation.d.ts +34 -0
- package/dist/store/mutation.d.ts.map +1 -0
- package/dist/store/mutation.js +85 -0
- package/dist/store/mutation.js.map +1 -0
- package/dist/store/obligations.d.ts +101 -0
- package/dist/store/obligations.d.ts.map +1 -0
- package/dist/store/obligations.js +226 -0
- package/dist/store/obligations.js.map +1 -0
- package/dist/store/operator-decisions.d.ts +23 -0
- package/dist/store/operator-decisions.d.ts.map +1 -0
- package/dist/store/operator-decisions.js +68 -0
- package/dist/store/operator-decisions.js.map +1 -0
- package/dist/store/owner-generations.d.ts +33 -0
- package/dist/store/owner-generations.d.ts.map +1 -0
- package/dist/store/owner-generations.js +63 -0
- package/dist/store/owner-generations.js.map +1 -0
- package/dist/store/partitions.d.ts +37 -0
- package/dist/store/partitions.d.ts.map +1 -0
- package/dist/store/partitions.js +68 -0
- package/dist/store/partitions.js.map +1 -0
- package/dist/store/pragmas.d.ts +32 -0
- package/dist/store/pragmas.d.ts.map +1 -0
- package/dist/store/pragmas.js +65 -0
- package/dist/store/pragmas.js.map +1 -0
- package/dist/store/project-router.d.ts +325 -0
- package/dist/store/project-router.d.ts.map +1 -0
- package/dist/store/project-router.js +298 -0
- package/dist/store/project-router.js.map +1 -0
- package/dist/store/projects.d.ts +36 -0
- package/dist/store/projects.d.ts.map +1 -0
- package/dist/store/projects.js +238 -0
- package/dist/store/projects.js.map +1 -0
- package/dist/store/publish-blob.d.ts +20 -0
- package/dist/store/publish-blob.d.ts.map +1 -0
- package/dist/store/publish-blob.js +158 -0
- package/dist/store/publish-blob.js.map +1 -0
- package/dist/store/purge-files.d.ts +30 -0
- package/dist/store/purge-files.d.ts.map +1 -0
- package/dist/store/purge-files.js +79 -0
- package/dist/store/purge-files.js.map +1 -0
- package/dist/store/resource-rows.d.ts +40 -0
- package/dist/store/resource-rows.d.ts.map +1 -0
- package/dist/store/resource-rows.js +103 -0
- package/dist/store/resource-rows.js.map +1 -0
- package/dist/store/resources.d.ts +67 -0
- package/dist/store/resources.d.ts.map +1 -0
- package/dist/store/resources.js +147 -0
- package/dist/store/resources.js.map +1 -0
- package/dist/store/retention.d.ts +91 -0
- package/dist/store/retention.d.ts.map +1 -0
- package/dist/store/retention.js +169 -0
- package/dist/store/retention.js.map +1 -0
- package/dist/store/run-events.d.ts +14 -0
- package/dist/store/run-events.d.ts.map +1 -0
- package/dist/store/run-events.js +35 -0
- package/dist/store/run-events.js.map +1 -0
- package/dist/store/runtime.d.ts +24 -0
- package/dist/store/runtime.d.ts.map +1 -0
- package/dist/store/runtime.js +67 -0
- package/dist/store/runtime.js.map +1 -0
- package/dist/store/schema.d.ts +33 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +187 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/setup-bindings.d.ts +20 -0
- package/dist/store/setup-bindings.d.ts.map +1 -0
- package/dist/store/setup-bindings.js +52 -0
- package/dist/store/setup-bindings.js.map +1 -0
- package/dist/store/sql-command-router.d.ts +79 -0
- package/dist/store/sql-command-router.d.ts.map +1 -0
- package/dist/store/sql-command-router.js +92 -0
- package/dist/store/sql-command-router.js.map +1 -0
- package/dist/store/sql-daemon-services.d.ts +61 -0
- package/dist/store/sql-daemon-services.d.ts.map +1 -0
- package/dist/store/sql-daemon-services.js +124 -0
- package/dist/store/sql-daemon-services.js.map +1 -0
- package/dist/store/sql-recovery-export.d.ts +8 -0
- package/dist/store/sql-recovery-export.d.ts.map +1 -0
- package/dist/store/sql-recovery-export.js +110 -0
- package/dist/store/sql-recovery-export.js.map +1 -0
- package/dist/store/sql-recovery-inspection.d.ts +22 -0
- package/dist/store/sql-recovery-inspection.d.ts.map +1 -0
- package/dist/store/sql-recovery-inspection.js +88 -0
- package/dist/store/sql-recovery-inspection.js.map +1 -0
- package/dist/store/sql-recovery.d.ts +69 -0
- package/dist/store/sql-recovery.d.ts.map +1 -0
- package/dist/store/sql-recovery.js +169 -0
- package/dist/store/sql-recovery.js.map +1 -0
- package/dist/store/sql-validation.d.ts +9 -0
- package/dist/store/sql-validation.d.ts.map +1 -0
- package/dist/store/sql-validation.js +103 -0
- package/dist/store/sql-validation.js.map +1 -0
- package/dist/store/statement-observer.d.ts +7 -0
- package/dist/store/statement-observer.d.ts.map +1 -0
- package/dist/store/statement-observer.js +44 -0
- package/dist/store/statement-observer.js.map +1 -0
- package/dist/store/store.d.ts +110 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +296 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/terminal-files.d.ts +21 -0
- package/dist/store/terminal-files.d.ts.map +1 -0
- package/dist/store/terminal-files.js +115 -0
- package/dist/store/terminal-files.js.map +1 -0
- package/dist/store/thread-replay.d.ts +12 -0
- package/dist/store/thread-replay.d.ts.map +1 -0
- package/dist/store/thread-replay.js +49 -0
- package/dist/store/thread-replay.js.map +1 -0
- package/dist/store/thread-rows.d.ts +25 -0
- package/dist/store/thread-rows.d.ts.map +1 -0
- package/dist/store/thread-rows.js +141 -0
- package/dist/store/thread-rows.js.map +1 -0
- package/dist/store/threads.d.ts +105 -0
- package/dist/store/threads.d.ts.map +1 -0
- package/dist/store/threads.js +423 -0
- package/dist/store/threads.js.map +1 -0
- package/dist/store/upload-binding-retention.d.ts +26 -0
- package/dist/store/upload-binding-retention.d.ts.map +1 -0
- package/dist/store/upload-binding-retention.js +142 -0
- package/dist/store/upload-binding-retention.js.map +1 -0
- package/dist/store/uploads.d.ts +30 -0
- package/dist/store/uploads.d.ts.map +1 -0
- package/dist/store/uploads.js +238 -0
- package/dist/store/uploads.js.map +1 -0
- package/dist/store-contracts.d.ts +181 -0
- package/dist/store-contracts.d.ts.map +1 -0
- package/dist/store-contracts.js +2 -0
- package/dist/store-contracts.js.map +1 -0
- package/dist/terminal-authority.d.ts +9 -0
- package/dist/terminal-authority.d.ts.map +1 -1
- package/dist/terminal-authority.js +103 -1
- package/dist/terminal-authority.js.map +1 -1
- package/dist/thread-lane-checkpoints.d.ts +0 -2
- package/dist/thread-lane-checkpoints.d.ts.map +1 -1
- package/dist/thread-lane-checkpoints.js +0 -4
- package/dist/thread-lane-checkpoints.js.map +1 -1
- package/dist/thread-store-support.d.ts +1 -27
- package/dist/thread-store-support.d.ts.map +1 -1
- package/dist/thread-store-support.js +0 -63
- package/dist/thread-store-support.js.map +1 -1
- package/dist/threads.d.ts +1 -113
- package/dist/threads.d.ts.map +1 -1
- package/dist/threads.js +1 -379
- package/dist/threads.js.map +1 -1
- package/package.json +9 -7
- package/dist/command-activity.d.ts +0 -14
- package/dist/command-activity.d.ts.map +0 -1
- package/dist/command-activity.js +0 -16
- package/dist/command-activity.js.map +0 -1
- package/dist/journal-events.d.ts +0 -4
- package/dist/journal-events.d.ts.map +0 -1
- package/dist/journal-events.js +0 -23
- package/dist/journal-events.js.map +0 -1
- package/dist/journal-maintenance.d.ts +0 -50
- package/dist/journal-maintenance.d.ts.map +0 -1
- package/dist/journal-maintenance.js +0 -162
- package/dist/journal-maintenance.js.map +0 -1
- package/dist/journal-manager-journal.d.ts +0 -18
- package/dist/journal-manager-journal.d.ts.map +0 -1
- package/dist/journal-manager-journal.js +0 -25
- package/dist/journal-manager-journal.js.map +0 -1
- package/dist/journal-manager-lifecycle.d.ts +0 -11
- package/dist/journal-manager-lifecycle.d.ts.map +0 -1
- package/dist/journal-manager-lifecycle.js +0 -2
- package/dist/journal-manager-lifecycle.js.map +0 -1
- package/dist/journal-manager.d.ts +0 -99
- package/dist/journal-manager.d.ts.map +0 -1
- package/dist/journal-manager.js +0 -559
- package/dist/journal-manager.js.map +0 -1
- package/dist/journal-prepared-operation.d.ts +0 -53
- package/dist/journal-prepared-operation.d.ts.map +0 -1
- package/dist/journal-prepared-operation.js +0 -158
- package/dist/journal-prepared-operation.js.map +0 -1
- package/dist/journal-projection-slot.d.ts +0 -28
- package/dist/journal-projection-slot.d.ts.map +0 -1
- package/dist/journal-projection-slot.js +0 -71
- package/dist/journal-projection-slot.js.map +0 -1
- package/dist/journal-projection.d.ts +0 -13
- package/dist/journal-projection.d.ts.map +0 -1
- package/dist/journal-projection.js +0 -2
- package/dist/journal-projection.js.map +0 -1
- package/dist/partition-accounts.d.ts +0 -27
- package/dist/partition-accounts.d.ts.map +0 -1
- package/dist/partition-accounts.js +0 -21
- package/dist/partition-accounts.js.map +0 -1
- package/dist/project-partition-preparation.d.ts +0 -87
- package/dist/project-partition-preparation.d.ts.map +0 -1
- package/dist/project-partition-preparation.js +0 -273
- package/dist/project-partition-preparation.js.map +0 -1
- package/dist/project-partitions.d.ts +0 -214
- package/dist/project-partitions.d.ts.map +0 -1
- package/dist/project-partitions.js +0 -486
- package/dist/project-partitions.js.map +0 -1
- package/dist/project-remove.d.ts +0 -11
- package/dist/project-remove.d.ts.map +0 -1
- package/dist/project-remove.js +0 -65
- package/dist/project-remove.js.map +0 -1
- package/dist/project-thread-listing.d.ts +0 -14
- package/dist/project-thread-listing.d.ts.map +0 -1
- package/dist/project-thread-listing.js +0 -37
- package/dist/project-thread-listing.js.map +0 -1
- package/dist/quota-projection.d.ts +0 -11
- package/dist/quota-projection.d.ts.map +0 -1
- package/dist/quota-projection.js +0 -10
- package/dist/quota-projection.js.map +0 -1
- package/dist/resource-store.d.ts +0 -39
- package/dist/resource-store.d.ts.map +0 -1
- package/dist/resource-store.js +0 -464
- package/dist/resource-store.js.map +0 -1
- package/dist/run-event-terminal-index.d.ts +0 -13
- package/dist/run-event-terminal-index.d.ts.map +0 -1
- package/dist/run-event-terminal-index.js +0 -38
- package/dist/run-event-terminal-index.js.map +0 -1
- package/dist/run-events.d.ts +0 -17
- package/dist/run-events.d.ts.map +0 -1
- package/dist/run-events.js +0 -31
- package/dist/run-events.js.map +0 -1
- package/dist/thread-head-ping.d.ts +0 -35
- package/dist/thread-head-ping.d.ts.map +0 -1
- package/dist/thread-head-ping.js +0 -67
- package/dist/thread-head-ping.js.map +0 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type IdempotencyBinding } from "./idempotency.js";
|
|
2
|
+
import { type SqlWriteContext } from "./mutation.js";
|
|
3
|
+
import { type PartitionGeneration } from "./partitions.js";
|
|
4
|
+
import type { EngineStore } from "./store.js";
|
|
5
|
+
import type { BlobFiles } from "./blob-files.js";
|
|
6
|
+
type Reader = Pick<SqlWriteContext, "prepare">;
|
|
7
|
+
/** Current registry authority, including recovery-required global state. */
|
|
8
|
+
export declare function globalGeneration(sql: Reader): PartitionGeneration | null;
|
|
9
|
+
/** The registry, not just a partition's ready bit, determines visibility. */
|
|
10
|
+
export declare const SERVED_PIDS_SQL = "\n SELECT g.id FROM meta m JOIN partition g ON g.id = CAST(m.value AS INTEGER)\n WHERE m.key = 'global_pid' AND g.status = 'ready'\n UNION ALL\n SELECT p.current_pid FROM meta m JOIN partition g ON g.id = CAST(m.value AS INTEGER)\n JOIN project p ON p.pid = g.id AND p.status = 'active'\n JOIN partition q ON q.id = p.current_pid AND q.status = 'ready'\n WHERE m.key = 'global_pid' AND g.status = 'ready'";
|
|
11
|
+
/** Addressed membership: no materialization of every project on hot lookups. */
|
|
12
|
+
export declare function isServedPid(sql: Reader, pid: number): boolean;
|
|
13
|
+
export declare function requireServedGeneration(sql: Reader, pid: number): PartitionGeneration;
|
|
14
|
+
export declare function servedGenerations(sql: Reader): PartitionGeneration[];
|
|
15
|
+
/** Used by first construction/import. No engine is opened or committed here. */
|
|
16
|
+
export declare function setGlobalGenerationInTx(sql: SqlWriteContext, pid: number): void;
|
|
17
|
+
/** Import's final pass, after project current_pid bindings are complete. */
|
|
18
|
+
export declare function reconcileLiveInTx(sql: SqlWriteContext): void;
|
|
19
|
+
export declare function setGenerationStatusInTx(sql: SqlWriteContext, pid: number, status: string): void;
|
|
20
|
+
export declare function archiveGenerationInTx(sql: SqlWriteContext, pid: number): string;
|
|
21
|
+
export declare function restoreGenerationInTx(sql: SqlWriteContext, pid: number): void;
|
|
22
|
+
/** Preserves old rows as evidence. Restoring an unregistered generation cannot
|
|
23
|
+
* re-adopt it: only the current global registry can make its commands live. */
|
|
24
|
+
export declare function quarantineGenerationInTx(sql: SqlWriteContext, oldPid: number, input: {
|
|
25
|
+
epoch: string;
|
|
26
|
+
createdAt: string;
|
|
27
|
+
}): PartitionGeneration;
|
|
28
|
+
/** Recovery owns request/fingerprint validation and any filesystem leftovers.
|
|
29
|
+
* A retry addresses oldPid, even after current authority has moved. */
|
|
30
|
+
export declare function quarantineGeneration(store: EngineStore, blobs: BlobFiles, input: {
|
|
31
|
+
oldPid: number;
|
|
32
|
+
keyDigest: string;
|
|
33
|
+
requestDigest: string;
|
|
34
|
+
operationId: string;
|
|
35
|
+
payload: unknown;
|
|
36
|
+
epoch?: string;
|
|
37
|
+
}): {
|
|
38
|
+
generation: PartitionGeneration | null;
|
|
39
|
+
binding: IdempotencyBinding;
|
|
40
|
+
replay: boolean;
|
|
41
|
+
};
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=generations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generations.d.ts","sourceRoot":"","sources":["../../src/store/generations.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEnG,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;AAE/C,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAIxE;AAED,6EAA6E;AAC7E,eAAO,MAAM,eAAe,waAO0B,CAAC;AAEvD,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAW7D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,CASrF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAYpE;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAa/E;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAQ5D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAU/F;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAI7E;AAED;+EAC+E;AAC/E,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GACA,mBAAmB,CAcrB;AAED;uEACuE;AACvE,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA;IAAE,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CA4B1F"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { bindIdempotencyInTx, lookupIdempotency } from "./idempotency.js";
|
|
3
|
+
import { appendPreparedEventInTx, prepareEvent } from "./event-store.js";
|
|
4
|
+
import { requireTransaction, runMutation } from "./mutation.js";
|
|
5
|
+
import { generationOf, insertPartitionInTx, partitionById, } from "./partitions.js";
|
|
6
|
+
/** Current registry authority, including recovery-required global state. */
|
|
7
|
+
export function globalGeneration(sql) {
|
|
8
|
+
const row = sql.prepare("SELECT value FROM meta WHERE key = 'global_pid'").get();
|
|
9
|
+
return row ? partitionById(sql, Number(row.value)) : null;
|
|
10
|
+
}
|
|
11
|
+
/** The registry, not just a partition's ready bit, determines visibility. */
|
|
12
|
+
export const SERVED_PIDS_SQL = `
|
|
13
|
+
SELECT g.id FROM meta m JOIN partition g ON g.id = CAST(m.value AS INTEGER)
|
|
14
|
+
WHERE m.key = 'global_pid' AND g.status = 'ready'
|
|
15
|
+
UNION ALL
|
|
16
|
+
SELECT p.current_pid FROM meta m JOIN partition g ON g.id = CAST(m.value AS INTEGER)
|
|
17
|
+
JOIN project p ON p.pid = g.id AND p.status = 'active'
|
|
18
|
+
JOIN partition q ON q.id = p.current_pid AND q.status = 'ready'
|
|
19
|
+
WHERE m.key = 'global_pid' AND g.status = 'ready'`;
|
|
20
|
+
/** Addressed membership: no materialization of every project on hot lookups. */
|
|
21
|
+
export function isServedPid(sql, pid) {
|
|
22
|
+
return Boolean(sql
|
|
23
|
+
.prepare(`SELECT 1 FROM partition q JOIN meta m ON m.key = 'global_pid'
|
|
24
|
+
JOIN partition g ON g.id = CAST(m.value AS INTEGER) AND g.status = 'ready'
|
|
25
|
+
WHERE q.id = ? AND q.status = 'ready' AND (q.id = g.id OR EXISTS(
|
|
26
|
+
SELECT 1 FROM project p WHERE p.current_pid = q.id AND p.pid = g.id AND p.status = 'active'))`)
|
|
27
|
+
.get(pid));
|
|
28
|
+
}
|
|
29
|
+
export function requireServedGeneration(sql, pid) {
|
|
30
|
+
const generation = partitionById(sql, pid);
|
|
31
|
+
if (!generation || !isServedPid(sql, pid)) {
|
|
32
|
+
throw Object.assign(new Error(`partition ${generation?.name ?? pid} requires journal recovery`), { code: "journal_recovery_required", status: 409 });
|
|
33
|
+
}
|
|
34
|
+
return generation;
|
|
35
|
+
}
|
|
36
|
+
export function servedGenerations(sql) {
|
|
37
|
+
return sql
|
|
38
|
+
.prepare(`SELECT q.id,q.name,q.epoch,q.status,q.next_seq FROM partition q
|
|
39
|
+
LEFT JOIN project p ON p.current_pid=q.id AND p.status='active'
|
|
40
|
+
AND p.pid=CAST((SELECT value FROM meta WHERE key='global_pid') AS INTEGER)
|
|
41
|
+
WHERE q.id IN (${SERVED_PIDS_SQL})
|
|
42
|
+
ORDER BY CASE WHEN q.name='global' THEN 0 ELSE 1 END,p.created_at,p.rowid`)
|
|
43
|
+
.all().map(generationOf);
|
|
44
|
+
}
|
|
45
|
+
/** Used by first construction/import. No engine is opened or committed here. */
|
|
46
|
+
export function setGlobalGenerationInTx(sql, pid) {
|
|
47
|
+
requireTransaction(sql);
|
|
48
|
+
const generation = partitionById(sql, pid);
|
|
49
|
+
if (generation?.name !== "global")
|
|
50
|
+
throw new Error("global authority must name a global partition");
|
|
51
|
+
sql
|
|
52
|
+
.prepare("INSERT INTO meta(key, value) VALUES('global_pid', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value")
|
|
53
|
+
.run(String(pid));
|
|
54
|
+
// Global registry replacement also hides all previously registered projects.
|
|
55
|
+
sql.prepare("UPDATE command SET live = 0 WHERE live = 1 AND pid <> ?").run(pid);
|
|
56
|
+
reconcileLiveInTx(sql);
|
|
57
|
+
}
|
|
58
|
+
/** Import's final pass, after project current_pid bindings are complete. */
|
|
59
|
+
export function reconcileLiveInTx(sql) {
|
|
60
|
+
requireTransaction(sql);
|
|
61
|
+
sql
|
|
62
|
+
.prepare(`UPDATE command SET live = CASE WHEN pid IN (${SERVED_PIDS_SQL}) THEN 1 ELSE 0 END
|
|
63
|
+
WHERE live <> CASE WHEN pid IN (${SERVED_PIDS_SQL}) THEN 1 ELSE 0 END`)
|
|
64
|
+
.run();
|
|
65
|
+
}
|
|
66
|
+
export function setGenerationStatusInTx(sql, pid, status) {
|
|
67
|
+
requireTransaction(sql);
|
|
68
|
+
sql.prepare("UPDATE partition SET status = ? WHERE id = ?").run(status, pid);
|
|
69
|
+
if (globalGeneration(sql)?.pid === pid) {
|
|
70
|
+
reconcileLiveInTx(sql);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
sql
|
|
74
|
+
.prepare("UPDATE command SET live = ? WHERE pid = ?")
|
|
75
|
+
.run(isServedPid(sql, pid) ? 1 : 0, pid);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function archiveGenerationInTx(sql, pid) {
|
|
79
|
+
const generation = partitionById(sql, pid);
|
|
80
|
+
if (!generation)
|
|
81
|
+
throw new Error(`no partition ${pid}`);
|
|
82
|
+
setGenerationStatusInTx(sql, pid, "archived");
|
|
83
|
+
return `partition:${generation.name}@${generation.epoch}`;
|
|
84
|
+
}
|
|
85
|
+
export function restoreGenerationInTx(sql, pid) {
|
|
86
|
+
const generation = partitionById(sql, pid);
|
|
87
|
+
if (generation?.status !== "archived")
|
|
88
|
+
throw new Error(`partition ${pid} is not archived`);
|
|
89
|
+
setGenerationStatusInTx(sql, pid, "ready");
|
|
90
|
+
}
|
|
91
|
+
/** Preserves old rows as evidence. Restoring an unregistered generation cannot
|
|
92
|
+
* re-adopt it: only the current global registry can make its commands live. */
|
|
93
|
+
export function quarantineGenerationInTx(sql, oldPid, input) {
|
|
94
|
+
requireTransaction(sql);
|
|
95
|
+
const old = partitionById(sql, oldPid);
|
|
96
|
+
if (!old)
|
|
97
|
+
throw new Error(`no partition ${oldPid}`);
|
|
98
|
+
const global = globalGeneration(sql);
|
|
99
|
+
const project = sql
|
|
100
|
+
.prepare("SELECT id FROM project WHERE pid = ? AND current_pid = ? AND status = 'active'")
|
|
101
|
+
.get(global?.pid ?? -1, oldPid);
|
|
102
|
+
if (global?.pid !== oldPid && !project)
|
|
103
|
+
throw new Error(`partition ${oldPid} is not current`);
|
|
104
|
+
setGenerationStatusInTx(sql, oldPid, "quarantined");
|
|
105
|
+
const next = insertPartitionInTx(sql, { name: old.name, ...input, projectId: project?.id });
|
|
106
|
+
if (global?.pid === oldPid)
|
|
107
|
+
setGlobalGenerationInTx(sql, next.pid);
|
|
108
|
+
else
|
|
109
|
+
sql.prepare("UPDATE project SET current_pid = ? WHERE id = ?").run(next.pid, project.id);
|
|
110
|
+
return next;
|
|
111
|
+
}
|
|
112
|
+
/** Recovery owns request/fingerprint validation and any filesystem leftovers.
|
|
113
|
+
* A retry addresses oldPid, even after current authority has moved. */
|
|
114
|
+
export function quarantineGeneration(store, blobs, input) {
|
|
115
|
+
const key = { owner: "quarantine", pid: input.oldPid, keyDigest: input.keyDigest };
|
|
116
|
+
const prior = lookupIdempotency(store, key, input.requestDigest);
|
|
117
|
+
if (prior) {
|
|
118
|
+
// Recovery owns the original operation receipt. Never infer its generation
|
|
119
|
+
// from today's current pointer: it may have been quarantined again.
|
|
120
|
+
return { generation: null, binding: prior, replay: true };
|
|
121
|
+
}
|
|
122
|
+
const epoch = input.epoch ?? randomUUID().replace(/-/g, "");
|
|
123
|
+
const time = store.now().toISOString();
|
|
124
|
+
const event = prepareEvent(blobs, {
|
|
125
|
+
type: "journal.partition_quarantined",
|
|
126
|
+
time,
|
|
127
|
+
payload: input.payload,
|
|
128
|
+
});
|
|
129
|
+
const binding = {
|
|
130
|
+
...key,
|
|
131
|
+
operation: "journal.partition.quarantine",
|
|
132
|
+
requestDigest: input.requestDigest,
|
|
133
|
+
targetId: input.operationId,
|
|
134
|
+
createdAt: time,
|
|
135
|
+
};
|
|
136
|
+
return runMutation(store, (tx) => {
|
|
137
|
+
const generation = quarantineGenerationInTx(tx, input.oldPid, { epoch, createdAt: time });
|
|
138
|
+
bindIdempotencyInTx(tx, binding);
|
|
139
|
+
appendPreparedEventInTx(tx, blobs, generation.pid, event);
|
|
140
|
+
return { generation, binding, replay: false };
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=generations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generations.js","sourceRoot":"","sources":["../../src/store/generations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type SqlWriteContext } from "./mutation.js";
|
|
2
|
+
export type IdempotencyOwner = "command" | "thread" | "turn" | "decision" | "project" | "setup" | "upload" | "quarantine";
|
|
3
|
+
export interface IdempotencyKey {
|
|
4
|
+
owner: IdempotencyOwner;
|
|
5
|
+
pid: number;
|
|
6
|
+
/** The caller's original digest formula, including any prefix, is preserved. */
|
|
7
|
+
keyDigest: string;
|
|
8
|
+
}
|
|
9
|
+
export interface IdempotencyBinding extends IdempotencyKey {
|
|
10
|
+
operation: string;
|
|
11
|
+
requestDigest: string;
|
|
12
|
+
targetId: string;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
/** Only uploads store an original reply. Other owners resolve their target. */
|
|
15
|
+
result?: unknown;
|
|
16
|
+
}
|
|
17
|
+
/** Addressed replay; request/body hashes are never recomputed or interchanged. */
|
|
18
|
+
export declare function lookupIdempotency(sql: Pick<SqlWriteContext, "prepare">, key: IdempotencyKey, requestDigest: string): IdempotencyBinding | undefined;
|
|
19
|
+
/** Bind once, in the same transaction as the target. Same-request replay keeps
|
|
20
|
+
* the first target/result/time; a different request never overwrites a row. */
|
|
21
|
+
export declare function bindIdempotencyInTx(sql: SqlWriteContext, binding: IdempotencyBinding): IdempotencyBinding;
|
|
22
|
+
/** Delete only the removed target's bindings. A retained turn must not lose its
|
|
23
|
+
* key merely because its command was pruned, even when the ids happen to match. */
|
|
24
|
+
export declare function deleteTargetIdempotencyInTx(sql: SqlWriteContext, owner: IdempotencyOwner, pid: number, targetId: string): number;
|
|
25
|
+
//# sourceMappingURL=idempotency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/store/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEzE,MAAM,MAAM,gBAAgB,GAC1B,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE7F,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,gBAAgB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAiBD,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EACrC,GAAG,EAAE,cAAc,EACnB,aAAa,EAAE,MAAM,GACpB,kBAAkB,GAAG,SAAS,CAoBhC;AAED;+EAC+E;AAC/E,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,kBAAkB,GAC1B,kBAAkB,CAsBpB;AAED;mFACmF;AACnF,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { requireTransaction } from "./mutation.js";
|
|
2
|
+
function conflict() {
|
|
3
|
+
throw Object.assign(new Error("idempotency key was already used with a different request"), {
|
|
4
|
+
code: "idempotency_conflict",
|
|
5
|
+
status: 409,
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
/** Addressed replay; request/body hashes are never recomputed or interchanged. */
|
|
9
|
+
export function lookupIdempotency(sql, key, requestDigest) {
|
|
10
|
+
const row = sql
|
|
11
|
+
.prepare("SELECT operation, request_digest, target_id, result, created_at FROM idempotency WHERE owner = ? AND pid = ? AND key_digest = ?")
|
|
12
|
+
.get(key.owner, key.pid, key.keyDigest);
|
|
13
|
+
if (!row)
|
|
14
|
+
return undefined;
|
|
15
|
+
if (row.request_digest !== requestDigest)
|
|
16
|
+
conflict();
|
|
17
|
+
return {
|
|
18
|
+
owner: key.owner,
|
|
19
|
+
pid: key.pid,
|
|
20
|
+
keyDigest: key.keyDigest,
|
|
21
|
+
operation: row.operation,
|
|
22
|
+
requestDigest: row.request_digest,
|
|
23
|
+
targetId: row.target_id,
|
|
24
|
+
createdAt: row.created_at,
|
|
25
|
+
...(row.result === null
|
|
26
|
+
? {}
|
|
27
|
+
: { result: JSON.parse(Buffer.from(row.result).toString("utf8")) }),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Bind once, in the same transaction as the target. Same-request replay keeps
|
|
31
|
+
* the first target/result/time; a different request never overwrites a row. */
|
|
32
|
+
export function bindIdempotencyInTx(sql, binding) {
|
|
33
|
+
requireTransaction(sql);
|
|
34
|
+
const existing = lookupIdempotency(sql, binding, binding.requestDigest);
|
|
35
|
+
if (existing)
|
|
36
|
+
return existing;
|
|
37
|
+
if (binding.owner !== "upload" && binding.result !== undefined) {
|
|
38
|
+
throw new Error("only upload idempotency bindings carry a result");
|
|
39
|
+
}
|
|
40
|
+
sql
|
|
41
|
+
.prepare("INSERT INTO idempotency(owner, pid, key_digest, operation, request_digest, target_id, result, created_at) VALUES(?, ?, ?, ?, ?, ?, ?, ?)")
|
|
42
|
+
.run(binding.owner, binding.pid, binding.keyDigest, binding.operation, binding.requestDigest, binding.targetId, binding.result === undefined ? null : Buffer.from(JSON.stringify(binding.result)), binding.createdAt);
|
|
43
|
+
return binding;
|
|
44
|
+
}
|
|
45
|
+
/** Delete only the removed target's bindings. A retained turn must not lose its
|
|
46
|
+
* key merely because its command was pruned, even when the ids happen to match. */
|
|
47
|
+
export function deleteTargetIdempotencyInTx(sql, owner, pid, targetId) {
|
|
48
|
+
requireTransaction(sql);
|
|
49
|
+
return Number(sql
|
|
50
|
+
.prepare("DELETE FROM idempotency WHERE target_id = ? AND owner = ? AND pid = ?")
|
|
51
|
+
.run(targetId, owner, pid).changes);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=idempotency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/store/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAwB,MAAM,eAAe,CAAC;AA6BzE,SAAS,QAAQ;IACf,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2DAA2D,CAAC,EAAE;QAC1F,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAC/B,GAAqC,EACrC,GAAmB,EACnB,aAAqB;IAErB,MAAM,GAAG,GAAG,GAAG;SACZ,OAAO,CACN,iIAAiI,CAClI;SACA,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAA2B,CAAC;IACpE,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,GAAG,CAAC,cAAc,KAAK,aAAa;QAAE,QAAQ,EAAE,CAAC;IACrD,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI;YACrB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,EAAE,CAAC;KACjF,CAAC;AACJ,CAAC;AAED;+EAC+E;AAC/E,MAAM,UAAU,mBAAmB,CACjC,GAAoB,EACpB,OAA2B;IAE3B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,GAAG;SACA,OAAO,CACN,0IAA0I,CAC3I;SACA,GAAG,CACF,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EACjF,OAAO,CAAC,SAAS,CAClB,CAAC;IACJ,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;mFACmF;AACnF,MAAM,UAAU,2BAA2B,CACzC,GAAoB,EACpB,KAAuB,EACvB,GAAW,EACX,QAAgB;IAEhB,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,MAAM,CACX,GAAG;SACA,OAAO,CAAC,uEAAuE,CAAC;SAChF,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CACrC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DatabaseSync, StatementSync } from "node:sqlite";
|
|
2
|
+
import { type BodyRef } from "./blob-files.js";
|
|
3
|
+
import { StoreError } from "./errors.js";
|
|
4
|
+
import type { SqlWriteContext } from "./mutation.js";
|
|
5
|
+
/** The importer has exactly one connection, no EngineStore or background worker. */
|
|
6
|
+
export declare class ImportContext implements SqlWriteContext {
|
|
7
|
+
readonly db: DatabaseSync;
|
|
8
|
+
readonly blobsDir: string;
|
|
9
|
+
private readonly statements;
|
|
10
|
+
private active;
|
|
11
|
+
readonly externalDirectories: Set<string>;
|
|
12
|
+
constructor(db: DatabaseSync, blobsDir: string);
|
|
13
|
+
get inTransaction(): boolean;
|
|
14
|
+
prepare(sql: string): StatementSync;
|
|
15
|
+
transaction<T>(body: () => T): T;
|
|
16
|
+
/** Existing O_DSYNC writer, with a directory receipt instead of live generations.
|
|
17
|
+
* Parent fsyncs these directories before publishing the closed temp database. */
|
|
18
|
+
body(bytes: Uint8Array): BodyRef;
|
|
19
|
+
read(sha: string): Buffer;
|
|
20
|
+
}
|
|
21
|
+
export declare function importError(code: string, detail: string, cause?: unknown): StoreError;
|
|
22
|
+
//# sourceMappingURL=import-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-context.d.ts","sourceRoot":"","sources":["../../src/store/import-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,oFAAoF;AACpF,qBAAa,aAAc,YAAW,eAAe;IAMjD,QAAQ,CAAC,EAAE,EAAE,YAAY;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAN3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,MAAM,CAAS;IACvB,QAAQ,CAAC,mBAAmB,cAAqB;IAEjD,YACW,EAAE,EAAE,YAAY,EAChB,QAAQ,EAAE,MAAM,EACvB;IAEJ,IAAI,aAAa,IAAI,OAAO,CAE3B;IACD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAOlC;IAED,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAgB/B;IAED;qFACiF;IACjF,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CA0B/B;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASxB;CACF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAErF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { INLINE_BODY_MAX_BYTES, sha256Hex } from "./blob-files.js";
|
|
4
|
+
import { writeExternalFile } from "./external-files.js";
|
|
5
|
+
import { StoreError } from "./errors.js";
|
|
6
|
+
/** The importer has exactly one connection, no EngineStore or background worker. */
|
|
7
|
+
export class ImportContext {
|
|
8
|
+
db;
|
|
9
|
+
blobsDir;
|
|
10
|
+
statements = new Map();
|
|
11
|
+
active = false;
|
|
12
|
+
externalDirectories = new Set();
|
|
13
|
+
constructor(db, blobsDir) {
|
|
14
|
+
this.db = db;
|
|
15
|
+
this.blobsDir = blobsDir;
|
|
16
|
+
}
|
|
17
|
+
get inTransaction() {
|
|
18
|
+
return this.active;
|
|
19
|
+
}
|
|
20
|
+
prepare(sql) {
|
|
21
|
+
let statement = this.statements.get(sql);
|
|
22
|
+
if (!statement) {
|
|
23
|
+
statement = this.db.prepare(sql);
|
|
24
|
+
this.statements.set(sql, statement);
|
|
25
|
+
}
|
|
26
|
+
return statement;
|
|
27
|
+
}
|
|
28
|
+
transaction(body) {
|
|
29
|
+
if (this.active)
|
|
30
|
+
throw new Error("nested import transaction");
|
|
31
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
32
|
+
this.active = true;
|
|
33
|
+
try {
|
|
34
|
+
const value = body();
|
|
35
|
+
if (value && typeof value.then === "function")
|
|
36
|
+
throw new Error("async import transaction");
|
|
37
|
+
this.db.exec("COMMIT");
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
this.db.exec("ROLLBACK");
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
this.active = false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Existing O_DSYNC writer, with a directory receipt instead of live generations.
|
|
49
|
+
* Parent fsyncs these directories before publishing the closed temp database. */
|
|
50
|
+
body(bytes) {
|
|
51
|
+
const sha256 = sha256Hex(bytes);
|
|
52
|
+
if (bytes.byteLength <= INLINE_BODY_MAX_BYTES)
|
|
53
|
+
return {
|
|
54
|
+
sha256,
|
|
55
|
+
size: bytes.byteLength,
|
|
56
|
+
inline: Buffer.from(bytes),
|
|
57
|
+
file: null,
|
|
58
|
+
generation: null,
|
|
59
|
+
};
|
|
60
|
+
const receipt = writeExternalFile({
|
|
61
|
+
registerExternal: (dir) => {
|
|
62
|
+
this.externalDirectories.add(dir);
|
|
63
|
+
return 0;
|
|
64
|
+
},
|
|
65
|
+
}, { dir: this.blobsDir, name: sha256, bytes, keepExisting: true });
|
|
66
|
+
// Existing immutable bytes are never rewritten, including a resource collision.
|
|
67
|
+
if (!receipt.written) {
|
|
68
|
+
const prior = readFileSync(receipt.path);
|
|
69
|
+
if (prior.length !== bytes.byteLength || sha256Hex(prior) !== sha256)
|
|
70
|
+
throw importError("store_import_blob_mismatch", `existing body ${sha256} differs`);
|
|
71
|
+
}
|
|
72
|
+
return { sha256, size: bytes.byteLength, inline: null, file: receipt.path, generation: null };
|
|
73
|
+
}
|
|
74
|
+
read(sha) {
|
|
75
|
+
const row = this.prepare("SELECT size,inline FROM blob WHERE sha256=?").get(sha);
|
|
76
|
+
if (!row)
|
|
77
|
+
throw importError("store_import_blob_missing", `missing body ${sha}`);
|
|
78
|
+
const bytes = row.inline === null ? readFileSync(join(this.blobsDir, sha)) : Buffer.from(row.inline);
|
|
79
|
+
if (bytes.length !== row.size || sha256Hex(bytes) !== sha)
|
|
80
|
+
throw importError("store_import_blob_mismatch", `body ${sha} differs`);
|
|
81
|
+
return bytes;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function importError(code, detail, cause) {
|
|
85
|
+
return new StoreError(code, 503, false, detail, cause === undefined ? undefined : { cause });
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=import-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-context.js","sourceRoot":"","sources":["../../src/store/import-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ImportPartitionSource } from "./import-source.js";
|
|
2
|
+
/** Decode legacy names only; no recursive scan, journal writer or new layout.
|
|
3
|
+
* Existing global/project slugs also recover empty or damaged partitions.
|
|
4
|
+
* Other nonempty names come from the first frame through the original codec. */
|
|
5
|
+
export declare function discoverLegacyPartitions(journalRoot: string): ImportPartitionSource[];
|
|
6
|
+
//# sourceMappingURL=import-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-discovery.d.ts","sourceRoot":"","sources":["../../src/store/import-discovery.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;gFAEgF;AAChF,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,EAAE,CA6BrF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { closeSync, existsSync, openSync, readSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import { PREFIX_BYTES, decodeFrameBody, readFramePrefix } from "./legacy-journal/frame-codec.js";
|
|
4
|
+
import { journalPartitionDirectory } from "./legacy-journal/journal-partition.js";
|
|
5
|
+
import { importError } from "./import-context.js";
|
|
6
|
+
/** Decode legacy names only; no recursive scan, journal writer or new layout.
|
|
7
|
+
* Existing global/project slugs also recover empty or damaged partitions.
|
|
8
|
+
* Other nonempty names come from the first frame through the original codec. */
|
|
9
|
+
export function discoverLegacyPartitions(journalRoot) {
|
|
10
|
+
const result = [];
|
|
11
|
+
for (const entry of readdirSync(journalRoot, { withFileTypes: true })) {
|
|
12
|
+
if (!entry.isDirectory())
|
|
13
|
+
continue;
|
|
14
|
+
const directory = join(journalRoot, entry.name), file = join(directory, "journal.bin");
|
|
15
|
+
const match = /^project-(.*)-[0-9a-f]{12}$/.exec(entry.name);
|
|
16
|
+
const candidate = entry.name === basename(journalPartitionDirectory(journalRoot, "global"))
|
|
17
|
+
? "global"
|
|
18
|
+
: match
|
|
19
|
+
? `project:${match[1]}`
|
|
20
|
+
: null;
|
|
21
|
+
if (candidate && journalPartitionDirectory(journalRoot, candidate) === directory) {
|
|
22
|
+
result.push({ name: candidate, directory });
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (!existsSync(file))
|
|
26
|
+
continue;
|
|
27
|
+
const name = firstPartitionName(file);
|
|
28
|
+
if (journalPartitionDirectory(journalRoot, name) !== directory)
|
|
29
|
+
throw importError("store_import_partition_identity", "legacy partition directory disagrees with its frame identity");
|
|
30
|
+
result.push({ name, directory });
|
|
31
|
+
}
|
|
32
|
+
if (!result.some((row) => row.name === "global"))
|
|
33
|
+
result.push({ name: "global", directory: journalPartitionDirectory(journalRoot, "global") });
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
function firstPartitionName(path) {
|
|
37
|
+
const fd = openSync(path, "r");
|
|
38
|
+
try {
|
|
39
|
+
const size = statSync(path).size, prefix = Buffer.alloc(Math.min(PREFIX_BYTES, size));
|
|
40
|
+
readExactly(fd, prefix, 0);
|
|
41
|
+
const decoded = readFramePrefix(prefix, size);
|
|
42
|
+
if (decoded.status !== "frame")
|
|
43
|
+
throw importError("store_import_partition_identity", "legacy partition has no readable name; source bytes retained");
|
|
44
|
+
const frame = Buffer.alloc(decoded.frameLength);
|
|
45
|
+
readExactly(fd, frame, 0);
|
|
46
|
+
const body = decodeFrameBody(frame, decoded.headerLength, decoded.payloadLength);
|
|
47
|
+
if (body.status !== "frame" ||
|
|
48
|
+
typeof body.header.partition !== "string" ||
|
|
49
|
+
!body.header.partition.trim())
|
|
50
|
+
throw importError("store_import_partition_identity", "legacy first frame has no verified partition identity");
|
|
51
|
+
return body.header.partition;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
closeSync(fd);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function readExactly(fd, bytes, position) {
|
|
58
|
+
let offset = 0;
|
|
59
|
+
while (offset < bytes.length) {
|
|
60
|
+
const count = readSync(fd, bytes, offset, bytes.length - offset, position + offset);
|
|
61
|
+
if (!count)
|
|
62
|
+
throw importError("store_import_source_changed", "legacy frame changed while reading its identity");
|
|
63
|
+
offset += count;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=import-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-discovery.js","sourceRoot":"","sources":["../../src/store/import-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;gFAEgF;AAChF,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,EAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,SAAS,GACb,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,yBAAyB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACvE,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,KAAK;gBACL,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE;gBACvB,CAAC,CAAC,IAAI,CAAC;QACb,IAAI,SAAS,IAAI,yBAAyB,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,yBAAyB,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,SAAS;YAC5D,MAAM,WAAW,CACf,iCAAiC,EACjC,8DAA8D,CAC/D,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,yBAAyB,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAC9B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;YAC5B,MAAM,WAAW,CACf,iCAAiC,EACjC,8DAA8D,CAC/D,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChD,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACjF,IACE,IAAI,CAAC,MAAM,KAAK,OAAO;YACvB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,QAAQ;YACzC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;YAE7B,MAAM,WAAW,CACf,iCAAiC,EACjC,uDAAuD,CACxD,CAAC;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AACD,SAAS,WAAW,CAAC,EAAU,EAAE,KAAa,EAAE,QAAgB;IAC9D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK;YACR,MAAM,WAAW,CACf,6BAA6B,EAC7B,iDAAiD,CAClD,CAAC;QACJ,MAAM,IAAI,KAAK,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { JournalRecord } from "./legacy-journal/frame-codec.js";
|
|
2
|
+
import { ImportContext } from "./import-context.js";
|
|
3
|
+
/** Bodies are prepared before BEGIN; the returned batch uses only pure row
|
|
4
|
+
* reducers. Runtime append/owner notifications never run during import. */
|
|
5
|
+
export declare function prepareImportRecords(sql: ImportContext, records: readonly JournalRecord[]): (pid: number) => void;
|
|
6
|
+
//# sourceMappingURL=import-records.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-records.d.ts","sourceRoot":"","sources":["../../src/store/import-records.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAoBrE,OAAO,EAAE,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAkBjE;2EAC2E;AAC3E,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CA4KvB"}
|