@lostgradient/weft 0.24.0 → 0.24.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cli/conformance.js +5 -2
- package/dist/cli/generated/operation-catalog.snapshot.json +95 -1
- package/dist/cli/generated/operation-client.generated.d.ts +28 -2
- package/dist/cli/generated/operation-client.generated.js +2 -0
- package/dist/cli/parse-schedule-arguments.js +15 -3
- package/dist/cli/schedule.js +2 -1
- package/dist/cli/types.d.ts +2 -1
- package/dist/client/http-client-requests.js +6 -9
- package/dist/client/start-body.js +1 -0
- package/dist/core/catalog/index.d.ts +2 -2
- package/dist/core/catalog/index.js +9 -2
- package/dist/core/catalog/reference-counts.d.ts +29 -14
- package/dist/core/catalog/removal.d.ts +63 -10
- package/dist/core/catalog/removal.js +18 -2
- package/dist/core/catalog/storage-io.d.ts +23 -0
- package/dist/core/catalog/storage-io.js +1 -1
- package/dist/core/engine/activity-resolution.js +17 -17
- package/dist/core/engine/bulk-operations-purge.d.ts +1 -1
- package/dist/core/engine/bulk-operations-purge.js +17 -22
- package/dist/core/engine/bulk-operations-retry.d.ts +24 -0
- package/dist/core/engine/bulk-operations-retry.js +190 -0
- package/dist/core/engine/bulk-operations-shared.d.ts +18 -0
- package/dist/core/engine/bulk-operations-shared.js +14 -0
- package/dist/core/engine/bulk-operations.d.ts +3 -2
- package/dist/core/engine/bulk-operations.js +10 -169
- package/dist/core/engine/callback-creators-bundles.js +5 -3
- package/dist/core/engine/callback-creators-core.js +9 -1
- package/dist/core/engine/callback-creators-schedule.js +2 -2
- package/dist/core/engine/catalog-readiness.js +2 -0
- package/dist/core/engine/catalog-removal.d.ts +107 -3
- package/dist/core/engine/catalog-removal.js +66 -13
- package/dist/core/engine/catalog-tombstone-recovery.d.ts +56 -0
- package/dist/core/engine/catalog-tombstone-recovery.js +39 -0
- package/dist/core/engine/child-workflow.d.ts +13 -1
- package/dist/core/engine/child-workflow.js +22 -4
- package/dist/core/engine/constraints.js +5 -1
- package/dist/core/engine/construction.d.ts +1 -1
- package/dist/core/engine/decode-revision.d.ts +32 -0
- package/dist/core/engine/decode-revision.js +9 -0
- package/dist/core/engine/disposal.d.ts +6 -2
- package/dist/core/engine/disposal.js +24 -10
- package/dist/core/engine/dynamic-source-errors.d.ts +81 -0
- package/dist/core/engine/dynamic-source-errors.js +25 -0
- package/dist/core/engine/dynamic-source-execution.d.ts +173 -0
- package/dist/core/engine/dynamic-source-execution.js +108 -0
- package/dist/core/engine/engine-internal-types.d.ts +16 -0
- package/dist/core/engine/engine-workflows-namespace.d.ts +10 -0
- package/dist/core/engine/engine-workflows-namespace.js +3 -1
- package/dist/core/engine/generation-codec.d.ts +22 -0
- package/dist/core/engine/generation-codec.js +2 -0
- package/dist/core/engine/index.d.ts +18 -10
- package/dist/core/engine/index.js +22 -11
- package/dist/core/engine/inline-launch-queue.js +1 -1
- package/dist/core/engine/internals.d.ts +26 -30
- package/dist/core/engine/lifecycle/checkpoint-launch.d.ts +29 -0
- package/dist/core/engine/lifecycle/checkpoint-launch.js +75 -0
- package/dist/core/engine/lifecycle/delayed-start-registration.d.ts +30 -0
- package/dist/core/engine/lifecycle/delayed-start-registration.js +11 -0
- package/dist/core/engine/lifecycle/fork-helpers.d.ts +33 -1
- package/dist/core/engine/lifecycle/fork-helpers.js +3 -1
- package/dist/core/engine/lifecycle/recovery-isolation.d.ts +20 -0
- package/dist/core/engine/lifecycle/recovery-isolation.js +26 -0
- package/dist/core/engine/lifecycle/recovery-revision-groups.d.ts +75 -0
- package/dist/core/engine/lifecycle/recovery-revision-groups.js +64 -0
- package/dist/core/engine/lifecycle/resume-body.d.ts +44 -0
- package/dist/core/engine/lifecycle/resume-body.js +211 -0
- package/dist/core/engine/lifecycle/resume-generation-guard.d.ts +58 -0
- package/dist/core/engine/lifecycle/resume-generation-guard.js +11 -0
- package/dist/core/engine/lifecycle/resume.d.ts +46 -3
- package/dist/core/engine/lifecycle/resume.js +21 -201
- package/dist/core/engine/lifecycle/shared.d.ts +43 -0
- package/dist/core/engine/lifecycle/standalone-claim-acquire.d.ts +80 -2
- package/dist/core/engine/lifecycle/standalone-claim-acquire.js +20 -4
- package/dist/core/engine/lifecycle/start-commit-errors.d.ts +12 -0
- package/dist/core/engine/lifecycle/start-commit-errors.js +6 -0
- package/dist/core/engine/lifecycle/start-commit.d.ts +24 -7
- package/dist/core/engine/lifecycle/start-commit.js +57 -15
- package/dist/core/engine/lifecycle/start-exec.d.ts +18 -2
- package/dist/core/engine/lifecycle/start-exec.js +7 -5
- package/dist/core/engine/lifecycle/start-or-signal-create.js +1 -3
- package/dist/core/engine/lifecycle/start-or-signal-resolution.d.ts +8 -2
- package/dist/core/engine/lifecycle/start-or-signal-resolution.js +11 -3
- package/dist/core/engine/lifecycle/start-or-signal.js +1 -1
- package/dist/core/engine/lifecycle/start-precondition-attribution.d.ts +55 -0
- package/dist/core/engine/lifecycle/start-precondition-attribution.js +13 -0
- package/dist/core/engine/lifecycle/start-revision-resolution.d.ts +34 -0
- package/dist/core/engine/lifecycle/start-revision-resolution.js +11 -0
- package/dist/core/engine/lifecycle/start-schedule-timing.d.ts +11 -0
- package/dist/core/engine/lifecycle/start-schedule-timing.js +21 -0
- package/dist/core/engine/lifecycle/start-state.d.ts +16 -0
- package/dist/core/engine/lifecycle/start-state.js +60 -0
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +146 -4
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +33 -4
- package/dist/core/engine/lifecycle/start.d.ts +54 -7
- package/dist/core/engine/lifecycle/start.js +53 -90
- package/dist/core/engine/lifecycle/transition.d.ts +12 -4
- package/dist/core/engine/lifecycle/transition.js +40 -95
- package/dist/core/engine/lifecycle.d.ts +5 -2
- package/dist/core/engine/lifecycle.js +7 -6
- package/dist/core/engine/listing.js +15 -1
- package/dist/core/engine/memo-durable-activity.js +4 -1
- package/dist/core/engine/nonterminal-revision-count.d.ts +25 -0
- package/dist/core/engine/nonterminal-revision-count.js +16 -0
- package/dist/core/engine/operations-time.d.ts +5 -23
- package/dist/core/engine/operations-time.js +13 -11
- package/dist/core/engine/ownership-bootstrap.d.ts +1 -1
- package/dist/core/engine/pinned-schedule-revision-count.d.ts +26 -0
- package/dist/core/engine/pinned-schedule-revision-count.js +19 -0
- package/dist/core/engine/pinned-schedule-revision.d.ts +76 -0
- package/dist/core/engine/pinned-schedule-revision.js +53 -0
- package/dist/core/engine/registration.d.ts +30 -0
- package/dist/core/engine/registration.js +17 -2
- package/dist/core/engine/retention.js +9 -2
- package/dist/core/engine/revision-errors.d.ts +71 -0
- package/dist/core/engine/revision-errors.js +13 -0
- package/dist/core/engine/schedule-overlap.js +2 -1
- package/dist/core/engine/schedule-revision-fire.d.ts +17 -0
- package/dist/core/engine/schedule-revision-fire.js +3 -0
- package/dist/core/engine/schedule-run.d.ts +10 -0
- package/dist/core/engine/schedule-run.js +2 -1
- package/dist/core/engine/schedules.d.ts +11 -1
- package/dist/core/engine/schedules.js +28 -9
- package/dist/core/engine/source-diagnostics.d.ts +76 -0
- package/dist/core/engine/source-diagnostics.js +105 -0
- package/dist/core/engine/source-registration.js +4 -2
- package/dist/core/engine/source-resolution.d.ts +25 -9
- package/dist/core/engine/source-resolution.js +49 -14
- package/dist/core/engine/source-runtime-state.d.ts +92 -0
- package/dist/core/engine/source-runtime-state.js +36 -0
- package/dist/core/engine/storage-io.d.ts +19 -2
- package/dist/core/engine/storage-io.js +21 -2
- package/dist/core/engine/termination/complete.js +1 -1
- package/dist/core/engine/termination/finalizer-registration.d.ts +18 -0
- package/dist/core/engine/termination/finalizer-registration.js +21 -0
- package/dist/core/engine/termination/finalizer.d.ts +16 -19
- package/dist/core/engine/termination/finalizer.js +3 -3
- package/dist/core/engine/termination/suspend.js +3 -0
- package/dist/core/engine/time-operation-callbacks.d.ts +32 -0
- package/dist/core/engine/time-operation-callbacks.js +0 -0
- package/dist/core/engine/validation/schedule-cadence.d.ts +16 -0
- package/dist/core/engine/validation/schedule-cadence.js +20 -0
- package/dist/core/engine/validation/schedule-options.d.ts +4 -1
- package/dist/core/engine/validation/schedule-options.js +14 -0
- package/dist/core/engine/validation/schedule-revision.d.ts +24 -0
- package/dist/core/engine/validation/schedule-revision.js +21 -0
- package/dist/core/engine/validation/schedule-warnings.d.ts +11 -0
- package/dist/core/engine/validation/schedule-warnings.js +5 -0
- package/dist/core/engine/validation/schedule.d.ts +29 -4
- package/dist/core/engine/validation/schedule.js +19 -36
- package/dist/core/engine/validation.js +13 -17
- package/dist/core/engine/workflow-claim-reclaim-target.d.ts +1 -1
- package/dist/core/engine/workflow-claim-reclaim-target.js +22 -8
- package/dist/core/engine/workflow-claim-registry.d.ts +79 -75
- package/dist/core/engine/workflow-claim-registry.js +15 -2
- package/dist/core/engine/workflow-generation-fence.d.ts +74 -0
- package/dist/core/engine/workflow-generation-fence.js +19 -0
- package/dist/core/engine/workflow-retention-deadline.d.ts +16 -0
- package/dist/core/engine/workflow-retention-deadline.js +33 -0
- package/dist/core/events/event-map.d.ts +5 -0
- package/dist/core/events/index.d.ts +1 -0
- package/dist/core/events/index.js +1 -0
- package/dist/core/events/workflow-source-events.d.ts +102 -0
- package/dist/core/events/workflow-source-events.js +57 -0
- package/dist/core/execution-strategy.d.ts +7 -0
- package/dist/core/inline-execution-strategy.context-options.d.ts +1 -1
- package/dist/core/inline-execution-strategy.js +1 -1
- package/dist/core/start-workflow-validation.d.ts +15 -0
- package/dist/core/start-workflow-validation.js +11 -1
- package/dist/core/types/checkpoint.d.ts +14 -0
- package/dist/core/types/schedules.d.ts +52 -1
- package/dist/core/types/state.d.ts +16 -0
- package/dist/core/weft-error.d.ts +1 -1
- package/dist/core/weft-error.js +4 -1
- package/dist/core/worker-execution-strategy.d.ts +1 -0
- package/dist/core/worker-execution-strategy.js +13 -1
- package/dist/core/worker-fault-handling.d.ts +10 -0
- package/dist/core/worker-fault-handling.js +1 -0
- package/dist/core/worker-inbound-message.d.ts +1 -0
- package/dist/core/worker-inbound-message.js +1 -0
- package/dist/core/worker-protocol-guard.js +4 -0
- package/dist/core/worker-protocol.d.ts +7 -0
- package/dist/core/worker-protocol.js +2 -1
- package/dist/core/worker-turn-watchdog.d.ts +8 -1
- package/dist/core/worker-turn-watchdog.js +3 -2
- package/dist/core/workflow-identifiers.d.ts +37 -0
- package/dist/core/workflow-identifiers.js +19 -1
- package/dist/diagnostics/format.js +5 -0
- package/dist/diagnostics/types.d.ts +24 -0
- package/dist/diagnostics/version-check.js +8 -2
- package/dist/http.js +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +7 -0
- package/dist/indexeddb.js +1 -1
- package/dist/json-schema.js +3 -3
- package/dist/server/fault-to-json-rpc.js +2 -1
- package/dist/server/fleet-event-feed.js +6 -6
- package/dist/server/index.d.ts +11 -0
- package/dist/server/operation-fault.d.ts +2 -0
- package/dist/server/operation-fault.js +2 -1
- package/dist/server/operations/create-schedule.d.ts +2 -0
- package/dist/server/operations/create-schedule.js +10 -6
- package/dist/server/operations/get-catalog-diagnostics.d.ts +28 -0
- package/dist/server/operations/get-catalog-diagnostics.js +10 -2
- package/dist/server/operations/get-task-detail-schema.d.ts +8 -0
- package/dist/server/operations/get-task-detail-schema.js +1 -0
- package/dist/server/operations/get-task-detail.d.ts +8 -0
- package/dist/server/operations/get-task-detail.js +1 -0
- package/dist/server/operations/get-task-diagnostics.d.ts +4 -4
- package/dist/server/operations/preload-workflow-revision.d.ts +28 -0
- package/dist/server/operations/preload-workflow-revision.js +60 -0
- package/dist/server/operations/schedule-faults.d.ts +1 -0
- package/dist/server/operations/schedule-faults.js +32 -4
- package/dist/server/operations/schedule-rest-body.d.ts +1 -0
- package/dist/server/operations/schedule-rest-body.js +2 -1
- package/dist/server/operations/static-registrations.js +6 -0
- package/dist/server/operations/update-schedule.d.ts +2 -0
- package/dist/server/operations/update-schedule.js +4 -2
- package/dist/server/operations/workflow-catalog-operation-helpers.js +27 -0
- package/dist/server/rest-binding.d.ts +11 -0
- package/dist/server/runtime/task-dispatch-envelope.d.ts +41 -0
- package/dist/server/runtime/task-dispatch-envelope.js +54 -0
- package/dist/server/runtime/task-dispatch-revision.d.ts +29 -0
- package/dist/server/runtime/task-dispatch-revision.js +13 -0
- package/dist/server/runtime/task-dispatch.d.ts +3 -1
- package/dist/server/runtime/task-dispatch.js +20 -44
- package/dist/server/runtime/task-ledger-recovery.js +1 -1
- package/dist/server/runtime/task-ledger-runtime.d.ts +14 -2
- package/dist/server/runtime/task-ledger-runtime.js +5 -3
- package/dist/server/runtime/task-polling.js +9 -3
- package/dist/server/runtime/task-reconciliation.js +2 -1
- package/dist/server/runtime/websocket-worker.js +9 -0
- package/dist/server/task-ledger-codec.d.ts +28 -0
- package/dist/server/task-ledger-codec.js +7 -1
- package/dist/server/task-ledger-transition-helpers.js +1 -0
- package/dist/server/task-ledger-types.d.ts +9 -0
- package/dist/server/task-ledger.d.ts +1 -1
- package/dist/server/task-ledger.js +3 -1
- package/dist/server/task-queue-types.d.ts +2 -0
- package/dist/storage/bun-sql.js +135 -100
- package/dist/storage/catalog-keys.d.ts +19 -0
- package/dist/storage/catalog-keys.js +3 -1
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/generation-keys.d.ts +52 -0
- package/dist/storage/generation-keys.js +4 -0
- package/dist/storage/index.d.ts +76 -63
- package/dist/storage/interface.d.ts +24 -230
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +2 -0
- package/dist/storage/lease-keys.d.ts +48 -0
- package/dist/storage/lease-keys.js +8 -0
- package/dist/storage/lmdb.d.ts +30 -2
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon.js +3 -3
- package/dist/storage/node-sqlite.js +135 -100
- package/dist/storage/postgres.js +3 -3
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/signal-keys.d.ts +23 -0
- package/dist/storage/signal-keys.js +9 -0
- package/dist/storage/testing.js +1 -1
- package/dist/storage/turso.js +2 -2
- package/dist/storage/workflow-lifecycle-keys.d.ts +128 -0
- package/dist/storage/workflow-lifecycle-keys.js +46 -0
- package/dist/storage/workflow-record-keys.d.ts +98 -0
- package/dist/storage/workflow-record-keys.js +47 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web-extension.js +1 -1
- package/dist/worker/protocol-messages.d.ts +17 -0
- package/dist/worker/protocol-schemas.d.ts +32 -0
- package/dist/worker/protocol-schemas.js +7 -3
- package/dist/worker/protocol-task-result.js +35 -3
- package/dist/worker/protocol.js +1 -1
- package/dist/worker/registry/types.d.ts +2 -0
- package/dist/worker/registry.d.ts +1 -1
- package/dist/worker/registry.js +3 -1
- package/dist/workers/workflow-runner.d.ts +9 -0
- package/dist/workers/workflow-runner.js +9 -2
- package/dist/workers/workflow-worker-entry.js +9 -4
- package/package.json +2 -2
package/dist/web-extension.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function T(e){let t=[];for(let n=0;n<e.length;n+=512)t.push(String.fromCharCode(...e.subarray(n,n+512)));return btoa(t.join(""))}function D(e){let t=atob(e),n=new Uint8Array(t.length);for(let i=0;i<t.length;i+=1)n[i]=t.charCodeAt(i);return n}function u(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}async function b(e,t){return await e.get(t)!==null}async function*c(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function S(e,t){let n=0;for await(let i of c(e,t))n++;return n}async function w(e,t){let n=[];for await(let i of c(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function v(e,t,n){let i=[];for await(let s of c(e,t,n))i.push({type:"delete",key:s});if(i.length===0)return 0;return await e.batch(i),i.length}function _(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function r(e){return encodeURIComponent(e)}function l(e){return String(e).padStart(16,"0")}var W={catalogEntry:(e,t)=>`catalog-entry:${r(e)}:${r(t)}`,catalogEntryPrefix:(e)=>`catalog-entry:${r(e)}:`,catalogActive:(e)=>`catalog-active:${r(e)}`};var I="default";var K={applicationMailbox:(e,t)=>`appmbx:v1:${r(e)}:${r(t)}`,applicationMailboxSinkProbe:(e,t,n)=>`appprobe:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandPrefix:(e,t)=>`appcmd:v1:${r(e)}:${r(t)}:`,applicationCommand:(e,t,n)=>`appcmd:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandReadyPrefix:(e,t)=>`appready:v1:${r(e)}:${r(t)}:`,applicationCommandReady:(e,t,n)=>`appready:v1:${r(e)}:${r(t)}:${l(n)}`,applicationCommandIdempotency:(e,t,n)=>`appidem:v1:${r(e)}:${r(t)}:${r(n)}`,applicationCommandBySequencePrefix:(e,t)=>`appseq:v1:${r(e)}:${r(t)}:`,applicationCommandBySequence:(e,t,n)=>`appseq:v1:${r(e)}:${r(t)}:${l(n)}`,applicationCommandTerminalPrefix:(e,t)=>`appterm:v1:${r(e)}:${r(t)}:`,applicationCommandTerminal:(e,t,n,i)=>`appterm:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`};var L={applicationOutbox:(e,t)=>`appobx:v1:${r(e)}:${r(t)}`,applicationOutboxSinkProbe:(e,t,n)=>`appprobe:v1:outbox:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryPrefix:(e,t)=>`appdlv:v1:${r(e)}:${r(t)}:`,applicationDelivery:(e,t,n)=>`appdlv:v1:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryDuePrefix:(e,t)=>`appdue:v1:${r(e)}:${r(t)}:`,applicationDeliveryDue:(e,t,n,i)=>`appdue:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`,applicationDeliveryIdempotency:(e,t,n)=>`appdidem:v1:${r(e)}:${r(t)}:${r(n)}`,applicationDeliveryBySequencePrefix:(e,t)=>`appdseq:v1:${r(e)}:${r(t)}:`,applicationDeliveryBySequence:(e,t,n)=>`appdseq:v1:${r(e)}:${r(t)}:${l(n)}`,applicationDeliveryTerminalPrefix:(e,t)=>`appdterm:v1:${r(e)}:${r(t)}:`,applicationDeliveryTerminal:(e,t,n,i)=>`appdterm:v1:${r(e)}:${r(t)}:${l(n)}:${r(i)}`};var U={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var E=1e4;class z extends Error{code="StorageBatchOperationLimitExceededError";cap=E;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${E}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function d(e,t){if(t>E)throw new z(e,t)}function M(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"ÿ"}function q(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function Ue(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function Y(e,t){if(e.has)return e.has(t);return b(e,t)}function H(e,t,n){if(e.keys)return e.keys(t,n);return c(e,t,n)}async function V(e,t){if(e.count)return e.count(t);return S(e,t)}async function j(e,t){if(e.deletePrefix)return e.deletePrefix(t);return w(e,t)}async function G(e,t,n){if(d("conditionalBatch conditions",t.length),d("conditionalBatch operations",n.length),_(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var a=l,te="0",ne="1",N=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,Ne={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${a(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${a(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${a(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>N(e,t,n,ne),startSignal:(e,t,n)=>N(e,t,n,te),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${a(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${a(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${a(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${a(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${a(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...K,...L,...U,...W,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${I}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${a(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${a(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${a(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};function re(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function f(e){let t={},n=!1;for(let s of["gt","gte","lt","lte"]){let o=e[s];if(o===void 0)continue;if(typeof o!=="string")throw Error("deleteRange bounds must be strings");t[s]=o,n=!0}if(!n)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=re(e.limit);if(i!==void 0)t.limit=i;return t}async function F(e,t,n){let i=f(n);if(e.deleteRange)return e.deleteRange(t,i);return v(e,t,i)}function ie(e,t){let n={key:e,open:!1};if(t.gte!==void 0&&t.gte>n.key)n.key=t.gte,n.open=!1;if(t.gt!==void 0&&t.gt>=n.key)n.key=t.gt,n.open=!0;return n}function oe(e,t){let n={key:M(e),open:!0};if(t.lt!==void 0&&t.lt<=n.key)n.key=t.lt,n.open=!0;if(t.lte!==void 0&&t.lte<n.key)n.key=t.lte,n.open=!1;return n}function Ye(e,t){let n=ie(e,t),i=oe(e,t);if(n.key>i.key||n.key===i.key&&(n.open||i.open))return null;return{lower:n,upper:i}}function k(e){return e.replaceAll(/:+$/g,"")}function se(e,t){let n=k(e),i=k(t);if(n.length===0)return i;if(i.length===0)return n;return`${n}:${i}`}class P{#t;#n;constructor(e,t){this.#t=e,this.#n=k(t)}#e(e){if(this.#n.length===0)return e;return e.length===0?`${this.#n}:`:`${this.#n}:${e}`}#r(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#e(t.key),value:t.value};return{type:"delete",key:this.#e(t.key)}})}#o(e){if(this.#n.length===0)return e;return e.slice(this.#n.length+1)}#i(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#e(e.gt);if(e.gte!==void 0)t.gte=this.#e(e.gte);if(e.lt!==void 0)t.lt=this.#e(e.lt);if(e.lte!==void 0)t.lte=this.#e(e.lte);return t}#s(e={}){let t=this.#i(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#g(e){return this.#i(e)}capabilities(){return this.#t.capabilities()}scoped(e){return new P(this.#t,se(this.#n,e))}async get(e){return this.#t.get(this.#e(e))}async put(e,t){await this.#t.put(this.#e(e),t)}async delete(e){await this.#t.delete(this.#e(e))}async*scan(e,t){for await(let[n,i]of this.#t.scan(this.#e(e),this.#s(t)))yield[this.#o(n),i]}async batch(e){d("batch operations",e.length),await this.#t.batch(this.#r(e))}async conditionalBatch(e,t){return G(this.#t,e.map((n)=>({key:this.#e(n.key),expectedValue:n.expectedValue})),this.#r(t))}async has(e){return Y(this.#t,this.#e(e))}async deletePrefix(e){return j(this.#t,this.#e(e))}async deleteRange(e,t){let n=this.#g(f(t));return F(this.#t,this.#e(e),n)}async*keys(e,t){for await(let n of H(this.#t,this.#e(e),this.#s(t)))yield this.#o(n)}async count(e){return V(this.#t,this.#e(e))}[Symbol.dispose](){this.#t[Symbol.dispose]()}}function Q(e,t){return new P(e,t)}var J=1,y="__weftStorageKeyspace",ae=102400,le=8192;function ge(e){return typeof e==="object"&&e!==null&&"then"in e&&typeof e.then==="function"}function C(e){if(!u(e))return!1;if(e.__weftStorage!==J)return!1;return typeof e.value==="string"}function ce(e){if(!u(e))return!1;return Object.values(e).every(C)}function x(e){if(e!==y)return;throw Error(`WebExtensionStorage key "${y}" is reserved for adapter metadata.`)}function ue(e){for(let t of e)x(t.key)}function X(e){return{__weftStorage:J,value:T(e)}}function Z(e){if(!C(e))return null;return D(e.value)}function de(e){return C(e)}function O(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}function pe(e){if(!u(e))return!1;if(e.runtime!==void 0&&!u(e.runtime))return!1;return e.storage===void 0||u(e.storage)}function fe(e){if(e!==void 0){if(!pe(e))throw Error("WebExtensionStorage injected namespace must be an object.");return e}let t=globalThis,n=t.browser??t.chrome;if(n?.storage===void 0)throw Error("WebExtensionStorage requires globalThis.browser.storage or globalThis.chrome.storage.");return n}function me(e,t){let n=e.storage?.[t];if(n===void 0)throw Error(`WebExtensionStorage area "${t}" is not available.`);return n}function ye(e){if(e==="session")return"ephemeral";if(e==="sync"||e==="managed")return"remote";return"local"}function he(e){let t=e.runtime?.lastError?.message;return t===void 0?null:Error(t)}async function R(e,t,n){return new Promise((i,s)=>{let o=!1,p=(g)=>{if(o)return;let A=he(e);if(o=!0,A!==null)s(A);else i(g)},B=(g)=>{if(o)return;o=!0,s(g)},ee=(g)=>p(g),h;try{h=t(ee)}catch{try{h=n()}catch(g){B(g);return}}if(ge(h))h.then(p,B)})}class m{static#t=new WeakMap;#n;#e;#r;#o;#i;constructor(e={},t){this.#r=e.area??"local",this.#o=ye(this.#r),this.#n=fe(t),this.#e=me(this.#n,this.#r),this.#i=()=>{},this.#n.storage?.onChanged?.addListener?.(this.#i)}capabilities(){return{persistence:this.#o,readAfterWrite:"session",scanConsistency:"best-effort",atomicBatch:!1,conditionalBatch:!1,boundedRangeDelete:!1}}async#s(e){return R(this.#n,(t)=>this.#e.get(e,t),()=>this.#e.get(e))}async#g(e){await R(this.#n,(t)=>this.#e.set(e,t),()=>this.#e.set(e))}async#d(e){if(this.#e.getBytesInUse===void 0)return null;return R(this.#n,(t)=>this.#e.getBytesInUse?.(e,t),()=>this.#e.getBytesInUse?.(e))}async#a(){let t=(await this.#s(y))[y];if(t===void 0)return{};if(!ce(t))throw Error("WebExtensionStorage keyspace is not a valid storage envelope map.");return{...t}}async#c(e){let t={[y]:e};await this.#m(t),await this.#g(t)}async#u(e){let t=m.#t.get(this.#e)??Promise.resolve(),n={},i=new Promise((o)=>{n.release=o}),s=t.catch(()=>{return}).then(()=>i);m.#t.set(this.#e,s),await t.catch(()=>{return});try{return await e()}finally{if(n.release?.(),m.#t.get(this.#e)===s)m.#t.delete(this.#e)}}#l(){if(this.#r==="managed")throw Error('WebExtensionStorage area "managed" is read-only.')}#p(e){let t=this.#e.QUOTA_BYTES_PER_ITEM??le;for(let[n,i]of Object.entries(e)){let s=O({[n]:i});if(s>t)throw Error(`WebExtensionStorage sync item quota exceeded for "${n}": ${String(s)} > ${String(t)}.`)}}async#f(e){let t=Object.keys(e),n=await this.#d(null),i=await this.#d(t);if(n!==null&&i!==null)return n-i+O(e);let s=await this.#s(null);return O({...s,...e})}async#m(e){if(this.#r!=="sync")return;this.#p(e);let t=this.#e.QUOTA_BYTES??ae,n=await this.#f(e);if(n>t)throw Error(`WebExtensionStorage sync total quota exceeded: ${String(n)} > ${String(t)}.`)}async get(e){x(e);let t=await this.#a();return Z(t[e])}async put(e,t){this.#l(),x(e),await this.#u(async()=>{let n=await this.#a();n[e]=X(t),await this.#c(n)})}async delete(e){this.#l(),x(e),await this.#u(async()=>{let t=await this.#a();if(!(e in t))return;delete t[e],await this.#c(t)})}async*scan(e,t={}){let n=await this.#a(),i=Object.keys(n).filter((o)=>o.startsWith(e)).filter((o)=>q(o,t)).filter((o)=>de(n[o])).toSorted();if(t.reverse)i=i.toReversed();let s=0;for(let o of i){if(t.limit!==void 0&&s>=t.limit)break;let p=Z(n[o]);if(p===null)continue;yield[o,p],s+=1}}async batch(e){if(d("batch operations",e.length),this.#l(),e.length===0)return;ue(e),await this.#u(async()=>{let t=await this.#a();for(let n of e)if(n.type==="put")t[n.key]=X(n.value);else delete t[n.key];await this.#c(t)})}has(e){return b(this,e)}async*keys(e,t){yield*c(this,e,t)}count(e){return S(this,e)}async deletePrefix(e){return this.#l(),w(this,e)}async deleteRange(e,t){let n=f(t);return this.#l(),v(this,e,n)}scoped(e){return Q(this,e)}[Symbol.dispose](){this.#n.storage?.onChanged?.removeListener?.(this.#i)}}export{m as WebExtensionStorage};
|
|
1
|
+
function T(e){let t=[];for(let r=0;r<e.length;r+=512)t.push(String.fromCharCode(...e.subarray(r,r+512)));return btoa(t.join(""))}function D(e){let t=atob(e),r=new Uint8Array(t.length);for(let i=0;i<t.length;i+=1)r[i]=t.charCodeAt(i);return r}function u(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}async function b(e,t){return await e.get(t)!==null}async function*c(e,t,r){for await(let[i]of e.scan(t,r))yield i}async function S(e,t){let r=0;for await(let i of c(e,t))r++;return r}async function E(e,t){let r=[];for await(let i of c(e,t))r.push({type:"delete",key:i});if(r.length===0)return 0;return await e.batch(r),r.length}async function w(e,t,r){let i=[];for await(let s of c(e,t,r))i.push({type:"delete",key:s});if(i.length===0)return 0;return await e.batch(i),i.length}function W(e,t,r){if(!e.capabilities()[t])throw Error(`Feature "${r}" requires storage capability "${t}", but this storage backend does not provide it.`)}function n(e){return encodeURIComponent(e)}function a(e){return String(e).padStart(16,"0")}var K={catalogEntry:(e,t)=>`catalog-entry:${n(e)}:${n(t)}`,catalogEntryPrefix:(e)=>`catalog-entry:${n(e)}:`,catalogActive:(e)=>`catalog-active:${n(e)}`,catalogTombstone:(e,t)=>`catalog-tombstone:${n(e)}:${n(t)}`,catalogTombstonePrefix:()=>"catalog-tombstone:"};var L={workflowGeneration:(e)=>`wf-gen:${n(e)}`};var I={livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${n(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder"};var N={applicationMailbox:(e,t)=>`appmbx:v1:${n(e)}:${n(t)}`,applicationMailboxSinkProbe:(e,t,r)=>`appprobe:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandPrefix:(e,t)=>`appcmd:v1:${n(e)}:${n(t)}:`,applicationCommand:(e,t,r)=>`appcmd:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandReadyPrefix:(e,t)=>`appready:v1:${n(e)}:${n(t)}:`,applicationCommandReady:(e,t,r)=>`appready:v1:${n(e)}:${n(t)}:${a(r)}`,applicationCommandIdempotency:(e,t,r)=>`appidem:v1:${n(e)}:${n(t)}:${n(r)}`,applicationCommandBySequencePrefix:(e,t)=>`appseq:v1:${n(e)}:${n(t)}:`,applicationCommandBySequence:(e,t,r)=>`appseq:v1:${n(e)}:${n(t)}:${a(r)}`,applicationCommandTerminalPrefix:(e,t)=>`appterm:v1:${n(e)}:${n(t)}:`,applicationCommandTerminal:(e,t,r,i)=>`appterm:v1:${n(e)}:${n(t)}:${a(r)}:${n(i)}`};var Y={applicationOutbox:(e,t)=>`appobx:v1:${n(e)}:${n(t)}`,applicationOutboxSinkProbe:(e,t,r)=>`appprobe:v1:outbox:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryPrefix:(e,t)=>`appdlv:v1:${n(e)}:${n(t)}:`,applicationDelivery:(e,t,r)=>`appdlv:v1:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryDuePrefix:(e,t)=>`appdue:v1:${n(e)}:${n(t)}:`,applicationDeliveryDue:(e,t,r,i)=>`appdue:v1:${n(e)}:${n(t)}:${a(r)}:${n(i)}`,applicationDeliveryIdempotency:(e,t,r)=>`appdidem:v1:${n(e)}:${n(t)}:${n(r)}`,applicationDeliveryBySequencePrefix:(e,t)=>`appdseq:v1:${n(e)}:${n(t)}:`,applicationDeliveryBySequence:(e,t,r)=>`appdseq:v1:${n(e)}:${n(t)}:${a(r)}`,applicationDeliveryTerminalPrefix:(e,t)=>`appdterm:v1:${n(e)}:${n(t)}:`,applicationDeliveryTerminal:(e,t,r,i)=>`appdterm:v1:${n(e)}:${n(t)}:${a(r)}:${n(i)}`};var U={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${n(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${n(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var ge="0",ce="1",F=(e,t,r,i)=>`sig:${n(e)}:${n(t)}:${i}:${n(r)}`,M={signal:(e,t,r)=>F(e,t,r,ce),startSignal:(e,t,r)=>F(e,t,r,ge),signalSequence:(e)=>`sigseq:v1:${n(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${n(e)}:`,signalAcceptedResponse:(e,t,r)=>`sigres:v1:${n(e)}:${n(t)}:${n(r)}`};var z="default";var l=a,q={deadline:(e,t)=>`wf-deadline:${l(e)}:${n(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${l(e)}:${n(t)}`,teardownTimer:(e,t)=>`wf-teardown:${l(e)}:${n(t)}`,delayedStart:(e,t)=>`wf-delayed:${l(e)}:${n(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${l(e)}:${n(t)}`},G={budget:(e,t,r)=>`budget:${e}:${t}:${r}`,review:(e,t)=>`review:${n(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${n(e)}`,childCancellationPrefix:(e)=>`child-cancel:${n(e)}:`,childCancellation:(e,t)=>`child-cancel:${n(e)}:${n(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}`,childWorkflowByParent:(e,t,r)=>`child-by-parent:${n(e)}:${t===void 0?"":`${n(t)}:`}${n(r)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${n(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${n(e)}:${n(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${n(e)}`,workflowHasServices:(e)=>`wf-has-services:${n(e)}`,finalizerState:(e)=>`wf-finalizer-state:${n(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${n(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${n(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${n(e)}`,offload:(e,t)=>`offload:${n(e)}:${t}`,archive:(e,t)=>`archive:${n(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${n(e)}:${n(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${z}:${n(e)}:${n(t)}`,streamChunkPrefix:(e,t)=>`blob:${n(e)}:${t}:chunk:`,streamChunk:(e,t,r)=>`blob:${n(e)}:${t}:chunk:${String(r).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${n(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${n(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,r)=>`tool-effect:${n(e)}:${t}:${r}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${n(e)}:${n(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${n(e)}:${n(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${l(e)}:${n(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${l(e)}:${n(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${l(e)}:${n(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${n(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};var v=a,H={workflow:(e)=>`wf:${n(e)}`,checkpoint:(e)=>`wf:${n(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${n(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${n(e)}:timeline:`,timeline:(e,t)=>`wf:${n(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${n(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${n(t)}`,scheduleRun:(e)=>`schedule-run:${n(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${n(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${n(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${n(e)}:${n(t)}`,operation:(e,t,r)=>`op:${e}:${v(t)}:${r}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,r)=>`audit:bulk:${v(e)}:${n(t)}:${n(r)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${v(e)}:${n(t)}`,asyncActivity:(e,t)=>`async-act:v1:${n(e)}:${n(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${n(e)}:${n(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${n(e)}:`,activityReconciliation:(e,t,r)=>`actrec:v1:${n(e)}:${n(t)}:${r}`,eventPrefix:(e)=>`ev:${n(e)}:`,event:(e,t)=>`ev:${n(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${n(e)}:head`,eventWatermark:(e)=>`ev:${n(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${n(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${n(e)}:${String(t).padStart(10,"0")}`},V={attribute:(e)=>`attr:${n(e)}`,attributeIndex:(e,t,r)=>`idx:${e}:${t}:${n(r)}`,tagIndex:(e,t)=>`tag:${n(e)}:${n(t)}`,updatePrefix:(e)=>`upd:${n(e)}:`,update:(e,t)=>`upd:${n(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${n(e)}:${t}`,startIdempotency:(e)=>`start-idem:${n(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`};var O=1e4;class X extends Error{code="StorageBatchOperationLimitExceededError";cap=O;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${O}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function d(e,t){if(t>O)throw new X(e,t)}function j(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"ÿ"}function Q(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function at(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0}async function Z(e,t){if(e.has)return e.has(t);return b(e,t)}function J(e,t,r){if(e.keys)return e.keys(t,r);return c(e,t,r)}async function ee(e,t){if(e.count)return e.count(t);return S(e,t)}async function te(e,t){if(e.deletePrefix)return e.deletePrefix(t);return E(e,t)}async function ne(e,t,r){if(d("conditionalBatch conditions",t.length),d("conditionalBatch operations",r.length),W(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,r)}var lt={...H,...M,...q,...V,...I,...N,...Y,...U,...K,...L,...G};function ue(e){if(e===void 0)return;if(typeof e!=="number"||!Number.isInteger(e)||e<0)throw Error("deleteRange limit must be a finite non-negative integer");return e===0?0:e}function f(e){let t={},r=!1;for(let s of["gt","gte","lt","lte"]){let o=e[s];if(o===void 0)continue;if(typeof o!=="string")throw Error("deleteRange bounds must be strings");t[s]=o,r=!0}if(!r)throw Error("deleteRange requires at least one of gt/gte/lt/lte; use deletePrefix to delete a whole prefix");let i=ue(e.limit);if(i!==void 0)t.limit=i;return t}async function re(e,t,r){let i=f(r);if(e.deleteRange)return e.deleteRange(t,i);return w(e,t,i)}function de(e,t){let r={key:e,open:!1};if(t.gte!==void 0&&t.gte>r.key)r.key=t.gte,r.open=!1;if(t.gt!==void 0&&t.gt>=r.key)r.key=t.gt,r.open=!0;return r}function pe(e,t){let r={key:j(e),open:!0};if(t.lt!==void 0&&t.lt<=r.key)r.key=t.lt,r.open=!0;if(t.lte!==void 0&&t.lte<r.key)r.key=t.lte,r.open=!1;return r}function dt(e,t){let r=de(e,t),i=pe(e,t);if(r.key>i.key||r.key===i.key&&(r.open||i.open))return null;return{lower:r,upper:i}}function R(e){return e.replaceAll(/:+$/g,"")}function fe(e,t){let r=R(e),i=R(t);if(r.length===0)return i;if(i.length===0)return r;return`${r}:${i}`}class C{#t;#n;constructor(e,t){this.#t=e,this.#n=R(t)}#e(e){if(this.#n.length===0)return e;return e.length===0?`${this.#n}:`:`${this.#n}:${e}`}#r(e){return e.map((t)=>{if(t.type==="put")return{type:"put",key:this.#e(t.key),value:t.value};return{type:"delete",key:this.#e(t.key)}})}#o(e){if(this.#n.length===0)return e;return e.slice(this.#n.length+1)}#i(e){let t={};if(e.limit!==void 0)t.limit=e.limit;if(e.gt!==void 0)t.gt=this.#e(e.gt);if(e.gte!==void 0)t.gte=this.#e(e.gte);if(e.lt!==void 0)t.lt=this.#e(e.lt);if(e.lte!==void 0)t.lte=this.#e(e.lte);return t}#s(e={}){let t=this.#i(e);if(e.reverse!==void 0)t.reverse=e.reverse;return t}#g(e){return this.#i(e)}capabilities(){return this.#t.capabilities()}scoped(e){return new C(this.#t,fe(this.#n,e))}async get(e){return this.#t.get(this.#e(e))}async put(e,t){await this.#t.put(this.#e(e),t)}async delete(e){await this.#t.delete(this.#e(e))}async*scan(e,t){for await(let[r,i]of this.#t.scan(this.#e(e),this.#s(t)))yield[this.#o(r),i]}async batch(e){d("batch operations",e.length),await this.#t.batch(this.#r(e))}async conditionalBatch(e,t){return ne(this.#t,e.map((r)=>({key:this.#e(r.key),expectedValue:r.expectedValue})),this.#r(t))}async has(e){return Z(this.#t,this.#e(e))}async deletePrefix(e){return te(this.#t,this.#e(e))}async deleteRange(e,t){let r=this.#g(f(t));return re(this.#t,this.#e(e),r)}async*keys(e,t){for await(let r of J(this.#t,this.#e(e),this.#s(t)))yield this.#o(r)}async count(e){return ee(this.#t,this.#e(e))}[Symbol.dispose](){this.#t[Symbol.dispose]()}}function ie(e,t){return new C(e,t)}var ae=1,y="__weftStorageKeyspace",me=102400,ye=8192;function he(e){return typeof e==="object"&&e!==null&&"then"in e&&typeof e.then==="function"}function _(e){if(!u(e))return!1;if(e.__weftStorage!==ae)return!1;return typeof e.value==="string"}function be(e){if(!u(e))return!1;return Object.values(e).every(_)}function x(e){if(e!==y)return;throw Error(`WebExtensionStorage key "${y}" is reserved for adapter metadata.`)}function Se(e){for(let t of e)x(t.key)}function oe(e){return{__weftStorage:ae,value:T(e)}}function se(e){if(!_(e))return null;return D(e.value)}function Ee(e){return _(e)}function k(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}function $e(e){if(!u(e))return!1;if(e.runtime!==void 0&&!u(e.runtime))return!1;return e.storage===void 0||u(e.storage)}function we(e){if(e!==void 0){if(!$e(e))throw Error("WebExtensionStorage injected namespace must be an object.");return e}let t=globalThis,r=t.browser??t.chrome;if(r?.storage===void 0)throw Error("WebExtensionStorage requires globalThis.browser.storage or globalThis.chrome.storage.");return r}function xe(e,t){let r=e.storage?.[t];if(r===void 0)throw Error(`WebExtensionStorage area "${t}" is not available.`);return r}function ve(e){if(e==="session")return"ephemeral";if(e==="sync"||e==="managed")return"remote";return"local"}function Oe(e){let t=e.runtime?.lastError?.message;return t===void 0?null:Error(t)}async function P(e,t,r){return new Promise((i,s)=>{let o=!1,p=(g)=>{if(o)return;let A=Oe(e);if(o=!0,A!==null)s(A);else i(g)},B=(g)=>{if(o)return;o=!0,s(g)},le=(g)=>p(g),h;try{h=t(le)}catch{try{h=r()}catch(g){B(g);return}}if(he(h))h.then(p,B)})}class m{static#t=new WeakMap;#n;#e;#r;#o;#i;constructor(e={},t){this.#r=e.area??"local",this.#o=ve(this.#r),this.#n=we(t),this.#e=xe(this.#n,this.#r),this.#i=()=>{},this.#n.storage?.onChanged?.addListener?.(this.#i)}capabilities(){return{persistence:this.#o,readAfterWrite:"session",scanConsistency:"best-effort",atomicBatch:!1,conditionalBatch:!1,boundedRangeDelete:!1}}async#s(e){return P(this.#n,(t)=>this.#e.get(e,t),()=>this.#e.get(e))}async#g(e){await P(this.#n,(t)=>this.#e.set(e,t),()=>this.#e.set(e))}async#d(e){if(this.#e.getBytesInUse===void 0)return null;return P(this.#n,(t)=>this.#e.getBytesInUse?.(e,t),()=>this.#e.getBytesInUse?.(e))}async#a(){let t=(await this.#s(y))[y];if(t===void 0)return{};if(!be(t))throw Error("WebExtensionStorage keyspace is not a valid storage envelope map.");return{...t}}async#c(e){let t={[y]:e};await this.#m(t),await this.#g(t)}async#u(e){let t=m.#t.get(this.#e)??Promise.resolve(),r={},i=new Promise((o)=>{r.release=o}),s=t.catch(()=>{return}).then(()=>i);m.#t.set(this.#e,s),await t.catch(()=>{return});try{return await e()}finally{if(r.release?.(),m.#t.get(this.#e)===s)m.#t.delete(this.#e)}}#l(){if(this.#r==="managed")throw Error('WebExtensionStorage area "managed" is read-only.')}#p(e){let t=this.#e.QUOTA_BYTES_PER_ITEM??ye;for(let[r,i]of Object.entries(e)){let s=k({[r]:i});if(s>t)throw Error(`WebExtensionStorage sync item quota exceeded for "${r}": ${String(s)} > ${String(t)}.`)}}async#f(e){let t=Object.keys(e),r=await this.#d(null),i=await this.#d(t);if(r!==null&&i!==null)return r-i+k(e);let s=await this.#s(null);return k({...s,...e})}async#m(e){if(this.#r!=="sync")return;this.#p(e);let t=this.#e.QUOTA_BYTES??me,r=await this.#f(e);if(r>t)throw Error(`WebExtensionStorage sync total quota exceeded: ${String(r)} > ${String(t)}.`)}async get(e){x(e);let t=await this.#a();return se(t[e])}async put(e,t){this.#l(),x(e),await this.#u(async()=>{let r=await this.#a();r[e]=oe(t),await this.#c(r)})}async delete(e){this.#l(),x(e),await this.#u(async()=>{let t=await this.#a();if(!(e in t))return;delete t[e],await this.#c(t)})}async*scan(e,t={}){let r=await this.#a(),i=Object.keys(r).filter((o)=>o.startsWith(e)).filter((o)=>Q(o,t)).filter((o)=>Ee(r[o])).toSorted();if(t.reverse)i=i.toReversed();let s=0;for(let o of i){if(t.limit!==void 0&&s>=t.limit)break;let p=se(r[o]);if(p===null)continue;yield[o,p],s+=1}}async batch(e){if(d("batch operations",e.length),this.#l(),e.length===0)return;Se(e),await this.#u(async()=>{let t=await this.#a();for(let r of e)if(r.type==="put")t[r.key]=oe(r.value);else delete t[r.key];await this.#c(t)})}has(e){return b(this,e)}async*keys(e,t){yield*c(this,e,t)}count(e){return S(this,e)}async deletePrefix(e){return this.#l(),E(this,e)}async deleteRange(e,t){let r=f(t);return this.#l(),w(this,e,r)}scoped(e){return ie(this,e)}[Symbol.dispose](){this.#n.storage?.onChanged?.removeListener?.(this.#i)}}export{m as WebExtensionStorage};
|
|
@@ -103,6 +103,12 @@ export type CompletedTaskResultMessage = {
|
|
|
103
103
|
readonly value: RemoteWorkerJsonValue;
|
|
104
104
|
/** Required per-dispatch token echoed from the {@link TaskMessage}. */
|
|
105
105
|
readonly attemptToken: string;
|
|
106
|
+
/**
|
|
107
|
+
* Echo of {@link TaskMessage.workflowRevision} (WFT-20), when the dispatch
|
|
108
|
+
* carried one. Missing-or-mismatched echo authorization is transport-specific
|
|
109
|
+
* — see `remote-worker-protocol.md`'s revision-staleness section.
|
|
110
|
+
*/
|
|
111
|
+
readonly workflowRevision?: string;
|
|
106
112
|
};
|
|
107
113
|
/**
|
|
108
114
|
* Failed activity result message.
|
|
@@ -127,6 +133,8 @@ export type FailedTaskResultMessage = {
|
|
|
127
133
|
readonly error: string;
|
|
128
134
|
/** Required per-dispatch token echoed from the {@link TaskMessage}. */
|
|
129
135
|
readonly attemptToken: string;
|
|
136
|
+
/** Echo of {@link TaskMessage.workflowRevision} (WFT-20) — see {@link CompletedTaskResultMessage.workflowRevision}. */
|
|
137
|
+
readonly workflowRevision?: string;
|
|
130
138
|
};
|
|
131
139
|
/**
|
|
132
140
|
* Cancelled activity result message.
|
|
@@ -153,6 +161,8 @@ export type CancelledTaskResultMessage = {
|
|
|
153
161
|
readonly cancelled?: true;
|
|
154
162
|
/** Required per-dispatch token echoed from the {@link TaskMessage}. */
|
|
155
163
|
readonly attemptToken: string;
|
|
164
|
+
/** Echo of {@link TaskMessage.workflowRevision} (WFT-20) — see {@link CompletedTaskResultMessage.workflowRevision}. */
|
|
165
|
+
readonly workflowRevision?: string;
|
|
156
166
|
};
|
|
157
167
|
/**
|
|
158
168
|
* Registration acknowledgement sent after a worker is accepted.
|
|
@@ -262,6 +272,13 @@ export type TaskMessage = {
|
|
|
262
272
|
readonly headers?: Readonly<Record<string, string>>;
|
|
263
273
|
/** Durable token for the workflow run that launched this activity, when known. */
|
|
264
274
|
readonly workflowExecutionToken?: string;
|
|
275
|
+
/**
|
|
276
|
+
* The dispatching workflow run's persisted revision (WFT-20), when known.
|
|
277
|
+
* A worker echoes this back on the resulting `taskResult`; the server
|
|
278
|
+
* rejects a completion whose echoed revision disagrees with the run's
|
|
279
|
+
* persisted revision as stale.
|
|
280
|
+
*/
|
|
281
|
+
readonly workflowRevision?: string;
|
|
265
282
|
/** Unique, unguessable token identifying this dispatch attempt. */
|
|
266
283
|
readonly attemptToken: string;
|
|
267
284
|
};
|
|
@@ -84,6 +84,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
84
84
|
readonly type: "string";
|
|
85
85
|
readonly minLength: 1;
|
|
86
86
|
};
|
|
87
|
+
readonly workflowRevision: {
|
|
88
|
+
readonly type: "string";
|
|
89
|
+
readonly minLength: 1;
|
|
90
|
+
};
|
|
87
91
|
};
|
|
88
92
|
}, {
|
|
89
93
|
readonly type: "object";
|
|
@@ -107,6 +111,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
107
111
|
readonly type: "string";
|
|
108
112
|
readonly minLength: 1;
|
|
109
113
|
};
|
|
114
|
+
readonly workflowRevision: {
|
|
115
|
+
readonly type: "string";
|
|
116
|
+
readonly minLength: 1;
|
|
117
|
+
};
|
|
110
118
|
};
|
|
111
119
|
}, {
|
|
112
120
|
readonly type: "object";
|
|
@@ -133,6 +141,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
133
141
|
readonly type: "string";
|
|
134
142
|
readonly minLength: 1;
|
|
135
143
|
};
|
|
144
|
+
readonly workflowRevision: {
|
|
145
|
+
readonly type: "string";
|
|
146
|
+
readonly minLength: 1;
|
|
147
|
+
};
|
|
136
148
|
};
|
|
137
149
|
}];
|
|
138
150
|
};
|
|
@@ -162,6 +174,10 @@ export declare const REMOTE_WORKER_MESSAGE_SCHEMAS: {
|
|
|
162
174
|
readonly type: "string";
|
|
163
175
|
readonly minLength: 1;
|
|
164
176
|
};
|
|
177
|
+
readonly workflowRevision: {
|
|
178
|
+
readonly type: "string";
|
|
179
|
+
readonly minLength: 1;
|
|
180
|
+
};
|
|
165
181
|
readonly attemptToken: {
|
|
166
182
|
readonly type: "string";
|
|
167
183
|
readonly minLength: 1;
|
|
@@ -371,6 +387,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
|
371
387
|
readonly type: "string";
|
|
372
388
|
readonly minLength: 1;
|
|
373
389
|
};
|
|
390
|
+
readonly workflowRevision: {
|
|
391
|
+
readonly type: "string";
|
|
392
|
+
readonly minLength: 1;
|
|
393
|
+
};
|
|
374
394
|
};
|
|
375
395
|
}, {
|
|
376
396
|
readonly type: "object";
|
|
@@ -394,6 +414,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
|
394
414
|
readonly type: "string";
|
|
395
415
|
readonly minLength: 1;
|
|
396
416
|
};
|
|
417
|
+
readonly workflowRevision: {
|
|
418
|
+
readonly type: "string";
|
|
419
|
+
readonly minLength: 1;
|
|
420
|
+
};
|
|
397
421
|
};
|
|
398
422
|
}, {
|
|
399
423
|
readonly type: "object";
|
|
@@ -420,6 +444,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
|
420
444
|
readonly type: "string";
|
|
421
445
|
readonly minLength: 1;
|
|
422
446
|
};
|
|
447
|
+
readonly workflowRevision: {
|
|
448
|
+
readonly type: "string";
|
|
449
|
+
readonly minLength: 1;
|
|
450
|
+
};
|
|
423
451
|
};
|
|
424
452
|
}];
|
|
425
453
|
};
|
|
@@ -449,6 +477,10 @@ export declare const REMOTE_WORKER_PROTOCOL_JSON_SCHEMA: {
|
|
|
449
477
|
readonly type: "string";
|
|
450
478
|
readonly minLength: 1;
|
|
451
479
|
};
|
|
480
|
+
readonly workflowRevision: {
|
|
481
|
+
readonly type: "string";
|
|
482
|
+
readonly minLength: 1;
|
|
483
|
+
};
|
|
452
484
|
readonly attemptToken: {
|
|
453
485
|
readonly type: "string";
|
|
454
486
|
readonly minLength: 1;
|
|
@@ -44,7 +44,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
44
44
|
operationId: { type: "string", minLength: 1 },
|
|
45
45
|
status: { const: "completed" },
|
|
46
46
|
value: jsonValueSchema,
|
|
47
|
-
attemptToken: { type: "string", minLength: 1 }
|
|
47
|
+
attemptToken: { type: "string", minLength: 1 },
|
|
48
|
+
workflowRevision: { type: "string", minLength: 1 }
|
|
48
49
|
}
|
|
49
50
|
},
|
|
50
51
|
{
|
|
@@ -56,7 +57,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
56
57
|
operationId: { type: "string", minLength: 1 },
|
|
57
58
|
status: { const: "failed" },
|
|
58
59
|
error: { type: "string" },
|
|
59
|
-
attemptToken: { type: "string", minLength: 1 }
|
|
60
|
+
attemptToken: { type: "string", minLength: 1 },
|
|
61
|
+
workflowRevision: { type: "string", minLength: 1 }
|
|
60
62
|
}
|
|
61
63
|
},
|
|
62
64
|
{
|
|
@@ -69,7 +71,8 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
69
71
|
status: { const: "cancelled" },
|
|
70
72
|
error: { type: "string" },
|
|
71
73
|
cancelled: { const: !0 },
|
|
72
|
-
attemptToken: { type: "string", minLength: 1 }
|
|
74
|
+
attemptToken: { type: "string", minLength: 1 },
|
|
75
|
+
workflowRevision: { type: "string", minLength: 1 }
|
|
73
76
|
}
|
|
74
77
|
}
|
|
75
78
|
]
|
|
@@ -86,6 +89,7 @@ export const REMOTE_WORKER_MESSAGE_SCHEMAS = {
|
|
|
86
89
|
attempt: { type: "number", minimum: 1 },
|
|
87
90
|
headers: stringMapSchema,
|
|
88
91
|
workflowExecutionToken: { type: "string", minLength: 1 },
|
|
92
|
+
workflowRevision: { type: "string", minLength: 1 },
|
|
89
93
|
attemptToken: { type: "string", minLength: 1 }
|
|
90
94
|
}
|
|
91
95
|
},
|
|
@@ -9,6 +9,14 @@ function parseEchoedAttemptToken(record) {
|
|
|
9
9
|
return protocolFailure("invalid_message", "taskResult.attemptToken must be a non-empty string");
|
|
10
10
|
return { ok: !0, message: { attemptToken } };
|
|
11
11
|
}
|
|
12
|
+
function parseEchoedWorkflowRevision(record) {
|
|
13
|
+
const workflowRevision = record.workflowRevision;
|
|
14
|
+
if (workflowRevision === void 0)
|
|
15
|
+
return { ok: !0, message: {} };
|
|
16
|
+
if (!isNonEmptyString(workflowRevision))
|
|
17
|
+
return protocolFailure("invalid_message", "taskResult.workflowRevision must be a non-empty string when present");
|
|
18
|
+
return { ok: !0, message: { workflowRevision } };
|
|
19
|
+
}
|
|
12
20
|
function parseCompletedTaskResult(operationId, record) {
|
|
13
21
|
const value = record.value;
|
|
14
22
|
if (!isRemoteWorkerJsonValue(value))
|
|
@@ -16,9 +24,19 @@ function parseCompletedTaskResult(operationId, record) {
|
|
|
16
24
|
const token = parseEchoedAttemptToken(record);
|
|
17
25
|
if (!token.ok)
|
|
18
26
|
return token;
|
|
27
|
+
const revision = parseEchoedWorkflowRevision(record);
|
|
28
|
+
if (!revision.ok)
|
|
29
|
+
return revision;
|
|
19
30
|
return {
|
|
20
31
|
ok: !0,
|
|
21
|
-
message: {
|
|
32
|
+
message: {
|
|
33
|
+
type: "taskResult",
|
|
34
|
+
operationId,
|
|
35
|
+
status: "completed",
|
|
36
|
+
value,
|
|
37
|
+
...token.message,
|
|
38
|
+
...revision.message
|
|
39
|
+
}
|
|
22
40
|
};
|
|
23
41
|
}
|
|
24
42
|
function parseFailedTaskResult(operationId, record) {
|
|
@@ -28,9 +46,19 @@ function parseFailedTaskResult(operationId, record) {
|
|
|
28
46
|
const token = parseEchoedAttemptToken(record);
|
|
29
47
|
if (!token.ok)
|
|
30
48
|
return token;
|
|
49
|
+
const revision = parseEchoedWorkflowRevision(record);
|
|
50
|
+
if (!revision.ok)
|
|
51
|
+
return revision;
|
|
31
52
|
return {
|
|
32
53
|
ok: !0,
|
|
33
|
-
message: {
|
|
54
|
+
message: {
|
|
55
|
+
type: "taskResult",
|
|
56
|
+
operationId,
|
|
57
|
+
status: "failed",
|
|
58
|
+
error,
|
|
59
|
+
...token.message,
|
|
60
|
+
...revision.message
|
|
61
|
+
}
|
|
34
62
|
};
|
|
35
63
|
}
|
|
36
64
|
function parseCancelledTaskResult(operationId, record) {
|
|
@@ -43,6 +71,9 @@ function parseCancelledTaskResult(operationId, record) {
|
|
|
43
71
|
const token = parseEchoedAttemptToken(record);
|
|
44
72
|
if (!token.ok)
|
|
45
73
|
return token;
|
|
74
|
+
const revision = parseEchoedWorkflowRevision(record);
|
|
75
|
+
if (!revision.ok)
|
|
76
|
+
return revision;
|
|
46
77
|
return {
|
|
47
78
|
ok: !0,
|
|
48
79
|
message: {
|
|
@@ -51,7 +82,8 @@ function parseCancelledTaskResult(operationId, record) {
|
|
|
51
82
|
status: "cancelled",
|
|
52
83
|
error,
|
|
53
84
|
...cancelled === !0 ? { cancelled } : {},
|
|
54
|
-
...token.message
|
|
85
|
+
...token.message,
|
|
86
|
+
...revision.message
|
|
55
87
|
}
|
|
56
88
|
};
|
|
57
89
|
}
|
package/dist/worker/protocol.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var X=import.meta.require;function l(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function p(e){if(e===null||typeof e==="string"||typeof e==="boolean"||typeof e==="number"&&Number.isFinite(e))return!0;if(Array.isArray(e))return e.every(p);if(!l(e))return!1;return Object.values(e).every(p)}function a(e){return typeof e==="string"&&e.length>0}function _(e){return Array.isArray(e)&&e.every(a)}function E(e){if(!l(e))return!1;return Object.values(e).every((t)=>typeof t==="string")}function u(e){return typeof e==="number"&&Number.isFinite(e)}function r(e,t,s){return{ok:!1,error:{code:e,message:t,...s!==void 0?{requestedProtocolVersion:s}:{}}}}function d(e,t,s){let o={};for(let[n,g,c,f]of s){let m=t[n];if(m===void 0){if(g)return{ok:!1,error:r(e,f)};continue}if(!c(m))return{ok:!1,error:r(e,f)};o[n]=m}return{ok:!0,values:o}}var i=3,M=3,O=3,T=[3];var R={$ref:"#/$defs/jsonValue"},S={type:"object",additionalProperties:R},w={type:"object",additionalProperties:{type:"string"}},P={const:i},k={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","manifest"],properties:{type:{const:"register"},protocolVersion:P,workerId:{type:"string",minLength:1},manifest:{type:"object"},concurrency:{type:"number",minimum:1,maximum:1000},startedAt:{type:"number"}}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:R,attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input","attemptToken"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:R,attempt:{type:"number",minimum:1},headers:w,workflowExecutionToken:{type:"string",minLength:1},attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","concurrency","acceptedManifestDigest","serverCapabilities"],properties:{type:{const:"registerAck"},protocolVersion:P,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},concurrency:{type:"number",minimum:1,maximum:1000},acceptedManifestDigest:{type:"string",minLength:1},serverCapabilities:{type:"array",items:{type:"string",minLength:1}}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version","deployment_conflict","registration_rejected"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:{type:"number"}},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},W={$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://weft.dev/schemas/remote-worker-protocol.v${String(i)}.json`,title:`Weft RemoteWorker Protocol v${String(i)}`,oneOf:Object.keys(k).map((e)=>({$ref:`#/$defs/messages/${e}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:S,messages:k}};function y(e){let t=e.attemptToken;if(!a(t))return r("invalid_message","taskResult.attemptToken must be a non-empty string");return{ok:!0,message:{attemptToken:t}}}function h(e,t){let s=t.value;if(!p(s))return r("invalid_message","completed taskResult.value must be valid JSON");let o=y(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"completed",value:s,...o.message}}}function v(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","failed taskResult.error must be a string");let o=y(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"failed",error:s,...o.message}}}function V(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","cancelled taskResult.error must be a string");let o=t.cancelled;if(o!==void 0&&o!==!0)return r("invalid_message","taskResult.cancelled must be true when present");let n=y(t);if(!n.ok)return n;return{ok:!0,message:{type:"taskResult",operationId:e,status:"cancelled",error:s,...o===!0?{cancelled:o}:{},...n.message}}}var I={completed:h,failed:v,cancelled:V};function C(e){return e==="completed"||e==="failed"||e==="cancelled"}function b(e){let t=e.operationId;if(!a(t))return r("invalid_message","taskResult.operationId must be a non-empty string");let s=e.status;if(!C(s))return r("invalid_message","taskResult.status must be completed, failed, or cancelled");return I[s](t,e)}var j=new Set(["register","heartbeat","taskResult"]),A=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function L(e){if(e===i)return{ok:!0,message:e};let t=u(e)?e:void 0;return r("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(e)}`,t)}var N=[["workerId",!0,a,"register.workerId must be a non-empty string"],["manifest",!0,l,"register.manifest must be a JSON object"],["concurrency",!1,u,"register.concurrency must be a finite number"],["startedAt",!1,u,"register.startedAt must be a finite number when present"]];function x(e){let t=L(e.protocolVersion);if(!t.ok)return t;let s=d("invalid_registration",e,N);if(!s.ok)return s.error;return{ok:!0,message:{type:"register",protocolVersion:t.message,...s.values}}}function F(e){let t=e.workerId;if(!a(t))return r("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:t}}}var q=[["operationId",!0,a,"task.operationId must be a non-empty string"],["activityName",!0,a,"task.activityName must be a non-empty string"],["input",!0,p,"task.input must be valid JSON"],["attempt",!1,u,"task.attempt must be a finite number"],["headers",!1,E,"task.headers must be a string map"],["workflowExecutionToken",!1,a,"task.workflowExecutionToken must be a non-empty string"],["attemptToken",!0,a,"task.attemptToken must be a non-empty string"]];function J(e){let t=d("invalid_message",e,q);if(!t.ok)return t.error;return{ok:!0,message:{type:"task",...t.values}}}function K(e){let t=e.operationId;if(!a(t))return r("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:t}}}function D(){return{ok:!0,message:{type:"shutdown"}}}function H(e){let t=e.protocolVersion;if(t!==i)return r("invalid_message",`registerAck.protocolVersion must be ${String(i)}`);let{workerId:s,queue:o,concurrency:n,acceptedManifestDigest:g,serverCapabilities:c}=e;if(!a(s))return r("invalid_message","registerAck.workerId must be a non-empty string");if(!a(o))return r("invalid_message","registerAck.queue must be a non-empty string");if(typeof n!=="number"||!Number.isFinite(n))return r("invalid_message","registerAck.concurrency must be a finite number");if(!a(g))return r("invalid_message","registerAck.acceptedManifestDigest must be a non-empty string");if(!_(c))return r("invalid_message","registerAck.serverCapabilities must be an array of non-empty strings");return{ok:!0,message:{type:"registerAck",protocolVersion:t,workerId:s,queue:o,concurrency:n,acceptedManifestDigest:g,serverCapabilities:c}}}function U(e){return e==="invalid_registration"||e==="unsupported_protocol_version"||e==="deployment_conflict"||e==="registration_rejected"}function G(e){let{code:t,message:s,supportedProtocolVersions:o,requestedProtocolVersion:n}=e;if(!U(t))return r("invalid_message","registerError.code is not recognized");if(typeof s!=="string")return r("invalid_message","registerError.message must be a string");if(!Array.isArray(o)||!o.every((c)=>u(c)))return r("invalid_message","registerError.supportedProtocolVersions is invalid");if(n!==void 0&&!u(n))return r("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:t,message:s,supportedProtocolVersions:o,...n!==void 0?{requestedProtocolVersion:n}:{}}}}function z(e){let{code:t,message:s}=e;if(t!=="invalid_json"&&t!=="invalid_message"&&t!=="unknown_message_type"&&t!=="registration_required")return r("invalid_message","protocolError.code is not recognized");if(typeof s!=="string")return r("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:t,message:s}}}function ie(e){if(!l(e))return r("invalid_message","Worker protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Worker protocol message.type must be a string");if(!j.has(t))return r("unknown_message_type",`Unknown worker message type: ${t}`);switch(t){case"register":return x(e);case"heartbeat":return F(e);case"taskResult":return b(e);default:return r("unknown_message_type",`Unknown worker message type: ${t}`)}}function ue(e){if(!l(e))return r("invalid_message","Server protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Server protocol message.type must be a string");if(!A.has(t))return r("unknown_message_type",`Unknown server message type: ${t}`);switch(t){case"registerAck":return H(e);case"registerError":return G(e);case"protocolError":return z(e);case"task":return J(e);case"cancel":return K(e);case"shutdown":return D();default:return r("unknown_message_type",`Unknown server message type: ${t}`)}}export{O as REMOTE_WORKER_MAX_PROTOCOL_VERSION,k as REMOTE_WORKER_MESSAGE_SCHEMAS,M as REMOTE_WORKER_MIN_PROTOCOL_VERSION,W as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,i as REMOTE_WORKER_PROTOCOL_VERSION,T as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,p as isRemoteWorkerJsonValue,ue as parseServerToWorkerMessage,ie as parseWorkerToServerMessage};
|
|
2
|
+
var Y=import.meta.require;function g(e){return e!==null&&typeof e==="object"&&!Array.isArray(e)}function p(e){if(e===null||typeof e==="string"||typeof e==="boolean"||typeof e==="number"&&Number.isFinite(e))return!0;if(Array.isArray(e))return e.every(p);if(!g(e))return!1;return Object.values(e).every(p)}function i(e){return typeof e==="string"&&e.length>0}function E(e){return Array.isArray(e)&&e.every(i)}function P(e){if(!g(e))return!1;return Object.values(e).every((t)=>typeof t==="string")}function c(e){return typeof e==="number"&&Number.isFinite(e)}function r(e,t,s){return{ok:!1,error:{code:e,message:t,...s!==void 0?{requestedProtocolVersion:s}:{}}}}function d(e,t,s){let n={};for(let[o,a,l,_]of s){let m=t[o];if(m===void 0){if(a)return{ok:!1,error:r(e,_)};continue}if(!l(m))return{ok:!1,error:r(e,_)};n[o]=m}return{ok:!0,values:n}}var u=3,O=3,w=3,T=[3];var k={$ref:"#/$defs/jsonValue"},S={type:"object",additionalProperties:k},v={type:"object",additionalProperties:{type:"string"}},b={const:u},R={register:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","manifest"],properties:{type:{const:"register"},protocolVersion:b,workerId:{type:"string",minLength:1},manifest:{type:"object"},concurrency:{type:"number",minimum:1,maximum:1000},startedAt:{type:"number"}}},heartbeat:{type:"object",additionalProperties:!1,required:["type","workerId"],properties:{type:{const:"heartbeat"},workerId:{type:"string",minLength:1}}},taskResult:{oneOf:[{type:"object",additionalProperties:!1,required:["type","operationId","status","value","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"completed"},value:k,attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"failed"},error:{type:"string"},attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}},{type:"object",additionalProperties:!1,required:["type","operationId","status","error","attemptToken"],properties:{type:{const:"taskResult"},operationId:{type:"string",minLength:1},status:{const:"cancelled"},error:{type:"string"},cancelled:{const:!0},attemptToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1}}}]},task:{type:"object",additionalProperties:!1,required:["type","operationId","activityName","input","attemptToken"],properties:{type:{const:"task"},operationId:{type:"string",minLength:1},activityName:{type:"string",minLength:1},input:k,attempt:{type:"number",minimum:1},headers:v,workflowExecutionToken:{type:"string",minLength:1},workflowRevision:{type:"string",minLength:1},attemptToken:{type:"string",minLength:1}}},cancel:{type:"object",additionalProperties:!1,required:["type","operationId"],properties:{type:{const:"cancel"},operationId:{type:"string",minLength:1}}},shutdown:{type:"object",additionalProperties:!1,required:["type"],properties:{type:{const:"shutdown"}}},registerAck:{type:"object",additionalProperties:!1,required:["type","protocolVersion","workerId","queue","concurrency","acceptedManifestDigest","serverCapabilities"],properties:{type:{const:"registerAck"},protocolVersion:b,workerId:{type:"string",minLength:1},queue:{type:"string",minLength:1},concurrency:{type:"number",minimum:1,maximum:1000},acceptedManifestDigest:{type:"string",minLength:1},serverCapabilities:{type:"array",items:{type:"string",minLength:1}}}},registerError:{type:"object",additionalProperties:!1,required:["type","code","message","supportedProtocolVersions"],properties:{type:{const:"registerError"},code:{enum:["invalid_registration","unsupported_protocol_version","deployment_conflict","registration_rejected"]},message:{type:"string"},supportedProtocolVersions:{type:"array",items:{type:"number"}},requestedProtocolVersion:{type:"number"}}},protocolError:{type:"object",additionalProperties:!1,required:["type","code","message"],properties:{type:{const:"protocolError"},code:{enum:["invalid_json","invalid_message","unknown_message_type","registration_required"]},message:{type:"string"}}}},W={$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://weft.dev/schemas/remote-worker-protocol.v${String(u)}.json`,title:`Weft RemoteWorker Protocol v${String(u)}`,oneOf:Object.keys(R).map((e)=>({$ref:`#/$defs/messages/${e}`})),$defs:{jsonValue:{oneOf:[{type:"null"},{type:"boolean"},{type:"number"},{type:"string"},{type:"array",items:{$ref:"#/$defs/jsonValue"}},{type:"object",additionalProperties:{$ref:"#/$defs/jsonValue"}}]},jsonObject:S,messages:R}};function y(e){let t=e.attemptToken;if(!i(t))return r("invalid_message","taskResult.attemptToken must be a non-empty string");return{ok:!0,message:{attemptToken:t}}}function f(e){let t=e.workflowRevision;if(t===void 0)return{ok:!0,message:{}};if(!i(t))return r("invalid_message","taskResult.workflowRevision must be a non-empty string when present");return{ok:!0,message:{workflowRevision:t}}}function h(e,t){let s=t.value;if(!p(s))return r("invalid_message","completed taskResult.value must be valid JSON");let n=y(t);if(!n.ok)return n;let o=f(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"completed",value:s,...n.message,...o.message}}}function V(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","failed taskResult.error must be a string");let n=y(t);if(!n.ok)return n;let o=f(t);if(!o.ok)return o;return{ok:!0,message:{type:"taskResult",operationId:e,status:"failed",error:s,...n.message,...o.message}}}function I(e,t){let s=t.error;if(typeof s!=="string")return r("invalid_message","cancelled taskResult.error must be a string");let n=t.cancelled;if(n!==void 0&&n!==!0)return r("invalid_message","taskResult.cancelled must be true when present");let o=y(t);if(!o.ok)return o;let a=f(t);if(!a.ok)return a;return{ok:!0,message:{type:"taskResult",operationId:e,status:"cancelled",error:s,...n===!0?{cancelled:n}:{},...o.message,...a.message}}}var C={completed:h,failed:V,cancelled:I};function j(e){return e==="completed"||e==="failed"||e==="cancelled"}function M(e){let t=e.operationId;if(!i(t))return r("invalid_message","taskResult.operationId must be a non-empty string");let s=e.status;if(!j(s))return r("invalid_message","taskResult.status must be completed, failed, or cancelled");return C[s](t,e)}var A=new Set(["register","heartbeat","taskResult"]),L=new Set(["registerAck","registerError","protocolError","task","cancel","shutdown"]);function N(e){if(e===u)return{ok:!0,message:e};let t=c(e)?e:void 0;return r("unsupported_protocol_version",`Unsupported RemoteWorker protocol version: ${String(e)}`,t)}var x=[["workerId",!0,i,"register.workerId must be a non-empty string"],["manifest",!0,g,"register.manifest must be a JSON object"],["concurrency",!1,c,"register.concurrency must be a finite number"],["startedAt",!1,c,"register.startedAt must be a finite number when present"]];function F(e){let t=N(e.protocolVersion);if(!t.ok)return t;let s=d("invalid_registration",e,x);if(!s.ok)return s.error;return{ok:!0,message:{type:"register",protocolVersion:t.message,...s.values}}}function q(e){let t=e.workerId;if(!i(t))return r("invalid_message","heartbeat.workerId must be a non-empty string");return{ok:!0,message:{type:"heartbeat",workerId:t}}}var J=[["operationId",!0,i,"task.operationId must be a non-empty string"],["activityName",!0,i,"task.activityName must be a non-empty string"],["input",!0,p,"task.input must be valid JSON"],["attempt",!1,c,"task.attempt must be a finite number"],["headers",!1,P,"task.headers must be a string map"],["workflowExecutionToken",!1,i,"task.workflowExecutionToken must be a non-empty string"],["workflowRevision",!1,i,"task.workflowRevision must be a non-empty string"],["attemptToken",!0,i,"task.attemptToken must be a non-empty string"]];function K(e){let t=d("invalid_message",e,J);if(!t.ok)return t.error;return{ok:!0,message:{type:"task",...t.values}}}function D(e){let t=e.operationId;if(!i(t))return r("invalid_message","cancel.operationId must be a non-empty string");return{ok:!0,message:{type:"cancel",operationId:t}}}function H(){return{ok:!0,message:{type:"shutdown"}}}function U(e){let t=e.protocolVersion;if(t!==u)return r("invalid_message",`registerAck.protocolVersion must be ${String(u)}`);let{workerId:s,queue:n,concurrency:o,acceptedManifestDigest:a,serverCapabilities:l}=e;if(!i(s))return r("invalid_message","registerAck.workerId must be a non-empty string");if(!i(n))return r("invalid_message","registerAck.queue must be a non-empty string");if(typeof o!=="number"||!Number.isFinite(o))return r("invalid_message","registerAck.concurrency must be a finite number");if(!i(a))return r("invalid_message","registerAck.acceptedManifestDigest must be a non-empty string");if(!E(l))return r("invalid_message","registerAck.serverCapabilities must be an array of non-empty strings");return{ok:!0,message:{type:"registerAck",protocolVersion:t,workerId:s,queue:n,concurrency:o,acceptedManifestDigest:a,serverCapabilities:l}}}function G(e){return e==="invalid_registration"||e==="unsupported_protocol_version"||e==="deployment_conflict"||e==="registration_rejected"}function z(e){let{code:t,message:s,supportedProtocolVersions:n,requestedProtocolVersion:o}=e;if(!G(t))return r("invalid_message","registerError.code is not recognized");if(typeof s!=="string")return r("invalid_message","registerError.message must be a string");if(!Array.isArray(n)||!n.every((l)=>c(l)))return r("invalid_message","registerError.supportedProtocolVersions is invalid");if(o!==void 0&&!c(o))return r("invalid_message","registerError.requestedProtocolVersion must be a finite number");return{ok:!0,message:{type:"registerError",code:t,message:s,supportedProtocolVersions:n,...o!==void 0?{requestedProtocolVersion:o}:{}}}}function X(e){let{code:t,message:s}=e;if(t!=="invalid_json"&&t!=="invalid_message"&&t!=="unknown_message_type"&&t!=="registration_required")return r("invalid_message","protocolError.code is not recognized");if(typeof s!=="string")return r("invalid_message","protocolError.message must be a string");return{ok:!0,message:{type:"protocolError",code:t,message:s}}}function ue(e){if(!g(e))return r("invalid_message","Worker protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Worker protocol message.type must be a string");if(!A.has(t))return r("unknown_message_type",`Unknown worker message type: ${t}`);switch(t){case"register":return F(e);case"heartbeat":return q(e);case"taskResult":return M(e);default:return r("unknown_message_type",`Unknown worker message type: ${t}`)}}function ce(e){if(!g(e))return r("invalid_message","Server protocol message must be a JSON object");let t=e.type;if(typeof t!=="string")return r("invalid_message","Server protocol message.type must be a string");if(!L.has(t))return r("unknown_message_type",`Unknown server message type: ${t}`);switch(t){case"registerAck":return U(e);case"registerError":return z(e);case"protocolError":return X(e);case"task":return K(e);case"cancel":return D(e);case"shutdown":return H();default:return r("unknown_message_type",`Unknown server message type: ${t}`)}}export{w as REMOTE_WORKER_MAX_PROTOCOL_VERSION,R as REMOTE_WORKER_MESSAGE_SCHEMAS,O as REMOTE_WORKER_MIN_PROTOCOL_VERSION,W as REMOTE_WORKER_PROTOCOL_JSON_SCHEMA,u as REMOTE_WORKER_PROTOCOL_VERSION,T as REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS,p as isRemoteWorkerJsonValue,ce as parseServerToWorkerMessage,ue as parseWorkerToServerMessage};
|
|
@@ -125,6 +125,8 @@ export interface InFlightTask {
|
|
|
125
125
|
fairShareKey?: string;
|
|
126
126
|
/** Unique, unguessable token for this dispatch attempt. */
|
|
127
127
|
attemptToken: string;
|
|
128
|
+
/** The dispatching workflow run's persisted revision (WFT-20), when the `TaskDispatch` carried one. */
|
|
129
|
+
workflowRevision?: string;
|
|
128
130
|
}
|
|
129
131
|
export interface WorkerRegistryOptions {
|
|
130
132
|
/** Routing policy used by {@link WorkerRegistry.findWorker}. Default: `'least-loaded'`. */
|
|
@@ -76,7 +76,7 @@ export declare class WorkerRegistry {
|
|
|
76
76
|
*/
|
|
77
77
|
findWorker(activityName: string, options?: RoutingOptions): WorkerInfo | undefined;
|
|
78
78
|
/** Track a task assignment with a visibility timeout deadline. */
|
|
79
|
-
assignTask(workerId: string, operationId: string, visibilityTimeout: number, fairShareKey: string | undefined, attemptToken: string): void;
|
|
79
|
+
assignTask(workerId: string, operationId: string, visibilityTimeout: number, fairShareKey: string | undefined, attemptToken: string, workflowRevision?: string): void;
|
|
80
80
|
/**
|
|
81
81
|
* Undo exactly `assignTask`'s effects — capacity increment, fair-share
|
|
82
82
|
* count, and the in-flight entry — when the durable claim that was
|
package/dist/worker/registry.js
CHANGED
|
@@ -132,7 +132,7 @@ export class WorkerRegistry {
|
|
|
132
132
|
return pickFairShare(eligible, this.#fairShareCounts, fairShareKey);
|
|
133
133
|
return pickLeastLoaded(eligible);
|
|
134
134
|
}
|
|
135
|
-
assignTask(workerId, operationId, visibilityTimeout, fairShareKey, attemptToken) {
|
|
135
|
+
assignTask(workerId, operationId, visibilityTimeout, fairShareKey, attemptToken, workflowRevision) {
|
|
136
136
|
const deadline = Date.now() + visibilityTimeout, task = {
|
|
137
137
|
operationId,
|
|
138
138
|
workerId,
|
|
@@ -144,6 +144,8 @@ export class WorkerRegistry {
|
|
|
144
144
|
task.fairShareKey = fairShareKey;
|
|
145
145
|
this.#fairShareCounts.increment(workerId, fairShareKey);
|
|
146
146
|
}
|
|
147
|
+
if (workflowRevision !== void 0)
|
|
148
|
+
task.workflowRevision = workflowRevision;
|
|
147
149
|
this.#inFlightTasks.set(operationId, task);
|
|
148
150
|
this.taskAssigned(workerId);
|
|
149
151
|
}
|
|
@@ -42,6 +42,14 @@ export interface WorkflowRunnerContext {
|
|
|
42
42
|
generators: Map<string, AsyncGenerator>;
|
|
43
43
|
abortControllers: Map<string, AbortController>;
|
|
44
44
|
replayStates: Map<string, WorkerReplayState>;
|
|
45
|
+
/**
|
|
46
|
+
* The revision (WFT-20) captured from the `run` message that started this
|
|
47
|
+
* workflow, keyed by workflow id — a `resume` inbound message never
|
|
48
|
+
* re-sends it, so `workflow-worker-entry.ts`'s `attachWorkerProtocol` reads
|
|
49
|
+
* it from here to stamp every outbound message for the workflow's
|
|
50
|
+
* remaining turns.
|
|
51
|
+
*/
|
|
52
|
+
workflowRevisions: Map<string, string>;
|
|
45
53
|
}
|
|
46
54
|
export declare function createWorkflowRunnerContext(): WorkflowRunnerContext;
|
|
47
55
|
export declare function handleRunMessage(context: WorkflowRunnerContext, message: {
|
|
@@ -53,6 +61,7 @@ export declare function handleRunMessage(context: WorkflowRunnerContext, message
|
|
|
53
61
|
executionStateOwnerId?: string;
|
|
54
62
|
deadline?: number;
|
|
55
63
|
headers?: [string, string][];
|
|
64
|
+
workflowRevision?: string;
|
|
56
65
|
}, getWorkflowHandler: (type: string) => ((ctx: WorkerWorkflowContext, input: unknown) => AsyncGenerator) | undefined, postLog?: WorkerLogPoster): Promise<WorkerOutboundMessage>;
|
|
57
66
|
export declare function handleResumeMessage(context: WorkflowRunnerContext, message: {
|
|
58
67
|
workflowId: string;
|
|
@@ -77,10 +77,15 @@ export function createWorkflowRunnerContext() {
|
|
|
77
77
|
return {
|
|
78
78
|
generators: new Map,
|
|
79
79
|
abortControllers: new Map,
|
|
80
|
-
replayStates: new Map
|
|
80
|
+
replayStates: new Map,
|
|
81
|
+
workflowRevisions: new Map
|
|
81
82
|
};
|
|
82
83
|
}
|
|
83
84
|
export async function handleRunMessage(context, message, getWorkflowHandler, postLog) {
|
|
85
|
+
if (message.workflowRevision !== void 0)
|
|
86
|
+
context.workflowRevisions.set(message.workflowId, message.workflowRevision);
|
|
87
|
+
else
|
|
88
|
+
context.workflowRevisions.delete(message.workflowId);
|
|
84
89
|
const handler = getWorkflowHandler(message.workflowType);
|
|
85
90
|
if (!handler)
|
|
86
91
|
return {
|
|
@@ -152,8 +157,10 @@ export async function handleCancelMessage(context, message) {
|
|
|
152
157
|
try {
|
|
153
158
|
await capturedGenerator.return(void 0);
|
|
154
159
|
} catch {}
|
|
155
|
-
if (context.generators.get(message.workflowId) === capturedGenerator)
|
|
160
|
+
if (context.generators.get(message.workflowId) === capturedGenerator) {
|
|
156
161
|
context.generators.delete(message.workflowId);
|
|
162
|
+
context.workflowRevisions.delete(message.workflowId);
|
|
163
|
+
}
|
|
157
164
|
if (context.abortControllers.get(message.workflowId) === capturedController)
|
|
158
165
|
context.abortControllers.delete(message.workflowId);
|
|
159
166
|
if (context.replayStates.get(message.workflowId) === capturedReplayState)
|
|
@@ -49,7 +49,9 @@ export function initializeWorkerMessageLoop(workflows) {
|
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
function postOutboundMessage(runnerContext, message, inboundMessage) {
|
|
52
|
-
const outboundMessage = attachWorkerProtocol(message, inboundMessage);
|
|
52
|
+
const activeTurnRevision = runnerContext.workflowRevisions.get(inboundMessage.workflowId), outboundMessage = attachWorkerProtocol(runnerContext, message, inboundMessage);
|
|
53
|
+
if (outboundMessage.type === "completed" || outboundMessage.type === "failed")
|
|
54
|
+
runnerContext.workflowRevisions.delete(inboundMessage.workflowId);
|
|
53
55
|
try {
|
|
54
56
|
assertWorkerProtocolMessageWithinLimit(outboundMessage, inboundMessage.maxProtocolMessageBytes);
|
|
55
57
|
if (outboundMessage.type === "checkpoint")
|
|
@@ -62,7 +64,8 @@ function postOutboundMessage(runnerContext, message, inboundMessage) {
|
|
|
62
64
|
workflowId: inboundMessage.workflowId,
|
|
63
65
|
error: error instanceof Error ? error.message : String(error),
|
|
64
66
|
failureCategory: "resource",
|
|
65
|
-
...inboundMessage.turnId === void 0 ? {} : { turnId: inboundMessage.turnId }
|
|
67
|
+
...inboundMessage.turnId === void 0 ? {} : { turnId: inboundMessage.turnId },
|
|
68
|
+
...activeTurnRevision === void 0 ? {} : { workflowRevision: activeTurnRevision }
|
|
66
69
|
});
|
|
67
70
|
try {
|
|
68
71
|
workerPostMessage(failedMessage);
|
|
@@ -71,10 +74,12 @@ function postOutboundMessage(runnerContext, message, inboundMessage) {
|
|
|
71
74
|
}
|
|
72
75
|
}
|
|
73
76
|
}
|
|
74
|
-
function attachWorkerProtocol(message, inboundMessage) {
|
|
77
|
+
function attachWorkerProtocol(runnerContext, message, inboundMessage) {
|
|
78
|
+
const workflowRevision = runnerContext.workflowRevisions.get(inboundMessage.workflowId);
|
|
75
79
|
return {
|
|
76
80
|
...message,
|
|
77
81
|
protocolVersion: WORKER_PROTOCOL_VERSION,
|
|
78
|
-
...inboundMessage.turnId === void 0 ? {} : { turnId: inboundMessage.turnId }
|
|
82
|
+
...inboundMessage.turnId === void 0 ? {} : { turnId: inboundMessage.turnId },
|
|
83
|
+
...workflowRevision === void 0 ? {} : { workflowRevision }
|
|
79
84
|
};
|
|
80
85
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lostgradient/weft",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.2",
|
|
4
4
|
"description": "A Bun-native durable execution engine with pluggable key-value storage.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bun",
|
|
@@ -221,7 +221,7 @@
|
|
|
221
221
|
"dev": "bun --watch run src/index.ts",
|
|
222
222
|
"format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"",
|
|
223
223
|
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\"",
|
|
224
|
-
"lint": "oxlint --type-aware --tsconfig ./tsconfig.json --report-unused-disable-directives-severity=error && bun run scripts/check-lint-disables.ts && bun run scripts/check-implementation-file-sizes.ts && bun run scripts/check-import-cycles.ts && bun run scripts/check-internal-imports.ts && bun run scripts/check-engine-internals-field-access.ts && bun run scripts/check-definition-vocabulary.ts && bun run scripts/check-catalog-completeness.ts && bun run scripts/check-catalog-drift.ts && bun run scripts/check-type-ergonomics.ts",
|
|
224
|
+
"lint": "oxlint --type-aware --tsconfig ./tsconfig.json --report-unused-disable-directives-severity=error && bun run scripts/check-lint-disables.ts && bun run scripts/check-implementation-file-sizes.ts && bun run scripts/check-import-cycles.ts && bun run scripts/check-internal-imports.ts && bun run scripts/check-engine-internals-field-access.ts && bun run scripts/check-revision-keyed-lookups.ts && bun run scripts/check-definition-vocabulary.ts && bun run scripts/check-catalog-completeness.ts && bun run scripts/check-catalog-drift.ts && bun run scripts/check-type-ergonomics.ts",
|
|
225
225
|
"lint:fix": "oxlint --fix --type-aware --tsconfig ./tsconfig.json",
|
|
226
226
|
"markdown-doctests:inventory": "bun run scripts/extract-markdown-doctests.ts inventory",
|
|
227
227
|
"prepack": "bun run scripts/run-gates.ts prepack",
|