zeitlich 0.2.37 → 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.
Files changed (131) hide show
  1. package/dist/{activities-Bb-nAjwQ.d.ts → activities-BKhMtKDd.d.ts} +4 -2
  2. package/dist/{activities-vkI4_3CC.d.cts → activities-CDcwkRZs.d.cts} +4 -2
  3. package/dist/adapters/sandbox/bedrock/index.cjs +3 -3
  4. package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
  5. package/dist/adapters/sandbox/bedrock/index.d.cts +6 -6
  6. package/dist/adapters/sandbox/bedrock/index.d.ts +6 -6
  7. package/dist/adapters/sandbox/bedrock/index.js +3 -3
  8. package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
  9. package/dist/adapters/sandbox/bedrock/workflow.d.cts +2 -2
  10. package/dist/adapters/sandbox/bedrock/workflow.d.ts +2 -2
  11. package/dist/adapters/sandbox/daytona/index.cjs +3 -3
  12. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  13. package/dist/adapters/sandbox/daytona/index.d.cts +4 -4
  14. package/dist/adapters/sandbox/daytona/index.d.ts +4 -4
  15. package/dist/adapters/sandbox/daytona/index.js +3 -3
  16. package/dist/adapters/sandbox/daytona/index.js.map +1 -1
  17. package/dist/adapters/sandbox/daytona/workflow.d.cts +1 -1
  18. package/dist/adapters/sandbox/daytona/workflow.d.ts +1 -1
  19. package/dist/adapters/sandbox/e2b/index.cjs +26 -14
  20. package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
  21. package/dist/adapters/sandbox/e2b/index.d.cts +24 -4
  22. package/dist/adapters/sandbox/e2b/index.d.ts +24 -4
  23. package/dist/adapters/sandbox/e2b/index.js +26 -14
  24. package/dist/adapters/sandbox/e2b/index.js.map +1 -1
  25. package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
  26. package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
  27. package/dist/adapters/sandbox/inmemory/index.cjs +3 -3
  28. package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
  29. package/dist/adapters/sandbox/inmemory/index.d.cts +4 -4
  30. package/dist/adapters/sandbox/inmemory/index.d.ts +4 -4
  31. package/dist/adapters/sandbox/inmemory/index.js +3 -3
  32. package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
  33. package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
  34. package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
  35. package/dist/adapters/thread/anthropic/index.cjs +23 -3
  36. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  37. package/dist/adapters/thread/anthropic/index.d.cts +5 -5
  38. package/dist/adapters/thread/anthropic/index.d.ts +5 -5
  39. package/dist/adapters/thread/anthropic/index.js +23 -3
  40. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  41. package/dist/adapters/thread/anthropic/workflow.cjs +2 -1
  42. package/dist/adapters/thread/anthropic/workflow.cjs.map +1 -1
  43. package/dist/adapters/thread/anthropic/workflow.d.cts +5 -5
  44. package/dist/adapters/thread/anthropic/workflow.d.ts +5 -5
  45. package/dist/adapters/thread/anthropic/workflow.js +2 -1
  46. package/dist/adapters/thread/anthropic/workflow.js.map +1 -1
  47. package/dist/adapters/thread/google-genai/index.cjs +27 -3
  48. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  49. package/dist/adapters/thread/google-genai/index.d.cts +5 -5
  50. package/dist/adapters/thread/google-genai/index.d.ts +5 -5
  51. package/dist/adapters/thread/google-genai/index.js +27 -3
  52. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  53. package/dist/adapters/thread/google-genai/workflow.cjs +2 -1
  54. package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -1
  55. package/dist/adapters/thread/google-genai/workflow.d.cts +5 -5
  56. package/dist/adapters/thread/google-genai/workflow.d.ts +5 -5
  57. package/dist/adapters/thread/google-genai/workflow.js +2 -1
  58. package/dist/adapters/thread/google-genai/workflow.js.map +1 -1
  59. package/dist/adapters/thread/langchain/index.cjs +23 -3
  60. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  61. package/dist/adapters/thread/langchain/index.d.cts +5 -5
  62. package/dist/adapters/thread/langchain/index.d.ts +5 -5
  63. package/dist/adapters/thread/langchain/index.js +23 -3
  64. package/dist/adapters/thread/langchain/index.js.map +1 -1
  65. package/dist/adapters/thread/langchain/workflow.cjs +2 -1
  66. package/dist/adapters/thread/langchain/workflow.cjs.map +1 -1
  67. package/dist/adapters/thread/langchain/workflow.d.cts +5 -5
  68. package/dist/adapters/thread/langchain/workflow.d.ts +5 -5
  69. package/dist/adapters/thread/langchain/workflow.js +2 -1
  70. package/dist/adapters/thread/langchain/workflow.js.map +1 -1
  71. package/dist/index.cjs +120 -30
  72. package/dist/index.cjs.map +1 -1
  73. package/dist/index.d.cts +11 -11
  74. package/dist/index.d.ts +11 -11
  75. package/dist/index.js +121 -31
  76. package/dist/index.js.map +1 -1
  77. package/dist/{proxy-0smGKvx8.d.ts → proxy-CUlKSvZS.d.ts} +1 -1
  78. package/dist/{proxy-DEtowJyd.d.cts → proxy-D_3x7RN4.d.cts} +1 -1
  79. package/dist/{thread-manager-C-C4pI2z.d.ts → thread-manager-CVu7o2cs.d.ts} +4 -2
  80. package/dist/{thread-manager-D4vgzYrh.d.cts → thread-manager-HSwyh28L.d.cts} +4 -2
  81. package/dist/{thread-manager-3fszQih4.d.ts → thread-manager-c1gPopAG.d.ts} +4 -2
  82. package/dist/{thread-manager-CzYln2OC.d.cts → thread-manager-wGi-LqIP.d.cts} +4 -2
  83. package/dist/{types-B37hKoWA.d.ts → types-BH_IRryz.d.ts} +10 -1
  84. package/dist/{types-D08CXPh8.d.cts → types-BaOw4hKI.d.cts} +10 -1
  85. package/dist/{types-CPKDl-y_.d.ts → types-C06FwR96.d.cts} +59 -4
  86. package/dist/{types-CNuWnvy9.d.ts → types-DAsQ21Rt.d.ts} +1 -1
  87. package/dist/{types-BO7Yju20.d.cts → types-DNr31FzL.d.ts} +59 -4
  88. package/dist/{types-DWEUmYAJ.d.cts → types-lm8tMNJQ.d.cts} +1 -1
  89. package/dist/{types-tQL9njTu.d.cts → types-yx0LzPGn.d.cts} +21 -7
  90. package/dist/{types-tQL9njTu.d.ts → types-yx0LzPGn.d.ts} +21 -7
  91. package/dist/{workflow-CjXHbZZc.d.ts → workflow-CSCkpwAL.d.ts} +2 -2
  92. package/dist/{workflow-Do_lzJpT.d.cts → workflow-DuvMZ8Vm.d.cts} +2 -2
  93. package/dist/workflow.cjs +94 -18
  94. package/dist/workflow.cjs.map +1 -1
  95. package/dist/workflow.d.cts +3 -3
  96. package/dist/workflow.d.ts +3 -3
  97. package/dist/workflow.js +95 -19
  98. package/dist/workflow.js.map +1 -1
  99. package/package.json +2 -2
  100. package/src/adapters/sandbox/bedrock/index.ts +12 -3
  101. package/src/adapters/sandbox/daytona/index.ts +12 -3
  102. package/src/adapters/sandbox/e2b/index.ts +36 -14
  103. package/src/adapters/sandbox/e2b/types.ts +16 -0
  104. package/src/adapters/sandbox/inmemory/index.ts +12 -3
  105. package/src/adapters/thread/anthropic/activities.ts +9 -0
  106. package/src/adapters/thread/anthropic/model-invoker.ts +3 -1
  107. package/src/adapters/thread/anthropic/thread-manager.ts +3 -0
  108. package/src/adapters/thread/google-genai/activities.ts +13 -0
  109. package/src/adapters/thread/google-genai/model-invoker.ts +3 -1
  110. package/src/adapters/thread/google-genai/thread-manager.ts +3 -0
  111. package/src/adapters/thread/langchain/activities.ts +9 -0
  112. package/src/adapters/thread/langchain/model-invoker.ts +2 -1
  113. package/src/adapters/thread/langchain/thread-manager.ts +3 -0
  114. package/src/lib/lifecycle.ts +11 -4
  115. package/src/lib/model/types.ts +10 -0
  116. package/src/lib/sandbox/manager.ts +26 -18
  117. package/src/lib/sandbox/types.ts +27 -7
  118. package/src/lib/session/session-edge-cases.integration.test.ts +265 -1
  119. package/src/lib/session/session.integration.test.ts +22 -1
  120. package/src/lib/session/session.ts +61 -7
  121. package/src/lib/session/types.ts +12 -0
  122. package/src/lib/subagent/subagent.integration.test.ts +100 -104
  123. package/src/lib/thread/manager.ts +18 -0
  124. package/src/lib/thread/proxy.ts +1 -0
  125. package/src/lib/thread/types.ts +9 -0
  126. package/src/lib/tool-router/index.ts +2 -0
  127. package/src/lib/tool-router/router-edge-cases.integration.test.ts +92 -0
  128. package/src/lib/tool-router/router.integration.test.ts +12 -0
  129. package/src/lib/tool-router/router.ts +89 -16
  130. package/src/lib/tool-router/types.ts +34 -1
  131. package/src/workflow.ts +2 -0
