zeitlich 0.2.49 → 0.2.51

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 (127) hide show
  1. package/README.md +26 -23
  2. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  3. package/dist/adapters/sandbox/daytona/index.d.cts +3 -3
  4. package/dist/adapters/sandbox/daytona/index.d.ts +3 -3
  5. package/dist/adapters/sandbox/daytona/index.js.map +1 -1
  6. package/dist/adapters/sandbox/daytona/workflow.d.cts +2 -2
  7. package/dist/adapters/sandbox/daytona/workflow.d.ts +2 -2
  8. package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
  9. package/dist/adapters/sandbox/e2b/index.d.cts +1 -1
  10. package/dist/adapters/sandbox/e2b/index.d.ts +1 -1
  11. package/dist/adapters/sandbox/e2b/index.js.map +1 -1
  12. package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
  13. package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
  14. package/dist/adapters/thread/anthropic/index.cjs +60 -55
  15. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  16. package/dist/adapters/thread/anthropic/index.d.cts +20 -15
  17. package/dist/adapters/thread/anthropic/index.d.ts +20 -15
  18. package/dist/adapters/thread/anthropic/index.js +60 -55
  19. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  20. package/dist/adapters/thread/anthropic/workflow.d.cts +7 -7
  21. package/dist/adapters/thread/anthropic/workflow.d.ts +7 -7
  22. package/dist/adapters/thread/google-genai/index.cjs +135 -66
  23. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  24. package/dist/adapters/thread/google-genai/index.d.cts +200 -26
  25. package/dist/adapters/thread/google-genai/index.d.ts +200 -26
  26. package/dist/adapters/thread/google-genai/index.js +135 -66
  27. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  28. package/dist/adapters/thread/google-genai/workflow.d.cts +8 -8
  29. package/dist/adapters/thread/google-genai/workflow.d.ts +8 -8
  30. package/dist/adapters/thread/langchain/index.cjs +67 -55
  31. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  32. package/dist/adapters/thread/langchain/index.d.cts +20 -15
  33. package/dist/adapters/thread/langchain/index.d.ts +20 -15
  34. package/dist/adapters/thread/langchain/index.js +67 -55
  35. package/dist/adapters/thread/langchain/index.js.map +1 -1
  36. package/dist/adapters/thread/langchain/workflow.d.cts +7 -7
  37. package/dist/adapters/thread/langchain/workflow.d.ts +7 -7
  38. package/dist/{cold-store-DKMAO1Dd.d.ts → cold-store-DyHodfAB.d.ts} +1 -1
  39. package/dist/{cold-store-CkWoNtMh.d.cts → cold-store-YOx9nmgR.d.cts} +1 -1
  40. package/dist/index.cjs +15050 -420
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +79 -83
  43. package/dist/index.d.ts +79 -83
  44. package/dist/index.js +15051 -417
  45. package/dist/index.js.map +1 -1
  46. package/dist/{proxy-B7CWEV-T.d.cts → proxy-2htgGQrc.d.cts} +1 -1
  47. package/dist/{proxy-ByFHMVRX.d.ts → proxy-CmiTP4pp.d.ts} +1 -1
  48. package/dist/{thread-manager-nK-WcFzM.d.ts → thread-manager-BJ5pz5Cx.d.cts} +6 -7
  49. package/dist/{thread-manager-7AW4rhfu.d.ts → thread-manager-BQAbrYXH.d.cts} +6 -7
  50. package/dist/{thread-manager-Cibe0X5m.d.cts → thread-manager-CcvltOuq.d.ts} +6 -7
  51. package/dist/{thread-manager-B9rtMEVn.d.cts → thread-manager-DHAbncHX.d.ts} +6 -7
  52. package/dist/{types-gVa5XCWD.d.ts → types-BQvXWcft.d.ts} +1 -1
  53. package/dist/{types-XUUFvrJ9.d.cts → types-BjdqxKYp.d.cts} +709 -709
  54. package/dist/{types-CJ7tCdl6.d.ts → types-D8W5TnSa.d.cts} +3 -3
  55. package/dist/{types-CJ7tCdl6.d.cts → types-D8W5TnSa.d.ts} +3 -3
  56. package/dist/{types-DO4Tkwxo.d.ts → types-DEbkLA06.d.ts} +3 -3
  57. package/dist/{types-DeVNWqlb.d.ts → types-DiI7mZhI.d.ts} +709 -709
  58. package/dist/{types-BR-k7h0e.d.cts → types-N_LTWe4b.d.cts} +3 -3
  59. package/dist/{types-CjY93AWZ.d.cts → types-OEN1xrFg.d.cts} +1 -1
  60. package/dist/{workflow-uhOIj9D-.d.ts → workflow-CcgD6EUB.d.cts} +34 -3
  61. package/dist/{workflow-KbGsxpfh.d.cts → workflow-DBjPOKBr.d.ts} +34 -3
  62. package/dist/workflow.cjs +15008 -377
  63. package/dist/workflow.cjs.map +1 -1
  64. package/dist/workflow.d.cts +3 -3
  65. package/dist/workflow.d.ts +3 -3
  66. package/dist/workflow.js +15009 -374
  67. package/dist/workflow.js.map +1 -1
  68. package/package.json +10 -37
  69. package/src/adapters/thread/anthropic/activities.test.ts +115 -0
  70. package/src/adapters/thread/anthropic/activities.ts +11 -19
  71. package/src/adapters/thread/anthropic/fork-transform.test.ts +17 -11
  72. package/src/adapters/thread/anthropic/model-invoker.test.ts +54 -3
  73. package/src/adapters/thread/anthropic/model-invoker.ts +11 -1
  74. package/src/adapters/thread/anthropic/thread-manager.test.ts +2 -2
  75. package/src/adapters/thread/anthropic/thread-manager.ts +3 -4
  76. package/src/adapters/thread/google-genai/activities.test.ts +162 -0
  77. package/src/adapters/thread/google-genai/activities.ts +38 -15
  78. package/src/adapters/thread/google-genai/fork-transform.test.ts +17 -11
  79. package/src/adapters/thread/google-genai/model-invoker.test.ts +386 -0
  80. package/src/adapters/thread/google-genai/model-invoker.ts +118 -23
  81. package/src/adapters/thread/google-genai/thread-manager.test.ts +2 -2
  82. package/src/adapters/thread/google-genai/thread-manager.ts +3 -4
  83. package/src/adapters/thread/langchain/activities.test.ts +88 -0
  84. package/src/adapters/thread/langchain/activities.ts +15 -12
  85. package/src/adapters/thread/langchain/fork-transform.test.ts +17 -11
  86. package/src/adapters/thread/langchain/model-invoker.test.ts +74 -0
  87. package/src/adapters/thread/langchain/model-invoker.ts +16 -3
  88. package/src/adapters/thread/langchain/thread-manager.test.ts +2 -2
  89. package/src/adapters/thread/langchain/thread-manager.ts +3 -4
  90. package/src/index.ts +2 -2
  91. package/src/lib/sandbox/capability-types.test.ts +2 -2
  92. package/src/lib/sandbox/manager.ts +2 -6
  93. package/src/lib/sandbox/sandbox.test.ts +1 -1
  94. package/src/lib/sandbox/types.ts +2 -2
  95. package/src/lib/session/session.integration.test.ts +92 -0
  96. package/src/lib/session/session.ts +23 -11
  97. package/src/lib/thread/keys.test.ts +9 -9
  98. package/src/lib/thread/keys.ts +1 -1
  99. package/src/lib/thread/manager.test.ts +24 -14
  100. package/src/lib/thread/manager.ts +19 -23
  101. package/src/lib/thread/snapshot.test.ts +51 -43
  102. package/src/lib/thread/snapshot.ts +54 -32
  103. package/src/lib/thread/test-utils.ts +106 -59
  104. package/src/lib/thread/tiered.test.ts +1 -1
  105. package/src/lib/thread/types.ts +2 -2
  106. package/src/lib/tool-router/router.integration.test.ts +44 -0
  107. package/src/lib/tool-router/router.ts +140 -32
  108. package/src/lib/workflow.ts +49 -0
  109. package/src/{adapters/sandbox/inmemory/proxy.ts → test-utils/in-memory-sandbox-proxy.ts} +5 -16
  110. package/src/{adapters/sandbox/inmemory/index.ts → test-utils/in-memory-sandbox.ts} +11 -3
  111. package/src/tools/bash/bash.test.ts +1 -1
  112. package/src/tools/edit/handler.test.ts +1 -1
  113. package/tsup.config.ts +2 -4
  114. package/dist/activities-7OcT_vdR.d.cts +0 -162
  115. package/dist/activities-zG_FBoY2.d.ts +0 -162
  116. package/dist/adapters/sandbox/inmemory/index.cjs +0 -214
  117. package/dist/adapters/sandbox/inmemory/index.cjs.map +0 -1
  118. package/dist/adapters/sandbox/inmemory/index.d.cts +0 -40
  119. package/dist/adapters/sandbox/inmemory/index.d.ts +0 -40
  120. package/dist/adapters/sandbox/inmemory/index.js +0 -211
  121. package/dist/adapters/sandbox/inmemory/index.js.map +0 -1
  122. package/dist/adapters/sandbox/inmemory/workflow.cjs +0 -36
  123. package/dist/adapters/sandbox/inmemory/workflow.cjs.map +0 -1
  124. package/dist/adapters/sandbox/inmemory/workflow.d.cts +0 -27
  125. package/dist/adapters/sandbox/inmemory/workflow.d.ts +0 -27
  126. package/dist/adapters/sandbox/inmemory/workflow.js +0 -34
  127. package/dist/adapters/sandbox/inmemory/workflow.js.map +0 -1
