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);
219
+ }
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;
225
228
  }
226
- await redis.set(metaKey, "1", "EX", ttlSeconds);
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
@@ -529,7 +532,8 @@ function createAnthropicModelInvoker({
529
532
  model,
530
533
  maxTokens = 16384,
531
534
  promptCache,
532
- hooks
535
+ hooks,
536
+ ttlSeconds
533
537
  }) {
534
538
  return async function invokeAnthropicModel2(config) {
535
539
  const { threadId, threadKey, state, assistantMessageId } = config;
@@ -538,7 +542,8 @@ function createAnthropicModelInvoker({
538
542
  redis,
539
543
  threadId,
540
544
  key: threadKey,
541
- hooks
545
+ hooks,
546
+ ...ttlSeconds !== void 0 && { ttlSeconds }
542
547
  });
543
548
  await thread.truncateFromId(assistantMessageId);
544
549
  const prepared = await thread.prepareForInvocation();
@@ -587,6 +592,7 @@ async function invokeAnthropicModel({
587
592
  maxTokens,
588
593
  promptCache,
589
594
  hooks,
595
+ ttlSeconds,
590
596
  config
591
597
  }) {
592
598
  const invoker = createAnthropicModelInvoker({
@@ -595,7 +601,8 @@ async function invokeAnthropicModel({
595
601
  model,
596
602
  maxTokens,
597
603
  promptCache,
598
- hooks
604
+ hooks,
605
+ ...ttlSeconds !== void 0 && { ttlSeconds }
599
606
  });
600
607
  return invoker(config);
601
608
  }
@@ -603,21 +610,20 @@ async function invokeAnthropicModel({
603
610
  // src/adapters/thread/anthropic/activities.ts
604
611
  function createAnthropicAdapter(config) {
605
612
  const { redis, client } = config;
606
- const baseExtras = {
613
+ const base = {
614
+ redis,
607
615
  ...config.ttlSeconds !== void 0 && { ttlSeconds: config.ttlSeconds }
608
616
  };
609
617
  const makeProviderThread = (threadId, threadKey) => createAnthropicThreadManager({
610
- redis,
618
+ ...base,
611
619
  threadId,
612
- key: threadKey,
613
- ...baseExtras
620
+ key: threadKey
614
621
  });
615
622
  const makeTieredBase = (threadId, threadKey) => createTieredThreadManager({
616
- redis,
623
+ ...base,
617
624
  threadId,
618
625
  key: threadKey,
619
626
  idOf: storedMessageId,
620
- ...baseExtras,
621
627
  ...config.coldStore && { coldStore: config.coldStore }
622
628
  });
623
629
  const threadOps = {
@@ -644,11 +650,10 @@ function createAnthropicAdapter(config) {
644
650
  },
645
651
  async forkThread(sourceThreadId, targetThreadId, threadKey) {
646
652
  const thread = createAnthropicThreadManager({
647
- redis,
653
+ ...base,
648
654
  threadId: sourceThreadId,
649
655
  key: threadKey,
650
- hooks: config.hooks,
651
- ...baseExtras
656
+ hooks: config.hooks
652
657
  });
653
658
  await thread.fork(targetThreadId);
654
659
  },
@@ -682,7 +687,7 @@ function createAnthropicAdapter(config) {
682
687
  }
683
688
  const makeInvoker = (model, maxTokens, promptCache) => {
684
689
  const invokerConfig = {
685
- redis,
690
+ ...base,
686
691
  client,
687
692
  model,
688
693
  ...maxTokens !== void 0 ? { maxTokens } : {},