zeitlich 0.2.36 → 0.2.38
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 +146 -92
- package/dist/{activities-BVI2lTwr.d.ts → activities-BKhMtKDd.d.ts} +4 -2
- package/dist/{activities-hd4aNnZE.d.cts → activities-CDcwkRZs.d.cts} +4 -2
- package/dist/adapters/sandbox/bedrock/index.cjs +17 -14
- package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
- package/dist/adapters/sandbox/bedrock/index.d.cts +7 -6
- package/dist/adapters/sandbox/bedrock/index.d.ts +7 -6
- package/dist/adapters/sandbox/bedrock/index.js +17 -14
- package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
- package/dist/adapters/sandbox/bedrock/workflow.cjs +2 -0
- package/dist/adapters/sandbox/bedrock/workflow.cjs.map +1 -1
- package/dist/adapters/sandbox/bedrock/workflow.d.cts +2 -2
- package/dist/adapters/sandbox/bedrock/workflow.d.ts +2 -2
- package/dist/adapters/sandbox/bedrock/workflow.js +2 -0
- package/dist/adapters/sandbox/bedrock/workflow.js.map +1 -1
- package/dist/adapters/sandbox/daytona/index.cjs +11 -3
- package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +5 -4
- package/dist/adapters/sandbox/daytona/index.d.ts +5 -4
- package/dist/adapters/sandbox/daytona/index.js +11 -3
- package/dist/adapters/sandbox/daytona/index.js.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.cjs +2 -0
- package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/daytona/workflow.d.ts +1 -1
- package/dist/adapters/sandbox/daytona/workflow.js +2 -0
- package/dist/adapters/sandbox/daytona/workflow.js.map +1 -1
- package/dist/adapters/sandbox/e2b/index.cjs +73 -12
- package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
- package/dist/adapters/sandbox/e2b/index.d.cts +26 -4
- package/dist/adapters/sandbox/e2b/index.d.ts +26 -4
- package/dist/adapters/sandbox/e2b/index.js +73 -12
- package/dist/adapters/sandbox/e2b/index.js.map +1 -1
- package/dist/adapters/sandbox/e2b/workflow.cjs +2 -0
- package/dist/adapters/sandbox/e2b/workflow.cjs.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/sandbox/e2b/workflow.js +2 -0
- package/dist/adapters/sandbox/e2b/workflow.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.cjs +8 -3
- package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +5 -4
- package/dist/adapters/sandbox/inmemory/index.d.ts +5 -4
- package/dist/adapters/sandbox/inmemory/index.js +8 -3
- package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.cjs +2 -0
- package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.js +2 -0
- package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -1
- package/dist/adapters/thread/anthropic/index.cjs +94 -39
- package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/index.d.cts +5 -5
- package/dist/adapters/thread/anthropic/index.d.ts +5 -5
- package/dist/adapters/thread/anthropic/index.js +94 -39
- package/dist/adapters/thread/anthropic/index.js.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.cjs +7 -2
- package/dist/adapters/thread/anthropic/workflow.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.d.cts +5 -5
- package/dist/adapters/thread/anthropic/workflow.d.ts +5 -5
- package/dist/adapters/thread/anthropic/workflow.js +7 -2
- package/dist/adapters/thread/anthropic/workflow.js.map +1 -1
- package/dist/adapters/thread/google-genai/index.cjs +77 -28
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +5 -5
- package/dist/adapters/thread/google-genai/index.d.ts +5 -5
- package/dist/adapters/thread/google-genai/index.js +77 -28
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.cjs +7 -2
- package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.d.cts +5 -5
- package/dist/adapters/thread/google-genai/workflow.d.ts +5 -5
- package/dist/adapters/thread/google-genai/workflow.js +7 -2
- package/dist/adapters/thread/google-genai/workflow.js.map +1 -1
- package/dist/adapters/thread/langchain/index.cjs +57 -10
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +5 -5
- package/dist/adapters/thread/langchain/index.d.ts +5 -5
- package/dist/adapters/thread/langchain/index.js +57 -10
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.cjs +7 -2
- package/dist/adapters/thread/langchain/workflow.cjs.map +1 -1
- package/dist/adapters/thread/langchain/workflow.d.cts +5 -5
- package/dist/adapters/thread/langchain/workflow.d.ts +5 -5
- package/dist/adapters/thread/langchain/workflow.js +7 -2
- package/dist/adapters/thread/langchain/workflow.js.map +1 -1
- package/dist/index.cjs +322 -146
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -14
- package/dist/index.d.ts +20 -14
- package/dist/index.js +323 -147
- package/dist/index.js.map +1 -1
- package/dist/{proxy-BjdFGPTm.d.ts → proxy-CUlKSvZS.d.ts} +1 -1
- package/dist/{proxy-7RnVaPdJ.d.cts → proxy-D_3x7RN4.d.cts} +1 -1
- package/dist/{thread-manager-CbpiGq1L.d.ts → thread-manager-CVu7o2cs.d.ts} +4 -2
- package/dist/{thread-manager-DzXm9eeI.d.cts → thread-manager-HSwyh28L.d.cts} +4 -2
- package/dist/{thread-manager-BBzNgQWH.d.cts → thread-manager-c1gPopAG.d.ts} +4 -2
- package/dist/{thread-manager-DjN5JYul.d.ts → thread-manager-wGi-LqIP.d.cts} +4 -2
- package/dist/{types-Mc_4BCfT.d.cts → types-BH_IRryz.d.ts} +10 -1
- package/dist/{types-yiXmqedU.d.ts → types-BaOw4hKI.d.cts} +10 -1
- package/dist/{types-DQ1l_gXL.d.cts → types-C06FwR96.d.cts} +121 -17
- package/dist/{types-wiGLvxWf.d.ts → types-DAsQ21Rt.d.ts} +1 -1
- package/dist/{types-CADc5V_P.d.ts → types-DNr31FzL.d.ts} +121 -17
- package/dist/{types-CBH54cwr.d.cts → types-lm8tMNJQ.d.cts} +1 -1
- package/dist/{types-DxCpFNv_.d.cts → types-yx0LzPGn.d.cts} +44 -5
- package/dist/{types-DxCpFNv_.d.ts → types-yx0LzPGn.d.ts} +44 -5
- package/dist/{workflow-DhtWRovz.d.cts → workflow-CSCkpwAL.d.ts} +2 -2
- package/dist/{workflow-P2pTSfKu.d.ts → workflow-DuvMZ8Vm.d.cts} +2 -2
- package/dist/workflow.cjs +274 -130
- 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 +275 -131
- package/dist/workflow.js.map +1 -1
- package/package.json +2 -2
- package/src/adapters/sandbox/bedrock/filesystem.ts +6 -12
- package/src/adapters/sandbox/bedrock/index.ts +22 -11
- package/src/adapters/sandbox/bedrock/proxy.ts +2 -0
- package/src/adapters/sandbox/daytona/index.ts +18 -3
- package/src/adapters/sandbox/daytona/proxy.ts +2 -0
- package/src/adapters/sandbox/e2b/filesystem.ts +5 -4
- package/src/adapters/sandbox/e2b/index.ts +87 -14
- package/src/adapters/sandbox/e2b/proxy.ts +2 -0
- package/src/adapters/sandbox/e2b/types.ts +16 -0
- package/src/adapters/sandbox/inmemory/index.ts +17 -3
- package/src/adapters/sandbox/inmemory/proxy.ts +2 -0
- package/src/adapters/thread/anthropic/activities.ts +58 -26
- package/src/adapters/thread/anthropic/model-invoker.ts +18 -7
- package/src/adapters/thread/anthropic/proxy.ts +6 -2
- package/src/adapters/thread/anthropic/thread-manager.test.ts +26 -7
- package/src/adapters/thread/anthropic/thread-manager.ts +63 -46
- package/src/adapters/thread/google-genai/activities.ts +20 -2
- package/src/adapters/thread/google-genai/model-invoker.ts +27 -7
- package/src/adapters/thread/google-genai/proxy.ts +6 -2
- package/src/adapters/thread/google-genai/thread-manager.test.ts +13 -3
- package/src/adapters/thread/google-genai/thread-manager.ts +57 -33
- package/src/adapters/thread/langchain/activities.ts +55 -24
- package/src/adapters/thread/langchain/hooks.test.ts +36 -49
- package/src/adapters/thread/langchain/hooks.ts +18 -5
- package/src/adapters/thread/langchain/model-invoker.ts +5 -4
- package/src/adapters/thread/langchain/proxy.ts +6 -2
- package/src/adapters/thread/langchain/thread-manager.test.ts +5 -1
- package/src/adapters/thread/langchain/thread-manager.ts +23 -9
- package/src/index.ts +4 -1
- package/src/lib/activity.ts +16 -6
- package/src/lib/hooks/types.ts +6 -6
- package/src/lib/lifecycle.ts +18 -3
- package/src/lib/model/proxy.ts +2 -2
- package/src/lib/model/types.ts +10 -0
- package/src/lib/observability/hooks.ts +4 -5
- package/src/lib/observability/index.ts +1 -4
- package/src/lib/sandbox/manager.ts +45 -20
- package/src/lib/sandbox/node-fs.ts +3 -6
- package/src/lib/sandbox/sandbox.test.ts +36 -3
- package/src/lib/sandbox/tree.integration.test.ts +10 -3
- package/src/lib/sandbox/types.ts +60 -6
- package/src/lib/session/session-edge-cases.integration.test.ts +316 -14
- package/src/lib/session/session.integration.test.ts +161 -1
- package/src/lib/session/session.ts +106 -21
- package/src/lib/session/types.ts +25 -5
- package/src/lib/skills/fs-provider.ts +12 -8
- package/src/lib/skills/handler.ts +1 -1
- package/src/lib/skills/parse.ts +3 -1
- package/src/lib/skills/register.ts +1 -3
- package/src/lib/skills/skills.integration.test.ts +25 -15
- package/src/lib/state/manager.integration.test.ts +12 -2
- package/src/lib/subagent/define.ts +1 -1
- package/src/lib/subagent/handler.ts +186 -71
- package/src/lib/subagent/index.ts +1 -5
- package/src/lib/subagent/register.ts +3 -2
- package/src/lib/subagent/signals.ts +1 -10
- package/src/lib/subagent/subagent.integration.test.ts +526 -248
- package/src/lib/subagent/tool.ts +4 -3
- package/src/lib/subagent/types.ts +50 -20
- package/src/lib/subagent/workflow.ts +9 -49
- package/src/lib/thread/id.test.ts +1 -1
- package/src/lib/thread/id.ts +1 -2
- package/src/lib/thread/manager.ts +18 -0
- package/src/lib/thread/proxy.ts +4 -4
- package/src/lib/thread/types.ts +20 -3
- package/src/lib/tool-router/index.ts +3 -5
- package/src/lib/tool-router/router-edge-cases.integration.test.ts +93 -1
- package/src/lib/tool-router/router.integration.test.ts +12 -0
- package/src/lib/tool-router/router.ts +90 -16
- package/src/lib/tool-router/types.ts +45 -4
- package/src/lib/tool-router/with-sandbox.ts +19 -5
- package/src/lib/virtual-fs/filesystem.ts +1 -1
- package/src/lib/virtual-fs/index.ts +5 -1
- package/src/lib/virtual-fs/mutations.ts +2 -4
- package/src/lib/virtual-fs/queries.ts +9 -5
- package/src/lib/virtual-fs/types.ts +4 -1
- package/src/lib/virtual-fs/virtual-fs.test.ts +9 -11
- package/src/lib/workflow.test.ts +7 -4
- package/src/lib/workflow.ts +1 -5
- package/src/tools/ask-user-question/tool.ts +1 -3
- package/src/tools/glob/handler.ts +1 -4
- package/src/tools/task-get/handler.ts +4 -5
- package/src/tools/task-list/handler.ts +1 -4
- package/src/tools/task-update/handler.ts +4 -5
- package/src/workflow.ts +22 -7
- package/tsup.config.ts +9 -6
- package/src/lib/.env +0 -1
- package/src/tools/bash/.env +0 -1
|
@@ -79,6 +79,20 @@ function createThreadManager(config) {
|
|
|
79
79
|
},
|
|
80
80
|
async delete() {
|
|
81
81
|
await redis.del(redisKey, metaKey);
|
|
82
|
+
},
|
|
83
|
+
async length() {
|
|
84
|
+
await assertThreadExists();
|
|
85
|
+
return redis.llen(redisKey);
|
|
86
|
+
},
|
|
87
|
+
async truncate(length) {
|
|
88
|
+
await assertThreadExists();
|
|
89
|
+
if (length <= 0) {
|
|
90
|
+
await redis.del(redisKey);
|
|
91
|
+
await redis.expire(metaKey, THREAD_TTL_SECONDS);
|
|
92
|
+
} else {
|
|
93
|
+
await redis.ltrim(redisKey, 0, length - 1);
|
|
94
|
+
await redis.expire(redisKey, THREAD_TTL_SECONDS);
|
|
95
|
+
}
|
|
82
96
|
}
|
|
83
97
|
};
|
|
84
98
|
}
|
|
@@ -120,46 +134,56 @@ function createAnthropicThreadManager(config) {
|
|
|
120
134
|
const base = createThreadManager(baseConfig);
|
|
121
135
|
const helpers = {
|
|
122
136
|
async appendUserMessage(id, content) {
|
|
123
|
-
await base.append([
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
137
|
+
await base.append([
|
|
138
|
+
{
|
|
139
|
+
id,
|
|
140
|
+
message: { role: "user", content: toContentBlocks(content) }
|
|
141
|
+
}
|
|
142
|
+
]);
|
|
127
143
|
},
|
|
128
144
|
async appendSystemMessage(id, content) {
|
|
129
145
|
await base.initialize();
|
|
130
|
-
await base.append([
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
146
|
+
await base.append([
|
|
147
|
+
{
|
|
148
|
+
id,
|
|
149
|
+
// Stored under a user-role placeholder to satisfy the MessageParam
|
|
150
|
+
// shape; the `isSystem` flag steers extraction in prepareForInvocation.
|
|
151
|
+
message: {
|
|
152
|
+
role: "user",
|
|
153
|
+
content
|
|
154
|
+
},
|
|
155
|
+
isSystem: true
|
|
156
|
+
}
|
|
157
|
+
]);
|
|
140
158
|
},
|
|
141
159
|
async appendAssistantMessage(id, content) {
|
|
142
|
-
await base.append([
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
160
|
+
await base.append([
|
|
161
|
+
{
|
|
162
|
+
id,
|
|
163
|
+
message: {
|
|
164
|
+
role: "assistant",
|
|
165
|
+
content
|
|
166
|
+
}
|
|
147
167
|
}
|
|
148
|
-
|
|
168
|
+
]);
|
|
149
169
|
},
|
|
150
170
|
async appendToolResult(id, toolCallId, _toolName, content) {
|
|
151
171
|
const toolContent = typeof content === "string" ? content : Array.isArray(content) ? content : JSON.stringify(content);
|
|
152
|
-
await base.append([
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
172
|
+
await base.append([
|
|
173
|
+
{
|
|
174
|
+
id,
|
|
175
|
+
message: {
|
|
176
|
+
role: "user",
|
|
177
|
+
content: [
|
|
178
|
+
{
|
|
179
|
+
type: "tool_result",
|
|
180
|
+
tool_use_id: toolCallId,
|
|
181
|
+
content: toolContent
|
|
182
|
+
}
|
|
183
|
+
]
|
|
184
|
+
}
|
|
161
185
|
}
|
|
162
|
-
|
|
186
|
+
]);
|
|
163
187
|
},
|
|
164
188
|
async prepareForInvocation() {
|
|
165
189
|
const stored = await base.load();
|
|
@@ -177,7 +201,8 @@ function createAnthropicThreadManager(config) {
|
|
|
177
201
|
const messages = mergeConsecutiveMessages(conversationMessages);
|
|
178
202
|
return {
|
|
179
203
|
messages: onPreparedMessage ? messages.map((msg, i) => onPreparedMessage(msg, i, messages)) : messages,
|
|
180
|
-
...system ? { system } : {}
|
|
204
|
+
...system ? { system } : {},
|
|
205
|
+
storedLength: stored.length
|
|
181
206
|
};
|
|
182
207
|
}
|
|
183
208
|
};
|
|
@@ -210,8 +235,13 @@ function createAnthropicModelInvoker({
|
|
|
210
235
|
return async function invokeAnthropicModel2(config) {
|
|
211
236
|
const { threadId, threadKey, state } = config;
|
|
212
237
|
const { heartbeat, signal } = getActivityContext();
|
|
213
|
-
const thread = createAnthropicThreadManager({
|
|
214
|
-
|
|
238
|
+
const thread = createAnthropicThreadManager({
|
|
239
|
+
redis,
|
|
240
|
+
threadId,
|
|
241
|
+
key: threadKey,
|
|
242
|
+
hooks
|
|
243
|
+
});
|
|
244
|
+
const { messages, system, storedLength } = await thread.prepareForInvocation();
|
|
215
245
|
const anthropicTools = toAnthropicTools(state.tools);
|
|
216
246
|
const tools = anthropicTools.length > 0 ? anthropicTools : void 0;
|
|
217
247
|
const params = {
|
|
@@ -241,7 +271,8 @@ function createAnthropicModelInvoker({
|
|
|
241
271
|
outputTokens: response.usage.output_tokens,
|
|
242
272
|
cachedWriteTokens: response.usage.cache_creation_input_tokens ?? void 0,
|
|
243
273
|
cachedReadTokens: response.usage.cache_read_input_tokens ?? void 0
|
|
244
|
-
}
|
|
274
|
+
},
|
|
275
|
+
threadLengthAtCall: storedLength
|
|
245
276
|
};
|
|
246
277
|
};
|
|
247
278
|
}
|
|
@@ -269,24 +300,44 @@ function createAnthropicAdapter(config) {
|
|
|
269
300
|
const { redis, client } = config;
|
|
270
301
|
const threadOps = {
|
|
271
302
|
async initializeThread(threadId, threadKey) {
|
|
272
|
-
const thread = createAnthropicThreadManager({
|
|
303
|
+
const thread = createAnthropicThreadManager({
|
|
304
|
+
redis,
|
|
305
|
+
threadId,
|
|
306
|
+
key: threadKey
|
|
307
|
+
});
|
|
273
308
|
await thread.initialize();
|
|
274
309
|
},
|
|
275
310
|
async appendHumanMessage(threadId, id, content, threadKey) {
|
|
276
|
-
const thread = createAnthropicThreadManager({
|
|
311
|
+
const thread = createAnthropicThreadManager({
|
|
312
|
+
redis,
|
|
313
|
+
threadId,
|
|
314
|
+
key: threadKey
|
|
315
|
+
});
|
|
277
316
|
await thread.appendUserMessage(id, content);
|
|
278
317
|
},
|
|
279
318
|
async appendSystemMessage(threadId, id, content, threadKey) {
|
|
280
|
-
const thread = createAnthropicThreadManager({
|
|
319
|
+
const thread = createAnthropicThreadManager({
|
|
320
|
+
redis,
|
|
321
|
+
threadId,
|
|
322
|
+
key: threadKey
|
|
323
|
+
});
|
|
281
324
|
await thread.appendSystemMessage(id, content);
|
|
282
325
|
},
|
|
283
326
|
async appendToolResult(id, cfg) {
|
|
284
327
|
const { threadId, threadKey, toolCallId, toolName, content } = cfg;
|
|
285
|
-
const thread = createAnthropicThreadManager({
|
|
328
|
+
const thread = createAnthropicThreadManager({
|
|
329
|
+
redis,
|
|
330
|
+
threadId,
|
|
331
|
+
key: threadKey
|
|
332
|
+
});
|
|
286
333
|
await thread.appendToolResult(id, toolCallId, toolName, content);
|
|
287
334
|
},
|
|
288
335
|
async appendAgentMessage(threadId, id, message, threadKey) {
|
|
289
|
-
const thread = createAnthropicThreadManager({
|
|
336
|
+
const thread = createAnthropicThreadManager({
|
|
337
|
+
redis,
|
|
338
|
+
threadId,
|
|
339
|
+
key: threadKey
|
|
340
|
+
});
|
|
290
341
|
await thread.appendAssistantMessage(id, message.content);
|
|
291
342
|
},
|
|
292
343
|
async forkThread(sourceThreadId, targetThreadId, threadKey) {
|
|
@@ -296,6 +347,10 @@ function createAnthropicAdapter(config) {
|
|
|
296
347
|
key: threadKey
|
|
297
348
|
});
|
|
298
349
|
await thread.fork(targetThreadId);
|
|
350
|
+
},
|
|
351
|
+
async truncateThread(threadId, length, threadKey) {
|
|
352
|
+
const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });
|
|
353
|
+
await thread.truncate(length);
|
|
299
354
|
}
|
|
300
355
|
};
|
|
301
356
|
function createActivities(scope) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/thread/manager.ts","../../../../src/adapters/thread/anthropic/thread-manager.ts","../../../../src/lib/activity.ts","../../../../src/adapters/thread/anthropic/model-invoker.ts","../../../../src/adapters/thread/anthropic/activities.ts"],"names":["invokeAnthropicModel"],"mappings":";;;AAEA,IAAM,kBAAA,GAAqB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAW1C,IAAM,wBAAA,GAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAYjC,SAAS,YAAA,CAAa,UAAkB,GAAA,EAAqB;AAC3D,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AAClC;AAMO,SAAS,oBACd,MAAA,EACsB;AACtB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA,GAAM,UAAA;AAAA,IACN,SAAA,GAAY,CAAC,CAAA,KAAiB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC9C,WAAA,GAAc,CAAC,GAAA,KAAmB,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IAChD;AAAA,GACF,GAAI,MAAA;AACJ,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,GAAG,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,CAAA,EAAG,GAAG,CAAA,KAAA,CAAO,CAAA;AAEpD,EAAA,eAAe,kBAAA,GAAoC;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,CAAA,QAAA,EAAW,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,UAAA,GAA4B;AAChC,MAAA,MAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AACxB,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,GAAA,EAAK,MAAM,kBAAkB,CAAA;AAAA,IACxD,CAAA;AAAA,IAEA,MAAM,IAAA,GAAqB;AACzB,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAM,OAAO,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,GAAG,EAAE,CAAA;AAC/C,MAAA,OAAO,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,IAC7B,CAAA;AAAA,IAEA,MAAM,OAAO,QAAA,EAA8B;AACzC,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,kBAAA,EAAmB;AAEzB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,CAAE,KAAK,GAAG,CAAA;AAC3C,QAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,EAAU,CAAA,MAAA,EAAS,OAAO,CAAA,CAAE,CAAA;AAC1D,QAAA,MAAM,KAAA,CAAM,IAAA;AAAA,UACV,wBAAA;AAAA,UACA,CAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAO,kBAAkB,CAAA;AAAA,UACzB,GAAG,QAAA,CAAS,GAAA,CAAI,SAAS;AAAA,SAC3B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,MAAM,KAAA,CAAM,QAAA,EAAU,GAAG,QAAA,CAAS,GAAA,CAAI,SAAS,CAAC,CAAA;AACtD,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,kBAAkB,CAAA;AAAA,MACjD;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAK,WAAA,EAAoD;AAC7D,MAAA,MAAM,kBAAA,EAAmB;AACzB,MAAA,MAAM,OAAO,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,GAAG,EAAE,CAAA;AAC/C,MAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,QACjC,GAAG,MAAA;AAAA,QACH,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,MAAM,OAAO,UAAA,EAAW;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,WAAA,EAAa,GAAG,CAAA;AAC5C,QAAA,MAAM,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,GAAG,IAAI,CAAA;AACjC,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,kBAAkB,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,MAAA,GAAwB;AAC5B,MAAA,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AAAA,IACnC;AAAA,GACF;AACF;;;ACrDA,SAAS,gBAAgB,GAAA,EAA4B;AACnD,EAAA,OAAO,GAAA,CAAI,EAAA;AACb;AAGA,SAAS,gBACP,OAAA,EACwC;AACxC,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,yBACP,QAAA,EACmC;AACnC,EAAA,MAAM,SAA4C,EAAC;AACnD,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,GAAA,CAAI,IAAA,EAAM;AAClC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAC1C,IAAA,CAAK,OAAA,GACL,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAS,CAAA;AAClD,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GACxC,GAAA,CAAI,OAAA,GACJ,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AACjD,MAAA,IAAA,CAAK,OAAA,GAAU,CAAC,GAAG,WAAA,EAAa,GAAG,UAAU,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAG,GAAA;AAAA,QACH,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GAC9B,CAAC,GAAG,GAAA,CAAI,OAAO,CAAA,GACf,GAAA,CAAI;AAAA,OACT,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,6BACd,MAAA,EACwB;AACxB,EAAA,MAAM,UAAA,GAAiD;AAAA,IACrD,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,IAAA,GAAO,oBAAoB,UAAU,CAAA;AAE3C,EAAA,MAAM,OAAA,GAA2D;AAAA,IAC/D,MAAM,iBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,IAAA,CAAK,OAAO,CAAC;AAAA,QACjB,EAAA;AAAA,QACA,SAAS,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,eAAA,CAAgB,OAAO,CAAA;AAAE,OAC5D,CAAC,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,mBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,KAAK,UAAA,EAAW;AACtB,MAAA,MAAM,IAAA,CAAK,OAAO,CAAC;AAAA,QACjB,EAAA;AAAA;AAAA;AAAA,QAGA,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN;AAAA,SACF;AAAA,QACA,QAAA,EAAU;AAAA,OACX,CAAC,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,sBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,MAAA,MAAM,IAAA,CAAK,OAAO,CAAC;AAAA,QACjB,EAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,WAAA;AAAA,UACN;AAAA;AACF,OACD,CAAC,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,gBAAA,CACJ,EAAA,EACA,UAAA,EACA,WACA,OAAA,EACe;AACf,MAAA,MAAM,WAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,OAAA,GACA,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAClB,OAAA,GACD,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC9B,MAAA,MAAM,IAAA,CAAK,OAAO,CAAC;AAAA,QACjB,EAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,aAAA;AAAA,YACN,WAAA,EAAa,UAAA;AAAA,YACb,OAAA,EAAS;AAAA,WACV;AAAA;AACH,OACD,CAAC,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,oBAAA,GAA4D;AAChE,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK;AAC/B,MAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAkB,GAAI,MAAA,CAAO,SAAS,EAAC;AACjE,MAAA,MAAM,MAAA,GAAS,gBAAA,GACX,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM,gBAAA,CAAiB,GAAA,EAAK,CAAA,EAAG,MAAM,CAAC,CAAA,GACvD,MAAA;AAEJ,MAAA,IAAI,MAAA;AACJ,MAAA,MAAM,uBAA0D,EAAC;AAEjE,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,MAAA,GAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,QAGxB,CAAA,MAAO;AACL,UAAA,oBAAA,CAAqB,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,QACxC;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,yBAAyB,oBAAoB,CAAA;AAC9D,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,iBAAA,GACN,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM,iBAAA,CAAkB,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAC,CAAA,GAC5D,QAAA;AAAA,QACJ,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW;AAAC,OAC7B;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AACpC;ACvMO,SAAS,kBAAA,GAGd;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,QAAQ,OAAA,EAAQ;AAC5B,IAAA,OAAO,EAAE,WAAW,MAAM,GAAA,CAAI,WAAU,EAAG,MAAA,EAAQ,IAAI,kBAAA,EAAmB;AAAA,EAC5E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACRA,SAAS,iBACP,KAAA,EAC2B;AAC3B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,cAAc,CAAA,CAAE;AAAA,GAClB,CAAE,CAAA;AACJ;AA0BO,SAAS,2BAAA,CAA4B;AAAA,EAC1C,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAAgC;AAC9B,EAAA,OAAO,eAAeA,sBACpB,MAAA,EACoD;AACpD,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM,GAAI,MAAA;AACvC,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,kBAAA,EAAmB;AAEjD,IAAA,MAAM,MAAA,GAAS,6BAA6B,EAAE,KAAA,EAAO,UAAU,GAAA,EAAK,SAAA,EAAW,OAAO,CAAA;AACtF,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,MAAM,OAAO,oBAAA,EAAqB;AAE/D,IAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,GAAiB,MAAA;AAE3D,IAAA,MAAM,MAAA,GAAwC;AAAA,MAC5C,KAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,QAAA;AAAA,MACA,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,MAC3B,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,KAC3B;AAEA,IAAA,MAAM,SAAS,MAAA,CAAO,QAAA,CAAS,OAAO,MAAA,EAAQ,EAAE,QAAQ,CAAA;AAExD,IAAA,WAAA,MAAiB,UAAU,MAAA,EAAQ;AACjC,MAAA,SAAA,IAAY;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAuC,MAAM,MAAA,CAAO,YAAA,EAAa;AAEvE,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjC,CAAC,KAAA,KACC,KAAA,CAAM,IAAA,KAAS;AAAA,KACnB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,YAAA,EAAc,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QACnC,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,IAAA,EAAO,EAAA,CAAG,KAAA,IAAqC;AAAC,OAClD,CAAE,CAAA;AAAA,MACF,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,SAAS,KAAA,CAAM,YAAA;AAAA,QAC5B,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,QAC7B,iBAAA,EAAmB,QAAA,CAAS,KAAA,CAAM,2BAAA,IAA+B,MAAA;AAAA,QACjE,gBAAA,EAAkB,QAAA,CAAS,KAAA,CAAM,uBAAA,IAA2B;AAAA;AAC9D,KACF;AAAA,EACF,CAAA;AACF;AAOA,eAAsB,oBAAA,CAAqB;AAAA,EACzC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAOuD;AACrD,EAAA,MAAM,UAAU,2BAAA,CAA4B;AAAA,IAC1C,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,QAAQ,MAAM,CAAA;AACvB;;;AC9GA,IAAM,cAAA,GAAiB,WAAA;AA0GhB,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA;AAE1B,EAAA,MAAM,SAAA,GAAyC;AAAA,IAC7C,MAAM,gBAAA,CAAiB,QAAA,EAAkB,SAAA,EAAmC;AAC1E,MAAA,MAAM,SAAS,4BAAA,CAA6B,EAAE,OAAO,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA;AAC/E,MAAA,MAAM,OAAO,UAAA,EAAW;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,kBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B,EAAE,OAAO,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA;AAC/E,MAAA,MAAM,MAAA,CAAO,iBAAA,CAAkB,EAAA,EAAI,OAAO,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,MAAM,mBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B,EAAE,OAAO,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA;AAC/E,MAAA,MAAM,MAAA,CAAO,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,IAEA,MAAM,gBAAA,CAAiB,EAAA,EAAY,GAAA,EAAsC;AACvE,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,QAAA,EAAU,SAAQ,GAAI,GAAA;AAC/D,MAAA,MAAM,SAAS,4BAAA,CAA6B,EAAE,OAAO,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA;AAC/E,MAAA,MAAM,MAAA,CAAO,gBAAA,CAAiB,EAAA,EAAI,UAAA,EAAY,UAAU,OAAO,CAAA;AAAA,IACjE,CAAA;AAAA,IAEA,MAAM,kBAAA,CACJ,QAAA,EACA,EAAA,EACA,SACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B,EAAE,OAAO,QAAA,EAAU,GAAA,EAAK,WAAW,CAAA;AAC/E,MAAA,MAAM,MAAA,CAAO,sBAAA,CAAuB,EAAA,EAAI,OAAA,CAAQ,OAAO,CAAA;AAAA,IACzD,CAAA;AAAA,IAEA,MAAM,UAAA,CACJ,cAAA,EACA,cAAA,EACA,SAAA,EACe;AACf,MAAA,MAAM,SAAS,4BAAA,CAA6B;AAAA,QAC1C,KAAA;AAAA,QACA,QAAA,EAAU,cAAA;AAAA,QACV,GAAA,EAAK;AAAA,OACN,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,KAAK,cAAc,CAAA;AAAA,IAClC;AAAA,GACF;AAEA,EAAA,SAAS,iBACP,KAAA,EACuB;AACvB,IAAA,MAAM,SAAS,KAAA,GACX,CAAA,EAAG,cAAc,CAAA,EAAG,MAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,cAAA;AACJ,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KACX,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACvC,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,OAAO,OAAA,CAAQ,SAAS,EAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC;AAAA,KACrE;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,CAClB,KAAA,EACA,SAAA,KAC6C;AAC7C,IAAA,MAAM,aAAA,GAA6C;AAAA,MACjD,KAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MAC/C,GAAI,MAAA,CAAO,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,MAAA,GAChD,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAC9B,EAAC;AAAA,MACL,OAAO,MAAA,CAAO;AAAA,KAChB;AACA,IAAA,OAAO,4BAA4B,aAAa,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,UAAoD,MAAA,CAAO,KAAA,GAC7D,YAAY,MAAA,CAAO,KAAK,KACtB,MAAM;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF,CAAA,CAAA;AAEJ,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,kBAAA,EAAoB,WAAA;AAAA,IACpB,WAAA,EAAa,CAAC,OAAA,KAAY;AAAA,GAC5B;AACF","file":"index.js","sourcesContent":["import type { ThreadManagerConfig, BaseThreadManager } from \"./types\";\n\nconst THREAD_TTL_SECONDS = 60 * 60 * 24 * 90; // 90 days\n\n/**\n * Lua script for atomic idempotent append.\n * Checks a dedup key; if it exists the message was already appended and we\n * return 0. Otherwise appends all messages to the list, sets TTL on both\n * the list and the dedup key, and returns 1.\n *\n * KEYS[1] = dedup key, KEYS[2] = list key\n * ARGV[1] = TTL seconds, ARGV[2..N] = serialised messages\n */\nconst APPEND_IDEMPOTENT_SCRIPT = `\nif redis.call('EXISTS', KEYS[1]) == 1 then\n return 0\nend\nfor i = 2, #ARGV do\n redis.call('RPUSH', KEYS[2], ARGV[i])\nend\nredis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))\nredis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))\nreturn 1\n`;\n\nfunction getThreadKey(threadId: string, key: string): string {\n return `${key}:thread:${threadId}`;\n}\n\n/**\n * Creates a generic thread manager for handling conversation state in Redis.\n * Framework-agnostic — works with any serializable message type.\n */\nexport function createThreadManager<T>(\n config: ThreadManagerConfig<T>\n): BaseThreadManager<T> {\n const {\n redis,\n threadId,\n key = \"messages\",\n serialize = (m: T): string => JSON.stringify(m),\n deserialize = (raw: string): T => JSON.parse(raw) as T,\n idOf,\n } = config;\n const redisKey = getThreadKey(threadId, key);\n const metaKey = getThreadKey(threadId, `${key}:meta`);\n\n async function assertThreadExists(): Promise<void> {\n const exists = await redis.exists(metaKey);\n if (!exists) {\n throw new Error(`Thread \"${threadId}\" (key: ${key}) does not exist`);\n }\n }\n\n return {\n async initialize(): Promise<void> {\n await redis.del(redisKey);\n await redis.set(metaKey, \"1\", \"EX\", THREAD_TTL_SECONDS);\n },\n\n async load(): Promise<T[]> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n return data.map(deserialize);\n },\n\n async append(messages: T[]): Promise<void> {\n if (messages.length === 0) return;\n await assertThreadExists();\n\n if (idOf) {\n const dedupId = messages.map(idOf).join(\":\");\n const dedupKey = getThreadKey(threadId, `dedup:${dedupId}`);\n await redis.eval(\n APPEND_IDEMPOTENT_SCRIPT,\n 2,\n dedupKey,\n redisKey,\n String(THREAD_TTL_SECONDS),\n ...messages.map(serialize)\n );\n } else {\n await redis.rpush(redisKey, ...messages.map(serialize));\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n },\n\n async fork(newThreadId: string): Promise<BaseThreadManager<T>> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n const forked = createThreadManager({\n ...config,\n threadId: newThreadId,\n });\n await forked.initialize();\n if (data.length > 0) {\n const newKey = getThreadKey(newThreadId, key);\n await redis.rpush(newKey, ...data);\n await redis.expire(newKey, THREAD_TTL_SECONDS);\n }\n return forked;\n },\n\n async delete(): Promise<void> {\n await redis.del(redisKey, metaKey);\n },\n };\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { JsonValue } from \"../../../lib/state/types\";\nimport { createThreadManager } from \"../../../lib/thread/manager\";\nimport type {\n ProviderThreadManager,\n ThreadManagerConfig,\n ThreadManagerHooks,\n} from \"../../../lib/thread/types\";\n\n/** SDK-native content type for Anthropic human messages */\nexport type AnthropicContent =\n | string\n | Anthropic.Messages.ContentBlockParam[];\n\n/** SDK-native content type for Anthropic system prompts (supports cache_control blocks) */\nexport type AnthropicSystemContent =\n | string\n | Anthropic.Messages.TextBlockParam[];\n\n/** A MessageParam with a unique ID for idempotent Redis storage */\nexport interface StoredMessage {\n id: string;\n message: Anthropic.Messages.MessageParam;\n /** System messages are stored separately since Anthropic passes them via config */\n isSystem?: boolean;\n}\n\nexport type AnthropicThreadManagerHooks = ThreadManagerHooks<StoredMessage, Anthropic.Messages.MessageParam>;\n\nexport interface AnthropicThreadManagerConfig {\n redis: Redis;\n threadId: string;\n /** Thread key, defaults to 'messages' */\n key?: string;\n hooks?: AnthropicThreadManagerHooks;\n}\n\n/** Prepared payload ready to send to the Anthropic API */\nexport interface AnthropicInvocationPayload {\n messages: Anthropic.Messages.MessageParam[];\n system?: string | Anthropic.Messages.TextBlockParam[];\n}\n\n/** Thread manager with Anthropic MessageParam convenience helpers */\nexport interface AnthropicThreadManager\n extends ProviderThreadManager<StoredMessage, AnthropicContent, JsonValue, AnthropicSystemContent> {\n appendAssistantMessage(\n id: string,\n content: Anthropic.Messages.ContentBlock[],\n ): Promise<void>;\n prepareForInvocation(): Promise<AnthropicInvocationPayload>;\n}\n\nfunction storedMessageId(msg: StoredMessage): string {\n return msg.id;\n}\n\n/** Normalise content into an array of ContentBlockParam */\nfunction toContentBlocks(\n content: AnthropicContent,\n): Anthropic.Messages.ContentBlockParam[] {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content }];\n }\n return content;\n}\n\n/**\n * Merge consecutive messages with the same role.\n * The Anthropic API requires alternating user/assistant turns; without\n * merging, multiple sequential tool-result messages would violate this.\n */\nfunction mergeConsecutiveMessages(\n messages: Anthropic.Messages.MessageParam[],\n): Anthropic.Messages.MessageParam[] {\n const merged: Anthropic.Messages.MessageParam[] = [];\n for (const msg of messages) {\n const last = merged[merged.length - 1];\n if (last && last.role === msg.role) {\n const lastContent = Array.isArray(last.content)\n ? last.content\n : [{ type: \"text\" as const, text: last.content }];\n const msgContent = Array.isArray(msg.content)\n ? msg.content\n : [{ type: \"text\" as const, text: msg.content }];\n last.content = [...lastContent, ...msgContent];\n } else {\n merged.push({\n ...msg,\n content: Array.isArray(msg.content)\n ? [...msg.content]\n : msg.content,\n });\n }\n }\n return merged;\n}\n\n/**\n * Creates an Anthropic-specific thread manager that stores StoredMessage\n * instances in Redis and provides convenience helpers for creating and\n * appending typed messages.\n */\nexport function createAnthropicThreadManager(\n config: AnthropicThreadManagerConfig,\n): AnthropicThreadManager {\n const baseConfig: ThreadManagerConfig<StoredMessage> = {\n redis: config.redis,\n threadId: config.threadId,\n key: config.key,\n idOf: storedMessageId,\n };\n\n const base = createThreadManager(baseConfig);\n\n const helpers: Omit<AnthropicThreadManager, keyof typeof base> = {\n async appendUserMessage(\n id: string,\n content: AnthropicContent,\n ): Promise<void> {\n await base.append([{\n id,\n message: { role: \"user\", content: toContentBlocks(content) },\n }]);\n },\n\n async appendSystemMessage(\n id: string,\n content: AnthropicSystemContent,\n ): Promise<void> {\n await base.initialize();\n await base.append([{\n id,\n // Stored under a user-role placeholder to satisfy the MessageParam\n // shape; the `isSystem` flag steers extraction in prepareForInvocation.\n message: {\n role: \"user\",\n content: content as Anthropic.Messages.MessageParam[\"content\"],\n },\n isSystem: true,\n }]);\n },\n\n async appendAssistantMessage(\n id: string,\n content: Anthropic.Messages.ContentBlock[],\n ): Promise<void> {\n await base.append([{\n id,\n message: {\n role: \"assistant\",\n content: content as unknown as Anthropic.Messages.ContentBlockParam[],\n },\n }]);\n },\n\n async appendToolResult(\n id: string,\n toolCallId: string,\n _toolName: string,\n content: JsonValue,\n ): Promise<void> {\n const toolContent =\n typeof content === \"string\"\n ? content\n : Array.isArray(content)\n ? (content as unknown as Anthropic.Messages.ToolResultBlockParam[\"content\"])\n : JSON.stringify(content);\n await base.append([{\n id,\n message: {\n role: \"user\",\n content: [{\n type: \"tool_result\" as const,\n tool_use_id: toolCallId,\n content: toolContent,\n }],\n },\n }]);\n },\n\n async prepareForInvocation(): Promise<AnthropicInvocationPayload> {\n const stored = await base.load();\n const { onPrepareMessage, onPreparedMessage } = config.hooks ?? {};\n const mapped = onPrepareMessage\n ? stored.map((msg, i) => onPrepareMessage(msg, i, stored))\n : stored;\n\n let system: string | Anthropic.Messages.TextBlockParam[] | undefined;\n const conversationMessages: Anthropic.Messages.MessageParam[] = [];\n\n for (const item of mapped) {\n if (item.isSystem) {\n system = item.message.content as\n | string\n | Anthropic.Messages.TextBlockParam[];\n } else {\n conversationMessages.push(item.message);\n }\n }\n\n const messages = mergeConsecutiveMessages(conversationMessages);\n return {\n messages: onPreparedMessage\n ? messages.map((msg, i) => onPreparedMessage(msg, i, messages))\n : messages,\n ...(system ? { system } : {}),\n };\n },\n };\n\n return Object.assign(base, helpers);\n}\n","import { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport type { BaseAgentState, RunAgentConfig } from \"./types\";\nimport type { JsonValue } from \"./state/types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"./tool-router/types\";\n\n/**\n * Safely retrieve Temporal activity heartbeat and cancellation signal.\n * Returns empty object when called outside a Temporal activity (e.g. tests).\n */\nexport function getActivityContext(): {\n heartbeat?: () => void;\n signal?: AbortSignal;\n} {\n try {\n const ctx = Context.current();\n return { heartbeat: () => ctx.heartbeat(), signal: ctx.cancellationSignal };\n } catch {\n return {};\n }\n}\n\n/**\n * Query the parent workflow's state from within an activity.\n * Resolves the workflow handle from the current activity context.\n */\nexport async function queryParentWorkflowState<T>(\n client: WorkflowClient\n): Promise<T> {\n const { workflowExecution } = Context.current().info;\n const handle = client.getHandle(\n workflowExecution.workflowId,\n workflowExecution.runId\n );\n return handle.query<T>(\"getAgentState\");\n}\n\n/**\n * Wraps a handler into a scope-prefixed `RunAgentActivity` by auto-fetching\n * the parent workflow's agent state before each invocation.\n *\n * Returns a `Record` with a single key `run<Scope>` so it can be spread\n * into the activities object alongside adapter activities.\n *\n * @param scope - Workflow scope used to derive the activity name.\n * `\"myAgentWorkflow\"` produces `{ runMyAgentWorkflow: fn }`.\n *\n * @example\n * ```typescript\n * import { createRunAgentActivity } from 'zeitlich';\n *\n * return {\n * ...adapter.createActivities(\"myAgentWorkflow\"),\n * ...createRunAgentActivity(client, adapter.invoker, \"myAgentWorkflow\"),\n * };\n * ```\n */\nexport function createRunAgentActivity<R, S extends BaseAgentState = BaseAgentState>(\n client: WorkflowClient,\n handler: (config: RunAgentConfig & { state: S }) => Promise<R>,\n scope: string,\n): Record<string, (config: RunAgentConfig) => Promise<R>> {\n const name = `run${scope.charAt(0).toUpperCase()}${scope.slice(1)}`;\n return {\n [name]: async (config: RunAgentConfig) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler({ ...config, state });\n },\n };\n}\n\n/**\n * Context injected into tool handlers created via {@link withParentWorkflowState}.\n */\nexport interface AgentStateContext<S extends BaseAgentState = BaseAgentState> extends RouterContext {\n state: S;\n}\n\n/**\n * Wraps a tool handler into an `ActivityToolHandler` by auto-fetching the\n * parent workflow's agent state before each invocation.\n *\n * @typeParam S - Custom agent state type (defaults to `BaseAgentState`)\n *\n * @example\n * ```typescript\n * import { withParentWorkflowState, type AgentStateContext } from 'zeitlich';\n *\n * // With custom state:\n * interface MyState extends BaseAgentState { customField: string }\n * const myHandler = withParentWorkflowState<MyArgs, MyResult, MyState>(\n * client,\n * async (args, ctx) => {\n * console.log(ctx.state.customField);\n * return { toolResponse: 'done', data: null };\n * },\n * );\n * ```\n */\nexport function withParentWorkflowState<TArgs, TResult, S extends BaseAgentState = BaseAgentState, TToolResponse = JsonValue>(\n client: WorkflowClient,\n handler: (\n args: TArgs,\n context: AgentStateContext<S>,\n ) => Promise<ToolHandlerResponse<TResult, TToolResponse>>,\n): ActivityToolHandler<TArgs, TResult, RouterContext, TToolResponse> {\n return async (args, context) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler(args, { ...context, state });\n };\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { SerializableToolDefinition } from \"../../../lib/types\";\nimport type { AgentResponse, ModelInvokerConfig } from \"../../../lib/model\";\nimport { createAnthropicThreadManager, type AnthropicThreadManagerHooks } from \"./thread-manager\";\nimport { getActivityContext } from \"../../../lib/activity\";\n\nexport interface AnthropicModelInvokerConfig {\n redis: Redis;\n client: Anthropic;\n model: string;\n /** Maximum tokens to generate. Defaults to 16384. */\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n}\n\nfunction toAnthropicTools(\n tools: SerializableToolDefinition[],\n): Anthropic.Messages.Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.schema as Anthropic.Messages.Tool.InputSchema,\n }));\n}\n\n/**\n * Creates an Anthropic model invoker that satisfies the generic\n * `ModelInvoker<Anthropic.Messages.Message>` contract.\n *\n * Internally streams the response and emits Temporal heartbeats on each\n * event so that long-running LLM calls remain visible to the scheduler.\n * The caller is responsible for appending the response to the thread.\n *\n * @example\n * ```typescript\n * import { createAnthropicModelInvoker } from 'zeitlich/adapters/thread/anthropic';\n * import { createRunAgentActivity } from 'zeitlich';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * const invoker = createAnthropicModelInvoker({\n * redis,\n * client,\n * model: 'claude-sonnet-4-20250514',\n * });\n *\n * return { ...createRunAgentActivity(client, invoker, \"myAgent\") };\n * ```\n */\nexport function createAnthropicModelInvoker({\n redis,\n client,\n model,\n maxTokens = 16384,\n hooks,\n}: AnthropicModelInvokerConfig) {\n return async function invokeAnthropicModel(\n config: ModelInvokerConfig,\n ): Promise<AgentResponse<Anthropic.Messages.Message>> {\n const { threadId, threadKey, state } = config;\n const { heartbeat, signal } = getActivityContext();\n\n const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey, hooks });\n const { messages, system } = await thread.prepareForInvocation();\n\n const anthropicTools = toAnthropicTools(state.tools);\n const tools = anthropicTools.length > 0 ? anthropicTools : undefined;\n\n const params: Anthropic.MessageCreateParams = {\n model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system } : {}),\n ...(tools ? { tools } : {}),\n };\n\n const stream = client.messages.stream(params, { signal });\n\n for await (const _event of stream) {\n heartbeat?.();\n }\n\n const response: Anthropic.Messages.Message = await stream.finalMessage();\n\n const toolCalls = response.content.filter(\n (block): block is Anthropic.Messages.ToolUseBlock =>\n block.type === \"tool_use\",\n );\n\n return {\n message: response,\n rawToolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: (tc.input as Record<string, unknown>) ?? {},\n })),\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cachedWriteTokens: response.usage.cache_creation_input_tokens ?? undefined,\n cachedReadTokens: response.usage.cache_read_input_tokens ?? undefined,\n },\n };\n };\n}\n\n/**\n * Standalone function for one-shot Anthropic model invocation.\n * Convenience wrapper around createAnthropicModelInvoker for cases\n * where you don't need to reuse the invoker.\n */\nexport async function invokeAnthropicModel({\n redis,\n client,\n model,\n maxTokens,\n hooks,\n config,\n}: {\n redis: Redis;\n client: Anthropic;\n model: string;\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n config: ModelInvokerConfig;\n}): Promise<AgentResponse<Anthropic.Messages.Message>> {\n const invoker = createAnthropicModelInvoker({\n redis,\n client,\n model,\n maxTokens,\n hooks,\n });\n return invoker(config);\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { ToolResultConfig } from \"../../../lib/types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"../../../lib/tool-router/types\";\nimport type {\n ThreadOps,\n PrefixedThreadOps,\n ScopedPrefix,\n} from \"../../../lib/session/types\";\nimport type { ModelInvoker } from \"../../../lib/model\";\nimport {\n createAnthropicThreadManager,\n type AnthropicContent,\n type AnthropicSystemContent,\n type AnthropicThreadManagerHooks,\n} from \"./thread-manager\";\nimport {\n createAnthropicModelInvoker,\n type AnthropicModelInvokerConfig,\n} from \"./model-invoker\";\n\nconst ADAPTER_PREFIX = \"anthropic\" as const;\n\nexport type AnthropicThreadOps<TScope extends string = \"\"> =\n PrefixedThreadOps<ScopedPrefix<TScope, typeof ADAPTER_PREFIX>, AnthropicContent>;\n\nexport interface AnthropicAdapterConfig {\n redis: Redis;\n client: Anthropic;\n /** Default model name (e.g. 'claude-sonnet-4-20250514'). If omitted, use `createModelInvoker()` */\n model?: string;\n /** Maximum tokens to generate. Defaults to 16384. */\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n}\n\n/**\n * Tool response type accepted by the Anthropic adapter.\n *\n * Handlers can return:\n * - **`string`** — plain text content for the tool result.\n * - **`Anthropic.Messages.ToolResultBlockParam[\"content\"]`** — array of content blocks\n * (e.g. `{ type: \"text\", text: \"...\" }`, `{ type: \"image\", source: { ... } }`).\n * Passed through as-is to the `tool_result` block.\n */\nexport type AnthropicToolResponse = Anthropic.Messages.ToolResultBlockParam[\"content\"];\n\nexport interface AnthropicAdapter {\n /** Model invoker using the default model (only available when `model` was provided) */\n invoker: ModelInvoker<Anthropic.Messages.Message>;\n /** Create an invoker for a specific model name (for multi-model setups) */\n createModelInvoker(\n model: string,\n maxTokens?: number,\n ): ModelInvoker<Anthropic.Messages.Message>;\n /**\n * Create prefixed thread activities for registration on the worker.\n *\n * @param scope - Workflow name appended to the adapter prefix.\n * Use different scopes for the main agent vs subagents to avoid collisions.\n *\n * @example\n * ```typescript\n * adapter.createActivities(\"codingAgent\")\n * // → { anthropicCodingAgentInitializeThread, anthropicCodingAgentAppendHumanMessage, … }\n *\n * adapter.createActivities(\"researchAgent\")\n * // → { anthropicResearchAgentInitializeThread, … }\n * ```\n */\n createActivities<S extends string = \"\">(\n scope?: S,\n ): AnthropicThreadOps<S>;\n\n /**\n * Identity wrapper that types a tool handler for this adapter.\n * Constrains `toolResponse` to {@link AnthropicToolResponse}.\n */\n wrapHandler<TArgs, TResult, TContext extends RouterContext = RouterContext>(\n handler: (\n args: TArgs,\n context: TContext,\n ) => Promise<ToolHandlerResponse<TResult, AnthropicToolResponse>>,\n ): ActivityToolHandler<TArgs, TResult, TContext, AnthropicToolResponse>;\n}\n\n/**\n * Creates an Anthropic adapter that bundles thread operations and model\n * invocation using the `@anthropic-ai/sdk`.\n *\n * Use `createActivities(scope)` to register scoped thread operations as\n * Temporal activities on the worker. The `invoker` (or invokers created via\n * `createModelInvoker`) should be wrapped with `createRunAgentActivity`.\n *\n * @example\n * ```typescript\n * import { createAnthropicAdapter } from 'zeitlich/adapters/thread/anthropic';\n * import { createRunAgentActivity } from 'zeitlich';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * const adapter = createAnthropicAdapter({ redis, client, model: 'claude-sonnet-4-20250514' });\n *\n * export function createActivities(temporalClient: WorkflowClient) {\n * return {\n * ...adapter.createActivities(\"codingAgent\"),\n * ...createRunAgentActivity(temporalClient, adapter.invoker, \"codingAgent\"),\n * };\n * }\n * ```\n *\n * @example Multi-agent worker (main + subagent share the adapter)\n * ```typescript\n * export function createActivities(temporalClient: WorkflowClient) {\n * return {\n * ...adapter.createActivities(\"codingAgent\"),\n * ...adapter.createActivities(\"researchAgent\"),\n * ...createRunAgentActivity(temporalClient, adapter.invoker, \"codingAgent\"),\n * ...createRunAgentActivity(\n * temporalClient,\n * adapter.createModelInvoker('claude-sonnet-4-20250514'),\n * \"researchAgent\",\n * ),\n * };\n * }\n * ```\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig,\n): AnthropicAdapter {\n const { redis, client } = config;\n\n const threadOps: ThreadOps<AnthropicContent> = {\n async initializeThread(threadId: string, threadKey?: string): Promise<void> {\n const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });\n await thread.initialize();\n },\n\n async appendHumanMessage(\n threadId: string,\n id: string,\n content: AnthropicContent,\n threadKey?: string,\n ): Promise<void> {\n const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });\n await thread.appendUserMessage(id, content);\n },\n\n async appendSystemMessage(\n threadId: string,\n id: string,\n content: AnthropicSystemContent,\n threadKey?: string,\n ): Promise<void> {\n const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });\n await thread.appendSystemMessage(id, content);\n },\n\n async appendToolResult(id: string, cfg: ToolResultConfig): Promise<void> {\n const { threadId, threadKey, toolCallId, toolName, content } = cfg;\n const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });\n await thread.appendToolResult(id, toolCallId, toolName, content);\n },\n\n async appendAgentMessage(\n threadId: string,\n id: string,\n message: Anthropic.Messages.Message,\n threadKey?: string,\n ): Promise<void> {\n const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });\n await thread.appendAssistantMessage(id, message.content);\n },\n\n async forkThread(\n sourceThreadId: string,\n targetThreadId: string,\n threadKey?: string,\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId: sourceThreadId,\n key: threadKey,\n });\n await thread.fork(targetThreadId);\n },\n };\n\n function createActivities<S extends string = \"\">(\n scope?: S,\n ): AnthropicThreadOps<S> {\n const prefix = scope\n ? `${ADAPTER_PREFIX}${scope.charAt(0).toUpperCase()}${scope.slice(1)}`\n : ADAPTER_PREFIX;\n const cap = (s: string): string =>\n s.charAt(0).toUpperCase() + s.slice(1);\n return Object.fromEntries(\n Object.entries(threadOps).map(([k, v]) => [`${prefix}${cap(k)}`, v]),\n ) as AnthropicThreadOps<S>;\n }\n\n const makeInvoker = (\n model: string,\n maxTokens?: number,\n ): ModelInvoker<Anthropic.Messages.Message> => {\n const invokerConfig: AnthropicModelInvokerConfig = {\n redis,\n client,\n model,\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(config.maxTokens !== undefined && maxTokens === undefined\n ? { maxTokens: config.maxTokens }\n : {}),\n hooks: config.hooks,\n };\n return createAnthropicModelInvoker(invokerConfig);\n };\n\n const invoker: ModelInvoker<Anthropic.Messages.Message> = config.model\n ? makeInvoker(config.model)\n : ((() => {\n throw new Error(\n \"No default model provided to createAnthropicAdapter. \" +\n \"Either pass `model` in the config or use `createModelInvoker(model)` instead.\",\n );\n }) as unknown as ModelInvoker<Anthropic.Messages.Message>);\n\n return {\n createActivities,\n invoker,\n createModelInvoker: makeInvoker,\n wrapHandler: (handler) => handler,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/thread/manager.ts","../../../../src/adapters/thread/anthropic/thread-manager.ts","../../../../src/lib/activity.ts","../../../../src/adapters/thread/anthropic/model-invoker.ts","../../../../src/adapters/thread/anthropic/activities.ts"],"names":["invokeAnthropicModel"],"mappings":"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","file":"index.js","sourcesContent":["import type { ThreadManagerConfig, BaseThreadManager } from \"./types\";\n\nconst THREAD_TTL_SECONDS = 60 * 60 * 24 * 90; // 90 days\n\n/**\n * Lua script for atomic idempotent append.\n * Checks a dedup key; if it exists the message was already appended and we\n * return 0. Otherwise appends all messages to the list, sets TTL on both\n * the list and the dedup key, and returns 1.\n *\n * KEYS[1] = dedup key, KEYS[2] = list key\n * ARGV[1] = TTL seconds, ARGV[2..N] = serialised messages\n */\nconst APPEND_IDEMPOTENT_SCRIPT = `\nif redis.call('EXISTS', KEYS[1]) == 1 then\n return 0\nend\nfor i = 2, #ARGV do\n redis.call('RPUSH', KEYS[2], ARGV[i])\nend\nredis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))\nredis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))\nreturn 1\n`;\n\nfunction getThreadKey(threadId: string, key: string): string {\n return `${key}:thread:${threadId}`;\n}\n\n/**\n * Creates a generic thread manager for handling conversation state in Redis.\n * Framework-agnostic — works with any serializable message type.\n */\nexport function createThreadManager<T>(\n config: ThreadManagerConfig<T>\n): BaseThreadManager<T> {\n const {\n redis,\n threadId,\n key = \"messages\",\n serialize = (m: T): string => JSON.stringify(m),\n deserialize = (raw: string): T => JSON.parse(raw) as T,\n idOf,\n } = config;\n const redisKey = getThreadKey(threadId, key);\n const metaKey = getThreadKey(threadId, `${key}:meta`);\n\n async function assertThreadExists(): Promise<void> {\n const exists = await redis.exists(metaKey);\n if (!exists) {\n throw new Error(`Thread \"${threadId}\" (key: ${key}) does not exist`);\n }\n }\n\n return {\n async initialize(): Promise<void> {\n await redis.del(redisKey);\n await redis.set(metaKey, \"1\", \"EX\", THREAD_TTL_SECONDS);\n },\n\n async load(): Promise<T[]> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n return data.map(deserialize);\n },\n\n async append(messages: T[]): Promise<void> {\n if (messages.length === 0) return;\n await assertThreadExists();\n\n if (idOf) {\n const dedupId = messages.map(idOf).join(\":\");\n const dedupKey = getThreadKey(threadId, `dedup:${dedupId}`);\n await redis.eval(\n APPEND_IDEMPOTENT_SCRIPT,\n 2,\n dedupKey,\n redisKey,\n String(THREAD_TTL_SECONDS),\n ...messages.map(serialize)\n );\n } else {\n await redis.rpush(redisKey, ...messages.map(serialize));\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n },\n\n async fork(newThreadId: string): Promise<BaseThreadManager<T>> {\n await assertThreadExists();\n const data = await redis.lrange(redisKey, 0, -1);\n const forked = createThreadManager({\n ...config,\n threadId: newThreadId,\n });\n await forked.initialize();\n if (data.length > 0) {\n const newKey = getThreadKey(newThreadId, key);\n await redis.rpush(newKey, ...data);\n await redis.expire(newKey, THREAD_TTL_SECONDS);\n }\n return forked;\n },\n\n async delete(): Promise<void> {\n await redis.del(redisKey, metaKey);\n },\n\n async length(): Promise<number> {\n await assertThreadExists();\n return redis.llen(redisKey);\n },\n\n async truncate(length: number): Promise<void> {\n await assertThreadExists();\n if (length <= 0) {\n await redis.del(redisKey);\n await redis.expire(metaKey, THREAD_TTL_SECONDS);\n } else {\n await redis.ltrim(redisKey, 0, length - 1);\n await redis.expire(redisKey, THREAD_TTL_SECONDS);\n }\n // Dedup keys for removed messages are left to expire via their TTL.\n // Post-truncate appends use fresh ids so collisions do not occur in practice.\n },\n };\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { JsonValue } from \"../../../lib/state/types\";\nimport { createThreadManager } from \"../../../lib/thread/manager\";\nimport type {\n ProviderThreadManager,\n ThreadManagerConfig,\n ThreadManagerHooks,\n} from \"../../../lib/thread/types\";\n\n/** SDK-native content type for Anthropic human messages */\nexport type AnthropicContent = string | Anthropic.Messages.ContentBlockParam[];\n\n/** SDK-native content type for Anthropic system prompts (supports cache_control blocks) */\nexport type AnthropicSystemContent =\n | string\n | Anthropic.Messages.TextBlockParam[];\n\n/** A MessageParam with a unique ID for idempotent Redis storage */\nexport interface StoredMessage {\n id: string;\n message: Anthropic.Messages.MessageParam;\n /** System messages are stored separately since Anthropic passes them via config */\n isSystem?: boolean;\n}\n\nexport type AnthropicThreadManagerHooks = ThreadManagerHooks<\n StoredMessage,\n Anthropic.Messages.MessageParam\n>;\n\nexport interface AnthropicThreadManagerConfig {\n redis: Redis;\n threadId: string;\n /** Thread key, defaults to 'messages' */\n key?: string;\n hooks?: AnthropicThreadManagerHooks;\n}\n\n/** Prepared payload ready to send to the Anthropic API */\nexport interface AnthropicInvocationPayload {\n messages: Anthropic.Messages.MessageParam[];\n system?: string | Anthropic.Messages.TextBlockParam[];\n /** Number of stored messages loaded from Redis before preparation. */\n storedLength: number;\n}\n\n/** Thread manager with Anthropic MessageParam convenience helpers */\nexport interface AnthropicThreadManager extends ProviderThreadManager<\n StoredMessage,\n AnthropicContent,\n JsonValue,\n AnthropicSystemContent\n> {\n appendAssistantMessage(\n id: string,\n content: Anthropic.Messages.ContentBlock[]\n ): Promise<void>;\n prepareForInvocation(): Promise<AnthropicInvocationPayload>;\n}\n\nfunction storedMessageId(msg: StoredMessage): string {\n return msg.id;\n}\n\n/** Normalise content into an array of ContentBlockParam */\nfunction toContentBlocks(\n content: AnthropicContent\n): Anthropic.Messages.ContentBlockParam[] {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content }];\n }\n return content;\n}\n\n/**\n * Merge consecutive messages with the same role.\n * The Anthropic API requires alternating user/assistant turns; without\n * merging, multiple sequential tool-result messages would violate this.\n */\nfunction mergeConsecutiveMessages(\n messages: Anthropic.Messages.MessageParam[]\n): Anthropic.Messages.MessageParam[] {\n const merged: Anthropic.Messages.MessageParam[] = [];\n for (const msg of messages) {\n const last = merged[merged.length - 1];\n if (last && last.role === msg.role) {\n const lastContent = Array.isArray(last.content)\n ? last.content\n : [{ type: \"text\" as const, text: last.content }];\n const msgContent = Array.isArray(msg.content)\n ? msg.content\n : [{ type: \"text\" as const, text: msg.content }];\n last.content = [...lastContent, ...msgContent];\n } else {\n merged.push({\n ...msg,\n content: Array.isArray(msg.content) ? [...msg.content] : msg.content,\n });\n }\n }\n return merged;\n}\n\n/**\n * Creates an Anthropic-specific thread manager that stores StoredMessage\n * instances in Redis and provides convenience helpers for creating and\n * appending typed messages.\n */\nexport function createAnthropicThreadManager(\n config: AnthropicThreadManagerConfig\n): AnthropicThreadManager {\n const baseConfig: ThreadManagerConfig<StoredMessage> = {\n redis: config.redis,\n threadId: config.threadId,\n key: config.key,\n idOf: storedMessageId,\n };\n\n const base = createThreadManager(baseConfig);\n\n const helpers: Omit<AnthropicThreadManager, keyof typeof base> = {\n async appendUserMessage(\n id: string,\n content: AnthropicContent\n ): Promise<void> {\n await base.append([\n {\n id,\n message: { role: \"user\", content: toContentBlocks(content) },\n },\n ]);\n },\n\n async appendSystemMessage(\n id: string,\n content: AnthropicSystemContent\n ): Promise<void> {\n await base.initialize();\n await base.append([\n {\n id,\n // Stored under a user-role placeholder to satisfy the MessageParam\n // shape; the `isSystem` flag steers extraction in prepareForInvocation.\n message: {\n role: \"user\",\n content: content as Anthropic.Messages.MessageParam[\"content\"],\n },\n isSystem: true,\n },\n ]);\n },\n\n async appendAssistantMessage(\n id: string,\n content: Anthropic.Messages.ContentBlock[]\n ): Promise<void> {\n await base.append([\n {\n id,\n message: {\n role: \"assistant\",\n content:\n content as unknown as Anthropic.Messages.ContentBlockParam[],\n },\n },\n ]);\n },\n\n async appendToolResult(\n id: string,\n toolCallId: string,\n _toolName: string,\n content: JsonValue\n ): Promise<void> {\n const toolContent =\n typeof content === \"string\"\n ? content\n : Array.isArray(content)\n ? (content as unknown as Anthropic.Messages.ToolResultBlockParam[\"content\"])\n : JSON.stringify(content);\n await base.append([\n {\n id,\n message: {\n role: \"user\",\n content: [\n {\n type: \"tool_result\" as const,\n tool_use_id: toolCallId,\n content: toolContent,\n },\n ],\n },\n },\n ]);\n },\n\n async prepareForInvocation(): Promise<AnthropicInvocationPayload> {\n const stored = await base.load();\n const { onPrepareMessage, onPreparedMessage } = config.hooks ?? {};\n const mapped = onPrepareMessage\n ? stored.map((msg, i) => onPrepareMessage(msg, i, stored))\n : stored;\n\n let system: string | Anthropic.Messages.TextBlockParam[] | undefined;\n const conversationMessages: Anthropic.Messages.MessageParam[] = [];\n\n for (const item of mapped) {\n if (item.isSystem) {\n system = item.message.content as\n | string\n | Anthropic.Messages.TextBlockParam[];\n } else {\n conversationMessages.push(item.message);\n }\n }\n\n const messages = mergeConsecutiveMessages(conversationMessages);\n return {\n messages: onPreparedMessage\n ? messages.map((msg, i) => onPreparedMessage(msg, i, messages))\n : messages,\n ...(system ? { system } : {}),\n storedLength: stored.length,\n };\n },\n };\n\n return Object.assign(base, helpers);\n}\n","import { Context } from \"@temporalio/activity\";\nimport type { WorkflowClient } from \"@temporalio/client\";\nimport type { BaseAgentState, RunAgentConfig } from \"./types\";\nimport type { JsonValue } from \"./state/types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"./tool-router/types\";\n\n/**\n * Safely retrieve Temporal activity heartbeat and cancellation signal.\n * Returns empty object when called outside a Temporal activity (e.g. tests).\n */\nexport function getActivityContext(): {\n heartbeat?: () => void;\n signal?: AbortSignal;\n} {\n try {\n const ctx = Context.current();\n return { heartbeat: () => ctx.heartbeat(), signal: ctx.cancellationSignal };\n } catch {\n return {};\n }\n}\n\n/**\n * Query the parent workflow's state from within an activity.\n * Resolves the workflow handle from the current activity context.\n */\nexport async function queryParentWorkflowState<T>(\n client: WorkflowClient\n): Promise<T> {\n const { workflowExecution } = Context.current().info;\n const handle = client.getHandle(\n workflowExecution.workflowId,\n workflowExecution.runId\n );\n return handle.query<T>(\"getAgentState\");\n}\n\n/**\n * Wraps a handler into a scope-prefixed `RunAgentActivity` by auto-fetching\n * the parent workflow's agent state before each invocation.\n *\n * Returns a `Record` with a single key `run<Scope>` so it can be spread\n * into the activities object alongside adapter activities.\n *\n * @param scope - Workflow scope used to derive the activity name.\n * `\"myAgentWorkflow\"` produces `{ runMyAgentWorkflow: fn }`.\n *\n * @example\n * ```typescript\n * import { createRunAgentActivity } from 'zeitlich';\n *\n * return {\n * ...adapter.createActivities(\"myAgentWorkflow\"),\n * ...createRunAgentActivity(client, adapter.invoker, \"myAgentWorkflow\"),\n * };\n * ```\n */\nexport function createRunAgentActivity<\n R,\n S extends BaseAgentState = BaseAgentState,\n>(\n client: WorkflowClient,\n handler: (config: RunAgentConfig & { state: S }) => Promise<R>,\n scope: string\n): Record<string, (config: RunAgentConfig) => Promise<R>> {\n const name = `run${scope.charAt(0).toUpperCase()}${scope.slice(1)}`;\n return {\n [name]: async (config: RunAgentConfig) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler({ ...config, state });\n },\n };\n}\n\n/**\n * Context injected into tool handlers created via {@link withParentWorkflowState}.\n */\nexport interface AgentStateContext<\n S extends BaseAgentState = BaseAgentState,\n> extends RouterContext {\n state: S;\n}\n\n/**\n * Wraps a tool handler into an `ActivityToolHandler` by auto-fetching the\n * parent workflow's agent state before each invocation.\n *\n * @typeParam S - Custom agent state type (defaults to `BaseAgentState`)\n *\n * @example\n * ```typescript\n * import { withParentWorkflowState, type AgentStateContext } from 'zeitlich';\n *\n * // With custom state:\n * interface MyState extends BaseAgentState { customField: string }\n * const myHandler = withParentWorkflowState<MyArgs, MyResult, MyState>(\n * client,\n * async (args, ctx) => {\n * console.log(ctx.state.customField);\n * return { toolResponse: 'done', data: null };\n * },\n * );\n * ```\n */\nexport function withParentWorkflowState<\n TArgs,\n TResult,\n S extends BaseAgentState = BaseAgentState,\n TToolResponse = JsonValue,\n>(\n client: WorkflowClient,\n handler: (\n args: TArgs,\n context: AgentStateContext<S>\n ) => Promise<ToolHandlerResponse<TResult, TToolResponse>>\n): ActivityToolHandler<TArgs, TResult, RouterContext, TToolResponse> {\n return async (args, context) => {\n const state = await queryParentWorkflowState<S>(client);\n return handler(args, { ...context, state });\n };\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { SerializableToolDefinition } from \"../../../lib/types\";\nimport type { AgentResponse, ModelInvokerConfig } from \"../../../lib/model\";\nimport {\n createAnthropicThreadManager,\n type AnthropicThreadManagerHooks,\n} from \"./thread-manager\";\nimport { getActivityContext } from \"../../../lib/activity\";\n\nexport interface AnthropicModelInvokerConfig {\n redis: Redis;\n client: Anthropic;\n model: string;\n /** Maximum tokens to generate. Defaults to 16384. */\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n}\n\nfunction toAnthropicTools(\n tools: SerializableToolDefinition[]\n): Anthropic.Messages.Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.schema as Anthropic.Messages.Tool.InputSchema,\n }));\n}\n\n/**\n * Creates an Anthropic model invoker that satisfies the generic\n * `ModelInvoker<Anthropic.Messages.Message>` contract.\n *\n * Internally streams the response and emits Temporal heartbeats on each\n * event so that long-running LLM calls remain visible to the scheduler.\n * The caller is responsible for appending the response to the thread.\n *\n * @example\n * ```typescript\n * import { createAnthropicModelInvoker } from 'zeitlich/adapters/thread/anthropic';\n * import { createRunAgentActivity } from 'zeitlich';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * const invoker = createAnthropicModelInvoker({\n * redis,\n * client,\n * model: 'claude-sonnet-4-20250514',\n * });\n *\n * return { ...createRunAgentActivity(client, invoker, \"myAgent\") };\n * ```\n */\nexport function createAnthropicModelInvoker({\n redis,\n client,\n model,\n maxTokens = 16384,\n hooks,\n}: AnthropicModelInvokerConfig) {\n return async function invokeAnthropicModel(\n config: ModelInvokerConfig\n ): Promise<AgentResponse<Anthropic.Messages.Message>> {\n const { threadId, threadKey, state } = config;\n const { heartbeat, signal } = getActivityContext();\n\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n hooks,\n });\n const { messages, system, storedLength } =\n await thread.prepareForInvocation();\n\n const anthropicTools = toAnthropicTools(state.tools);\n const tools = anthropicTools.length > 0 ? anthropicTools : undefined;\n\n const params: Anthropic.MessageCreateParams = {\n model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system } : {}),\n ...(tools ? { tools } : {}),\n };\n\n const stream = client.messages.stream(params, { signal });\n\n for await (const _event of stream) {\n heartbeat?.();\n }\n\n const response: Anthropic.Messages.Message = await stream.finalMessage();\n\n const toolCalls = response.content.filter(\n (block): block is Anthropic.Messages.ToolUseBlock =>\n block.type === \"tool_use\"\n );\n\n return {\n message: response,\n rawToolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: (tc.input as Record<string, unknown>) ?? {},\n })),\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cachedWriteTokens:\n response.usage.cache_creation_input_tokens ?? undefined,\n cachedReadTokens: response.usage.cache_read_input_tokens ?? undefined,\n },\n threadLengthAtCall: storedLength,\n };\n };\n}\n\n/**\n * Standalone function for one-shot Anthropic model invocation.\n * Convenience wrapper around createAnthropicModelInvoker for cases\n * where you don't need to reuse the invoker.\n */\nexport async function invokeAnthropicModel({\n redis,\n client,\n model,\n maxTokens,\n hooks,\n config,\n}: {\n redis: Redis;\n client: Anthropic;\n model: string;\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n config: ModelInvokerConfig;\n}): Promise<AgentResponse<Anthropic.Messages.Message>> {\n const invoker = createAnthropicModelInvoker({\n redis,\n client,\n model,\n maxTokens,\n hooks,\n });\n return invoker(config);\n}\n","import type Redis from \"ioredis\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type { ToolResultConfig } from \"../../../lib/types\";\nimport type {\n ActivityToolHandler,\n RouterContext,\n ToolHandlerResponse,\n} from \"../../../lib/tool-router/types\";\nimport type {\n ThreadOps,\n PrefixedThreadOps,\n ScopedPrefix,\n} from \"../../../lib/session/types\";\nimport type { ModelInvoker } from \"../../../lib/model\";\nimport {\n createAnthropicThreadManager,\n type AnthropicContent,\n type AnthropicSystemContent,\n type AnthropicThreadManagerHooks,\n} from \"./thread-manager\";\nimport {\n createAnthropicModelInvoker,\n type AnthropicModelInvokerConfig,\n} from \"./model-invoker\";\n\nconst ADAPTER_PREFIX = \"anthropic\" as const;\n\nexport type AnthropicThreadOps<TScope extends string = \"\"> = PrefixedThreadOps<\n ScopedPrefix<TScope, typeof ADAPTER_PREFIX>,\n AnthropicContent\n>;\n\nexport interface AnthropicAdapterConfig {\n redis: Redis;\n client: Anthropic;\n /** Default model name (e.g. 'claude-sonnet-4-20250514'). If omitted, use `createModelInvoker()` */\n model?: string;\n /** Maximum tokens to generate. Defaults to 16384. */\n maxTokens?: number;\n hooks?: AnthropicThreadManagerHooks;\n}\n\n/**\n * Tool response type accepted by the Anthropic adapter.\n *\n * Handlers can return:\n * - **`string`** — plain text content for the tool result.\n * - **`Anthropic.Messages.ToolResultBlockParam[\"content\"]`** — array of content blocks\n * (e.g. `{ type: \"text\", text: \"...\" }`, `{ type: \"image\", source: { ... } }`).\n * Passed through as-is to the `tool_result` block.\n */\nexport type AnthropicToolResponse =\n Anthropic.Messages.ToolResultBlockParam[\"content\"];\n\nexport interface AnthropicAdapter {\n /** Model invoker using the default model (only available when `model` was provided) */\n invoker: ModelInvoker<Anthropic.Messages.Message>;\n /** Create an invoker for a specific model name (for multi-model setups) */\n createModelInvoker(\n model: string,\n maxTokens?: number\n ): ModelInvoker<Anthropic.Messages.Message>;\n /**\n * Create prefixed thread activities for registration on the worker.\n *\n * @param scope - Workflow name appended to the adapter prefix.\n * Use different scopes for the main agent vs subagents to avoid collisions.\n *\n * @example\n * ```typescript\n * adapter.createActivities(\"codingAgent\")\n * // → { anthropicCodingAgentInitializeThread, anthropicCodingAgentAppendHumanMessage, … }\n *\n * adapter.createActivities(\"researchAgent\")\n * // → { anthropicResearchAgentInitializeThread, … }\n * ```\n */\n createActivities<S extends string = \"\">(scope?: S): AnthropicThreadOps<S>;\n\n /**\n * Identity wrapper that types a tool handler for this adapter.\n * Constrains `toolResponse` to {@link AnthropicToolResponse}.\n */\n wrapHandler<TArgs, TResult, TContext extends RouterContext = RouterContext>(\n handler: (\n args: TArgs,\n context: TContext\n ) => Promise<ToolHandlerResponse<TResult, AnthropicToolResponse>>\n ): ActivityToolHandler<TArgs, TResult, TContext, AnthropicToolResponse>;\n}\n\n/**\n * Creates an Anthropic adapter that bundles thread operations and model\n * invocation using the `@anthropic-ai/sdk`.\n *\n * Use `createActivities(scope)` to register scoped thread operations as\n * Temporal activities on the worker. The `invoker` (or invokers created via\n * `createModelInvoker`) should be wrapped with `createRunAgentActivity`.\n *\n * @example\n * ```typescript\n * import { createAnthropicAdapter } from 'zeitlich/adapters/thread/anthropic';\n * import { createRunAgentActivity } from 'zeitlich';\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * const adapter = createAnthropicAdapter({ redis, client, model: 'claude-sonnet-4-20250514' });\n *\n * export function createActivities(temporalClient: WorkflowClient) {\n * return {\n * ...adapter.createActivities(\"codingAgent\"),\n * ...createRunAgentActivity(temporalClient, adapter.invoker, \"codingAgent\"),\n * };\n * }\n * ```\n *\n * @example Multi-agent worker (main + subagent share the adapter)\n * ```typescript\n * export function createActivities(temporalClient: WorkflowClient) {\n * return {\n * ...adapter.createActivities(\"codingAgent\"),\n * ...adapter.createActivities(\"researchAgent\"),\n * ...createRunAgentActivity(temporalClient, adapter.invoker, \"codingAgent\"),\n * ...createRunAgentActivity(\n * temporalClient,\n * adapter.createModelInvoker('claude-sonnet-4-20250514'),\n * \"researchAgent\",\n * ),\n * };\n * }\n * ```\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig\n): AnthropicAdapter {\n const { redis, client } = config;\n\n const threadOps: ThreadOps<AnthropicContent> = {\n async initializeThread(\n threadId: string,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.initialize();\n },\n\n async appendHumanMessage(\n threadId: string,\n id: string,\n content: AnthropicContent,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendUserMessage(id, content);\n },\n\n async appendSystemMessage(\n threadId: string,\n id: string,\n content: AnthropicSystemContent,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendSystemMessage(id, content);\n },\n\n async appendToolResult(id: string, cfg: ToolResultConfig): Promise<void> {\n const { threadId, threadKey, toolCallId, toolName, content } = cfg;\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendToolResult(id, toolCallId, toolName, content);\n },\n\n async appendAgentMessage(\n threadId: string,\n id: string,\n message: Anthropic.Messages.Message,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId,\n key: threadKey,\n });\n await thread.appendAssistantMessage(id, message.content);\n },\n\n async forkThread(\n sourceThreadId: string,\n targetThreadId: string,\n threadKey?: string\n ): Promise<void> {\n const thread = createAnthropicThreadManager({\n redis,\n threadId: sourceThreadId,\n key: threadKey,\n });\n await thread.fork(targetThreadId);\n },\n\n async truncateThread(\n threadId: string,\n length: number,\n threadKey?: string,\n ): Promise<void> {\n const thread = createAnthropicThreadManager({ redis, threadId, key: threadKey });\n await thread.truncate(length);\n },\n };\n\n function createActivities<S extends string = \"\">(\n scope?: S\n ): AnthropicThreadOps<S> {\n const prefix = scope\n ? `${ADAPTER_PREFIX}${scope.charAt(0).toUpperCase()}${scope.slice(1)}`\n : ADAPTER_PREFIX;\n const cap = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1);\n return Object.fromEntries(\n Object.entries(threadOps).map(([k, v]) => [`${prefix}${cap(k)}`, v])\n ) as AnthropicThreadOps<S>;\n }\n\n const makeInvoker = (\n model: string,\n maxTokens?: number\n ): ModelInvoker<Anthropic.Messages.Message> => {\n const invokerConfig: AnthropicModelInvokerConfig = {\n redis,\n client,\n model,\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(config.maxTokens !== undefined && maxTokens === undefined\n ? { maxTokens: config.maxTokens }\n : {}),\n hooks: config.hooks,\n };\n return createAnthropicModelInvoker(invokerConfig);\n };\n\n const invoker: ModelInvoker<Anthropic.Messages.Message> = config.model\n ? makeInvoker(config.model)\n : ((() => {\n throw new Error(\n \"No default model provided to createAnthropicAdapter. \" +\n \"Either pass `model` in the config or use `createModelInvoker(model)` instead.\"\n );\n }) as unknown as ModelInvoker<Anthropic.Messages.Message>);\n\n return {\n createActivities,\n invoker,\n createModelInvoker: makeInvoker,\n wrapHandler: (handler) => handler,\n };\n}\n"]}
|
|
@@ -24,14 +24,19 @@ function createThreadOpsProxy(adapterPrefix, scope, options) {
|
|
|
24
24
|
appendToolResult: acts[p("appendToolResult")],
|
|
25
25
|
appendAgentMessage: acts[p("appendAgentMessage")],
|
|
26
26
|
appendSystemMessage: acts[p("appendSystemMessage")],
|
|
27
|
-
forkThread: acts[p("forkThread")]
|
|
27
|
+
forkThread: acts[p("forkThread")],
|
|
28
|
+
truncateThread: acts[p("truncateThread")]
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
// src/adapters/thread/anthropic/proxy.ts
|
|
32
33
|
var ADAPTER_PREFIX = "anthropic";
|
|
33
34
|
function proxyAnthropicThreadOps(scope, options) {
|
|
34
|
-
return createThreadOpsProxy(
|
|
35
|
+
return createThreadOpsProxy(
|
|
36
|
+
ADAPTER_PREFIX,
|
|
37
|
+
scope,
|
|
38
|
+
options
|
|
39
|
+
);
|
|
35
40
|
}
|
|
36
41
|
|
|
37
42
|
exports.proxyAnthropicThreadOps = proxyAnthropicThreadOps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/thread/proxy.ts","../../../../src/adapters/thread/anthropic/proxy.ts"],"names":["workflowInfo","proxyActivities"],"mappings":";;;;;AAwBO,SAAS,oBAAA,CACd,aAAA,EACA,KAAA,EACA,OAAA,EACiC;AACjC,EAAA,MAAM,aAAA,GAAgB,KAAA,IAASA,qBAAA,EAAa,CAAE,YAAA;AAG9C,EAAA,MAAM,IAAA,GAAOC,wBAAA;AAAA,IACX,OAAA,IAAW;AAAA,MACT,mBAAA,EAAqB,KAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,CAAA;AAAA,QACjB,eAAA,EAAiB,IAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,kBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAEA,EAAA,MAAM,MAAA,
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/thread/proxy.ts","../../../../src/adapters/thread/anthropic/proxy.ts"],"names":["workflowInfo","proxyActivities"],"mappings":";;;;;AAwBO,SAAS,oBAAA,CACd,aAAA,EACA,KAAA,EACA,OAAA,EACiC;AACjC,EAAA,MAAM,aAAA,GAAgB,KAAA,IAASA,qBAAA,EAAa,CAAE,YAAA;AAG9C,EAAA,MAAM,IAAA,GAAOC,wBAAA;AAAA,IACX,OAAA,IAAW;AAAA,MACT,mBAAA,EAAqB,KAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,CAAA;AAAA,QACjB,eAAA,EAAiB,IAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,kBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA,EAAG,aAAa,CAAA,EAAG,cAAc,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,aAAA,CAAc,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAChG,EAAA,MAAM,IAAI,CAAC,GAAA,KACT,CAAA,EAAG,MAAM,GAAG,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,aAAa,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,IAAA,CAAK,CAAA,CAAE,kBAAkB,CAAC,CAAA;AAAA,IAC5C,kBAAA,EAAoB,IAAA,CAAK,CAAA,CAAE,oBAAoB,CAAC,CAAA;AAAA,IAChD,gBAAA,EAAkB,IAAA,CAAK,CAAA,CAAE,kBAAkB,CAAC,CAAA;AAAA,IAC5C,kBAAA,EAAoB,IAAA,CAAK,CAAA,CAAE,oBAAoB,CAAC,CAAA;AAAA,IAChD,mBAAA,EAAqB,IAAA,CAAK,CAAA,CAAE,qBAAqB,CAAC,CAAA;AAAA,IAClD,UAAA,EAAY,IAAA,CAAK,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,IAChC,cAAA,EAAgB,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA,GAC1C;AACF;;;AChCA,IAAM,cAAA,GAAiB,WAAA;AAEhB,SAAS,uBAAA,CACd,OACA,OAAA,EACmD;AACnD,EAAA,OAAO,oBAAA;AAAA,IACL,cAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF","file":"workflow.cjs","sourcesContent":["/**\n * Shared proxy helper for thread operations.\n *\n * Each adapter re-exports a thin wrapper that supplies its prefix and\n * casts the return type to carry the adapter's native content type.\n */\nimport {\n proxyActivities,\n workflowInfo,\n type ActivityInterfaceFor,\n} from \"@temporalio/workflow\";\nimport type { ThreadOps } from \"../session/types\";\n\n/**\n * Creates a workflow-safe Temporal activity proxy for {@link ThreadOps}.\n *\n * The proxy resolves activity names by combining the adapter prefix with\n * the workflow scope, so each adapter + workflow combination gets its own\n * namespace.\n *\n * @param adapterPrefix - Adapter identifier (e.g. \"anthropic\", \"googleGenAI\", \"langChain\")\n * @param scope - Optional workflow scope override. Defaults to `workflowInfo().workflowType`.\n * @param options - Optional Temporal `proxyActivities` options.\n */\nexport function createThreadOpsProxy(\n adapterPrefix: string,\n scope?: string,\n options?: Parameters<typeof proxyActivities>[0]\n): ActivityInterfaceFor<ThreadOps> {\n const resolvedScope = scope ?? workflowInfo().workflowType;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const acts = proxyActivities<Record<string, (...args: any[]) => any>>(\n options ?? {\n startToCloseTimeout: \"10s\",\n retry: {\n maximumAttempts: 6,\n initialInterval: \"5s\",\n maximumInterval: \"15m\",\n backoffCoefficient: 4,\n },\n }\n );\n\n const prefix = `${adapterPrefix}${resolvedScope.charAt(0).toUpperCase()}${resolvedScope.slice(1)}`;\n const p = (key: string): string =>\n `${prefix}${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n\n return {\n initializeThread: acts[p(\"initializeThread\")],\n appendHumanMessage: acts[p(\"appendHumanMessage\")],\n appendToolResult: acts[p(\"appendToolResult\")],\n appendAgentMessage: acts[p(\"appendAgentMessage\")],\n appendSystemMessage: acts[p(\"appendSystemMessage\")],\n forkThread: acts[p(\"forkThread\")],\n truncateThread: acts[p(\"truncateThread\")],\n } as ActivityInterfaceFor<ThreadOps>;\n}\n","/**\n * Workflow-safe proxy for Anthropic thread operations.\n *\n * Import this from `zeitlich/adapters/thread/anthropic/workflow`\n * in your Temporal workflow files.\n *\n * By default the scope is derived from `workflowInfo().workflowType`,\n * so activities are automatically namespaced per workflow.\n *\n * @example\n * ```typescript\n * import { proxyAnthropicThreadOps } from 'zeitlich/adapters/thread/anthropic/workflow';\n *\n * // Auto-scoped to the current workflow name\n * const threadOps = proxyAnthropicThreadOps();\n *\n * // Explicit scope override\n * const threadOps = proxyAnthropicThreadOps(\"customScope\");\n * ```\n */\nimport { type ActivityInterfaceFor } from \"@temporalio/workflow\";\nimport type { ThreadOps } from \"../../../lib/session/types\";\nimport type { AnthropicContent } from \"./thread-manager\";\nimport { createThreadOpsProxy } from \"../../../lib/thread/proxy\";\n\nconst ADAPTER_PREFIX = \"anthropic\";\n\nexport function proxyAnthropicThreadOps(\n scope?: string,\n options?: Parameters<typeof createThreadOpsProxy>[2]\n): ActivityInterfaceFor<ThreadOps<AnthropicContent>> {\n return createThreadOpsProxy(\n ADAPTER_PREFIX,\n scope,\n options\n ) as ActivityInterfaceFor<ThreadOps<AnthropicContent>>;\n}\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { ActivityInterfaceFor } from '@temporalio/workflow';
|
|
2
|
-
import { T as ThreadOps } from '../../../types-
|
|
3
|
-
import { A as AnthropicContent } from '../../../thread-manager-
|
|
4
|
-
import { c as createThreadOpsProxy } from '../../../proxy-
|
|
2
|
+
import { T as ThreadOps } from '../../../types-C06FwR96.cjs';
|
|
3
|
+
import { A as AnthropicContent } from '../../../thread-manager-HSwyh28L.cjs';
|
|
4
|
+
import { c as createThreadOpsProxy } from '../../../proxy-D_3x7RN4.cjs';
|
|
5
5
|
import '@temporalio/common';
|
|
6
6
|
import '@temporalio/common/lib/interfaces';
|
|
7
7
|
import 'zod';
|
|
8
|
-
import '../../../types-
|
|
8
|
+
import '../../../types-yx0LzPGn.cjs';
|
|
9
9
|
import 'ioredis';
|
|
10
10
|
import '@anthropic-ai/sdk';
|
|
11
|
-
import '../../../types-
|
|
11
|
+
import '../../../types-BaOw4hKI.cjs';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Workflow-safe proxy for Anthropic thread operations.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { ActivityInterfaceFor } from '@temporalio/workflow';
|
|
2
|
-
import { T as ThreadOps } from '../../../types-
|
|
3
|
-
import { A as AnthropicContent } from '../../../thread-manager-
|
|
4
|
-
import { c as createThreadOpsProxy } from '../../../proxy-
|
|
2
|
+
import { T as ThreadOps } from '../../../types-DNr31FzL.js';
|
|
3
|
+
import { A as AnthropicContent } from '../../../thread-manager-CVu7o2cs.js';
|
|
4
|
+
import { c as createThreadOpsProxy } from '../../../proxy-CUlKSvZS.js';
|
|
5
5
|
import '@temporalio/common';
|
|
6
6
|
import '@temporalio/common/lib/interfaces';
|
|
7
7
|
import 'zod';
|
|
8
|
-
import '../../../types-
|
|
8
|
+
import '../../../types-yx0LzPGn.js';
|
|
9
9
|
import 'ioredis';
|
|
10
10
|
import '@anthropic-ai/sdk';
|
|
11
|
-
import '../../../types-
|
|
11
|
+
import '../../../types-BH_IRryz.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Workflow-safe proxy for Anthropic thread operations.
|
|
@@ -22,14 +22,19 @@ function createThreadOpsProxy(adapterPrefix, scope, options) {
|
|
|
22
22
|
appendToolResult: acts[p("appendToolResult")],
|
|
23
23
|
appendAgentMessage: acts[p("appendAgentMessage")],
|
|
24
24
|
appendSystemMessage: acts[p("appendSystemMessage")],
|
|
25
|
-
forkThread: acts[p("forkThread")]
|
|
25
|
+
forkThread: acts[p("forkThread")],
|
|
26
|
+
truncateThread: acts[p("truncateThread")]
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
// src/adapters/thread/anthropic/proxy.ts
|
|
30
31
|
var ADAPTER_PREFIX = "anthropic";
|
|
31
32
|
function proxyAnthropicThreadOps(scope, options) {
|
|
32
|
-
return createThreadOpsProxy(
|
|
33
|
+
return createThreadOpsProxy(
|
|
34
|
+
ADAPTER_PREFIX,
|
|
35
|
+
scope,
|
|
36
|
+
options
|
|
37
|
+
);
|
|
33
38
|
}
|
|
34
39
|
|
|
35
40
|
export { proxyAnthropicThreadOps };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/thread/proxy.ts","../../../../src/adapters/thread/anthropic/proxy.ts"],"names":[],"mappings":";;;AAwBO,SAAS,oBAAA,CACd,aAAA,EACA,KAAA,EACA,OAAA,EACiC;AACjC,EAAA,MAAM,aAAA,GAAgB,KAAA,IAAS,YAAA,EAAa,CAAE,YAAA;AAG9C,EAAA,MAAM,IAAA,GAAO,eAAA;AAAA,IACX,OAAA,IAAW;AAAA,MACT,mBAAA,EAAqB,KAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,CAAA;AAAA,QACjB,eAAA,EAAiB,IAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,kBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAEA,EAAA,MAAM,MAAA,
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/thread/proxy.ts","../../../../src/adapters/thread/anthropic/proxy.ts"],"names":[],"mappings":";;;AAwBO,SAAS,oBAAA,CACd,aAAA,EACA,KAAA,EACA,OAAA,EACiC;AACjC,EAAA,MAAM,aAAA,GAAgB,KAAA,IAAS,YAAA,EAAa,CAAE,YAAA;AAG9C,EAAA,MAAM,IAAA,GAAO,eAAA;AAAA,IACX,OAAA,IAAW;AAAA,MACT,mBAAA,EAAqB,KAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,CAAA;AAAA,QACjB,eAAA,EAAiB,IAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,kBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA,EAAG,aAAa,CAAA,EAAG,cAAc,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,aAAA,CAAc,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAChG,EAAA,MAAM,IAAI,CAAC,GAAA,KACT,CAAA,EAAG,MAAM,GAAG,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,aAAa,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,IAAA,CAAK,CAAA,CAAE,kBAAkB,CAAC,CAAA;AAAA,IAC5C,kBAAA,EAAoB,IAAA,CAAK,CAAA,CAAE,oBAAoB,CAAC,CAAA;AAAA,IAChD,gBAAA,EAAkB,IAAA,CAAK,CAAA,CAAE,kBAAkB,CAAC,CAAA;AAAA,IAC5C,kBAAA,EAAoB,IAAA,CAAK,CAAA,CAAE,oBAAoB,CAAC,CAAA;AAAA,IAChD,mBAAA,EAAqB,IAAA,CAAK,CAAA,CAAE,qBAAqB,CAAC,CAAA;AAAA,IAClD,UAAA,EAAY,IAAA,CAAK,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,IAChC,cAAA,EAAgB,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA,GAC1C;AACF;;;AChCA,IAAM,cAAA,GAAiB,WAAA;AAEhB,SAAS,uBAAA,CACd,OACA,OAAA,EACmD;AACnD,EAAA,OAAO,oBAAA;AAAA,IACL,cAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF","file":"workflow.js","sourcesContent":["/**\n * Shared proxy helper for thread operations.\n *\n * Each adapter re-exports a thin wrapper that supplies its prefix and\n * casts the return type to carry the adapter's native content type.\n */\nimport {\n proxyActivities,\n workflowInfo,\n type ActivityInterfaceFor,\n} from \"@temporalio/workflow\";\nimport type { ThreadOps } from \"../session/types\";\n\n/**\n * Creates a workflow-safe Temporal activity proxy for {@link ThreadOps}.\n *\n * The proxy resolves activity names by combining the adapter prefix with\n * the workflow scope, so each adapter + workflow combination gets its own\n * namespace.\n *\n * @param adapterPrefix - Adapter identifier (e.g. \"anthropic\", \"googleGenAI\", \"langChain\")\n * @param scope - Optional workflow scope override. Defaults to `workflowInfo().workflowType`.\n * @param options - Optional Temporal `proxyActivities` options.\n */\nexport function createThreadOpsProxy(\n adapterPrefix: string,\n scope?: string,\n options?: Parameters<typeof proxyActivities>[0]\n): ActivityInterfaceFor<ThreadOps> {\n const resolvedScope = scope ?? workflowInfo().workflowType;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const acts = proxyActivities<Record<string, (...args: any[]) => any>>(\n options ?? {\n startToCloseTimeout: \"10s\",\n retry: {\n maximumAttempts: 6,\n initialInterval: \"5s\",\n maximumInterval: \"15m\",\n backoffCoefficient: 4,\n },\n }\n );\n\n const prefix = `${adapterPrefix}${resolvedScope.charAt(0).toUpperCase()}${resolvedScope.slice(1)}`;\n const p = (key: string): string =>\n `${prefix}${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n\n return {\n initializeThread: acts[p(\"initializeThread\")],\n appendHumanMessage: acts[p(\"appendHumanMessage\")],\n appendToolResult: acts[p(\"appendToolResult\")],\n appendAgentMessage: acts[p(\"appendAgentMessage\")],\n appendSystemMessage: acts[p(\"appendSystemMessage\")],\n forkThread: acts[p(\"forkThread\")],\n truncateThread: acts[p(\"truncateThread\")],\n } as ActivityInterfaceFor<ThreadOps>;\n}\n","/**\n * Workflow-safe proxy for Anthropic thread operations.\n *\n * Import this from `zeitlich/adapters/thread/anthropic/workflow`\n * in your Temporal workflow files.\n *\n * By default the scope is derived from `workflowInfo().workflowType`,\n * so activities are automatically namespaced per workflow.\n *\n * @example\n * ```typescript\n * import { proxyAnthropicThreadOps } from 'zeitlich/adapters/thread/anthropic/workflow';\n *\n * // Auto-scoped to the current workflow name\n * const threadOps = proxyAnthropicThreadOps();\n *\n * // Explicit scope override\n * const threadOps = proxyAnthropicThreadOps(\"customScope\");\n * ```\n */\nimport { type ActivityInterfaceFor } from \"@temporalio/workflow\";\nimport type { ThreadOps } from \"../../../lib/session/types\";\nimport type { AnthropicContent } from \"./thread-manager\";\nimport { createThreadOpsProxy } from \"../../../lib/thread/proxy\";\n\nconst ADAPTER_PREFIX = \"anthropic\";\n\nexport function proxyAnthropicThreadOps(\n scope?: string,\n options?: Parameters<typeof createThreadOpsProxy>[2]\n): ActivityInterfaceFor<ThreadOps<AnthropicContent>> {\n return createThreadOpsProxy(\n ADAPTER_PREFIX,\n scope,\n options\n ) as ActivityInterfaceFor<ThreadOps<AnthropicContent>>;\n}\n"]}
|