@@ -57,11 +57,11 @@ function createThreadManager(config) {
57
57
  return {
58
58
  async initialize() {
59
59
  await redis.del(redisKey);
60
- await redis.set(metaKey, "1", "EX", ttlSeconds);
60
+ await redis.set(metaKey, "1", { EX: ttlSeconds });
61
61
  },
62
62
  async load() {
63
63
  await assertThreadExists();
64
- const data = await redis.lrange(redisKey, 0, -1);
64
+ const data = await redis.lRange(redisKey, 0, -1);
65
65
  return data.map(deserialize);
66
66
  },
67
67
  async append(messages) {
@@ -69,22 +69,18 @@ function createThreadManager(config) {
69
69
  await assertThreadExists();
70
70
  if (idOf) {
71
71
  const dedupId = messages.map(idOf).join(":");
72
- await redis.eval(
73
- APPEND_IDEMPOTENT_SCRIPT,
74
- 2,
75
- dedupKey(dedupId),
76
- redisKey,
77
- String(ttlSeconds),
78
- ...messages.map(serialize)
79
- );
72
+ await redis.eval(APPEND_IDEMPOTENT_SCRIPT, {
73
+ keys: [dedupKey(dedupId), redisKey],
74
+ arguments: [String(ttlSeconds), ...messages.map(serialize)]
75
+ });
80
76
  } else {
81
- await redis.rpush(redisKey, ...messages.map(serialize));
77
+ await redis.rPush(redisKey, messages.map(serialize));
82
78
  await redis.expire(redisKey, ttlSeconds);
83
79
  }
84
80
  },
85
81
  async fork(newThreadId) {
86
82
  await assertThreadExists();
87
- const data = await redis.lrange(redisKey, 0, -1);
83
+ const data = await redis.lRange(redisKey, 0, -1);
88
84
  const stateRaw = await redis.get(stateKey);
89
85
  const forked = createThreadManager({
90
86
  ...config,
@@ -93,12 +89,12 @@ function createThreadManager(config) {
93
89
  await forked.initialize();
94
90
  if (data.length > 0) {
95
91
  const newKey = getThreadListKey(key, newThreadId);
96
- await redis.rpush(newKey, ...data);
92
+ await redis.rPush(newKey, data);
97
93
  await redis.expire(newKey, ttlSeconds);
98
94
  }
99
95
  if (stateRaw != null) {
100
96
  const newStateKey = getThreadStateKey(key, newThreadId);
101
- await redis.set(newStateKey, stateRaw, "EX", ttlSeconds);
97
+ await redis.set(newStateKey, stateRaw, { EX: ttlSeconds });
102
98
  }
103
99
  return forked;
104
100
  },
@@ -109,20 +105,20 @@ function createThreadManager(config) {
109
105
  "replaceAll requires the thread manager to be configured with `idOf`"
110
106
  );
111
107
  }
112
- const existing = await redis.lrange(redisKey, 0, -1);
108
+ const existing = await redis.lRange(redisKey, 0, -1);
113
109
  const existingIds = existing.map((raw) => idOf(deserialize(raw))).filter((id) => typeof id === "string");
114
110
  await redis.del(redisKey);
115
111
  if (existingIds.length > 0) {
116
- await redis.del(...existingIds.map(dedupKey));
112
+ await redis.del(existingIds.map(dedupKey));
117
113
  }
118
114
  if (messages.length > 0) {
119
- await redis.rpush(redisKey, ...messages.map(serialize));
115
+ await redis.rPush(redisKey, messages.map(serialize));
120
116
  await redis.expire(redisKey, ttlSeconds);
121
117
  }
122
118
  await redis.expire(metaKey, ttlSeconds);
123
119
  },
124
120
  async delete() {
125
- await redis.del(redisKey, metaKey, stateKey);
121
+ await redis.del([redisKey, metaKey, stateKey]);
126
122
  },
127
123
  async loadState() {
128
124
  const raw = await redis.get(stateKey);
@@ -131,14 +127,14 @@ function createThreadManager(config) {
131
127
  },
132
128
  async saveState(state) {
133
129
  await assertThreadExists();
134
- await redis.set(stateKey, JSON.stringify(state), "EX", ttlSeconds);
130
+ await redis.set(stateKey, JSON.stringify(state), { EX: ttlSeconds });
135
131
  },
136
132
  async deleteState() {
137
133
  await redis.del(stateKey);
138
134
  },
139
135
  async length() {
140
136
  await assertThreadExists();
141
- return redis.llen(redisKey);
137
+ return redis.lLen(redisKey);
142
138
  },
143
139
  async truncateFromId(messageId) {
144
140
  await assertThreadExists();
@@ -147,7 +143,7 @@ function createThreadManager(config) {
147
143
  "truncateFromId requires the thread manager to be configured with `idOf`"
148
144
  );
149
145
  }
150
- const data = await redis.lrange(redisKey, 0, -1);
146
+ const data = await redis.lRange(redisKey, 0, -1);
151
147
  let idx = -1;
152
148
  const removedIds = [];
153
149
  for (let i = 0; i < data.length; i++) {
@@ -162,11 +158,11 @@ function createThreadManager(config) {
162
158
  await redis.del(redisKey);
163
159
  await redis.expire(metaKey, ttlSeconds);
164
160
  } else {
165
- await redis.ltrim(redisKey, 0, idx - 1);
161
+ await redis.lTrim(redisKey, 0, idx - 1);
166
162
  await redis.expire(redisKey, ttlSeconds);
167
163
  }
168
164
  if (removedIds.length > 0) {
169
- await redis.del(...removedIds.map(dedupKey));
165
+ await redis.del(removedIds.map(dedupKey));
170
166
  }
171
167
  }
172
168
  };
@@ -181,7 +177,7 @@ async function encodeSnapshot(config) {
181
177
  }
182
178
  const listKey = getThreadListKey(threadKey, threadId);
183
179
  const stateKey = getThreadStateKey(threadKey, threadId);
184
- const messages = await redis.lrange(listKey, 0, -1);
180
+ const messages = await redis.lRange(listKey, 0, -1);
185
181
  const stateRaw = await redis.get(stateKey);
186
182
  const state = stateRaw == null ? null : JSON.parse(stateRaw);
187
183
  const dedupIds = idOf ? messages.map(idOf) : [];
@@ -201,31 +197,38 @@ async function applySnapshot(config) {
201
197
  }
202
198
  const listKey = getThreadListKey(threadKey, threadId);
203
199
  const stateKey = getThreadStateKey(threadKey, threadId);
204
- await redis.del(listKey, stateKey);
205
- const pipeline = redis.pipeline();
200
+ await redis.del([listKey, stateKey]);
201
+ const pipeline = redis.multi();
206
202
  if (snapshot.messages.length > 0) {
207
- pipeline.rpush(listKey, ...snapshot.messages);
203
+ pipeline.rPush(listKey, snapshot.messages);
208
204
  pipeline.expire(listKey, ttlSeconds);
209
205
  }
210
206
  if (snapshot.state != null) {
211
- pipeline.set(stateKey, JSON.stringify(snapshot.state), "EX", ttlSeconds);
207
+ pipeline.set(stateKey, JSON.stringify(snapshot.state), { EX: ttlSeconds });
212
208
  }
213
209
  for (const id of snapshot.dedupIds) {
214
- pipeline.set(getThreadDedupKey(threadId, id), "1", "EX", ttlSeconds);
210
+ pipeline.set(getThreadDedupKey(threadId, id), "1", { EX: ttlSeconds });
215
211
  }
216
- const results = await pipeline.exec();
217
- if (results) {
218
- const firstErr = results.find(([err]) => err)?.[0] ?? null;
219
- if (firstErr) {
220
- await redis.del(
221
- listKey,
222
- stateKey,
223
- ...snapshot.dedupIds.map((id) => getThreadDedupKey(threadId, id))
224
- ).catch(() => void 0);
225
- throw firstErr;
226
- }
212
+ try {
213
+ await pipeline.execAsPipeline();
214
+ } catch (err) {
215
+ await redis.del([
216
+ listKey,
217
+ stateKey,
218
+ ...snapshot.dedupIds.map((id) => getThreadDedupKey(threadId, id))
219
+ ]).catch(() => void 0);
220
+ throw firstPipelineError(err);
227
221
  }
228
- await redis.set(metaKey, "1", "EX", ttlSeconds);
222
+ await redis.set(metaKey, "1", { EX: ttlSeconds });
223
+ }
224
+ function firstPipelineError(err) {
225
+ if (err != null && typeof err === "object" && "replies" in err && Array.isArray(err.replies)) {
226
+ const firstErr = err.replies.find(
227
+ (r) => r instanceof Error
228
+ );
229
+ if (firstErr) return firstErr;
230
+ }
231
+ return err;
229
232
  }
230
233
  async function clearHotTier(config) {
231
234
  const { redis, threadKey, threadId, dedupIds = [] } = config;
@@ -235,7 +238,7 @@ async function clearHotTier(config) {
235
238
  getThreadStateKey(threadKey, threadId),
236
239
  ...dedupIds.map((id) => getThreadDedupKey(threadId, id))
237
240
  ];
238
- await redis.del(...keys);
241
+ await redis.del(keys);
239
242
  }
240
243
 
241
244
  // src/lib/thread/tiered.ts
@@ -422,7 +425,7 @@ function getActivityContext() {
422
425
  }
423
426
 
424
427
  // src/adapters/thread/langchain/model-invoker.ts
425
- function createLangChainModelInvoker({ redis, model, hooks }) {
428
+ function createLangChainModelInvoker({ redis, model, hooks, ttlSeconds }) {
426
429
  return async function invokeLangChainModel2(config) {
427
430
  const { threadId, threadKey, agentName, state, metadata, assistantMessageId } = config;
428
431
  const { heartbeat, signal } = getActivityContext();
@@ -430,7 +433,8 @@ function createLangChainModelInvoker({ redis, model, hooks }) {
430
433
  redis,
431
434
  threadId,
432
435
  key: threadKey,
433
- hooks
436
+ hooks,
437
+ ...ttlSeconds !== void 0 && { ttlSeconds }
434
438
  });
435
439
  const runId = v4_default();
436
440
  await thread.truncateFromId(assistantMessageId);
@@ -470,30 +474,35 @@ async function invokeLangChainModel({
470
474
  redis,
471
475
  model,
472
476
  hooks,
477
+ ttlSeconds,
473
478
  config
474
479
  }) {
475
- const invoker = createLangChainModelInvoker({ redis, model, hooks });
480
+ const invoker = createLangChainModelInvoker({
481
+ redis,
482
+ model,
483
+ hooks,
484
+ ...ttlSeconds !== void 0 && { ttlSeconds }
485
+ });
476
486
  return invoker(config);
477
487
  }
478
488
 
479
489
  // src/adapters/thread/langchain/activities.ts
480
490
  function createLangChainAdapter(config) {
481
491
  const { redis } = config;
482
- const baseExtras = {
492
+ const base = {
493
+ redis,
483
494
  ...config.ttlSeconds !== void 0 && { ttlSeconds: config.ttlSeconds }
484
495
  };
485
496
  const makeProviderThread = (threadId, threadKey) => createLangChainThreadManager({
486
- redis,
497
+ ...base,
487
498
  threadId,
488
- key: threadKey,
489
- ...baseExtras
499
+ key: threadKey
490
500
  });
491
501
  const makeTieredBase = (threadId, threadKey) => createTieredThreadManager({
492
- redis,
502
+ ...base,
493
503
  threadId,
494
504
  key: threadKey,
495
505
  idOf: storedMessageId,
496
- ...baseExtras,
497
506
  ...config.coldStore && { coldStore: config.coldStore }
498
507
  });
499
508
  const threadOps = {
@@ -521,11 +530,10 @@ function createLangChainAdapter(config) {
521
530
  },
522
531
  async forkThread(sourceThreadId, targetThreadId, threadKey) {
523
532
  const thread = createLangChainThreadManager({
524
- redis,
533
+ ...base,
525
534
  threadId: sourceThreadId,
526
535
  key: threadKey,
527
- hooks: config.hooks,
528
- ...baseExtras
536
+ hooks: config.hooks
529
537
  });
530
538
  await thread.fork(targetThreadId);
531
539
  },
@@ -557,7 +565,11 @@ function createLangChainAdapter(config) {
557
565
  Object.entries(threadOps).map(([k, v]) => [`${prefix}${cap(k)}`, v])
558
566
  );
559
567
  }
560
- const makeInvoker = (model) => createLangChainModelInvoker({ redis, model, hooks: config.hooks });
568
+ const makeInvoker = (model) => createLangChainModelInvoker({
569
+ ...base,
570
+ model,
571
+ hooks: config.hooks
572
+ });
561
573
  const invoker = config.model ? makeInvoker(config.model) : () => {
562
574
  throw new Error(
563
575
  "No default model provided to createLangChainAdapter. Either pass `model` in the config or use `createModelInvoker(model)` instead."