zeitlich 0.2.33 → 0.2.34
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 +17 -6
- package/dist/{activities-fnX8-vhR.d.cts → activities-JOqPfKP0.d.cts} +2 -2
- package/dist/{activities-YBD5BaHh.d.ts → activities-WwMsjRwm.d.ts} +2 -2
- package/dist/adapters/sandbox/bedrock/index.cjs +2 -0
- package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
- package/dist/adapters/sandbox/bedrock/index.d.cts +4 -3
- package/dist/adapters/sandbox/bedrock/index.d.ts +4 -3
- package/dist/adapters/sandbox/bedrock/index.js +2 -0
- package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
- package/dist/adapters/sandbox/bedrock/workflow.cjs +1 -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 +1 -0
- package/dist/adapters/sandbox/bedrock/workflow.js.map +1 -1
- package/dist/adapters/sandbox/daytona/index.cjs +2 -0
- package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +2 -1
- package/dist/adapters/sandbox/daytona/index.d.ts +2 -1
- package/dist/adapters/sandbox/daytona/index.js +2 -0
- package/dist/adapters/sandbox/daytona/index.js.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.cjs +1 -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 +1 -0
- package/dist/adapters/sandbox/daytona/workflow.js.map +1 -1
- package/dist/adapters/sandbox/e2b/index.cjs +3 -0
- package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
- package/dist/adapters/sandbox/e2b/index.d.cts +2 -1
- package/dist/adapters/sandbox/e2b/index.d.ts +2 -1
- package/dist/adapters/sandbox/e2b/index.js +3 -0
- package/dist/adapters/sandbox/e2b/index.js.map +1 -1
- package/dist/adapters/sandbox/e2b/workflow.cjs +1 -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 +1 -0
- package/dist/adapters/sandbox/e2b/workflow.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.cjs +2 -0
- package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +2 -1
- package/dist/adapters/sandbox/inmemory/index.d.ts +2 -1
- package/dist/adapters/sandbox/inmemory/index.js +2 -0
- package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.cjs +1 -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 +1 -0
- package/dist/adapters/sandbox/inmemory/workflow.js.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/workflow.d.cts +5 -5
- package/dist/adapters/thread/anthropic/workflow.d.ts +5 -5
- 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/workflow.d.cts +5 -5
- package/dist/adapters/thread/google-genai/workflow.d.ts +5 -5
- 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/workflow.d.cts +5 -5
- package/dist/adapters/thread/langchain/workflow.d.ts +5 -5
- package/dist/index.cjs +114 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -9
- package/dist/index.d.ts +10 -9
- package/dist/index.js +114 -30
- package/dist/index.js.map +1 -1
- package/dist/{proxy-CTCYWjkr.d.cts → proxy-BesT2ioL.d.cts} +1 -1
- package/dist/{proxy-Br4unLTC.d.ts → proxy-Bz6wXYW-.d.ts} +1 -1
- package/dist/{thread-manager-Cv_BR28i.d.cts → thread-manager-CCVAOK8g.d.cts} +1 -1
- package/dist/{thread-manager-CUubPYPH.d.cts → thread-manager-Cf_34H8w.d.cts} +1 -1
- package/dist/{thread-manager-YJLoc1vH.d.ts → thread-manager-ClKAQx78.d.ts} +1 -1
- package/dist/{thread-manager-DKWxHUzD.d.ts → thread-manager-DarJIK_b.d.ts} +1 -1
- package/dist/{types-Bpq5fDI5.d.cts → types-BGLW5Zyj.d.ts} +35 -20
- package/dist/{types-BxiT8w9d.d.ts → types-BVUmLYpj.d.ts} +1 -1
- package/dist/{types-DUvEZSDe.d.cts → types-CBH54cwr.d.cts} +1 -1
- package/dist/{types-NJDyMyUx.d.cts → types-DPAZ3KCs.d.cts} +1 -1
- package/dist/{types-CheCTLeV.d.ts → types-DlLajQcu.d.cts} +35 -20
- package/dist/{types-AujBIMMn.d.cts → types-DxCpFNv_.d.cts} +4 -0
- package/dist/{types-AujBIMMn.d.ts → types-DxCpFNv_.d.ts} +4 -0
- package/dist/{types-DBk-C8zM.d.ts → types-wiGLvxWf.d.ts} +1 -1
- package/dist/{workflow-D9nNERvs.d.ts → workflow-_ZGcacCK.d.ts} +3 -3
- package/dist/{workflow-Od9vx5Jk.d.cts → workflow-hocXpLwg.d.cts} +3 -3
- package/dist/workflow.cjs +108 -30
- 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 +108 -30
- package/dist/workflow.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/sandbox/bedrock/index.ts +4 -0
- package/src/adapters/sandbox/bedrock/proxy.ts +1 -0
- package/src/adapters/sandbox/daytona/index.ts +4 -0
- package/src/adapters/sandbox/daytona/proxy.ts +1 -0
- package/src/adapters/sandbox/e2b/index.ts +4 -0
- package/src/adapters/sandbox/e2b/proxy.ts +1 -0
- package/src/adapters/sandbox/inmemory/index.ts +4 -0
- package/src/adapters/sandbox/inmemory/proxy.ts +1 -0
- package/src/lib/lifecycle.ts +7 -3
- package/src/lib/sandbox/manager.ts +7 -0
- package/src/lib/sandbox/types.ts +4 -0
- package/src/lib/session/session-edge-cases.integration.test.ts +194 -0
- package/src/lib/session/session.integration.test.ts +5 -0
- package/src/lib/session/session.ts +9 -0
- package/src/lib/session/types.ts +5 -0
- package/src/lib/subagent/define.ts +1 -1
- package/src/lib/subagent/handler.ts +142 -32
- package/src/lib/subagent/index.ts +5 -1
- package/src/lib/subagent/signals.ts +8 -1
- package/src/lib/subagent/subagent.integration.test.ts +532 -25
- package/src/lib/subagent/types.ts +32 -15
- package/src/lib/subagent/workflow.ts +26 -13
- package/src/lib/virtual-fs/manager.ts +1 -1
- package/src/lib/virtual-fs/types.ts +2 -2
- package/src/lib/virtual-fs/virtual-fs.test.ts +2 -2
package/dist/workflow.cjs
CHANGED
|
@@ -392,23 +392,50 @@ function createSubagentTool(subagents) {
|
|
|
392
392
|
};
|
|
393
393
|
}
|
|
394
394
|
var childResultSignal = workflow.defineSignal("childResult");
|
|
395
|
+
var childSandboxReadySignal = workflow.defineSignal("childSandboxReady");
|
|
395
396
|
var destroySandboxSignal = workflow.defineSignal("destroySandbox");
|
|
396
397
|
|
|
397
398
|
// src/lib/subagent/handler.ts
|
|
398
399
|
function resolveSandboxConfig(config) {
|
|
399
|
-
if (!config || config === "none")
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
400
|
+
if (!config || config === "none") {
|
|
401
|
+
return { source: "none", init: "per-call", continuation: "fork" };
|
|
402
|
+
}
|
|
403
|
+
if (config.source === "inherit") {
|
|
404
|
+
return {
|
|
405
|
+
source: "inherit",
|
|
406
|
+
init: "per-call",
|
|
407
|
+
continuation: config.continuation,
|
|
408
|
+
shutdown: config.shutdown
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
source: "own",
|
|
413
|
+
init: config.init ?? "per-call",
|
|
414
|
+
continuation: config.continuation,
|
|
415
|
+
shutdown: config.shutdown
|
|
416
|
+
};
|
|
403
417
|
}
|
|
404
418
|
function createSubagentHandler(subagents) {
|
|
405
419
|
const { taskQueue: parentTaskQueue } = workflow.workflowInfo();
|
|
406
420
|
const childResults = /* @__PURE__ */ new Map();
|
|
407
421
|
const pendingDestroys = /* @__PURE__ */ new Map();
|
|
408
422
|
const threadSandboxes = /* @__PURE__ */ new Map();
|
|
423
|
+
const persistentSandboxes = /* @__PURE__ */ new Map();
|
|
424
|
+
const persistentSandboxCreating = /* @__PURE__ */ new Set();
|
|
425
|
+
const lazyCreatorAgent = /* @__PURE__ */ new Map();
|
|
409
426
|
workflow.setHandler(childResultSignal, ({ childWorkflowId, result }) => {
|
|
410
427
|
childResults.set(childWorkflowId, result);
|
|
411
428
|
});
|
|
429
|
+
workflow.setHandler(
|
|
430
|
+
childSandboxReadySignal,
|
|
431
|
+
({ childWorkflowId, sandboxId }) => {
|
|
432
|
+
const agentName = lazyCreatorAgent.get(childWorkflowId);
|
|
433
|
+
if (agentName && !persistentSandboxes.has(agentName)) {
|
|
434
|
+
persistentSandboxes.set(agentName, sandboxId);
|
|
435
|
+
lazyCreatorAgent.delete(childWorkflowId);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
);
|
|
412
439
|
const handler = async (args, context) => {
|
|
413
440
|
const config = subagents.find((s) => s.agentName === args.subagent);
|
|
414
441
|
if (!config) {
|
|
@@ -435,21 +462,48 @@ function createSubagentHandler(subagents) {
|
|
|
435
462
|
};
|
|
436
463
|
}
|
|
437
464
|
let sandbox;
|
|
465
|
+
let sandboxShutdownOverride;
|
|
466
|
+
let isLazyCreator = false;
|
|
438
467
|
if (sandboxCfg.source === "inherit" && parentSandboxId) {
|
|
439
|
-
|
|
440
|
-
mode: "
|
|
441
|
-
|
|
442
|
-
|
|
468
|
+
if (sandboxCfg.continuation === "fork") {
|
|
469
|
+
sandbox = { mode: "fork", sandboxId: parentSandboxId };
|
|
470
|
+
} else {
|
|
471
|
+
sandbox = { mode: "inherit", sandboxId: parentSandboxId };
|
|
472
|
+
}
|
|
443
473
|
} else if (sandboxCfg.source === "own") {
|
|
444
|
-
const
|
|
445
|
-
|
|
446
|
-
|
|
474
|
+
const isLazy = sandboxCfg.init === "once";
|
|
475
|
+
let baseSandboxId;
|
|
476
|
+
if (isLazy) {
|
|
477
|
+
baseSandboxId = persistentSandboxes.get(config.agentName);
|
|
478
|
+
if (!baseSandboxId) {
|
|
479
|
+
if (persistentSandboxCreating.has(config.agentName)) {
|
|
480
|
+
await workflow.condition(() => persistentSandboxes.has(config.agentName));
|
|
481
|
+
baseSandboxId = persistentSandboxes.get(config.agentName);
|
|
482
|
+
} else {
|
|
483
|
+
persistentSandboxCreating.add(config.agentName);
|
|
484
|
+
isLazyCreator = true;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
} else if (continuationThreadId) {
|
|
488
|
+
baseSandboxId = threadSandboxes.get(continuationThreadId);
|
|
489
|
+
}
|
|
490
|
+
if (baseSandboxId) {
|
|
491
|
+
sandbox = {
|
|
492
|
+
mode: sandboxCfg.continuation === "continue" ? "continue" : "fork",
|
|
493
|
+
sandboxId: baseSandboxId
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
const userShutdown = sandboxCfg.shutdown;
|
|
497
|
+
const alreadySurvives = userShutdown === "pause-until-parent-close" || userShutdown === "keep-until-parent-close" || userShutdown === "pause" || userShutdown === "keep";
|
|
498
|
+
const mustSurvive = isLazyCreator || sandboxCfg.continuation === "continue" || isLazy && sandboxCfg.continuation === "fork";
|
|
499
|
+
if (mustSurvive && !alreadySurvives) {
|
|
500
|
+
sandboxShutdownOverride = isLazyCreator ? "pause-until-parent-close" : "pause";
|
|
447
501
|
}
|
|
448
502
|
}
|
|
449
503
|
const workflowInput = {
|
|
450
504
|
...thread && { thread },
|
|
451
505
|
...sandbox && { sandbox },
|
|
452
|
-
|
|
506
|
+
sandboxShutdown: sandboxShutdownOverride ?? sandboxCfg.shutdown ?? void 0
|
|
453
507
|
};
|
|
454
508
|
const resolvedContext = config.context === void 0 ? void 0 : typeof config.context === "function" ? config.context() : config.context;
|
|
455
509
|
const childOpts = {
|
|
@@ -457,6 +511,9 @@ function createSubagentHandler(subagents) {
|
|
|
457
511
|
args: resolvedContext === void 0 ? [args.prompt, workflowInput] : [args.prompt, workflowInput, resolvedContext],
|
|
458
512
|
taskQueue: config.taskQueue ?? parentTaskQueue
|
|
459
513
|
};
|
|
514
|
+
if (isLazyCreator) {
|
|
515
|
+
lazyCreatorAgent.set(childWorkflowId, config.agentName);
|
|
516
|
+
}
|
|
460
517
|
workflow.log.info("subagent spawned", {
|
|
461
518
|
subagent: config.agentName,
|
|
462
519
|
childWorkflowId,
|
|
@@ -464,10 +521,10 @@ function createSubagentHandler(subagents) {
|
|
|
464
521
|
sandboxSource: sandboxCfg.source
|
|
465
522
|
});
|
|
466
523
|
const childHandle = await workflow.startChild(config.workflow, childOpts);
|
|
467
|
-
const effectiveShutdown = sandboxCfg.shutdown ?? "destroy";
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
pendingDestroys.set(
|
|
524
|
+
const effectiveShutdown = sandboxShutdownOverride ?? sandboxCfg.shutdown ?? "destroy";
|
|
525
|
+
if (effectiveShutdown === "pause-until-parent-close" || effectiveShutdown === "keep-until-parent-close") {
|
|
526
|
+
const key = isLazyCreator ? `persistent:${config.agentName}` : childWorkflowId;
|
|
527
|
+
pendingDestroys.set(key, childHandle);
|
|
471
528
|
}
|
|
472
529
|
await Promise.race([
|
|
473
530
|
workflow.condition(() => childResults.has(childWorkflowId)),
|
|
@@ -501,8 +558,16 @@ function createSubagentHandler(subagents) {
|
|
|
501
558
|
sandboxId: childSandboxId,
|
|
502
559
|
metadata
|
|
503
560
|
} = childResult;
|
|
504
|
-
if (
|
|
505
|
-
|
|
561
|
+
if (childSandboxId) {
|
|
562
|
+
if (sandboxCfg.source === "own" && sandboxCfg.init === "once" && !persistentSandboxes.has(config.agentName)) {
|
|
563
|
+
persistentSandboxes.set(config.agentName, childSandboxId);
|
|
564
|
+
} else if (allowsContinuation && childThreadId) {
|
|
565
|
+
threadSandboxes.set(childThreadId, childSandboxId);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
if (isLazyCreator) {
|
|
569
|
+
persistentSandboxCreating.delete(config.agentName);
|
|
570
|
+
lazyCreatorAgent.delete(childWorkflowId);
|
|
506
571
|
}
|
|
507
572
|
if (!toolResponse) {
|
|
508
573
|
return {
|
|
@@ -708,6 +773,7 @@ async function createSession({
|
|
|
708
773
|
thread: threadInit,
|
|
709
774
|
sandbox: sandboxInit,
|
|
710
775
|
sandboxShutdown = "destroy",
|
|
776
|
+
onSandboxReady,
|
|
711
777
|
virtualFs: virtualFsConfig,
|
|
712
778
|
virtualFsOps
|
|
713
779
|
}) {
|
|
@@ -810,6 +876,9 @@ async function createSession({
|
|
|
810
876
|
});
|
|
811
877
|
}
|
|
812
878
|
sandboxId = sandboxInit.sandboxId;
|
|
879
|
+
if (sandboxShutdown === "pause-until-parent-close") {
|
|
880
|
+
await sandboxOps.resumeSandbox(sandboxId);
|
|
881
|
+
}
|
|
813
882
|
sandboxOwned = true;
|
|
814
883
|
} else if (sandboxMode === "fork") {
|
|
815
884
|
if (!sandboxOps) {
|
|
@@ -832,6 +901,9 @@ async function createSession({
|
|
|
832
901
|
sandboxOwned = true;
|
|
833
902
|
}
|
|
834
903
|
}
|
|
904
|
+
if (sandboxId && onSandboxReady) {
|
|
905
|
+
onSandboxReady(sandboxId);
|
|
906
|
+
}
|
|
835
907
|
if (virtualFsConfig) {
|
|
836
908
|
if (!virtualFsOps) {
|
|
837
909
|
throw workflow.ApplicationFailure.create({
|
|
@@ -1223,39 +1295,45 @@ function defineSubagent(definition, overrides) {
|
|
|
1223
1295
|
function defineSubagentWorkflow(config, fn) {
|
|
1224
1296
|
const workflow$1 = async (prompt, workflowInput, context) => {
|
|
1225
1297
|
const effectiveShutdown = workflowInput.sandboxShutdown ?? config.sandboxShutdown ?? "destroy";
|
|
1298
|
+
const { parent } = workflow.workflowInfo();
|
|
1299
|
+
if (!parent) {
|
|
1300
|
+
throw workflow.ApplicationFailure.create({
|
|
1301
|
+
message: "Subagent workflow called without a parent workflow",
|
|
1302
|
+
nonRetryable: true
|
|
1303
|
+
});
|
|
1304
|
+
}
|
|
1305
|
+
const parentHandle = workflow.getExternalWorkflowHandle(parent.workflowId);
|
|
1226
1306
|
const sessionInput = {
|
|
1227
1307
|
agentName: config.name,
|
|
1228
1308
|
sandboxShutdown: effectiveShutdown,
|
|
1229
1309
|
...workflowInput.thread && { thread: workflowInput.thread },
|
|
1230
|
-
...workflowInput.sandbox && { sandbox: workflowInput.sandbox }
|
|
1310
|
+
...workflowInput.sandbox && { sandbox: workflowInput.sandbox },
|
|
1311
|
+
onSandboxReady: (sandboxId) => {
|
|
1312
|
+
void parentHandle.signal(childSandboxReadySignal, {
|
|
1313
|
+
childWorkflowId: workflow.workflowInfo().workflowId,
|
|
1314
|
+
sandboxId
|
|
1315
|
+
});
|
|
1316
|
+
}
|
|
1231
1317
|
};
|
|
1232
1318
|
const { destroySandbox, ...result } = await fn(
|
|
1233
1319
|
prompt,
|
|
1234
1320
|
sessionInput,
|
|
1235
1321
|
context ?? {}
|
|
1236
1322
|
);
|
|
1237
|
-
if (effectiveShutdown === "pause-until-parent-close") {
|
|
1323
|
+
if (effectiveShutdown === "pause-until-parent-close" || effectiveShutdown === "keep-until-parent-close") {
|
|
1238
1324
|
if (!destroySandbox) {
|
|
1239
1325
|
throw workflow.ApplicationFailure.create({
|
|
1240
|
-
message: `Subagent "${config.name}" has sandboxShutdown="
|
|
1326
|
+
message: `Subagent "${config.name}" has sandboxShutdown="${effectiveShutdown}" but fn did not return a destroySandbox callback`,
|
|
1241
1327
|
nonRetryable: true
|
|
1242
1328
|
});
|
|
1243
1329
|
}
|
|
1244
1330
|
if (!result.sandboxId) {
|
|
1245
1331
|
throw workflow.ApplicationFailure.create({
|
|
1246
|
-
message: `Subagent "${config.name}" has sandboxShutdown="
|
|
1332
|
+
message: `Subagent "${config.name}" has sandboxShutdown="${effectiveShutdown}" but fn did not return a sandboxId`,
|
|
1247
1333
|
nonRetryable: true
|
|
1248
1334
|
});
|
|
1249
1335
|
}
|
|
1250
1336
|
}
|
|
1251
|
-
const { parent } = workflow.workflowInfo();
|
|
1252
|
-
if (!parent) {
|
|
1253
|
-
throw workflow.ApplicationFailure.create({
|
|
1254
|
-
message: "Subagent workflow called without a parent workflow",
|
|
1255
|
-
nonRetryable: true
|
|
1256
|
-
});
|
|
1257
|
-
}
|
|
1258
|
-
const parentHandle = workflow.getExternalWorkflowHandle(parent.workflowId);
|
|
1259
1337
|
await parentHandle.signal(childResultSignal, {
|
|
1260
1338
|
childWorkflowId: workflow.workflowInfo().workflowId,
|
|
1261
1339
|
result
|