zeitlich 0.2.38 → 0.2.40
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-CULxRzJ1.d.ts} +4 -6
- package/dist/{activities-CDcwkRZs.d.cts → activities-CvUrG3YG.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 +267 -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 +264 -49
- package/dist/index.js.map +1 -1
- package/dist/{proxy-D_3x7RN4.d.cts → proxy-5EbwzaY4.d.cts} +1 -1
- package/dist/{proxy-CUlKSvZS.d.ts → proxy-wZufFfBh.d.ts} +1 -1
- package/dist/{thread-manager-CVu7o2cs.d.ts → thread-manager-BNiIt5r8.d.ts} +2 -4
- package/dist/{thread-manager-c1gPopAG.d.ts → thread-manager-BoN5DOvG.d.cts} +2 -4
- package/dist/{thread-manager-wGi-LqIP.d.cts → thread-manager-BqBAIsED.d.ts} +2 -4
- package/dist/{thread-manager-HSwyh28L.d.cts → thread-manager-DF8WuCRs.d.cts} +2 -4
- package/dist/{types-BH_IRryz.d.ts → types-C7OoY7h8.d.ts} +54 -6
- package/dist/{types-C06FwR96.d.cts → types-Cn2r3ol3.d.cts} +163 -44
- package/dist/{types-BaOw4hKI.d.cts → types-CuISs0Ub.d.cts} +54 -6
- package/dist/{types-DNr31FzL.d.ts → types-DeQH84C_.d.ts} +163 -44
- package/dist/{workflow-CSCkpwAL.d.ts → workflow-C2MZZj5K.d.ts} +82 -2
- package/dist/{workflow-DuvMZ8Vm.d.cts → workflow-DhplIN65.d.cts} +82 -2
- package/dist/workflow.cjs +189 -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 +186 -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 +69 -28
- package/src/lib/session/types.ts +61 -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-DhplIN65.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-DhplIN65.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-Cn2r3ol3.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-Cn2r3ol3.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-CuISs0Ub.cjs';
|
|
9
|
+
export { P as ProviderThreadManager } from './types-CuISs0Ub.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-C2MZZj5K.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-C2MZZj5K.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-DeQH84C_.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-DeQH84C_.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-C7OoY7h8.js';
|
|
9
|
+
export { P as ProviderThreadManager } from './types-C7OoY7h8.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,13 @@ 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
|
+
threadId
|
|
1354
|
+
});
|
|
1355
|
+
}
|
|
1258
1356
|
return {
|
|
1259
1357
|
threadId,
|
|
1260
1358
|
finalMessage,
|
|
@@ -1283,6 +1381,18 @@ function defineWorkflow(config, fn) {
|
|
|
1283
1381
|
return workflow;
|
|
1284
1382
|
}
|
|
1285
1383
|
|
|
1384
|
+
// src/lib/thread/keys.ts
|
|
1385
|
+
var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
|
|
1386
|
+
function getThreadListKey(threadKey, threadId) {
|
|
1387
|
+
return `${threadKey}:thread:${threadId}`;
|
|
1388
|
+
}
|
|
1389
|
+
function getThreadMetaKey(threadKey, threadId) {
|
|
1390
|
+
return `${threadKey}:meta:thread:${threadId}`;
|
|
1391
|
+
}
|
|
1392
|
+
function getThreadStateKey(threadKey, threadId) {
|
|
1393
|
+
return `${threadKey}:state:thread:${threadId}`;
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1286
1396
|
// src/lib/types.ts
|
|
1287
1397
|
function isTerminalStatus(status) {
|
|
1288
1398
|
return status === "COMPLETED" || status === "FAILED" || status === "CANCELLED";
|
|
@@ -1302,11 +1412,19 @@ function createAgentStateManager({
|
|
|
1302
1412
|
let systemPrompt = initialState?.systemPrompt;
|
|
1303
1413
|
const tasks = new Map(initialState?.tasks);
|
|
1304
1414
|
const {
|
|
1305
|
-
status:
|
|
1306
|
-
version:
|
|
1307
|
-
turns:
|
|
1308
|
-
tasks:
|
|
1309
|
-
tools:
|
|
1415
|
+
status: _status,
|
|
1416
|
+
version: _version,
|
|
1417
|
+
turns: _turns,
|
|
1418
|
+
tasks: _tasks,
|
|
1419
|
+
tools: _tools,
|
|
1420
|
+
systemPrompt: _systemPrompt,
|
|
1421
|
+
fileTree: _fileTree,
|
|
1422
|
+
inlineFiles: _inlineFiles,
|
|
1423
|
+
virtualFsCtx: _virtualFsCtx,
|
|
1424
|
+
totalInputTokens: _totalInputTokens,
|
|
1425
|
+
totalOutputTokens: _totalOutputTokens,
|
|
1426
|
+
cachedWriteTokens: _cachedWriteTokens,
|
|
1427
|
+
cachedReadTokens: _cachedReadTokens,
|
|
1310
1428
|
...custom
|
|
1311
1429
|
} = initialState ?? {};
|
|
1312
1430
|
const customState = custom;
|
|
@@ -1386,7 +1504,14 @@ function createAgentStateManager({
|
|
|
1386
1504
|
version++;
|
|
1387
1505
|
},
|
|
1388
1506
|
mergeUpdate(update) {
|
|
1389
|
-
|
|
1507
|
+
const { tasks: nextTasks, ...rest } = update;
|
|
1508
|
+
if (nextTasks) {
|
|
1509
|
+
tasks.clear();
|
|
1510
|
+
for (const [id, task] of nextTasks) {
|
|
1511
|
+
tasks.set(id, task);
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
Object.assign(customState, rest);
|
|
1390
1515
|
version++;
|
|
1391
1516
|
},
|
|
1392
1517
|
getCurrentState() {
|
|
@@ -1424,6 +1549,12 @@ function createAgentStateManager({
|
|
|
1424
1549
|
}
|
|
1425
1550
|
return deleted;
|
|
1426
1551
|
},
|
|
1552
|
+
getPersistedSlice() {
|
|
1553
|
+
return {
|
|
1554
|
+
tasks: Array.from(tasks.entries()),
|
|
1555
|
+
custom: { ...customState }
|
|
1556
|
+
};
|
|
1557
|
+
},
|
|
1427
1558
|
updateUsage(usage) {
|
|
1428
1559
|
totalInputTokens += usage.inputTokens ?? 0;
|
|
1429
1560
|
totalOutputTokens += usage.outputTokens ?? 0;
|
|
@@ -1545,22 +1676,42 @@ function defineSubagentWorkflow(config, fn) {
|
|
|
1545
1676
|
});
|
|
1546
1677
|
}
|
|
1547
1678
|
const parentHandle = getExternalWorkflowHandle(parent.workflowId);
|
|
1679
|
+
let capturedSandboxId;
|
|
1680
|
+
let capturedSnapshot;
|
|
1681
|
+
let capturedBaseSnapshot;
|
|
1682
|
+
let capturedThreadId;
|
|
1548
1683
|
const sessionInput = {
|
|
1549
1684
|
agentName: config.name,
|
|
1550
1685
|
sandboxShutdown: effectiveShutdown,
|
|
1551
1686
|
...workflowInput.thread && { thread: workflowInput.thread },
|
|
1552
1687
|
...workflowInput.sandbox && { sandbox: workflowInput.sandbox },
|
|
1553
|
-
onSandboxReady: (sandboxId) => {
|
|
1688
|
+
onSandboxReady: ({ sandboxId, baseSnapshot }) => {
|
|
1689
|
+
capturedBaseSnapshot = baseSnapshot;
|
|
1554
1690
|
const isReuse = workflowInput.sandbox?.mode === "continue";
|
|
1555
1691
|
if (!isReuse) {
|
|
1556
1692
|
void parentHandle.signal(childSandboxReadySignal, {
|
|
1557
1693
|
childWorkflowId: workflowInfo().workflowId,
|
|
1558
|
-
sandboxId
|
|
1694
|
+
sandboxId,
|
|
1695
|
+
...baseSnapshot && { baseSnapshot }
|
|
1559
1696
|
});
|
|
1560
1697
|
}
|
|
1698
|
+
},
|
|
1699
|
+
onSessionExit: ({ sandboxId, snapshot, threadId }) => {
|
|
1700
|
+
capturedSandboxId = sandboxId;
|
|
1701
|
+
capturedSnapshot = snapshot;
|
|
1702
|
+
capturedThreadId = threadId;
|
|
1703
|
+
}
|
|
1704
|
+
};
|
|
1705
|
+
const result = await fn(prompt, sessionInput, context ?? {});
|
|
1706
|
+
return {
|
|
1707
|
+
...result,
|
|
1708
|
+
...capturedThreadId !== void 0 && { threadId: capturedThreadId },
|
|
1709
|
+
...capturedSandboxId !== void 0 && { sandboxId: capturedSandboxId },
|
|
1710
|
+
...capturedSnapshot !== void 0 && { snapshot: capturedSnapshot },
|
|
1711
|
+
...capturedBaseSnapshot !== void 0 && {
|
|
1712
|
+
baseSnapshot: capturedBaseSnapshot
|
|
1561
1713
|
}
|
|
1562
1714
|
};
|
|
1563
|
-
return fn(prompt, sessionInput, context ?? {});
|
|
1564
1715
|
};
|
|
1565
1716
|
Object.defineProperty(workflow, "name", { value: config.name });
|
|
1566
1717
|
return Object.assign(workflow, {
|
|
@@ -2330,7 +2481,6 @@ var FileSystemSkillProvider = class {
|
|
|
2330
2481
|
};
|
|
2331
2482
|
|
|
2332
2483
|
// src/lib/thread/manager.ts
|
|
2333
|
-
var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
|
|
2334
2484
|
var APPEND_IDEMPOTENT_SCRIPT = `
|
|
2335
2485
|
if redis.call('EXISTS', KEYS[1]) == 1 then
|
|
2336
2486
|
return 0
|
|
@@ -2342,8 +2492,8 @@ redis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))
|
|
|
2342
2492
|
redis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))
|
|
2343
2493
|
return 1
|
|
2344
2494
|
`;
|
|
2345
|
-
function
|
|
2346
|
-
return
|
|
2495
|
+
function getDedupKey(threadId, id) {
|
|
2496
|
+
return `dedup:${id}:thread:${threadId}`;
|
|
2347
2497
|
}
|
|
2348
2498
|
function createThreadManager(config) {
|
|
2349
2499
|
const {
|
|
@@ -2354,8 +2504,9 @@ function createThreadManager(config) {
|
|
|
2354
2504
|
deserialize = (raw) => JSON.parse(raw),
|
|
2355
2505
|
idOf
|
|
2356
2506
|
} = config;
|
|
2357
|
-
const redisKey =
|
|
2358
|
-
const metaKey =
|
|
2507
|
+
const redisKey = getThreadListKey(key, threadId);
|
|
2508
|
+
const metaKey = getThreadMetaKey(key, threadId);
|
|
2509
|
+
const stateKey = getThreadStateKey(key, threadId);
|
|
2359
2510
|
async function assertThreadExists() {
|
|
2360
2511
|
const exists = await redis.exists(metaKey);
|
|
2361
2512
|
if (!exists) {
|
|
@@ -2377,7 +2528,7 @@ function createThreadManager(config) {
|
|
|
2377
2528
|
await assertThreadExists();
|
|
2378
2529
|
if (idOf) {
|
|
2379
2530
|
const dedupId = messages.map(idOf).join(":");
|
|
2380
|
-
const dedupKey =
|
|
2531
|
+
const dedupKey = getDedupKey(threadId, dedupId);
|
|
2381
2532
|
await redis.eval(
|
|
2382
2533
|
APPEND_IDEMPOTENT_SCRIPT,
|
|
2383
2534
|
2,
|
|
@@ -2394,34 +2545,98 @@ function createThreadManager(config) {
|
|
|
2394
2545
|
async fork(newThreadId) {
|
|
2395
2546
|
await assertThreadExists();
|
|
2396
2547
|
const data = await redis.lrange(redisKey, 0, -1);
|
|
2548
|
+
const stateRaw = await redis.get(stateKey);
|
|
2397
2549
|
const forked = createThreadManager({
|
|
2398
2550
|
...config,
|
|
2399
2551
|
threadId: newThreadId
|
|
2400
2552
|
});
|
|
2401
2553
|
await forked.initialize();
|
|
2402
2554
|
if (data.length > 0) {
|
|
2403
|
-
const newKey =
|
|
2555
|
+
const newKey = getThreadListKey(key, newThreadId);
|
|
2404
2556
|
await redis.rpush(newKey, ...data);
|
|
2405
2557
|
await redis.expire(newKey, THREAD_TTL_SECONDS);
|
|
2406
2558
|
}
|
|
2559
|
+
if (stateRaw != null) {
|
|
2560
|
+
const newStateKey = getThreadStateKey(key, newThreadId);
|
|
2561
|
+
await redis.set(newStateKey, stateRaw, "EX", THREAD_TTL_SECONDS);
|
|
2562
|
+
}
|
|
2407
2563
|
return forked;
|
|
2408
2564
|
},
|
|
2565
|
+
async replaceAll(messages) {
|
|
2566
|
+
await assertThreadExists();
|
|
2567
|
+
if (!idOf) {
|
|
2568
|
+
throw new Error(
|
|
2569
|
+
"replaceAll requires the thread manager to be configured with `idOf`"
|
|
2570
|
+
);
|
|
2571
|
+
}
|
|
2572
|
+
const existing = await redis.lrange(redisKey, 0, -1);
|
|
2573
|
+
const existingIds = existing.map((raw) => idOf(deserialize(raw))).filter((id) => typeof id === "string");
|
|
2574
|
+
await redis.del(redisKey);
|
|
2575
|
+
if (existingIds.length > 0) {
|
|
2576
|
+
await redis.del(
|
|
2577
|
+
...existingIds.map((id) => getDedupKey(threadId, id))
|
|
2578
|
+
);
|
|
2579
|
+
}
|
|
2580
|
+
if (messages.length > 0) {
|
|
2581
|
+
await redis.rpush(redisKey, ...messages.map(serialize));
|
|
2582
|
+
await redis.expire(redisKey, THREAD_TTL_SECONDS);
|
|
2583
|
+
}
|
|
2584
|
+
await redis.expire(metaKey, THREAD_TTL_SECONDS);
|
|
2585
|
+
},
|
|
2409
2586
|
async delete() {
|
|
2410
|
-
await redis.del(redisKey, metaKey);
|
|
2587
|
+
await redis.del(redisKey, metaKey, stateKey);
|
|
2588
|
+
},
|
|
2589
|
+
async loadState() {
|
|
2590
|
+
const raw = await redis.get(stateKey);
|
|
2591
|
+
if (raw == null) return null;
|
|
2592
|
+
return JSON.parse(raw);
|
|
2593
|
+
},
|
|
2594
|
+
async saveState(state) {
|
|
2595
|
+
await assertThreadExists();
|
|
2596
|
+
await redis.set(
|
|
2597
|
+
stateKey,
|
|
2598
|
+
JSON.stringify(state),
|
|
2599
|
+
"EX",
|
|
2600
|
+
THREAD_TTL_SECONDS
|
|
2601
|
+
);
|
|
2602
|
+
},
|
|
2603
|
+
async deleteState() {
|
|
2604
|
+
await redis.del(stateKey);
|
|
2411
2605
|
},
|
|
2412
2606
|
async length() {
|
|
2413
2607
|
await assertThreadExists();
|
|
2414
2608
|
return redis.llen(redisKey);
|
|
2415
2609
|
},
|
|
2416
|
-
async
|
|
2610
|
+
async truncateFromId(messageId) {
|
|
2417
2611
|
await assertThreadExists();
|
|
2418
|
-
if (
|
|
2612
|
+
if (!idOf) {
|
|
2613
|
+
throw new Error(
|
|
2614
|
+
"truncateFromId requires the thread manager to be configured with `idOf`"
|
|
2615
|
+
);
|
|
2616
|
+
}
|
|
2617
|
+
const data = await redis.lrange(redisKey, 0, -1);
|
|
2618
|
+
let idx = -1;
|
|
2619
|
+
const removedIds = [];
|
|
2620
|
+
for (let i = 0; i < data.length; i++) {
|
|
2621
|
+
const raw = data[i];
|
|
2622
|
+
if (raw === void 0) continue;
|
|
2623
|
+
const id = idOf(deserialize(raw));
|
|
2624
|
+
if (idx === -1 && id === messageId) idx = i;
|
|
2625
|
+
if (idx !== -1) removedIds.push(id);
|
|
2626
|
+
}
|
|
2627
|
+
if (idx === -1) return;
|
|
2628
|
+
if (idx === 0) {
|
|
2419
2629
|
await redis.del(redisKey);
|
|
2420
2630
|
await redis.expire(metaKey, THREAD_TTL_SECONDS);
|
|
2421
2631
|
} else {
|
|
2422
|
-
await redis.ltrim(redisKey, 0,
|
|
2632
|
+
await redis.ltrim(redisKey, 0, idx - 1);
|
|
2423
2633
|
await redis.expire(redisKey, THREAD_TTL_SECONDS);
|
|
2424
2634
|
}
|
|
2635
|
+
if (removedIds.length > 0) {
|
|
2636
|
+
await redis.del(
|
|
2637
|
+
...removedIds.map((id) => getDedupKey(threadId, id))
|
|
2638
|
+
);
|
|
2639
|
+
}
|
|
2425
2640
|
}
|
|
2426
2641
|
};
|
|
2427
2642
|
}
|
|
@@ -3236,6 +3451,6 @@ var toTree = async (fs, opts = {}) => {
|
|
|
3236
3451
|
return base + subtree;
|
|
3237
3452
|
};
|
|
3238
3453
|
|
|
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 };
|
|
3454
|
+
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
3455
|
//# sourceMappingURL=index.js.map
|
|
3241
3456
|
//# sourceMappingURL=index.js.map
|