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
@@ -55,11 +55,11 @@ function createThreadManager(config) {
55
55
  return {
56
56
  async initialize() {
57
57
  await redis.del(redisKey);
58
- await redis.set(metaKey, "1", "EX", ttlSeconds);
58
+ await redis.set(metaKey, "1", { EX: ttlSeconds });
59
59
  },
60
60
  async load() {
61
61
  await assertThreadExists();
62
- const data = await redis.lrange(redisKey, 0, -1);
62
+ const data = await redis.lRange(redisKey, 0, -1);
63
63
  return data.map(deserialize);
64
64
  },
65
65
  async append(messages) {
@@ -67,22 +67,18 @@ function createThreadManager(config) {
67
67
  await assertThreadExists();
68
68
  if (idOf) {
69
69
  const dedupId = messages.map(idOf).join(":");
70
- await redis.eval(
71
- APPEND_IDEMPOTENT_SCRIPT,
72
- 2,
73
- dedupKey(dedupId),
74
- redisKey,
75
- String(ttlSeconds),
76
- ...messages.map(serialize)
77
- );
70
+ await redis.eval(APPEND_IDEMPOTENT_SCRIPT, {
71
+ keys: [dedupKey(dedupId), redisKey],
72
+ arguments: [String(ttlSeconds), ...messages.map(serialize)]
73
+ });
78
74
  } else {
79
- await redis.rpush(redisKey, ...messages.map(serialize));
75
+ await redis.rPush(redisKey, messages.map(serialize));
80
76
  await redis.expire(redisKey, ttlSeconds);
81
77
  }
82
78
  },
83
79
  async fork(newThreadId) {
84
80
  await assertThreadExists();
85
- const data = await redis.lrange(redisKey, 0, -1);
81
+ const data = await redis.lRange(redisKey, 0, -1);
86
82
  const stateRaw = await redis.get(stateKey);
87
83
  const forked = createThreadManager({
88
84
  ...config,
@@ -91,12 +87,12 @@ function createThreadManager(config) {
91
87
  await forked.initialize();
92
88
  if (data.length > 0) {
93
89
  const newKey = getThreadListKey(key, newThreadId);
94
- await redis.rpush(newKey, ...data);
90
+ await redis.rPush(newKey, data);
95
91
  await redis.expire(newKey, ttlSeconds);
96
92
  }
97
93
  if (stateRaw != null) {
98
94
  const newStateKey = getThreadStateKey(key, newThreadId);
99
- await redis.set(newStateKey, stateRaw, "EX", ttlSeconds);
95
+ await redis.set(newStateKey, stateRaw, { EX: ttlSeconds });
100
96
  }
101
97
  return forked;
102
98
  },
@@ -107,20 +103,20 @@ function createThreadManager(config) {
107
103
  "replaceAll requires the thread manager to be configured with `idOf`"
108
104
  );
109
105
  }
110
- const existing = await redis.lrange(redisKey, 0, -1);
106
+ const existing = await redis.lRange(redisKey, 0, -1);
111
107
  const existingIds = existing.map((raw) => idOf(deserialize(raw))).filter((id) => typeof id === "string");
112
108
  await redis.del(redisKey);
113
109
  if (existingIds.length > 0) {
114
- await redis.del(...existingIds.map(dedupKey));
110
+ await redis.del(existingIds.map(dedupKey));
115
111
  }
116
112
  if (messages.length > 0) {
117
- await redis.rpush(redisKey, ...messages.map(serialize));
113
+ await redis.rPush(redisKey, messages.map(serialize));
118
114
  await redis.expire(redisKey, ttlSeconds);
119
115
  }
120
116
  await redis.expire(metaKey, ttlSeconds);
121
117
  },
122
118
  async delete() {
123
- await redis.del(redisKey, metaKey, stateKey);
119
+ await redis.del([redisKey, metaKey, stateKey]);
124
120
  },
125
121
  async loadState() {
126
122
  const raw = await redis.get(stateKey);
@@ -129,14 +125,14 @@ function createThreadManager(config) {
129
125
  },
130
126
  async saveState(state) {
131
127
  await assertThreadExists();
132
- await redis.set(stateKey, JSON.stringify(state), "EX", ttlSeconds);
128
+ await redis.set(stateKey, JSON.stringify(state), { EX: ttlSeconds });
133
129
  },
134
130
  async deleteState() {
135
131
  await redis.del(stateKey);
136
132
  },
137
133
  async length() {
138
134
  await assertThreadExists();
139
- return redis.llen(redisKey);
135
+ return redis.lLen(redisKey);
140
136
  },
141
137
  async truncateFromId(messageId) {
142
138
  await assertThreadExists();
@@ -145,7 +141,7 @@ function createThreadManager(config) {
145
141
  "truncateFromId requires the thread manager to be configured with `idOf`"
146
142
  );
147
143
  }
148
- const data = await redis.lrange(redisKey, 0, -1);
144
+ const data = await redis.lRange(redisKey, 0, -1);
149
145
  let idx = -1;
150
146
  const removedIds = [];
151
147
  for (let i = 0; i < data.length; i++) {
@@ -160,11 +156,11 @@ function createThreadManager(config) {
160
156
  await redis.del(redisKey);
161
157
  await redis.expire(metaKey, ttlSeconds);
162
158
  } else {
163
- await redis.ltrim(redisKey, 0, idx - 1);
159
+ await redis.lTrim(redisKey, 0, idx - 1);
164
160
  await redis.expire(redisKey, ttlSeconds);
165
161
  }
166
162
  if (removedIds.length > 0) {
167
- await redis.del(...removedIds.map(dedupKey));
163
+ await redis.del(removedIds.map(dedupKey));
168
164
  }
169
165
  }
170
166
  };
@@ -179,7 +175,7 @@ async function encodeSnapshot(config) {
179
175
  }
180
176
  const listKey = getThreadListKey(threadKey, threadId);
181
177
  const stateKey = getThreadStateKey(threadKey, threadId);
182
- const messages = await redis.lrange(listKey, 0, -1);
178
+ const messages = await redis.lRange(listKey, 0, -1);
183
179
  const stateRaw = await redis.get(stateKey);
184
180
  const state = stateRaw == null ? null : JSON.parse(stateRaw);
185
181
  const dedupIds = idOf ? messages.map(idOf) : [];
@@ -199,31 +195,38 @@ async function applySnapshot(config) {
199
195
  }
200
196
  const listKey = getThreadListKey(threadKey, threadId);
201
197
  const stateKey = getThreadStateKey(threadKey, threadId);
202
- await redis.del(listKey, stateKey);
203
- const pipeline = redis.pipeline();
198
+ await redis.del([listKey, stateKey]);
199
+ const pipeline = redis.multi();
204
200
  if (snapshot.messages.length > 0) {
205
- pipeline.rpush(listKey, ...snapshot.messages);
201
+ pipeline.rPush(listKey, snapshot.messages);
206
202
  pipeline.expire(listKey, ttlSeconds);
207
203
  }
208
204
  if (snapshot.state != null) {
209
- pipeline.set(stateKey, JSON.stringify(snapshot.state), "EX", ttlSeconds);
205
+ pipeline.set(stateKey, JSON.stringify(snapshot.state), { EX: ttlSeconds });
210
206
  }
211
207
  for (const id of snapshot.dedupIds) {
212
- pipeline.set(getThreadDedupKey(threadId, id), "1", "EX", ttlSeconds);
208
+ pipeline.set(getThreadDedupKey(threadId, id), "1", { EX: ttlSeconds });
213
209
  }
214
- const results = await pipeline.exec();
215
- if (results) {
216
- const firstErr = results.find(([err]) => err)?.[0] ?? null;
217
- if (firstErr) {
218
- await redis.del(
219
- listKey,
220
- stateKey,
221
- ...snapshot.dedupIds.map((id) => getThreadDedupKey(threadId, id))
222
- ).catch(() => void 0);
223
- throw firstErr;
224
- }
210
+ try {
211
+ await pipeline.execAsPipeline();
212
+ } catch (err) {
213
+ await redis.del([
214
+ listKey,
215
+ stateKey,
216
+ ...snapshot.dedupIds.map((id) => getThreadDedupKey(threadId, id))
217
+ ]).catch(() => void 0);
218
+ throw firstPipelineError(err);
225
219
  }
226
- await redis.set(metaKey, "1", "EX", ttlSeconds);
220
+ await redis.set(metaKey, "1", { EX: ttlSeconds });
221
+ }
222
+ function firstPipelineError(err) {
223
+ if (err != null && typeof err === "object" && "replies" in err && Array.isArray(err.replies)) {
224
+ const firstErr = err.replies.find(
225
+ (r) => r instanceof Error
226
+ );
227
+ if (firstErr) return firstErr;
228
+ }
229
+ return err;
227
230
  }
228
231
  async function clearHotTier(config) {
229
232
  const { redis, threadKey, threadId, dedupIds = [] } = config;
@@ -233,7 +236,7 @@ async function clearHotTier(config) {
233
236
  getThreadStateKey(threadKey, threadId),
234
237
  ...dedupIds.map((id) => getThreadDedupKey(threadId, id))
235
238
  ];
236
- await redis.del(...keys);
239
+ await redis.del(keys);
237
240
  }
238
241
 
239
242
  // src/lib/thread/tiered.ts
@@ -420,7 +423,7 @@ function getActivityContext() {
420
423
  }
421
424
 
422
425
  // src/adapters/thread/langchain/model-invoker.ts
423
- function createLangChainModelInvoker({ redis, model, hooks }) {
426
+ function createLangChainModelInvoker({ redis, model, hooks, ttlSeconds }) {
424
427
  return async function invokeLangChainModel2(config) {
425
428
  const { threadId, threadKey, agentName, state, metadata, assistantMessageId } = config;
426
429
  const { heartbeat, signal } = getActivityContext();
@@ -428,7 +431,8 @@ function createLangChainModelInvoker({ redis, model, hooks }) {
428
431
  redis,
429
432
  threadId,
430
433
  key: threadKey,
431
- hooks
434
+ hooks,
435
+ ...ttlSeconds !== void 0 && { ttlSeconds }
432
436
  });
433
437
  const runId = v4_default();
434
438
  await thread.truncateFromId(assistantMessageId);
@@ -468,30 +472,35 @@ async function invokeLangChainModel({
468
472
  redis,
469
473
  model,
470
474
  hooks,
475
+ ttlSeconds,
471
476
  config
472
477
  }) {
473
- const invoker = createLangChainModelInvoker({ redis, model, hooks });
478
+ const invoker = createLangChainModelInvoker({
479
+ redis,
480
+ model,
481
+ hooks,
482
+ ...ttlSeconds !== void 0 && { ttlSeconds }
483
+ });
474
484
  return invoker(config);
475
485
  }
476
486
 
477
487
  // src/adapters/thread/langchain/activities.ts
478
488
  function createLangChainAdapter(config) {
479
489
  const { redis } = config;
480
- const baseExtras = {
490
+ const base = {
491
+ redis,
481
492
  ...config.ttlSeconds !== void 0 && { ttlSeconds: config.ttlSeconds }
482
493
  };
483
494
  const makeProviderThread = (threadId, threadKey) => createLangChainThreadManager({
484
- redis,
495
+ ...base,
485
496
  threadId,
486
- key: threadKey,
487
- ...baseExtras
497
+ key: threadKey
488
498
  });
489
499
  const makeTieredBase = (threadId, threadKey) => createTieredThreadManager({
490
- redis,
500
+ ...base,
491
501
  threadId,
492
502
  key: threadKey,
493
503
  idOf: storedMessageId,
494
- ...baseExtras,
495
504
  ...config.coldStore && { coldStore: config.coldStore }
496
505
  });
497
506
  const threadOps = {
@@ -519,11 +528,10 @@ function createLangChainAdapter(config) {
519
528
  },
520
529
  async forkThread(sourceThreadId, targetThreadId, threadKey) {
521
530
  const thread = createLangChainThreadManager({
522
- redis,
531
+ ...base,
523
532
  threadId: sourceThreadId,
524
533
  key: threadKey,
525
- hooks: config.hooks,
526
- ...baseExtras
534
+ hooks: config.hooks
527
535
  });
528
536
  await thread.fork(targetThreadId);
529
537
  },
@@ -555,7 +563,11 @@ function createLangChainAdapter(config) {
555
563
  Object.entries(threadOps).map(([k, v]) => [`${prefix}${cap(k)}`, v])
556
564
  );
557
565
  }
558
- const makeInvoker = (model) => createLangChainModelInvoker({ redis, model, hooks: config.hooks });
566
+ const makeInvoker = (model) => createLangChainModelInvoker({
567
+ ...base,
568
+ model,
569
+ hooks: config.hooks
570
+ });
559
571
  const invoker = config.model ? makeInvoker(config.model) : () => {
560
572
  throw new Error(
561
573
  "No default model provided to createLangChainAdapter. Either pass `model` in the config or use `createModelInvoker(model)` instead."