@lostgradient/weft 0.18.0 → 0.20.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.
Files changed (171) hide show
  1. package/README.md +3 -1
  2. package/dist/cli/conformance.js +14 -18
  3. package/dist/cli/generated/operation-catalog.snapshot.json +1597 -21
  4. package/dist/cli/generated/operation-client.generated.d.ts +37 -6
  5. package/dist/cli/generated/operation-client.generated.js +6 -0
  6. package/dist/core/context/child-workflow-pipe.d.ts +1 -1
  7. package/dist/core/context/child-workflow-pipe.js +1 -1
  8. package/dist/core/engine/construction.d.ts +2 -0
  9. package/dist/core/engine/construction.js +3 -0
  10. package/dist/core/engine/index.js +1 -0
  11. package/dist/core/engine/listing.d.ts +1 -0
  12. package/dist/core/engine/listing.js +6 -4
  13. package/dist/core/weft-error.d.ts +1 -1
  14. package/dist/core/weft-error.js +2 -1
  15. package/dist/core/worker-execution-dispatcher.d.ts +8 -0
  16. package/dist/core/worker-execution-dispatcher.js +4 -0
  17. package/dist/core/worker-execution-strategy-options.d.ts +16 -0
  18. package/dist/core/worker-execution-strategy.js +71 -89
  19. package/dist/core/worker-fault-handling.d.ts +45 -0
  20. package/dist/core/worker-fault-handling.js +88 -0
  21. package/dist/core/worker-protocol.d.ts +18 -1
  22. package/dist/core/worker-protocol.js +1 -1
  23. package/dist/core/worker-realm-readiness.d.ts +78 -0
  24. package/dist/core/worker-realm-readiness.js +127 -0
  25. package/dist/index.d.ts +3 -1
  26. package/dist/index.js +28 -1
  27. package/dist/json-schema.js +1 -1
  28. package/dist/runtime/portable.d.ts +14 -0
  29. package/dist/runtime/portable.js +10 -0
  30. package/dist/server/index.d.ts +71 -8
  31. package/dist/server/index.js +7 -3
  32. package/dist/server/operations/get-task-detail-schema.d.ts +341 -0
  33. package/dist/server/operations/get-task-detail-schema.js +118 -0
  34. package/dist/server/operations/get-task-detail.d.ts +346 -0
  35. package/dist/server/operations/get-task-detail.js +215 -0
  36. package/dist/server/operations/get-task-diagnostics.d.ts +43 -18
  37. package/dist/server/operations/get-task-diagnostics.js +87 -126
  38. package/dist/server/operations/get-worker-diagnostics.d.ts +177 -0
  39. package/dist/server/operations/get-worker-diagnostics.js +117 -0
  40. package/dist/server/operations/list-worker-registration-rejections.d.ts +79 -0
  41. package/dist/server/operations/list-worker-registration-rejections.js +60 -0
  42. package/dist/server/operations/list-workers.js +1 -3
  43. package/dist/server/operations/static-registrations.js +8 -20
  44. package/dist/server/rest-bindings.js +31 -2
  45. package/dist/server/runtime/authentication-bridge.js +6 -14
  46. package/dist/server/runtime/context.d.ts +23 -0
  47. package/dist/server/runtime/task-dispatch.d.ts +7 -1
  48. package/dist/server/runtime/task-dispatch.js +126 -55
  49. package/dist/server/runtime/task-ledger-completion.d.ts +68 -0
  50. package/dist/server/runtime/task-ledger-completion.js +72 -0
  51. package/dist/server/runtime/task-ledger-recovery.d.ts +55 -0
  52. package/dist/server/runtime/task-ledger-recovery.js +73 -0
  53. package/dist/server/runtime/task-ledger-runtime.d.ts +64 -0
  54. package/dist/server/runtime/task-ledger-runtime.js +34 -0
  55. package/dist/server/runtime/task-metrics.d.ts +6 -4
  56. package/dist/server/runtime/task-polling.d.ts +14 -12
  57. package/dist/server/runtime/task-polling.js +106 -82
  58. package/dist/server/runtime/task-reconciliation.d.ts +35 -8
  59. package/dist/server/runtime/task-reconciliation.js +75 -74
  60. package/dist/server/runtime/task-result-resolution.d.ts +2 -10
  61. package/dist/server/runtime/task-result-resolution.js +0 -67
  62. package/dist/server/runtime/task-result-view.d.ts +82 -0
  63. package/dist/server/runtime/task-result-view.js +48 -0
  64. package/dist/server/runtime/websocket-worker-messaging.d.ts +16 -0
  65. package/dist/server/runtime/websocket-worker-messaging.js +32 -0
  66. package/dist/server/runtime/websocket-worker-registration.d.ts +41 -0
  67. package/dist/server/runtime/websocket-worker-registration.js +134 -0
  68. package/dist/server/runtime/websocket-worker.d.ts +0 -1
  69. package/dist/server/runtime/websocket-worker.js +64 -116
  70. package/dist/server/serve-internals.d.ts +9 -6
  71. package/dist/server/serve-internals.js +14 -40
  72. package/dist/server/task-ledger-codec.d.ts +40 -0
  73. package/dist/server/task-ledger-codec.js +195 -0
  74. package/dist/server/task-ledger-keys.d.ts +13 -0
  75. package/dist/server/task-ledger-keys.js +5 -0
  76. package/dist/server/task-ledger-limits.d.ts +34 -0
  77. package/dist/server/task-ledger-limits.js +5 -0
  78. package/dist/server/task-ledger-transition-helpers.d.ts +38 -0
  79. package/dist/server/task-ledger-transition-helpers.js +42 -0
  80. package/dist/server/task-ledger-transitions-cancellation.d.ts +31 -0
  81. package/dist/server/task-ledger-transitions-cancellation.js +73 -0
  82. package/dist/server/task-ledger-transitions.d.ts +129 -0
  83. package/dist/server/task-ledger-transitions.js +162 -0
  84. package/dist/server/task-ledger-types.d.ts +220 -0
  85. package/dist/server/task-ledger-types.js +1 -0
  86. package/dist/server/task-ledger.d.ts +17 -0
  87. package/dist/server/task-ledger.js +24 -0
  88. package/dist/server/task-state.d.ts +25 -152
  89. package/dist/server/task-state.js +0 -188
  90. package/dist/server/worker-admission-policy.d.ts +70 -0
  91. package/dist/server/worker-admission-policy.js +0 -0
  92. package/dist/storage/compressed-storage.js +1 -1
  93. package/dist/storage/index.d.ts +0 -2
  94. package/dist/storage/interface.d.ts +0 -2
  95. package/dist/storage/interface.js +1 -1
  96. package/dist/storage/lmdb.js +1 -1
  97. package/dist/storage/memory.js +1 -1
  98. package/dist/storage/neon.js +1 -1
  99. package/dist/storage/postgres.js +1 -1
  100. package/dist/storage/resolve.js +1 -1
  101. package/dist/storage/scoped-storage.js +1 -1
  102. package/dist/storage/testing.js +1 -1
  103. package/dist/storage/turso.js +1 -1
  104. package/dist/storage/web-extension.js +2 -2
  105. package/dist/version.d.ts +1 -1
  106. package/dist/version.js +1 -1
  107. package/dist/web-extension.js +1 -1
  108. package/dist/worker/index.d.ts +2 -0
  109. package/dist/worker/index.js +30 -4
  110. package/dist/worker/manifest/canonical-json.d.ts +20 -0
  111. package/dist/worker/manifest/canonical-json.js +13 -0
  112. package/dist/worker/manifest/capabilities.d.ts +24 -0
  113. package/dist/worker/manifest/capabilities.js +74 -0
  114. package/dist/worker/manifest/content-digest.d.ts +20 -0
  115. package/dist/worker/manifest/content-digest.js +13 -0
  116. package/dist/worker/manifest/declared-shape-digest.d.ts +14 -0
  117. package/dist/worker/manifest/declared-shape-digest.js +4 -0
  118. package/dist/worker/manifest/digest.d.ts +82 -0
  119. package/dist/worker/manifest/digest.js +9 -0
  120. package/dist/worker/manifest/execution-identity.d.ts +92 -0
  121. package/dist/worker/manifest/execution-identity.js +36 -0
  122. package/dist/worker/manifest/failure.d.ts +59 -0
  123. package/dist/worker/manifest/failure.js +4 -0
  124. package/dist/worker/manifest/index.d.ts +22 -0
  125. package/dist/worker/manifest/index.js +23 -0
  126. package/dist/worker/manifest/internal-realm.d.ts +50 -0
  127. package/dist/worker/manifest/internal-realm.js +39 -0
  128. package/dist/worker/manifest/is-record.d.ts +12 -0
  129. package/dist/worker/manifest/is-record.js +6 -0
  130. package/dist/worker/manifest/json-scan.d.ts +26 -0
  131. package/dist/worker/manifest/json-scan.js +88 -0
  132. package/dist/worker/manifest/limits.d.ts +138 -0
  133. package/dist/worker/manifest/limits.js +1 -0
  134. package/dist/worker/manifest/normalize.d.ts +63 -0
  135. package/dist/worker/manifest/normalize.js +73 -0
  136. package/dist/worker/manifest/parse-json.d.ts +24 -0
  137. package/dist/worker/manifest/parse-json.js +15 -0
  138. package/dist/worker/manifest/parse.d.ts +86 -0
  139. package/dist/worker/manifest/parse.js +188 -0
  140. package/dist/worker/manifest/registry-contract-builder.d.ts +120 -0
  141. package/dist/worker/manifest/registry-contract-builder.js +65 -0
  142. package/dist/worker/manifest/types.d.ts +263 -0
  143. package/dist/worker/manifest/types.js +1 -0
  144. package/dist/worker/manifest/utf8.d.ts +13 -0
  145. package/dist/worker/manifest/utf8.js +7 -0
  146. package/dist/worker/options.d.ts +55 -8
  147. package/dist/worker/options.js +65 -9
  148. package/dist/worker/protocol-internals.d.ts +1 -2
  149. package/dist/worker/protocol-internals.js +0 -5
  150. package/dist/worker/protocol-messages.d.ts +33 -17
  151. package/dist/worker/protocol-schemas.d.ts +36 -74
  152. package/dist/worker/protocol-schemas.js +25 -18
  153. package/dist/worker/protocol-version.d.ts +18 -14
  154. package/dist/worker/protocol-version.js +1 -1
  155. package/dist/worker/protocol.js +1 -1
  156. package/dist/worker/registry/deployment-consistency.d.ts +78 -0
  157. package/dist/worker/registry/deployment-consistency.js +27 -0
  158. package/dist/worker/registry/drain.d.ts +14 -0
  159. package/dist/worker/registry/drain.js +24 -0
  160. package/dist/worker/registry/rejections.d.ts +31 -0
  161. package/dist/worker/registry/rejections.js +10 -0
  162. package/dist/worker/registry/summary.d.ts +0 -3
  163. package/dist/worker/registry/summary.js +2 -5
  164. package/dist/worker/registry/types.d.ts +10 -3
  165. package/dist/worker/registry.d.ts +47 -2
  166. package/dist/worker/registry.js +45 -32
  167. package/dist/workers/workflow-worker-entry.d.ts +12 -7
  168. package/dist/workers/workflow-worker-entry.js +9 -2
  169. package/package.json +3 -3
  170. package/dist/server/task-resolved-record.d.ts +0 -12
  171. package/dist/server/task-resolved-record.js +0 -35
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Weft
2
2
 