package/dist/workflow.cjs CHANGED
@@ -113,7 +113,7 @@ function createToolRouter(options) {
113
113
  });
114
114
  }
115
115
  }
116
- async function processToolCall(toolCall, turn, sandboxId) {
116
+ async function processToolCall(toolCall, turn, sandboxId, onRewindRequested) {
117
117
  const startTime = Date.now();
118
118
  const tool = toolMap.get(toolCall.name);
119
119
  const preResult = await runPreHooks(toolCall, tool, turn);
@@ -128,7 +128,7 @@ function createToolRouter(options) {
128
128
  reason: "Skipped by PreToolUse hook"
129
129
  })
130
130
  });
131
- return null;
131
+ return { kind: "skipped" };
132
132
  }
133
133
  const effectiveArgs = preResult.args;
134
134
  workflow.log.debug("tool call dispatched", {
@@ -140,6 +140,7 @@ function createToolRouter(options) {
140
140
  let content;
141
141
  let resultAppended = false;
142
142
  let metadata;
143
+ let rewindRequested = false;
143
144
  try {
144
145
  if (tool) {
145
146
  const routerContext = {
@@ -157,11 +158,15 @@ function createToolRouter(options) {
157
158
  content = response.toolResponse;
158
159
  resultAppended = response.resultAppended === true;
159
160
  metadata = response.metadata;
161
+ rewindRequested = response.rewind === true;
160
162
  } else {
161
163
  result = { error: `Unknown tool: ${toolCall.name}` };
162
164
  content = JSON.stringify(result, null, 2);
163
165
  }
164
166
  } catch (error) {
167
+ if (workflow.isCancellation(error)) {
168
+ throw error;
169
+ }
165
170
  workflow.log.warn("tool call failed", {
166
171
  toolName: toolCall.name,
167
172
  toolCallId: toolCall.id,
@@ -179,6 +184,15 @@ function createToolRouter(options) {
179
184
  result = recovery.result;
180
185
  content = recovery.content;
181
186
  }
187
+ if (rewindRequested) {
188
+ const signal = {
189
+ toolCallId: toolCall.id,
190
+ toolName: toolCall.name
191
+ };
192
+ workflow.log.info("tool requested rewind", { ...signal });
193
+ onRewindRequested?.(signal);
194
+ return { kind: "rewind", signal };
195
+ }
182
196
  if (!resultAppended) {
183
197
  const config = {
184
198
  threadId: options.threadId,
@@ -215,7 +229,7 @@ function createToolRouter(options) {
215
229
  turn,
216
230
  durationMs
217
231
  );
218
- return toolResult;
232
+ return { kind: "result", value: toolResult };
219
233
  }
220
234
  return {
221
235
  hasTools() {
@@ -250,27 +264,59 @@ function createToolRouter(options) {
250
264
  }));
251
265
  },
252
266
  async processToolCalls(toolCalls, context) {
267
+ const attachRewind = (arr, rewind) => {
268
+ if (rewind) {
269
+ arr.rewind = rewind;
270
+ }
271
+ return arr;
272
+ };
253
273
  if (toolCalls.length === 0) {
254
- return [];
274
+ return attachRewind([], void 0);
255
275
  }
256
276
  const turn = context?.turn ?? 0;
257
277
  const sandboxId = context?.sandboxId;
278
+ let rewindSignal;
258
279
  if (options.parallel) {
259
- const results2 = await Promise.all(
260
- toolCalls.map((tc) => processToolCall(tc, turn, sandboxId))
261
- );
262
- return results2.filter(
263
- (r) => r !== null
280
+ const scope = new workflow.CancellationScope({ cancellable: true });
281
+ const onRewindRequested = (signal) => {
282
+ if (!rewindSignal) {
283
+ rewindSignal = signal;
284
+ scope.cancel();
285
+ }
286
+ };
287
+ const outcomes = await scope.run(
288
+ async () => Promise.allSettled(
289
+ toolCalls.map(
290
+ (tc) => processToolCall(tc, turn, sandboxId, onRewindRequested)
291
+ )
292
+ )
264
293
  );
294
+ const results2 = [];
295
+ for (const outcome of outcomes) {
296
+ if (outcome.status === "rejected") {
297
+ if (workflow.isCancellation(outcome.reason)) {
298
+ continue;
299
+ }
300
+ throw outcome.reason;
301
+ }
302
+ if (outcome.value.kind === "result") {
303
+ results2.push(outcome.value.value);
304
+ }
305
+ }
306
+ return attachRewind(results2, rewindSignal);
265
307
  }
266
308
  const results = [];
267
309
  for (const toolCall of toolCalls) {
268
- const result = await processToolCall(toolCall, turn, sandboxId);
269
- if (result !== null) {
270
- results.push(result);
310
+ const outcome = await processToolCall(toolCall, turn, sandboxId);
311
+ if (outcome.kind === "rewind") {
312
+ rewindSignal = outcome.signal;
313
+ break;
314
+ }
315
+ if (outcome.kind === "result") {
316
+ results.push(outcome.value);
271
317
  }
272
318
  }
273
- return results;
319
+ return attachRewind(results, rewindSignal);
274
320
  },
275
321
  async processToolCallsByName(toolCalls, toolName, handler, context) {
276
322
  const matchingCalls = toolCalls.filter((tc) => tc.name === toolName);
@@ -867,7 +913,8 @@ async function createSession({
867
913
  initializeThread,
868
914
  appendSystemMessage,
869
915
  appendAgentMessage,
870
- forkThread
916
+ forkThread,
917
+ truncateThread
871
918
  } = threadOps;
872
919
  const plugins = [];
873
920
  let destroySubagentSandboxes;
@@ -961,8 +1008,10 @@ async function createSession({
961
1008
  nonRetryable: true
962
1009
  });
963
1010
  }
1011
+ const forkInit = sandboxInit;
964
1012
  sandboxId = await sandboxOps.forkSandbox(
965
- sandboxInit.sandboxId
1013
+ forkInit.sandboxId,
1014
+ forkInit.options
966
1015
  );
967
1016
  sandboxOwned = true;
968
1017
  } else if (sandboxMode === "from-snapshot") {
@@ -972,8 +1021,11 @@ async function createSession({
972
1021
  nonRetryable: true
973
1022
  });
974
1023
  }
975
- const snap = sandboxInit.snapshot;
976
- sandboxId = await sandboxOps.restoreSandbox(snap);
1024
+ const restoreInit = sandboxInit;
1025
+ sandboxId = await sandboxOps.restoreSandbox(
1026
+ restoreInit.snapshot,
1027
+ restoreInit.options
1028
+ );
977
1029
  sandboxOwned = true;
978
1030
  } else if (sandboxOps) {
979
1031
  const skillFiles = skills ? collectSkillFiles(skills) : void 0;
@@ -1062,12 +1114,18 @@ async function createSession({
1062
1114
  const currentTurn = stateManager.getTurns();
1063
1115
  workflow.log.debug("turn started", { agentName, threadId, turn: currentTurn });
1064
1116
  stateManager.setTools(toolRouter.getToolDefinitions());
1065
- const { message, rawToolCalls, usage } = await runAgent({
1117
+ const {
1118
+ message,
1119
+ rawToolCalls,
1120
+ usage,
1121
+ threadLengthAtCall
1122
+ } = await runAgent({
1066
1123
  threadId,
1067
1124
  threadKey,
1068
1125
  agentName,
1069
1126
  metadata
1070
1127
  });
1128
+ const preAssistantLength = threadLengthAtCall;
1071
1129
  await appendAgentMessage(threadId, workflow.uuid4(), message, threadKey);
1072
1130
  if (usage) {
1073
1131
  stateManager.updateUsage(usage);
@@ -1113,6 +1171,24 @@ async function createSession({
1113
1171
  stateManager.updateUsage(result.usage);
1114
1172
  }
1115
1173
  }
1174
+ const rewind = toolCallResults.rewind;
1175
+ if (rewind) {
1176
+ workflow.log.info("rewinding turn", {
1177
+ agentName,
1178
+ threadId,
1179
+ turn: currentTurn,
1180
+ toolCallId: rewind.toolCallId,
1181
+ toolName: rewind.toolName
1182
+ });
1183
+ if (preAssistantLength === void 0) {
1184
+ throw workflow.ApplicationFailure.create({
1185
+ message: "Rewind requested but runAgent did not report `threadLengthAtCall`; the adapter must populate it to support rewinds.",
1186
+ nonRetryable: true
1187
+ });
1188
+ }
1189
+ await truncateThread(threadId, preAssistantLength, threadKey);
1190
+ continue;
1191
+ }
1116
1192
  if (stateManager.getStatus() === "WAITING_FOR_INPUT") {
1117
1193
  const conditionMet = await workflow.condition(
1118
1194
  () => stateManager.getStatus() === "RUNNING",