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
|
@@ -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",
|
|
58
|
+
await redis.set(metaKey, "1", { EX: ttlSeconds });
|
|
59
59
|
},
|
|
60
60
|
async load() {
|
|
61
61
|
await assertThreadExists();
|
|
62
|
-
const data = await redis.
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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.
|
|
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(
|
|
110
|
+
await redis.del(existingIds.map(dedupKey));
|
|
115
111
|
}
|
|
116
112
|
if (messages.length > 0) {
|
|
117
|
-
await redis.
|
|
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),
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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.
|
|
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.
|
|
198
|
+
await redis.del([listKey, stateKey]);
|
|
199
|
+
const pipeline = redis.multi();
|
|
204
200
|
if (snapshot.messages.length > 0) {
|
|
205
|
-
pipeline.
|
|
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),
|
|
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",
|
|
208
|
+
pipeline.set(getThreadDedupKey(threadId, id), "1", { EX: ttlSeconds });
|
|
213
209
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
613
|
+
const base = {
|
|
614
|
+
redis,
|
|
607
615
|
...config.ttlSeconds !== void 0 && { ttlSeconds: config.ttlSeconds }
|
|
608
616
|
};
|
|
609
617
|
const makeProviderThread = (threadId, threadKey) => createAnthropicThreadManager({
|
|
610
|
-
|
|
618
|
+
...base,
|
|
611
619
|
threadId,
|
|
612
|
-
key: threadKey
|
|
613
|
-
...baseExtras
|
|
620
|
+
key: threadKey
|
|
614
621
|
});
|
|
615
622
|
const makeTieredBase = (threadId, threadKey) => createTieredThreadManager({
|
|
616
|
-
|
|
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
|
-
|
|
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
|
-
|
|
690
|
+
...base,
|
|
686
691
|
client,
|
|
687
692
|
model,
|
|
688
693
|
...maxTokens !== void 0 ? { maxTokens } : {},
|