3
- A Bun-native durable execution engine. Current release: `0.18.0`.
3
+ A Bun-native durable execution engine. Current release: `0.19.0`.
4
4
 
5
5
  Install the library from npm as `@lostgradient/weft`:
6
6
 
@@ -378,6 +378,8 @@ import { RemoteWorker } from '@lostgradient/weft';
378
378
 
379
379
  const worker = new RemoteWorker({
380
380
  serverUrl: 'wss://weft.internal:7233',
381
+ deploymentName: 'orders',
382
+ buildId: '2026.08.19-1',
381
383
  workflows: {
382
384
  orderFulfillment: {
383
385
  name: 'orderFulfillment',
@@ -1,23 +1,20 @@
1
1
  import { decode } from "../core/codec.js";
2
2
  import { Engine } from "../core/engine.js";
3
3
  import { serve } from "../server/index.js";
4
- import { KEYS } from "../storage/interface.js";
4
+ import { isRemoteTaskTerminalResolved, taskLedgerKey } from "../server/task-ledger.js";
5
5
  import { MemoryStorage } from "../storage/memory.js";
6
6
  import {
7
7
  REMOTE_WORKER_PROTOCOL_VERSION,
8
8
  REMOTE_WORKER_SUPPORTED_PROTOCOL_VERSIONS
9
9
  } from "../worker/protocol.js";
10
10
  const CONFORMANCE_QUEUE = "conformance", CONFORMANCE_ACTIVITIES = [
11
- "weft.conformance.echo",
12
- "weft.conformance.sleep",
13
- "weft.conformance.cancel"
11
+ "conformance.echo",
12
+ "conformance.sleep",
13
+ "conformance.cancel"
14
14
  ], CONFORMANCE_HEARTBEAT_INTERVAL_MS = 25;
15
15
  function createCheck(name, ok, message) {
16
16
  return { name, ok, message };
17
17
  }
18
- function isRecord(value) {
19
- return value !== null && typeof value === "object" && !Array.isArray(value);
20
- }
21
18
  async function waitForCondition(predicate, timeoutMs, label) {
22
19
  const deadline = Date.now() + timeoutMs;
23
20
  let lastError;
@@ -110,17 +107,12 @@ async function waitForWorkerIdle(server, workerId, timeoutMs) {
110
107
  }
111
108
  throw Error(`Timed out after ${timeoutMs}ms waiting for worker ${workerId} to become idle`);
112
109
  }
113
- function isResolvedRecord(value) {
114
- if (!isRecord(value))
115
- return !1;
116
- return typeof value.operationId === "string" && (value.status === "completed" || value.status === "failed") && typeof value.resolvedAt === "number";
117
- }
118
110
  async function readResolvedStatus(storage, operationId) {
119
- const stored = await storage.get(KEYS.operationResolved(operationId));
111
+ const stored = await storage.get(taskLedgerKey(operationId));
120
112
  if (stored === null)
121
113
  return;
122
114
  const decoded = decode(stored);
123
- if (!isResolvedRecord(decoded))
115
+ if (!isRemoteTaskTerminalResolved(decoded))
124
116
  return;
125
117
  return decoded.status;
126
118
  }
@@ -131,6 +123,7 @@ async function dispatchAndWait(server, storage, operationId, activityName, input
131
123
  if (!await server.dispatchTask({
132
124
  operationId,
133
125
  activityName,
126
+ workflowType: "conformance",
134
127
  input,
135
128
  queue: CONFORMANCE_QUEUE,
136
129
  visibilityTimeout: Math.max(500, timeoutMs)
@@ -151,15 +144,16 @@ async function runConformanceChecks(command, timeoutMs) {
151
144
  worker = startWorker(command, server);
152
145
  const workerId = await waitForRegisteredWorker(server, timeoutMs), registered = server.registry.getWorker(workerId);
153
146
  checks.push(createCheck("register", registered?.queue === CONFORMANCE_QUEUE && CONFORMANCE_ACTIVITIES.every((activity) => registered.activities.includes(activity)), `registered worker ${workerId}`));
154
- await dispatchAndWait(server, storage, "conformance-echo", "weft.conformance.echo", { ok: !0 }, "completed", timeoutMs);
147
+ await dispatchAndWait(server, storage, "conformance-echo", "conformance.echo", { ok: !0 }, "completed", timeoutMs);
155
148
  checks.push(createCheck("task completion", !0, "echo task resolved"));
156
149
  await waitForWorkerHeartbeat(server, workerId, timeoutMs);
157
- await dispatchAndWait(server, storage, "conformance-heartbeat", "weft.conformance.sleep", { milliseconds: CONFORMANCE_HEARTBEAT_INTERVAL_MS * 3 }, "completed", timeoutMs);
150
+ await dispatchAndWait(server, storage, "conformance-heartbeat", "conformance.sleep", { milliseconds: CONFORMANCE_HEARTBEAT_INTERVAL_MS * 3 }, "completed", timeoutMs);
158
151
  checks.push(createCheck("heartbeat", !0, "heartbeat observed while worker was connected"));
159
152
  const cancelOperationId = "conformance-cancel";
160
153
  if (!await server.dispatchTask({
161
154
  operationId: cancelOperationId,
162
- activityName: "weft.conformance.cancel",
155
+ activityName: "conformance.cancel",
156
+ workflowType: "conformance",
163
157
  input: { milliseconds: timeoutMs },
164
158
  queue: CONFORMANCE_QUEUE,
165
159
  visibilityTimeout: Math.max(500, timeoutMs)
@@ -173,7 +167,8 @@ async function runConformanceChecks(command, timeoutMs) {
173
167
  const reconnectOperationId = "conformance-reconnect", reconnectDelayMs = Math.min(1500, Math.max(250, Math.floor(timeoutMs * 0.75)));
174
168
  if (!await server.dispatchTask({
175
169
  operationId: reconnectOperationId,
176
- activityName: "weft.conformance.sleep",
170
+ activityName: "conformance.sleep",
171
+ workflowType: "conformance",
177
172
  input: { milliseconds: reconnectDelayMs },
178
173
  queue: CONFORMANCE_QUEUE,
179
174
  visibilityTimeout: Math.max(500, timeoutMs)
@@ -185,6 +180,7 @@ async function runConformanceChecks(command, timeoutMs) {
185
180
  await stopWorker(worker);
186
181
  worker = replacementWorker;
187
182
  await waitForCondition(() => server.registry.getWorker(workerId) === void 0, timeoutMs, "original worker disconnect");
183
+ await waitForCondition(() => (server.registry.getWorker(replacementWorkerId)?.inFlight ?? 0) > 0 || server.registry.getWorker(replacementWorkerId) === void 0, timeoutMs, "reassigned reconnect task delivered to replacement worker");
188
184
  await waitForWorkerIdle(server, replacementWorkerId, timeoutMs);
189
185
  await waitForResolvedStatus(storage, reconnectOperationId, "completed", timeoutMs);
190
186
  checks.push(createCheck("reconnect", !0, "in-flight task completed after reconnect"));