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
@@ -53,11 +53,11 @@ function createThreadManager(config) {
53
53
  return {
54
54
  async initialize() {
55
55
  await redis.del(redisKey);
56
- await redis.set(metaKey, "1", "EX", ttlSeconds);
56
+ await redis.set(metaKey, "1", { EX: ttlSeconds });
57
57
  },
58
58
  async load() {
59
59
  await assertThreadExists();
60
- const data = await redis.lrange(redisKey, 0, -1);
60
+ const data = await redis.lRange(redisKey, 0, -1);
61
61
  return data.map(deserialize);
62
62
  },
63
63
  async append(messages) {
@@ -65,22 +65,18 @@ function createThreadManager(config) {
65
65
  await assertThreadExists();
66
66
  if (idOf) {
67
67
  const dedupId = messages.map(idOf).join(":");
68
- await redis.eval(
69
- APPEND_IDEMPOTENT_SCRIPT,
70
- 2,
71
- dedupKey(dedupId),
72
- redisKey,
73
- String(ttlSeconds),
74
- ...messages.map(serialize)
75
- );
68
+ await redis.eval(APPEND_IDEMPOTENT_SCRIPT, {
69
+ keys: [dedupKey(dedupId), redisKey],
70
+ arguments: [String(ttlSeconds), ...messages.map(serialize)]
71
+ });
76
72
  } else {
77
- await redis.rpush(redisKey, ...messages.map(serialize));
73
+ await redis.rPush(redisKey, messages.map(serialize));
78
74
  await redis.expire(redisKey, ttlSeconds);
79
75
  }
80
76
  },
81
77
  async fork(newThreadId) {
82
78
  await assertThreadExists();
83
- const data = await redis.lrange(redisKey, 0, -1);
79
+ const data = await redis.lRange(redisKey, 0, -1);
84
80
  const stateRaw = await redis.get(stateKey);
85
81
  const forked = createThreadManager({
86
82
  ...config,
@@ -89,12 +85,12 @@ function createThreadManager(config) {
89
85
  await forked.initialize();
90
86
  if (data.length > 0) {
91
87
  const newKey = getThreadListKey(key, newThreadId);
92
- await redis.rpush(newKey, ...data);
88
+ await redis.rPush(newKey, data);
93
89
  await redis.expire(newKey, ttlSeconds);
94
90
  }
95
91
  if (stateRaw != null) {
96
92
  const newStateKey = getThreadStateKey(key, newThreadId);
97
- await redis.set(newStateKey, stateRaw, "EX", ttlSeconds);
93
+ await redis.set(newStateKey, stateRaw, { EX: ttlSeconds });
98
94
  }
99
95
  return forked;
100
96
  },
@@ -105,20 +101,20 @@ function createThreadManager(config) {
105
101
  "replaceAll requires the thread manager to be configured with `idOf`"
106
102
  );
107
103
  }
108
- const existing = await redis.lrange(redisKey, 0, -1);
104
+ const existing = await redis.lRange(redisKey, 0, -1);
109
105
  const existingIds = existing.map((raw) => idOf(deserialize(raw))).filter((id) => typeof id === "string");
110
106
  await redis.del(redisKey);
111
107
  if (existingIds.length > 0) {
112
- await redis.del(...existingIds.map(dedupKey));
108
+ await redis.del(existingIds.map(dedupKey));
113
109
  }
114
110
  if (messages.length > 0) {
115
- await redis.rpush(redisKey, ...messages.map(serialize));
111
+ await redis.rPush(redisKey, messages.map(serialize));
116
112
  await redis.expire(redisKey, ttlSeconds);
117
113
  }
118
114
  await redis.expire(metaKey, ttlSeconds);
119
115
  },
120
116
  async delete() {
121
- await redis.del(redisKey, metaKey, stateKey);
117
+ await redis.del([redisKey, metaKey, stateKey]);
122
118
  },
123
119
  async loadState() {
124
120
  const raw = await redis.get(stateKey);
@@ -127,14 +123,14 @@ function createThreadManager(config) {
127
123
  },
128
124
  async saveState(state) {
129
125
  await assertThreadExists();
130
- await redis.set(stateKey, JSON.stringify(state), "EX", ttlSeconds);
126
+ await redis.set(stateKey, JSON.stringify(state), { EX: ttlSeconds });
131
127
  },
132
128
  async deleteState() {
133
129
  await redis.del(stateKey);
134
130
  },
135
131
  async length() {
136
132
  await assertThreadExists();
137
- return redis.llen(redisKey);
133
+ return redis.lLen(redisKey);
138
134
  },
139
135
  async truncateFromId(messageId) {
140
136
  await assertThreadExists();
@@ -143,7 +139,7 @@ function createThreadManager(config) {
143
139
  "truncateFromId requires the thread manager to be configured with `idOf`"
144
140
  );
145
141
  }
146
- const data = await redis.lrange(redisKey, 0, -1);
142
+ const data = await redis.lRange(redisKey, 0, -1);
147
143
  let idx = -1;
148
144
  const removedIds = [];
149
145
  for (let i = 0; i < data.length; i++) {
@@ -158,11 +154,11 @@ function createThreadManager(config) {
158
154
  await redis.del(redisKey);
159
155
  await redis.expire(metaKey, ttlSeconds);
160
156
  } else {
161
- await redis.ltrim(redisKey, 0, idx - 1);
157
+ await redis.lTrim(redisKey, 0, idx - 1);
162
158
  await redis.expire(redisKey, ttlSeconds);
163
159
  }
164
160
  if (removedIds.length > 0) {
165
- await redis.del(...removedIds.map(dedupKey));
161
+ await redis.del(removedIds.map(dedupKey));
166
162
  }
167
163
  }
168
164
  };
@@ -177,7 +173,7 @@ async function encodeSnapshot(config) {
177
173
  }
178
174
  const listKey = getThreadListKey(threadKey, threadId);
179
175
  const stateKey = getThreadStateKey(threadKey, threadId);
180
- const messages = await redis.lrange(listKey, 0, -1);
176
+ const messages = await redis.lRange(listKey, 0, -1);
181
177
  const stateRaw = await redis.get(stateKey);
182
178
  const state = stateRaw == null ? null : JSON.parse(stateRaw);
183
179
  const dedupIds = idOf ? messages.map(idOf) : [];
@@ -197,31 +193,38 @@ async function applySnapshot(config) {
197
193
  }
198
194
  const listKey = getThreadListKey(threadKey, threadId);
199
195
  const stateKey = getThreadStateKey(threadKey, threadId);
200
- await redis.del(listKey, stateKey);
201
- const pipeline = redis.pipeline();
196
+ await redis.del([listKey, stateKey]);
197
+ const pipeline = redis.multi();
202
198
  if (snapshot.messages.length > 0) {
203
- pipeline.rpush(listKey, ...snapshot.messages);
199
+ pipeline.rPush(listKey, snapshot.messages);
204
200
  pipeline.expire(listKey, ttlSeconds);
205
201
  }
206
202
  if (snapshot.state != null) {
207
- pipeline.set(stateKey, JSON.stringify(snapshot.state), "EX", ttlSeconds);
203
+ pipeline.set(stateKey, JSON.stringify(snapshot.state), { EX: ttlSeconds });
208
204
  }
209
205
  for (const id of snapshot.dedupIds) {
210
- pipeline.set(getThreadDedupKey(threadId, id), "1", "EX", ttlSeconds);
206
+ pipeline.set(getThreadDedupKey(threadId, id), "1", { EX: ttlSeconds });
211
207
  }
212
- const results = await pipeline.exec();
213
- if (results) {
214
- const firstErr = results.find(([err]) => err)?.[0] ?? null;
215
- if (firstErr) {
216
- await redis.del(
217
- listKey,
218
- stateKey,
219
- ...snapshot.dedupIds.map((id) => getThreadDedupKey(threadId, id))
220
- ).catch(() => void 0);
221
- throw firstErr;
222
- }
208
+ try {
209
+ await pipeline.execAsPipeline();
210
+ } catch (err) {
211
+ await redis.del([
212
+ listKey,
213
+ stateKey,
214
+ ...snapshot.dedupIds.map((id) => getThreadDedupKey(threadId, id))
215
+ ]).catch(() => void 0);
216
+ throw firstPipelineError(err);
217
+ }
218
+ await redis.set(metaKey, "1", { EX: ttlSeconds });
219
+ }
220
+ function firstPipelineError(err) {
221
+ if (err != null && typeof err === "object" && "replies" in err && Array.isArray(err.replies)) {
222
+ const firstErr = err.replies.find(
223
+ (r) => r instanceof Error
224
+ );
225
+ if (firstErr) return firstErr;
223
226
  }
224
- await redis.set(metaKey, "1", "EX", ttlSeconds);
227
+ return err;
225
228
  }
226
229
  async function clearHotTier(config) {
227
230
  const { redis, threadKey, threadId, dedupIds = [] } = config;
@@ -231,7 +234,7 @@ async function clearHotTier(config) {
231
234
  getThreadStateKey(threadKey, threadId),
232
235
  ...dedupIds.map((id) => getThreadDedupKey(threadId, id))
233
236
  ];
234
- await redis.del(...keys);
237
+ await redis.del(keys);
235
238
  }
236
239
 
237
240
  // src/lib/thread/tiered.ts
@@ -527,7 +530,8 @@ function createAnthropicModelInvoker({
527
530
  model,
528
531
  maxTokens = 16384,
529
532
  promptCache,
530
- hooks
533
+ hooks,
534
+ ttlSeconds
531
535
  }) {
532
536
  return async function invokeAnthropicModel2(config) {
533
537
  const { threadId, threadKey, state, assistantMessageId } = config;
@@ -536,7 +540,8 @@ function createAnthropicModelInvoker({
536
540
  redis,
537
541
  threadId,
538
542
  key: threadKey,
539
- hooks
543
+ hooks,
544
+ ...ttlSeconds !== void 0 && { ttlSeconds }
540
545
  });
541
546
  await thread.truncateFromId(assistantMessageId);
542
547
  const prepared = await thread.prepareForInvocation();
@@ -585,6 +590,7 @@ async function invokeAnthropicModel({
585
590
  maxTokens,
586
591
  promptCache,
587
592
  hooks,
593
+ ttlSeconds,
588
594
  config
589
595
  }) {
590
596
  const invoker = createAnthropicModelInvoker({
@@ -593,7 +599,8 @@ async function invokeAnthropicModel({
593
599
  model,
594
600
  maxTokens,
595
601
  promptCache,
596
- hooks
602
+ hooks,
603
+ ...ttlSeconds !== void 0 && { ttlSeconds }
597
604
  });
598
605
  return invoker(config);
599
606
  }
@@ -601,21 +608,20 @@ async function invokeAnthropicModel({
601
608
  // src/adapters/thread/anthropic/activities.ts
602
609
  function createAnthropicAdapter(config) {
603
610
  const { redis, client } = config;
604
- const baseExtras = {
611
+ const base = {
612
+ redis,
605
613
  ...config.ttlSeconds !== void 0 && { ttlSeconds: config.ttlSeconds }
606
614
  };
607
615
  const makeProviderThread = (threadId, threadKey) => createAnthropicThreadManager({
608
- redis,
616
+ ...base,
609
617
  threadId,
610
- key: threadKey,
611
- ...baseExtras
618
+ key: threadKey
612
619
  });
613
620
  const makeTieredBase = (threadId, threadKey) => createTieredThreadManager({
614
- redis,
621
+ ...base,
615
622
  threadId,
616
623
  key: threadKey,
617
624
  idOf: storedMessageId,
618
- ...baseExtras,
619
625
  ...config.coldStore && { coldStore: config.coldStore }
620
626
  });
621
627
  const threadOps = {
@@ -642,11 +648,10 @@ function createAnthropicAdapter(config) {
642
648
  },
643
649
  async forkThread(sourceThreadId, targetThreadId, threadKey) {
644
650
  const thread = createAnthropicThreadManager({
645
- redis,
651
+ ...base,
646
652
  threadId: sourceThreadId,
647
653
  key: threadKey,
648
- hooks: config.hooks,
649
- ...baseExtras
654
+ hooks: config.hooks
650
655
  });
651
656
  await thread.fork(targetThreadId);
652
657
  },
@@ -680,7 +685,7 @@ function createAnthropicAdapter(config) {
680
685
  }
681
686
  const makeInvoker = (model, maxTokens, promptCache) => {
682
687
  const invokerConfig = {
683
- redis,
688
+ ...base,
684
689
  client,
685
690
  model,
686
691
  ...maxTokens !== void 0 ? { maxTokens } : {},