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.
- package/README.md +26 -23
- package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +3 -3
- package/dist/adapters/sandbox/daytona/index.d.ts +3 -3
- package/dist/adapters/sandbox/daytona/index.js.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.d.cts +2 -2
- package/dist/adapters/sandbox/daytona/workflow.d.ts +2 -2
- package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
- package/dist/adapters/sandbox/e2b/index.d.cts +1 -1
- package/dist/adapters/sandbox/e2b/index.d.ts +1 -1
- package/dist/adapters/sandbox/e2b/index.js.map +1 -1
- package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
- package/dist/adapters/thread/anthropic/index.cjs +60 -55
- package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/index.d.cts +20 -15
- package/dist/adapters/thread/anthropic/index.d.ts +20 -15
- package/dist/adapters/thread/anthropic/index.js +60 -55
- package/dist/adapters/thread/anthropic/index.js.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.d.cts +7 -7
- package/dist/adapters/thread/anthropic/workflow.d.ts +7 -7
- package/dist/adapters/thread/google-genai/index.cjs +135 -66
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +200 -26
- package/dist/adapters/thread/google-genai/index.d.ts +200 -26
- package/dist/adapters/thread/google-genai/index.js +135 -66
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.d.cts +8 -8
- package/dist/adapters/thread/google-genai/workflow.d.ts +8 -8
- package/dist/adapters/thread/langchain/index.cjs +67 -55
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +20 -15
- package/dist/adapters/thread/langchain/index.d.ts +20 -15
- package/dist/adapters/thread/langchain/index.js +67 -55
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.d.cts +7 -7
- package/dist/adapters/thread/langchain/workflow.d.ts +7 -7
- package/dist/{cold-store-DKMAO1Dd.d.ts → cold-store-DyHodfAB.d.ts} +1 -1
- package/dist/{cold-store-CkWoNtMh.d.cts → cold-store-YOx9nmgR.d.cts} +1 -1
- package/dist/index.cjs +15050 -420
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +79 -83
- package/dist/index.d.ts +79 -83
- package/dist/index.js +15051 -417
- package/dist/index.js.map +1 -1
- package/dist/{proxy-B7CWEV-T.d.cts → proxy-2htgGQrc.d.cts} +1 -1
- package/dist/{proxy-ByFHMVRX.d.ts → proxy-CmiTP4pp.d.ts} +1 -1
- package/dist/{thread-manager-nK-WcFzM.d.ts → thread-manager-BJ5pz5Cx.d.cts} +6 -7
- package/dist/{thread-manager-7AW4rhfu.d.ts → thread-manager-BQAbrYXH.d.cts} +6 -7
- package/dist/{thread-manager-Cibe0X5m.d.cts → thread-manager-CcvltOuq.d.ts} +6 -7
- package/dist/{thread-manager-B9rtMEVn.d.cts → thread-manager-DHAbncHX.d.ts} +6 -7
- package/dist/{types-gVa5XCWD.d.ts → types-BQvXWcft.d.ts} +1 -1
- package/dist/{types-XUUFvrJ9.d.cts → types-BjdqxKYp.d.cts} +709 -709
- package/dist/{types-CJ7tCdl6.d.ts → types-D8W5TnSa.d.cts} +3 -3
- package/dist/{types-CJ7tCdl6.d.cts → types-D8W5TnSa.d.ts} +3 -3
- package/dist/{types-DO4Tkwxo.d.ts → types-DEbkLA06.d.ts} +3 -3
- package/dist/{types-DeVNWqlb.d.ts → types-DiI7mZhI.d.ts} +709 -709
- package/dist/{types-BR-k7h0e.d.cts → types-N_LTWe4b.d.cts} +3 -3
- package/dist/{types-CjY93AWZ.d.cts → types-OEN1xrFg.d.cts} +1 -1
- package/dist/{workflow-uhOIj9D-.d.ts → workflow-CcgD6EUB.d.cts} +34 -3
- package/dist/{workflow-KbGsxpfh.d.cts → workflow-DBjPOKBr.d.ts} +34 -3
- package/dist/workflow.cjs +15008 -377
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +3 -3
- package/dist/workflow.d.ts +3 -3
- package/dist/workflow.js +15009 -374
- package/dist/workflow.js.map +1 -1
- package/package.json +10 -37
- package/src/adapters/thread/anthropic/activities.test.ts +115 -0
- package/src/adapters/thread/anthropic/activities.ts +11 -19
- package/src/adapters/thread/anthropic/fork-transform.test.ts +17 -11
- package/src/adapters/thread/anthropic/model-invoker.test.ts +54 -3
- package/src/adapters/thread/anthropic/model-invoker.ts +11 -1
- package/src/adapters/thread/anthropic/thread-manager.test.ts +2 -2
- package/src/adapters/thread/anthropic/thread-manager.ts +3 -4
- package/src/adapters/thread/google-genai/activities.test.ts +162 -0
- package/src/adapters/thread/google-genai/activities.ts +38 -15
- package/src/adapters/thread/google-genai/fork-transform.test.ts +17 -11
- package/src/adapters/thread/google-genai/model-invoker.test.ts +386 -0
- package/src/adapters/thread/google-genai/model-invoker.ts +118 -23
- package/src/adapters/thread/google-genai/thread-manager.test.ts +2 -2
- package/src/adapters/thread/google-genai/thread-manager.ts +3 -4
- package/src/adapters/thread/langchain/activities.test.ts +88 -0
- package/src/adapters/thread/langchain/activities.ts +15 -12
- package/src/adapters/thread/langchain/fork-transform.test.ts +17 -11
- package/src/adapters/thread/langchain/model-invoker.test.ts +74 -0
- package/src/adapters/thread/langchain/model-invoker.ts +16 -3
- package/src/adapters/thread/langchain/thread-manager.test.ts +2 -2
- package/src/adapters/thread/langchain/thread-manager.ts +3 -4
- package/src/index.ts +2 -2
- package/src/lib/sandbox/capability-types.test.ts +2 -2
- package/src/lib/sandbox/manager.ts +2 -6
- package/src/lib/sandbox/sandbox.test.ts +1 -1
- package/src/lib/sandbox/types.ts +2 -2
- package/src/lib/session/session.integration.test.ts +92 -0
- package/src/lib/session/session.ts +23 -11
- package/src/lib/thread/keys.test.ts +9 -9
- package/src/lib/thread/keys.ts +1 -1
- package/src/lib/thread/manager.test.ts +24 -14
- package/src/lib/thread/manager.ts +19 -23
- package/src/lib/thread/snapshot.test.ts +51 -43
- package/src/lib/thread/snapshot.ts +54 -32
- package/src/lib/thread/test-utils.ts +106 -59
- package/src/lib/thread/tiered.test.ts +1 -1
- package/src/lib/thread/types.ts +2 -2
- package/src/lib/tool-router/router.integration.test.ts +44 -0
- package/src/lib/tool-router/router.ts +140 -32
- package/src/lib/workflow.ts +49 -0
- package/src/{adapters/sandbox/inmemory/proxy.ts → test-utils/in-memory-sandbox-proxy.ts} +5 -16
- package/src/{adapters/sandbox/inmemory/index.ts → test-utils/in-memory-sandbox.ts} +11 -3
- package/src/tools/bash/bash.test.ts +1 -1
- package/src/tools/edit/handler.test.ts +1 -1
- package/tsup.config.ts +2 -4
- package/dist/activities-7OcT_vdR.d.cts +0 -162
- package/dist/activities-zG_FBoY2.d.ts +0 -162
- package/dist/adapters/sandbox/inmemory/index.cjs +0 -214
- package/dist/adapters/sandbox/inmemory/index.cjs.map +0 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +0 -40
- package/dist/adapters/sandbox/inmemory/index.d.ts +0 -40
- package/dist/adapters/sandbox/inmemory/index.js +0 -211
- package/dist/adapters/sandbox/inmemory/index.js.map +0 -1
- package/dist/adapters/sandbox/inmemory/workflow.cjs +0 -36
- package/dist/adapters/sandbox/inmemory/workflow.cjs.map +0 -1
- package/dist/adapters/sandbox/inmemory/workflow.d.cts +0 -27
- package/dist/adapters/sandbox/inmemory/workflow.d.ts +0 -27
- package/dist/adapters/sandbox/inmemory/workflow.js +0 -34
- 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",
|
|
56
|
+
await redis.set(metaKey, "1", { EX: ttlSeconds });
|
|
57
57
|
},
|
|
58
58
|
async load() {
|
|
59
59
|
await assertThreadExists();
|
|
60
|
-
const data = await redis.
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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.
|
|
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(
|
|
108
|
+
await redis.del(existingIds.map(dedupKey));
|
|
113
109
|
}
|
|
114
110
|
if (messages.length > 0) {
|
|
115
|
-
await redis.
|
|
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),
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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.
|
|
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.
|
|
196
|
+
await redis.del([listKey, stateKey]);
|
|
197
|
+
const pipeline = redis.multi();
|
|
202
198
|
if (snapshot.messages.length > 0) {
|
|
203
|
-
pipeline.
|
|
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),
|
|
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",
|
|
206
|
+
pipeline.set(getThreadDedupKey(threadId, id), "1", { EX: ttlSeconds });
|
|
211
207
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
611
|
+
const base = {
|
|
612
|
+
redis,
|
|
605
613
|
...config.ttlSeconds !== void 0 && { ttlSeconds: config.ttlSeconds }
|
|
606
614
|
};
|
|
607
615
|
const makeProviderThread = (threadId, threadKey) => createAnthropicThreadManager({
|
|
608
|
-
|
|
616
|
+
...base,
|
|
609
617
|
threadId,
|
|
610
|
-
key: threadKey
|
|
611
|
-
...baseExtras
|
|
618
|
+
key: threadKey
|
|
612
619
|
});
|
|
613
620
|
const makeTieredBase = (threadId, threadKey) => createTieredThreadManager({
|
|
614
|
-
|
|
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
|
-
|
|
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
|
-
|
|
688
|
+
...base,
|
|
684
689
|
client,
|
|
685
690
|
model,
|
|
686
691
|
...maxTokens !== void 0 ? { maxTokens } : {},
|