zeitlich 0.2.38 → 0.2.39
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 +18 -0
- package/dist/{activities-BKhMtKDd.d.ts → activities-Bmu7XnaG.d.ts} +4 -6
- package/dist/{activities-CDcwkRZs.d.cts → activities-ByBFLvm2.d.cts} +4 -6
- package/dist/adapter-id-BB-mmrts.d.cts +17 -0
- package/dist/adapter-id-BB-mmrts.d.ts +17 -0
- package/dist/adapter-id-CMwVrVqv.d.cts +17 -0
- package/dist/adapter-id-CMwVrVqv.d.ts +17 -0
- package/dist/adapter-id-CbY2zeSt.d.cts +17 -0
- package/dist/adapter-id-CbY2zeSt.d.ts +17 -0
- package/dist/adapters/thread/anthropic/index.cjs +140 -23
- package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/index.d.cts +8 -7
- package/dist/adapters/thread/anthropic/index.d.ts +8 -7
- package/dist/adapters/thread/anthropic/index.js +140 -24
- package/dist/adapters/thread/anthropic/index.js.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.cjs +8 -3
- package/dist/adapters/thread/anthropic/workflow.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.d.cts +5 -4
- package/dist/adapters/thread/anthropic/workflow.d.ts +5 -4
- package/dist/adapters/thread/anthropic/workflow.js +8 -4
- package/dist/adapters/thread/anthropic/workflow.js.map +1 -1
- package/dist/adapters/thread/google-genai/index.cjs +140 -23
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +5 -4
- package/dist/adapters/thread/google-genai/index.d.ts +5 -4
- package/dist/adapters/thread/google-genai/index.js +140 -24
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.cjs +8 -3
- package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.d.cts +5 -4
- package/dist/adapters/thread/google-genai/workflow.d.ts +5 -4
- package/dist/adapters/thread/google-genai/workflow.js +8 -4
- package/dist/adapters/thread/google-genai/workflow.js.map +1 -1
- package/dist/adapters/thread/index.cjs +16 -0
- package/dist/adapters/thread/index.cjs.map +1 -0
- package/dist/adapters/thread/index.d.cts +34 -0
- package/dist/adapters/thread/index.d.ts +34 -0
- package/dist/adapters/thread/index.js +12 -0
- package/dist/adapters/thread/index.js.map +1 -0
- package/dist/adapters/thread/langchain/index.cjs +139 -24
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +8 -7
- package/dist/adapters/thread/langchain/index.d.ts +8 -7
- package/dist/adapters/thread/langchain/index.js +139 -25
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.cjs +8 -3
- package/dist/adapters/thread/langchain/workflow.cjs.map +1 -1
- package/dist/adapters/thread/langchain/workflow.d.cts +5 -4
- package/dist/adapters/thread/langchain/workflow.d.ts +5 -4
- package/dist/adapters/thread/langchain/workflow.js +8 -4
- package/dist/adapters/thread/langchain/workflow.js.map +1 -1
- package/dist/index.cjs +266 -48
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +263 -49
- package/dist/index.js.map +1 -1
- package/dist/{proxy-D_3x7RN4.d.cts → proxy-BAKzNGRq.d.cts} +1 -1
- package/dist/{proxy-CUlKSvZS.d.ts → proxy-DO_MXbY4.d.ts} +1 -1
- package/dist/{thread-manager-CVu7o2cs.d.ts → thread-manager-CcRXasqs.d.ts} +2 -4
- package/dist/{thread-manager-HSwyh28L.d.cts → thread-manager-ClwSaUnj.d.cts} +2 -4
- package/dist/{thread-manager-c1gPopAG.d.ts → thread-manager-D-7lp1JK.d.ts} +2 -4
- package/dist/{thread-manager-wGi-LqIP.d.cts → thread-manager-Y8Ucf0Tf.d.cts} +2 -4
- package/dist/{types-C06FwR96.d.cts → types-Bcbiq8iv.d.cts} +162 -44
- package/dist/{types-BH_IRryz.d.ts → types-DpHTX-iO.d.ts} +54 -6
- package/dist/{types-DNr31FzL.d.ts → types-Dt8-HBBT.d.ts} +162 -44
- package/dist/{types-BaOw4hKI.d.cts → types-hFFi-Zd9.d.cts} +54 -6
- package/dist/{workflow-CSCkpwAL.d.ts → workflow-Bmf9EtDW.d.ts} +82 -2
- package/dist/{workflow-DuvMZ8Vm.d.cts → workflow-Bx9utBwb.d.cts} +82 -2
- package/dist/workflow.cjs +188 -37
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +185 -38
- package/dist/workflow.js.map +1 -1
- package/package.json +11 -1
- package/src/adapters/thread/adapter-id.test.ts +42 -0
- package/src/adapters/thread/anthropic/activities.ts +33 -7
- package/src/adapters/thread/anthropic/adapter-id.ts +16 -0
- package/src/adapters/thread/anthropic/fork-transform.test.ts +291 -0
- package/src/adapters/thread/anthropic/index.ts +3 -0
- package/src/adapters/thread/anthropic/model-invoker.ts +8 -4
- package/src/adapters/thread/anthropic/proxy.ts +3 -2
- package/src/adapters/thread/anthropic/thread-manager.ts +27 -4
- package/src/adapters/thread/google-genai/activities.ts +33 -7
- package/src/adapters/thread/google-genai/adapter-id.ts +16 -0
- package/src/adapters/thread/google-genai/fork-transform.test.ts +149 -0
- package/src/adapters/thread/google-genai/index.ts +3 -0
- package/src/adapters/thread/google-genai/model-invoker.ts +7 -3
- package/src/adapters/thread/google-genai/proxy.ts +3 -2
- package/src/adapters/thread/google-genai/thread-manager.ts +27 -4
- package/src/adapters/thread/index.ts +39 -0
- package/src/adapters/thread/langchain/activities.ts +33 -7
- package/src/adapters/thread/langchain/adapter-id.ts +16 -0
- package/src/adapters/thread/langchain/fork-transform.test.ts +142 -0
- package/src/adapters/thread/langchain/index.ts +3 -0
- package/src/adapters/thread/langchain/model-invoker.ts +8 -3
- package/src/adapters/thread/langchain/proxy.ts +3 -2
- package/src/adapters/thread/langchain/thread-manager.ts +27 -4
- package/src/lib/lifecycle.ts +3 -1
- package/src/lib/model/types.ts +7 -10
- package/src/lib/session/session-edge-cases.integration.test.ts +131 -63
- package/src/lib/session/session.integration.test.ts +174 -5
- package/src/lib/session/session.ts +68 -28
- package/src/lib/session/types.ts +60 -9
- package/src/lib/state/index.ts +1 -0
- package/src/lib/state/manager.integration.test.ts +109 -0
- package/src/lib/state/manager.ts +38 -8
- package/src/lib/state/types.ts +25 -0
- package/src/lib/subagent/handler.ts +124 -11
- package/src/lib/subagent/index.ts +5 -1
- package/src/lib/subagent/subagent.integration.test.ts +528 -0
- package/src/lib/subagent/types.ts +63 -14
- package/src/lib/subagent/workflow.ts +29 -2
- package/src/lib/thread/index.ts +5 -0
- package/src/lib/thread/keys.test.ts +101 -0
- package/src/lib/thread/keys.ts +94 -0
- package/src/lib/thread/manager.test.ts +139 -0
- package/src/lib/thread/manager.ts +92 -14
- package/src/lib/thread/proxy.ts +2 -0
- package/src/lib/thread/types.ts +60 -6
- package/src/lib/tool-router/types.ts +16 -8
- package/src/lib/types.ts +12 -0
- package/src/workflow.ts +12 -1
- package/tsup.config.ts +1 -0
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-
|
|
2
|
-
export { A as AskUserQuestionArgs, c as FileTreeAccessor, d as GrepArgs, O as ObservabilityHooks, R as ReadSkillArgs, S as SessionEndedEvent, e as SessionStartedEvent, f as SubagentArgs, T as
|
|
3
|
-
import { R as RouterContext,
|
|
4
|
-
export {
|
|
1
|
+
import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-Bx9utBwb.cjs';
|
|
2
|
+
export { A as AskUserQuestionArgs, D as DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, c as FileTreeAccessor, d as GrepArgs, O as ObservabilityHooks, R as ReadSkillArgs, S as SessionEndedEvent, e as SessionStartedEvent, f as SubagentArgs, T as THREAD_TTL_SECONDS, g as TaskCreateArgs, h as TaskGetArgs, i as TaskListArgs, j as TaskUpdateArgs, k as ToolExecutedEvent, l as TurnCompletedEvent, W as WorkflowConfig, m as WorkflowInput, n as WorkflowSessionInput, Z as ZeitlichObservabilitySinks, o as applyVirtualTreeMutations, p as askUserQuestionTool, q as bashTool, r as composeHooks, s as createAgentStateManager, t as createAskUserQuestionHandler, u as createBashToolDescription, v as createObservabilityHooks, w as createReadSkillHandler, x as createReadSkillTool, y as createSession, z as createTaskCreateHandler, C as createTaskGetHandler, E as createTaskListHandler, H as createTaskUpdateHandler, I as createToolRouter, J as defineSubagent, K as defineSubagentWorkflow, L as defineTool, M as defineWorkflow, N as editTool, P as filesWithMimeType, Q as formatVirtualFileTree, U as getShortId, V as getThreadListKey, X as getThreadMetaKey, Y as globTool, _ as grepTool, $ as hasDirectory, a0 as hasFileWithMimeType, a1 as hasNoOtherToolCalls, a2 as parseSkillFile, a3 as proxyRunAgent, a4 as proxyVirtualFsOps, a5 as readFileTool, a6 as taskCreateTool, a7 as taskGetTool, a8 as taskListTool, a9 as taskUpdateTool, aa as writeFileTool } from './workflow-Bx9utBwb.cjs';
|
|
3
|
+
import { R as RouterContext, e as ToolResultConfig, d as ActivityToolHandler, J as JsonValue, c as ToolHandlerResponse, B as BaseAgentState, f as RunAgentConfig, g as SkillProvider, h as SkillMetadata, i as Skill, F as FileEntryMetadata, j as FileResolver, V as VirtualFsContext, k as TreeMutation, l as PrefixedVirtualFsOps } from './types-Bcbiq8iv.cjs';
|
|
4
|
+
export { m as AgentConfig, n as AgentFile, A as AgentResponse, o as AgentState, p as AgentStateManager, q as AgentStatus, r as AppendToolResultFn, s as FileEntry, H as Hooks, I as InferToolResults, t as JsonPrimitive, u as JsonSerializable, a as ModelInvoker, M as ModelInvokerConfig, v as ParsedToolCall, w as ParsedToolCallUnion, P as PersistedThreadState, x as PostHumanMessageAppendHook, y as PostHumanMessageAppendHookContext, z as PostToolUseFailureHook, C as PostToolUseFailureHookContext, D as PostToolUseFailureHookResult, E as PostToolUseHook, G as PostToolUseHookContext, K as PreHumanMessageAppendHook, L as PreHumanMessageAppendHookContext, N as PreToolUseHook, O as PreToolUseHookContext, Q as PreToolUseHookResult, b as PrefixedThreadOps, U as ProcessToolCallsContext, W as ProcessToolCallsResult, X as RawToolCall, Y as RewindSignal, Z as RunAgentActivity, _ as SandboxInit, $ as SandboxShutdown, S as ScopedPrefix, a0 as SerializableToolDefinition, a1 as SessionConfig, a2 as SessionEndHook, a3 as SessionEndHookContext, a4 as SessionExitReason, a5 as SessionResult, a6 as SessionStartHook, a7 as SessionStartHookContext, a8 as SubagentChildWorkflowOptions, a9 as SubagentConfig, aa as SubagentDefinition, ab as SubagentFnResult, ac as SubagentHandlerResponse, ad as SubagentHooks, ae as SubagentSandboxConfig, af as SubagentSandboxShutdown, ag as SubagentSessionInput, ah as SubagentWorkflow, ai as SubagentWorkflowInput, aj as TaskStatus, ak as ThreadInit, T as ThreadOps, al as TokenUsage, am as ToolArgs, an as ToolCallResult, ao as ToolCallResultUnion, ap as ToolDefinition, aq as ToolHandler, ar as ToolHooks, as as ToolMap, at as ToolNames, au as ToolResult, av as ToolRouter, aw as ToolRouterHooks, ax as ToolWithHandler, ay as VirtualFileSystem, az as VirtualFileTree, aA as VirtualFsOps, aB as VirtualFsState, aC as WorkflowTask, aD as ZeitlichSession, aE as isTerminalStatus } from './types-Bcbiq8iv.cjs';
|
|
5
5
|
import { S as Sandbox, a as SandboxFileSystem, d as SandboxCreateOptions, b as SandboxProvider, f as SandboxSnapshot, P as PrefixedSandboxOps, F as FileStat, D as DirentEntry, E as ExecResult } from './types-yx0LzPGn.cjs';
|
|
6
6
|
export { h as ExecOptions, c as SandboxCapabilities, e as SandboxCreateResult, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps } from './types-yx0LzPGn.cjs';
|
|
7
7
|
import { WorkflowClient } from '@temporalio/client';
|
|
8
|
-
import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-
|
|
9
|
-
export { P as ProviderThreadManager } from './types-
|
|
8
|
+
import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-hFFi-Zd9.cjs';
|
|
9
|
+
export { P as ProviderThreadManager } from './types-hFFi-Zd9.cjs';
|
|
10
10
|
import 'zod';
|
|
11
11
|
import '@temporalio/workflow';
|
|
12
12
|
import '@temporalio/common';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-
|
|
2
|
-
export { A as AskUserQuestionArgs, c as FileTreeAccessor, d as GrepArgs, O as ObservabilityHooks, R as ReadSkillArgs, S as SessionEndedEvent, e as SessionStartedEvent, f as SubagentArgs, T as
|
|
3
|
-
import { R as RouterContext,
|
|
4
|
-
export {
|
|
1
|
+
import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-Bmf9EtDW.js';
|
|
2
|
+
export { A as AskUserQuestionArgs, D as DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, c as FileTreeAccessor, d as GrepArgs, O as ObservabilityHooks, R as ReadSkillArgs, S as SessionEndedEvent, e as SessionStartedEvent, f as SubagentArgs, T as THREAD_TTL_SECONDS, g as TaskCreateArgs, h as TaskGetArgs, i as TaskListArgs, j as TaskUpdateArgs, k as ToolExecutedEvent, l as TurnCompletedEvent, W as WorkflowConfig, m as WorkflowInput, n as WorkflowSessionInput, Z as ZeitlichObservabilitySinks, o as applyVirtualTreeMutations, p as askUserQuestionTool, q as bashTool, r as composeHooks, s as createAgentStateManager, t as createAskUserQuestionHandler, u as createBashToolDescription, v as createObservabilityHooks, w as createReadSkillHandler, x as createReadSkillTool, y as createSession, z as createTaskCreateHandler, C as createTaskGetHandler, E as createTaskListHandler, H as createTaskUpdateHandler, I as createToolRouter, J as defineSubagent, K as defineSubagentWorkflow, L as defineTool, M as defineWorkflow, N as editTool, P as filesWithMimeType, Q as formatVirtualFileTree, U as getShortId, V as getThreadListKey, X as getThreadMetaKey, Y as globTool, _ as grepTool, $ as hasDirectory, a0 as hasFileWithMimeType, a1 as hasNoOtherToolCalls, a2 as parseSkillFile, a3 as proxyRunAgent, a4 as proxyVirtualFsOps, a5 as readFileTool, a6 as taskCreateTool, a7 as taskGetTool, a8 as taskListTool, a9 as taskUpdateTool, aa as writeFileTool } from './workflow-Bmf9EtDW.js';
|
|
3
|
+
import { R as RouterContext, e as ToolResultConfig, d as ActivityToolHandler, J as JsonValue, c as ToolHandlerResponse, B as BaseAgentState, f as RunAgentConfig, g as SkillProvider, h as SkillMetadata, i as Skill, F as FileEntryMetadata, j as FileResolver, V as VirtualFsContext, k as TreeMutation, l as PrefixedVirtualFsOps } from './types-Dt8-HBBT.js';
|
|
4
|
+
export { m as AgentConfig, n as AgentFile, A as AgentResponse, o as AgentState, p as AgentStateManager, q as AgentStatus, r as AppendToolResultFn, s as FileEntry, H as Hooks, I as InferToolResults, t as JsonPrimitive, u as JsonSerializable, a as ModelInvoker, M as ModelInvokerConfig, v as ParsedToolCall, w as ParsedToolCallUnion, P as PersistedThreadState, x as PostHumanMessageAppendHook, y as PostHumanMessageAppendHookContext, z as PostToolUseFailureHook, C as PostToolUseFailureHookContext, D as PostToolUseFailureHookResult, E as PostToolUseHook, G as PostToolUseHookContext, K as PreHumanMessageAppendHook, L as PreHumanMessageAppendHookContext, N as PreToolUseHook, O as PreToolUseHookContext, Q as PreToolUseHookResult, b as PrefixedThreadOps, U as ProcessToolCallsContext, W as ProcessToolCallsResult, X as RawToolCall, Y as RewindSignal, Z as RunAgentActivity, _ as SandboxInit, $ as SandboxShutdown, S as ScopedPrefix, a0 as SerializableToolDefinition, a1 as SessionConfig, a2 as SessionEndHook, a3 as SessionEndHookContext, a4 as SessionExitReason, a5 as SessionResult, a6 as SessionStartHook, a7 as SessionStartHookContext, a8 as SubagentChildWorkflowOptions, a9 as SubagentConfig, aa as SubagentDefinition, ab as SubagentFnResult, ac as SubagentHandlerResponse, ad as SubagentHooks, ae as SubagentSandboxConfig, af as SubagentSandboxShutdown, ag as SubagentSessionInput, ah as SubagentWorkflow, ai as SubagentWorkflowInput, aj as TaskStatus, ak as ThreadInit, T as ThreadOps, al as TokenUsage, am as ToolArgs, an as ToolCallResult, ao as ToolCallResultUnion, ap as ToolDefinition, aq as ToolHandler, ar as ToolHooks, as as ToolMap, at as ToolNames, au as ToolResult, av as ToolRouter, aw as ToolRouterHooks, ax as ToolWithHandler, ay as VirtualFileSystem, az as VirtualFileTree, aA as VirtualFsOps, aB as VirtualFsState, aC as WorkflowTask, aD as ZeitlichSession, aE as isTerminalStatus } from './types-Dt8-HBBT.js';
|
|
5
5
|
import { S as Sandbox, a as SandboxFileSystem, d as SandboxCreateOptions, b as SandboxProvider, f as SandboxSnapshot, P as PrefixedSandboxOps, F as FileStat, D as DirentEntry, E as ExecResult } from './types-yx0LzPGn.js';
|
|
6
6
|
export { h as ExecOptions, c as SandboxCapabilities, e as SandboxCreateResult, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps } from './types-yx0LzPGn.js';
|
|
7
7
|
import { WorkflowClient } from '@temporalio/client';
|
|
8
|
-
import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-
|
|
9
|
-
export { P as ProviderThreadManager } from './types-
|
|
8
|
+
import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-DpHTX-iO.js';
|
|
9
|
+
export { P as ProviderThreadManager } from './types-DpHTX-iO.js';
|
|
10
10
|
import 'zod';
|
|
11
11
|
import '@temporalio/workflow';
|
|
12
12
|
import '@temporalio/common';
|
package/dist/index.js
CHANGED
|
@@ -438,6 +438,7 @@ function createSubagentTool(subagents) {
|
|
|
438
438
|
var childSandboxReadySignal = defineSignal("childSandboxReady");
|
|
439
439
|
|
|
440
440
|
// src/lib/subagent/handler.ts
|
|
441
|
+
var DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT = "1h";
|
|
441
442
|
function resolveSandboxConfig(config) {
|
|
442
443
|
if (!config || config === "none") {
|
|
443
444
|
return { source: "none", init: "per-call", continuation: "fork" };
|
|
@@ -469,17 +470,28 @@ function createSubagentHandler(subagents) {
|
|
|
469
470
|
const threadSandboxes = /* @__PURE__ */ new Map();
|
|
470
471
|
const persistentSandboxes = /* @__PURE__ */ new Map();
|
|
471
472
|
const persistentSandboxCreating = /* @__PURE__ */ new Set();
|
|
473
|
+
const persistentSandboxCreationError = /* @__PURE__ */ new Map();
|
|
472
474
|
const lazyCreatorAgent = /* @__PURE__ */ new Map();
|
|
475
|
+
const snapshotBaseCreatorAgent = /* @__PURE__ */ new Map();
|
|
473
476
|
const threadSnapshots = /* @__PURE__ */ new Map();
|
|
474
477
|
const persistentBaseSnapshot = /* @__PURE__ */ new Map();
|
|
475
478
|
const persistentBaseSnapshotCreating = /* @__PURE__ */ new Set();
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
lazyCreatorAgent.
|
|
479
|
+
const persistentBaseSnapshotCreationError = /* @__PURE__ */ new Map();
|
|
480
|
+
setHandler(
|
|
481
|
+
childSandboxReadySignal,
|
|
482
|
+
({ childWorkflowId, sandboxId, baseSnapshot }) => {
|
|
483
|
+
const lazyAgent = lazyCreatorAgent.get(childWorkflowId);
|
|
484
|
+
if (lazyAgent && !persistentSandboxes.has(lazyAgent)) {
|
|
485
|
+
persistentSandboxes.set(lazyAgent, sandboxId);
|
|
486
|
+
lazyCreatorAgent.delete(childWorkflowId);
|
|
487
|
+
}
|
|
488
|
+
const snapAgent = snapshotBaseCreatorAgent.get(childWorkflowId);
|
|
489
|
+
if (snapAgent && baseSnapshot && !persistentBaseSnapshot.has(snapAgent)) {
|
|
490
|
+
persistentBaseSnapshot.set(snapAgent, baseSnapshot);
|
|
491
|
+
snapshotBaseCreatorAgent.delete(childWorkflowId);
|
|
492
|
+
}
|
|
481
493
|
}
|
|
482
|
-
|
|
494
|
+
);
|
|
483
495
|
const handler = async (args, context) => {
|
|
484
496
|
const config = subagents.find((s) => s.agentName === args.subagent);
|
|
485
497
|
if (!config) {
|
|
@@ -535,8 +547,20 @@ function createSubagentHandler(subagents) {
|
|
|
535
547
|
baseSnap = persistentBaseSnapshot.get(config.agentName);
|
|
536
548
|
if (!baseSnap) {
|
|
537
549
|
if (persistentBaseSnapshotCreating.has(config.agentName)) {
|
|
538
|
-
await condition(
|
|
550
|
+
await condition(
|
|
551
|
+
() => persistentBaseSnapshot.has(config.agentName) || persistentBaseSnapshotCreationError.has(config.agentName) || !persistentBaseSnapshotCreating.has(config.agentName)
|
|
552
|
+
);
|
|
553
|
+
const creatorErr = persistentBaseSnapshotCreationError.get(
|
|
554
|
+
config.agentName
|
|
555
|
+
);
|
|
556
|
+
if (creatorErr !== void 0) {
|
|
557
|
+
throw creatorErr;
|
|
558
|
+
}
|
|
539
559
|
baseSnap = persistentBaseSnapshot.get(config.agentName);
|
|
560
|
+
if (!baseSnap) {
|
|
561
|
+
persistentBaseSnapshotCreating.add(config.agentName);
|
|
562
|
+
isSnapshotBaseCreator = true;
|
|
563
|
+
}
|
|
540
564
|
} else {
|
|
541
565
|
persistentBaseSnapshotCreating.add(config.agentName);
|
|
542
566
|
isSnapshotBaseCreator = true;
|
|
@@ -554,8 +578,20 @@ function createSubagentHandler(subagents) {
|
|
|
554
578
|
baseSandboxId = persistentSandboxes.get(config.agentName);
|
|
555
579
|
if (!baseSandboxId) {
|
|
556
580
|
if (persistentSandboxCreating.has(config.agentName)) {
|
|
557
|
-
await condition(
|
|
581
|
+
await condition(
|
|
582
|
+
() => persistentSandboxes.has(config.agentName) || persistentSandboxCreationError.has(config.agentName) || !persistentSandboxCreating.has(config.agentName)
|
|
583
|
+
);
|
|
584
|
+
const creatorErr = persistentSandboxCreationError.get(
|
|
585
|
+
config.agentName
|
|
586
|
+
);
|
|
587
|
+
if (creatorErr !== void 0) {
|
|
588
|
+
throw creatorErr;
|
|
589
|
+
}
|
|
558
590
|
baseSandboxId = persistentSandboxes.get(config.agentName);
|
|
591
|
+
if (!baseSandboxId) {
|
|
592
|
+
persistentSandboxCreating.add(config.agentName);
|
|
593
|
+
isLazyCreator = true;
|
|
594
|
+
}
|
|
559
595
|
} else {
|
|
560
596
|
persistentSandboxCreating.add(config.agentName);
|
|
561
597
|
isLazyCreator = true;
|
|
@@ -584,6 +620,12 @@ function createSubagentHandler(subagents) {
|
|
|
584
620
|
};
|
|
585
621
|
const resolvedContext = config.context === void 0 ? void 0 : typeof config.context === "function" ? config.context() : config.context;
|
|
586
622
|
const childOpts = {
|
|
623
|
+
// Apply a bounded run timeout by default so a child workflow that
|
|
624
|
+
// fails to initialize or otherwise never reaches a terminal state
|
|
625
|
+
// cannot hang the parent's `Subagent` tool call forever. Callers can
|
|
626
|
+
// raise, lower, or disable it via `workflowOptions.workflowRunTimeout`.
|
|
627
|
+
workflowRunTimeout: DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT,
|
|
628
|
+
...config.workflowOptions ?? {},
|
|
587
629
|
workflowId: childWorkflowId,
|
|
588
630
|
args: resolvedContext === void 0 ? [args.prompt, workflowInput] : [args.prompt, workflowInput, resolvedContext],
|
|
589
631
|
taskQueue: config.taskQueue ?? parentTaskQueue
|
|
@@ -591,13 +633,39 @@ function createSubagentHandler(subagents) {
|
|
|
591
633
|
if (isLazyCreator) {
|
|
592
634
|
lazyCreatorAgent.set(childWorkflowId, config.agentName);
|
|
593
635
|
}
|
|
636
|
+
if (isSnapshotBaseCreator) {
|
|
637
|
+
snapshotBaseCreatorAgent.set(childWorkflowId, config.agentName);
|
|
638
|
+
}
|
|
594
639
|
log.info("subagent spawned", {
|
|
595
640
|
subagent: config.agentName,
|
|
596
641
|
childWorkflowId,
|
|
597
642
|
threadMode,
|
|
598
643
|
sandboxSource: sandboxCfg.source
|
|
599
644
|
});
|
|
600
|
-
|
|
645
|
+
let childResult;
|
|
646
|
+
try {
|
|
647
|
+
childResult = await executeChild(
|
|
648
|
+
config.workflow,
|
|
649
|
+
childOpts
|
|
650
|
+
);
|
|
651
|
+
} catch (err) {
|
|
652
|
+
log.warn("subagent failed", {
|
|
653
|
+
subagent: config.agentName,
|
|
654
|
+
childWorkflowId,
|
|
655
|
+
error: err instanceof Error ? err.message : String(err)
|
|
656
|
+
});
|
|
657
|
+
if (isLazyCreator) {
|
|
658
|
+
persistentSandboxCreating.delete(config.agentName);
|
|
659
|
+
persistentSandboxCreationError.set(config.agentName, err);
|
|
660
|
+
lazyCreatorAgent.delete(childWorkflowId);
|
|
661
|
+
}
|
|
662
|
+
if (isSnapshotBaseCreator) {
|
|
663
|
+
persistentBaseSnapshotCreating.delete(config.agentName);
|
|
664
|
+
persistentBaseSnapshotCreationError.set(config.agentName, err);
|
|
665
|
+
snapshotBaseCreatorAgent.delete(childWorkflowId);
|
|
666
|
+
}
|
|
667
|
+
throw err;
|
|
668
|
+
}
|
|
601
669
|
const effectiveShutdown = sandboxShutdownOverride ?? sandboxCfg.shutdown ?? "destroy";
|
|
602
670
|
log.info("subagent completed", {
|
|
603
671
|
subagent: config.agentName,
|
|
@@ -641,10 +709,13 @@ function createSubagentHandler(subagents) {
|
|
|
641
709
|
}
|
|
642
710
|
if (isLazyCreator) {
|
|
643
711
|
persistentSandboxCreating.delete(config.agentName);
|
|
712
|
+
persistentSandboxCreationError.delete(config.agentName);
|
|
644
713
|
lazyCreatorAgent.delete(childWorkflowId);
|
|
645
714
|
}
|
|
646
715
|
if (isSnapshotBaseCreator) {
|
|
647
716
|
persistentBaseSnapshotCreating.delete(config.agentName);
|
|
717
|
+
persistentBaseSnapshotCreationError.delete(config.agentName);
|
|
718
|
+
snapshotBaseCreatorAgent.delete(childWorkflowId);
|
|
648
719
|
}
|
|
649
720
|
if (!toolResponse) {
|
|
650
721
|
return {
|
|
@@ -887,6 +958,7 @@ async function createSession({
|
|
|
887
958
|
sandbox: sandboxInit,
|
|
888
959
|
sandboxShutdown = "destroy",
|
|
889
960
|
onSandboxReady,
|
|
961
|
+
onSessionExit,
|
|
890
962
|
virtualFs: virtualFsConfig,
|
|
891
963
|
virtualFsOps
|
|
892
964
|
}) {
|
|
@@ -912,7 +984,8 @@ async function createSession({
|
|
|
912
984
|
appendSystemMessage,
|
|
913
985
|
appendAgentMessage,
|
|
914
986
|
forkThread,
|
|
915
|
-
|
|
987
|
+
loadThreadState,
|
|
988
|
+
saveThreadState
|
|
916
989
|
} = threadOps;
|
|
917
990
|
const plugins = [];
|
|
918
991
|
let destroySubagentSandboxes;
|
|
@@ -1040,7 +1113,10 @@ async function createSession({
|
|
|
1040
1113
|
baseSnapshot = await sandboxOps.snapshotSandbox(sandboxId);
|
|
1041
1114
|
}
|
|
1042
1115
|
if (sandboxId && sandboxOwned && onSandboxReady) {
|
|
1043
|
-
onSandboxReady(
|
|
1116
|
+
onSandboxReady({
|
|
1117
|
+
sandboxId,
|
|
1118
|
+
...baseSnapshot && { baseSnapshot }
|
|
1119
|
+
});
|
|
1044
1120
|
}
|
|
1045
1121
|
if (virtualFsConfig) {
|
|
1046
1122
|
if (!virtualFsOps) {
|
|
@@ -1083,9 +1159,20 @@ async function createSession({
|
|
|
1083
1159
|
});
|
|
1084
1160
|
const sessionStartMs = Date.now();
|
|
1085
1161
|
const systemPrompt = stateManager.getSystemPrompt();
|
|
1162
|
+
const rehydrateFromSlice = (slice) => {
|
|
1163
|
+
stateManager.mergeUpdate({
|
|
1164
|
+
tasks: new Map(slice.tasks),
|
|
1165
|
+
...slice.custom
|
|
1166
|
+
});
|
|
1167
|
+
};
|
|
1086
1168
|
if (threadMode === "fork" && sourceThreadId) {
|
|
1087
1169
|
await forkThread(sourceThreadId, threadId, threadKey);
|
|
1088
|
-
|
|
1170
|
+
const forkedSlice = await loadThreadState(threadId, threadKey);
|
|
1171
|
+
if (forkedSlice) rehydrateFromSlice(forkedSlice);
|
|
1172
|
+
} else if (threadMode === "continue") {
|
|
1173
|
+
const continuedSlice = await loadThreadState(threadId, threadKey);
|
|
1174
|
+
if (continuedSlice) rehydrateFromSlice(continuedSlice);
|
|
1175
|
+
} else {
|
|
1089
1176
|
if (appendSystemPrompt) {
|
|
1090
1177
|
if (systemPrompt == null || typeof systemPrompt === "string" && systemPrompt.trim() === "") {
|
|
1091
1178
|
throw ApplicationFailure.create({
|
|
@@ -1107,24 +1194,21 @@ async function createSession({
|
|
|
1107
1194
|
let exitReason = "completed";
|
|
1108
1195
|
let finalMessage = null;
|
|
1109
1196
|
try {
|
|
1197
|
+
let assistantId;
|
|
1110
1198
|
while (stateManager.isRunning() && !stateManager.isTerminal() && stateManager.getTurns() < maxTurns) {
|
|
1111
1199
|
stateManager.incrementTurns();
|
|
1112
1200
|
const currentTurn = stateManager.getTurns();
|
|
1113
1201
|
log.debug("turn started", { agentName, threadId, turn: currentTurn });
|
|
1114
1202
|
stateManager.setTools(toolRouter.getToolDefinitions());
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
rawToolCalls,
|
|
1118
|
-
usage,
|
|
1119
|
-
threadLengthAtCall
|
|
1120
|
-
} = await runAgent({
|
|
1203
|
+
assistantId ??= uuid4();
|
|
1204
|
+
const { message, rawToolCalls, usage } = await runAgent({
|
|
1121
1205
|
threadId,
|
|
1122
1206
|
threadKey,
|
|
1123
1207
|
agentName,
|
|
1124
|
-
metadata
|
|
1208
|
+
metadata,
|
|
1209
|
+
assistantMessageId: assistantId
|
|
1125
1210
|
});
|
|
1126
|
-
|
|
1127
|
-
await appendAgentMessage(threadId, uuid4(), message, threadKey);
|
|
1211
|
+
await appendAgentMessage(threadId, assistantId, message, threadKey);
|
|
1128
1212
|
if (usage) {
|
|
1129
1213
|
stateManager.updateUsage(usage);
|
|
1130
1214
|
}
|
|
@@ -1178,15 +1262,9 @@ async function createSession({
|
|
|
1178
1262
|
toolCallId: rewind.toolCallId,
|
|
1179
1263
|
toolName: rewind.toolName
|
|
1180
1264
|
});
|
|
1181
|
-
if (preAssistantLength === void 0) {
|
|
1182
|
-
throw ApplicationFailure.create({
|
|
1183
|
-
message: "Rewind requested but runAgent did not report `threadLengthAtCall`; the adapter must populate it to support rewinds.",
|
|
1184
|
-
nonRetryable: true
|
|
1185
|
-
});
|
|
1186
|
-
}
|
|
1187
|
-
await truncateThread(threadId, preAssistantLength, threadKey);
|
|
1188
1265
|
continue;
|
|
1189
1266
|
}
|
|
1267
|
+
assistantId = void 0;
|
|
1190
1268
|
if (stateManager.getStatus() === "WAITING_FOR_INPUT") {
|
|
1191
1269
|
const conditionMet = await condition(
|
|
1192
1270
|
() => stateManager.getStatus() === "RUNNING",
|
|
@@ -1219,6 +1297,19 @@ async function createSession({
|
|
|
1219
1297
|
});
|
|
1220
1298
|
throw ApplicationFailure.fromError(error);
|
|
1221
1299
|
} finally {
|
|
1300
|
+
try {
|
|
1301
|
+
await saveThreadState(
|
|
1302
|
+
threadId,
|
|
1303
|
+
stateManager.getPersistedSlice(),
|
|
1304
|
+
threadKey
|
|
1305
|
+
);
|
|
1306
|
+
} catch (persistError) {
|
|
1307
|
+
log.warn("failed to persist thread state", {
|
|
1308
|
+
agentName,
|
|
1309
|
+
threadId,
|
|
1310
|
+
error: persistError instanceof Error ? persistError.message : String(persistError)
|
|
1311
|
+
});
|
|
1312
|
+
}
|
|
1222
1313
|
await callSessionEnd(exitReason, stateManager.getTurns());
|
|
1223
1314
|
if (sandboxOwned && sandboxId && sandboxOps) {
|
|
1224
1315
|
switch (sandboxShutdown) {
|
|
@@ -1255,6 +1346,12 @@ async function createSession({
|
|
|
1255
1346
|
...baseSnapshot && { hasBaseSnapshot: true },
|
|
1256
1347
|
...exitSnapshot && { hasExitSnapshot: true }
|
|
1257
1348
|
});
|
|
1349
|
+
if (onSessionExit) {
|
|
1350
|
+
onSessionExit({
|
|
1351
|
+
...sandboxId && { sandboxId },
|
|
1352
|
+
...exitSnapshot && { snapshot: exitSnapshot }
|
|
1353
|
+
});
|
|
1354
|
+
}
|
|
1258
1355
|
return {
|
|
1259
1356
|
threadId,
|
|
1260
1357
|
finalMessage,
|
|
@@ -1283,6 +1380,18 @@ function defineWorkflow(config, fn) {
|
|
|
1283
1380
|
return workflow;
|
|
1284
1381
|
}
|
|
1285
1382
|
|
|
1383
|
+
// src/lib/thread/keys.ts
|
|
1384
|
+
var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
|
|
1385
|
+
function getThreadListKey(threadKey, threadId) {
|
|
1386
|
+
return `${threadKey}:thread:${threadId}`;
|
|
1387
|
+
}
|
|
1388
|
+
function getThreadMetaKey(threadKey, threadId) {
|
|
1389
|
+
return `${threadKey}:meta:thread:${threadId}`;
|
|
1390
|
+
}
|
|
1391
|
+
function getThreadStateKey(threadKey, threadId) {
|
|
1392
|
+
return `${threadKey}:state:thread:${threadId}`;
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1286
1395
|
// src/lib/types.ts
|
|
1287
1396
|
function isTerminalStatus(status) {
|
|
1288
1397
|
return status === "COMPLETED" || status === "FAILED" || status === "CANCELLED";
|
|
@@ -1302,11 +1411,19 @@ function createAgentStateManager({
|
|
|
1302
1411
|
let systemPrompt = initialState?.systemPrompt;
|
|
1303
1412
|
const tasks = new Map(initialState?.tasks);
|
|
1304
1413
|
const {
|
|
1305
|
-
status:
|
|
1306
|
-
version:
|
|
1307
|
-
turns:
|
|
1308
|
-
tasks:
|
|
1309
|
-
tools:
|
|
1414
|
+
status: _status,
|
|
1415
|
+
version: _version,
|
|
1416
|
+
turns: _turns,
|
|
1417
|
+
tasks: _tasks,
|
|
1418
|
+
tools: _tools,
|
|
1419
|
+
systemPrompt: _systemPrompt,
|
|
1420
|
+
fileTree: _fileTree,
|
|
1421
|
+
inlineFiles: _inlineFiles,
|
|
1422
|
+
virtualFsCtx: _virtualFsCtx,
|
|
1423
|
+
totalInputTokens: _totalInputTokens,
|
|
1424
|
+
totalOutputTokens: _totalOutputTokens,
|
|
1425
|
+
cachedWriteTokens: _cachedWriteTokens,
|
|
1426
|
+
cachedReadTokens: _cachedReadTokens,
|
|
1310
1427
|
...custom
|
|
1311
1428
|
} = initialState ?? {};
|
|
1312
1429
|
const customState = custom;
|
|
@@ -1386,7 +1503,14 @@ function createAgentStateManager({
|
|
|
1386
1503
|
version++;
|
|
1387
1504
|
},
|
|
1388
1505
|
mergeUpdate(update) {
|
|
1389
|
-
|
|
1506
|
+
const { tasks: nextTasks, ...rest } = update;
|
|
1507
|
+
if (nextTasks) {
|
|
1508
|
+
tasks.clear();
|
|
1509
|
+
for (const [id, task] of nextTasks) {
|
|
1510
|
+
tasks.set(id, task);
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
Object.assign(customState, rest);
|
|
1390
1514
|
version++;
|
|
1391
1515
|
},
|
|
1392
1516
|
getCurrentState() {
|
|
@@ -1424,6 +1548,12 @@ function createAgentStateManager({
|
|
|
1424
1548
|
}
|
|
1425
1549
|
return deleted;
|
|
1426
1550
|
},
|
|
1551
|
+
getPersistedSlice() {
|
|
1552
|
+
return {
|
|
1553
|
+
tasks: Array.from(tasks.entries()),
|
|
1554
|
+
custom: { ...customState }
|
|
1555
|
+
};
|
|
1556
|
+
},
|
|
1427
1557
|
updateUsage(usage) {
|
|
1428
1558
|
totalInputTokens += usage.inputTokens ?? 0;
|
|
1429
1559
|
totalOutputTokens += usage.outputTokens ?? 0;
|
|
@@ -1545,22 +1675,42 @@ function defineSubagentWorkflow(config, fn) {
|
|
|
1545
1675
|
});
|
|
1546
1676
|
}
|
|
1547
1677
|
const parentHandle = getExternalWorkflowHandle(parent.workflowId);
|
|
1678
|
+
let capturedSandboxId;
|
|
1679
|
+
let capturedSnapshot;
|
|
1680
|
+
let capturedBaseSnapshot;
|
|
1681
|
+
let capturedThreadId;
|
|
1548
1682
|
const sessionInput = {
|
|
1549
1683
|
agentName: config.name,
|
|
1550
1684
|
sandboxShutdown: effectiveShutdown,
|
|
1551
1685
|
...workflowInput.thread && { thread: workflowInput.thread },
|
|
1552
1686
|
...workflowInput.sandbox && { sandbox: workflowInput.sandbox },
|
|
1553
|
-
onSandboxReady: (sandboxId) => {
|
|
1687
|
+
onSandboxReady: ({ sandboxId, baseSnapshot }) => {
|
|
1688
|
+
capturedBaseSnapshot = baseSnapshot;
|
|
1554
1689
|
const isReuse = workflowInput.sandbox?.mode === "continue";
|
|
1555
1690
|
if (!isReuse) {
|
|
1556
1691
|
void parentHandle.signal(childSandboxReadySignal, {
|
|
1557
1692
|
childWorkflowId: workflowInfo().workflowId,
|
|
1558
|
-
sandboxId
|
|
1693
|
+
sandboxId,
|
|
1694
|
+
...baseSnapshot && { baseSnapshot }
|
|
1559
1695
|
});
|
|
1560
1696
|
}
|
|
1697
|
+
},
|
|
1698
|
+
onSessionExit: ({ sandboxId, snapshot, threadId }) => {
|
|
1699
|
+
capturedSandboxId = sandboxId;
|
|
1700
|
+
capturedSnapshot = snapshot;
|
|
1701
|
+
capturedThreadId = threadId;
|
|
1702
|
+
}
|
|
1703
|
+
};
|
|
1704
|
+
const result = await fn(prompt, sessionInput, context ?? {});
|
|
1705
|
+
return {
|
|
1706
|
+
...result,
|
|
1707
|
+
...capturedThreadId !== void 0 && { threadId: capturedThreadId },
|
|
1708
|
+
...capturedSandboxId !== void 0 && { sandboxId: capturedSandboxId },
|
|
1709
|
+
...capturedSnapshot !== void 0 && { snapshot: capturedSnapshot },
|
|
1710
|
+
...capturedBaseSnapshot !== void 0 && {
|
|
1711
|
+
baseSnapshot: capturedBaseSnapshot
|
|
1561
1712
|
}
|
|
1562
1713
|
};
|
|
1563
|
-
return fn(prompt, sessionInput, context ?? {});
|
|
1564
1714
|
};
|
|
1565
1715
|
Object.defineProperty(workflow, "name", { value: config.name });
|
|
1566
1716
|
return Object.assign(workflow, {
|
|
@@ -2330,7 +2480,6 @@ var FileSystemSkillProvider = class {
|
|
|
2330
2480
|
};
|
|
2331
2481
|
|
|
2332
2482
|
// src/lib/thread/manager.ts
|
|
2333
|
-
var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
|
|
2334
2483
|
var APPEND_IDEMPOTENT_SCRIPT = `
|
|
2335
2484
|
if redis.call('EXISTS', KEYS[1]) == 1 then
|
|
2336
2485
|
return 0
|
|
@@ -2342,8 +2491,8 @@ redis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))
|
|
|
2342
2491
|
redis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))
|
|
2343
2492
|
return 1
|
|
2344
2493
|
`;
|
|
2345
|
-
function
|
|
2346
|
-
return
|
|
2494
|
+
function getDedupKey(threadId, id) {
|
|
2495
|
+
return `dedup:${id}:thread:${threadId}`;
|
|
2347
2496
|
}
|
|
2348
2497
|
function createThreadManager(config) {
|
|
2349
2498
|
const {
|
|
@@ -2354,8 +2503,9 @@ function createThreadManager(config) {
|
|
|
2354
2503
|
deserialize = (raw) => JSON.parse(raw),
|
|
2355
2504
|
idOf
|
|
2356
2505
|
} = config;
|
|
2357
|
-
const redisKey =
|
|
2358
|
-
const metaKey =
|
|
2506
|
+
const redisKey = getThreadListKey(key, threadId);
|
|
2507
|
+
const metaKey = getThreadMetaKey(key, threadId);
|
|
2508
|
+
const stateKey = getThreadStateKey(key, threadId);
|
|
2359
2509
|
async function assertThreadExists() {
|
|
2360
2510
|
const exists = await redis.exists(metaKey);
|
|
2361
2511
|
if (!exists) {
|
|
@@ -2377,7 +2527,7 @@ function createThreadManager(config) {
|
|
|
2377
2527
|
await assertThreadExists();
|
|
2378
2528
|
if (idOf) {
|
|
2379
2529
|
const dedupId = messages.map(idOf).join(":");
|
|
2380
|
-
const dedupKey =
|
|
2530
|
+
const dedupKey = getDedupKey(threadId, dedupId);
|
|
2381
2531
|
await redis.eval(
|
|
2382
2532
|
APPEND_IDEMPOTENT_SCRIPT,
|
|
2383
2533
|
2,
|
|
@@ -2394,34 +2544,98 @@ function createThreadManager(config) {
|
|
|
2394
2544
|
async fork(newThreadId) {
|
|
2395
2545
|
await assertThreadExists();
|
|
2396
2546
|
const data = await redis.lrange(redisKey, 0, -1);
|
|
2547
|
+
const stateRaw = await redis.get(stateKey);
|
|
2397
2548
|
const forked = createThreadManager({
|
|
2398
2549
|
...config,
|
|
2399
2550
|
threadId: newThreadId
|
|
2400
2551
|
});
|
|
2401
2552
|
await forked.initialize();
|
|
2402
2553
|
if (data.length > 0) {
|
|
2403
|
-
const newKey =
|
|
2554
|
+
const newKey = getThreadListKey(key, newThreadId);
|
|
2404
2555
|
await redis.rpush(newKey, ...data);
|
|
2405
2556
|
await redis.expire(newKey, THREAD_TTL_SECONDS);
|
|
2406
2557
|
}
|
|
2558
|
+
if (stateRaw != null) {
|
|
2559
|
+
const newStateKey = getThreadStateKey(key, newThreadId);
|
|
2560
|
+
await redis.set(newStateKey, stateRaw, "EX", THREAD_TTL_SECONDS);
|
|
2561
|
+
}
|
|
2407
2562
|
return forked;
|
|
2408
2563
|
},
|
|
2564
|
+
async replaceAll(messages) {
|
|
2565
|
+
await assertThreadExists();
|
|
2566
|
+
if (!idOf) {
|
|
2567
|
+
throw new Error(
|
|
2568
|
+
"replaceAll requires the thread manager to be configured with `idOf`"
|
|
2569
|
+
);
|
|
2570
|
+
}
|
|
2571
|
+
const existing = await redis.lrange(redisKey, 0, -1);
|
|
2572
|
+
const existingIds = existing.map((raw) => idOf(deserialize(raw))).filter((id) => typeof id === "string");
|
|
2573
|
+
await redis.del(redisKey);
|
|
2574
|
+
if (existingIds.length > 0) {
|
|
2575
|
+
await redis.del(
|
|
2576
|
+
...existingIds.map((id) => getDedupKey(threadId, id))
|
|
2577
|
+
);
|
|
2578
|
+
}
|
|
2579
|
+
if (messages.length > 0) {
|
|
2580
|
+
await redis.rpush(redisKey, ...messages.map(serialize));
|
|
2581
|
+
await redis.expire(redisKey, THREAD_TTL_SECONDS);
|
|
2582
|
+
}
|
|
2583
|
+
await redis.expire(metaKey, THREAD_TTL_SECONDS);
|
|
2584
|
+
},
|
|
2409
2585
|
async delete() {
|
|
2410
|
-
await redis.del(redisKey, metaKey);
|
|
2586
|
+
await redis.del(redisKey, metaKey, stateKey);
|
|
2587
|
+
},
|
|
2588
|
+
async loadState() {
|
|
2589
|
+
const raw = await redis.get(stateKey);
|
|
2590
|
+
if (raw == null) return null;
|
|
2591
|
+
return JSON.parse(raw);
|
|
2592
|
+
},
|
|
2593
|
+
async saveState(state) {
|
|
2594
|
+
await assertThreadExists();
|
|
2595
|
+
await redis.set(
|
|
2596
|
+
stateKey,
|
|
2597
|
+
JSON.stringify(state),
|
|
2598
|
+
"EX",
|
|
2599
|
+
THREAD_TTL_SECONDS
|
|
2600
|
+
);
|
|
2601
|
+
},
|
|
2602
|
+
async deleteState() {
|
|
2603
|
+
await redis.del(stateKey);
|
|
2411
2604
|
},
|
|
2412
2605
|
async length() {
|
|
2413
2606
|
await assertThreadExists();
|
|
2414
2607
|
return redis.llen(redisKey);
|
|
2415
2608
|
},
|
|
2416
|
-
async
|
|
2609
|
+
async truncateFromId(messageId) {
|
|
2417
2610
|
await assertThreadExists();
|
|
2418
|
-
if (
|
|
2611
|
+
if (!idOf) {
|
|
2612
|
+
throw new Error(
|
|
2613
|
+
"truncateFromId requires the thread manager to be configured with `idOf`"
|
|
2614
|
+
);
|
|
2615
|
+
}
|
|
2616
|
+
const data = await redis.lrange(redisKey, 0, -1);
|
|
2617
|
+
let idx = -1;
|
|
2618
|
+
const removedIds = [];
|
|
2619
|
+
for (let i = 0; i < data.length; i++) {
|
|
2620
|
+
const raw = data[i];
|
|
2621
|
+
if (raw === void 0) continue;
|
|
2622
|
+
const id = idOf(deserialize(raw));
|
|
2623
|
+
if (idx === -1 && id === messageId) idx = i;
|
|
2624
|
+
if (idx !== -1) removedIds.push(id);
|
|
2625
|
+
}
|
|
2626
|
+
if (idx === -1) return;
|
|
2627
|
+
if (idx === 0) {
|
|
2419
2628
|
await redis.del(redisKey);
|
|
2420
2629
|
await redis.expire(metaKey, THREAD_TTL_SECONDS);
|
|
2421
2630
|
} else {
|
|
2422
|
-
await redis.ltrim(redisKey, 0,
|
|
2631
|
+
await redis.ltrim(redisKey, 0, idx - 1);
|
|
2423
2632
|
await redis.expire(redisKey, THREAD_TTL_SECONDS);
|
|
2424
2633
|
}
|
|
2634
|
+
if (removedIds.length > 0) {
|
|
2635
|
+
await redis.del(
|
|
2636
|
+
...removedIds.map((id) => getDedupKey(threadId, id))
|
|
2637
|
+
);
|
|
2638
|
+
}
|
|
2425
2639
|
}
|
|
2426
2640
|
};
|
|
2427
2641
|
}
|
|
@@ -3236,6 +3450,6 @@ var toTree = async (fs, opts = {}) => {
|
|
|
3236
3450
|
return base + subtree;
|
|
3237
3451
|
};
|
|
3238
3452
|
|
|
3239
|
-
export { FileSystemSkillProvider, NodeFsSandboxFileSystem, SandboxManager, SandboxNotFoundError, SandboxNotSupportedError, VirtualFileSystem, applyVirtualTreeMutations, askUserQuestionTool, bashHandler, bashTool, composeHooks, createAgentStateManager, createAskUserQuestionHandler, createBashToolDescription, createObservabilityHooks, createReadSkillHandler, createReadSkillTool, createRunAgentActivity, createSession, createTaskCreateHandler, createTaskGetHandler, createTaskListHandler, createTaskUpdateHandler, createThreadManager, createToolRouter, createVirtualFsActivities, defineSubagent, defineSubagentWorkflow, defineTool, defineWorkflow, editHandler, editTool, filesWithMimeType, formatVirtualFileTree, getActivityContext, getShortId, globHandler, globTool, grepTool, hasDirectory, hasFileWithMimeType, hasNoOtherToolCalls, isTerminalStatus, parseSkillFile, proxyRunAgent, proxyVirtualFsOps, queryParentWorkflowState, readFileHandler, readFileTool, taskCreateTool, taskGetTool, taskListTool, taskUpdateTool, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler, writeFileTool };
|
|
3453
|
+
export { DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, FileSystemSkillProvider, NodeFsSandboxFileSystem, SandboxManager, SandboxNotFoundError, SandboxNotSupportedError, THREAD_TTL_SECONDS, VirtualFileSystem, applyVirtualTreeMutations, askUserQuestionTool, bashHandler, bashTool, composeHooks, createAgentStateManager, createAskUserQuestionHandler, createBashToolDescription, createObservabilityHooks, createReadSkillHandler, createReadSkillTool, createRunAgentActivity, createSession, createTaskCreateHandler, createTaskGetHandler, createTaskListHandler, createTaskUpdateHandler, createThreadManager, createToolRouter, createVirtualFsActivities, defineSubagent, defineSubagentWorkflow, defineTool, defineWorkflow, editHandler, editTool, filesWithMimeType, formatVirtualFileTree, getActivityContext, getShortId, getThreadListKey, getThreadMetaKey, globHandler, globTool, grepTool, hasDirectory, hasFileWithMimeType, hasNoOtherToolCalls, isTerminalStatus, parseSkillFile, proxyRunAgent, proxyVirtualFsOps, queryParentWorkflowState, readFileHandler, readFileTool, taskCreateTool, taskGetTool, taskListTool, taskUpdateTool, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler, writeFileTool };
|
|
3240
3454
|
//# sourceMappingURL=index.js.map
|
|
3241
3455
|
//# sourceMappingURL=index.js.map
|