@langchain/langgraph-sdk 1.8.5 → 1.8.6
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/dist/headless-tools.cjs +114 -0
- package/dist/headless-tools.cjs.map +1 -0
- package/dist/headless-tools.d.cts +72 -0
- package/dist/headless-tools.d.cts.map +1 -0
- package/dist/headless-tools.d.ts +72 -0
- package/dist/headless-tools.d.ts.map +1 -0
- package/dist/headless-tools.js +108 -0
- package/dist/headless-tools.js.map +1 -0
- package/dist/index.cjs +8 -0
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/react/index.cjs +8 -0
- package/dist/react/index.d.cts +2 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.js +2 -1
- package/dist/react/stream.custom.cjs +20 -5
- package/dist/react/stream.custom.cjs.map +1 -1
- package/dist/react/stream.custom.d.cts.map +1 -1
- package/dist/react/stream.custom.d.ts.map +1 -1
- package/dist/react/stream.custom.js +21 -6
- package/dist/react/stream.custom.js.map +1 -1
- package/dist/react/stream.lgp.cjs +25 -7
- package/dist/react/stream.lgp.cjs.map +1 -1
- package/dist/react/stream.lgp.js +26 -8
- package/dist/react/stream.lgp.js.map +1 -1
- package/dist/ui/index.cjs +2 -0
- package/dist/ui/index.d.cts +2 -2
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +2 -2
- package/dist/ui/interrupts.cjs +25 -3
- package/dist/ui/interrupts.cjs.map +1 -1
- package/dist/ui/interrupts.d.cts +3 -1
- package/dist/ui/interrupts.d.cts.map +1 -1
- package/dist/ui/interrupts.d.ts +3 -1
- package/dist/ui/interrupts.d.ts.map +1 -1
- package/dist/ui/interrupts.js +24 -4
- package/dist/ui/interrupts.js.map +1 -1
- package/dist/ui/orchestrator-custom.cjs +15 -5
- package/dist/ui/orchestrator-custom.cjs.map +1 -1
- package/dist/ui/orchestrator-custom.d.cts.map +1 -1
- package/dist/ui/orchestrator-custom.d.ts.map +1 -1
- package/dist/ui/orchestrator-custom.js +16 -6
- package/dist/ui/orchestrator-custom.js.map +1 -1
- package/dist/ui/orchestrator.cjs +23 -7
- package/dist/ui/orchestrator.cjs.map +1 -1
- package/dist/ui/orchestrator.d.cts.map +1 -1
- package/dist/ui/orchestrator.d.ts.map +1 -1
- package/dist/ui/orchestrator.js +24 -8
- package/dist/ui/orchestrator.js.map +1 -1
- package/dist/ui/types.d.cts +15 -1
- package/dist/ui/types.d.cts.map +1 -1
- package/dist/ui/types.d.ts +15 -1
- package/dist/ui/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
//#region src/headless-tools.ts
|
|
2
|
+
/**
|
|
3
|
+
* Strip headless-tool interrupts from a user-facing interrupt list.
|
|
4
|
+
*/
|
|
5
|
+
function filterOutHeadlessToolInterrupts(interrupts) {
|
|
6
|
+
return interrupts.filter((interrupt) => interrupt.value == null || !isHeadlessToolInterrupt(interrupt.value));
|
|
7
|
+
}
|
|
8
|
+
function isHeadlessToolInterrupt(interrupt) {
|
|
9
|
+
if (typeof interrupt !== "object" || interrupt == null) return false;
|
|
10
|
+
const value = interrupt;
|
|
11
|
+
return value.type === "tool" && typeof value.toolCall === "object" && value.toolCall != null && typeof value.toolCall.name === "string";
|
|
12
|
+
}
|
|
13
|
+
function findHeadlessTool(tools, name) {
|
|
14
|
+
return tools.find((tool) => tool.tool.name === name);
|
|
15
|
+
}
|
|
16
|
+
async function executeHeadlessTool(implementation, args, onTool) {
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
onTool?.({
|
|
19
|
+
phase: "start",
|
|
20
|
+
name: implementation.tool.name,
|
|
21
|
+
args
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
const result = await implementation.execute(args);
|
|
25
|
+
const duration = Date.now() - startTime;
|
|
26
|
+
onTool?.({
|
|
27
|
+
phase: "success",
|
|
28
|
+
name: implementation.tool.name,
|
|
29
|
+
args,
|
|
30
|
+
result,
|
|
31
|
+
duration
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
success: true,
|
|
35
|
+
result
|
|
36
|
+
};
|
|
37
|
+
} catch (err) {
|
|
38
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
39
|
+
const duration = Date.now() - startTime;
|
|
40
|
+
onTool?.({
|
|
41
|
+
phase: "error",
|
|
42
|
+
name: implementation.tool.name,
|
|
43
|
+
args,
|
|
44
|
+
error,
|
|
45
|
+
duration
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
error
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function handleHeadlessToolInterrupt(interrupt, tools, onTool) {
|
|
54
|
+
const { toolCall } = interrupt;
|
|
55
|
+
const implementation = findHeadlessTool(tools, toolCall.name);
|
|
56
|
+
if (!implementation) {
|
|
57
|
+
const error = /* @__PURE__ */ new Error(`Headless tool "${toolCall.name}" is not registered. Available tools: ${tools.map((tool) => tool.tool.name).join(", ") || "none"}`);
|
|
58
|
+
onTool?.({
|
|
59
|
+
phase: "error",
|
|
60
|
+
name: toolCall.name,
|
|
61
|
+
args: toolCall.args,
|
|
62
|
+
error,
|
|
63
|
+
duration: 0
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
toolCallId: toolCall.id,
|
|
67
|
+
value: { error: error.message }
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const result = await executeHeadlessTool(implementation, toolCall.args, onTool);
|
|
71
|
+
if (result.success) return {
|
|
72
|
+
toolCallId: toolCall.id,
|
|
73
|
+
value: result.result
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
toolCallId: toolCall.id,
|
|
77
|
+
value: { error: result.error.message }
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function headlessToolResumeCommand(result) {
|
|
81
|
+
return { resume: result.toolCallId ? { [result.toolCallId]: result.value } : result.value };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Execute and resume all newly seen headless-tool interrupts from a values
|
|
85
|
+
* payload. Callers own `handledIds` and should clear it when the thread changes.
|
|
86
|
+
*/
|
|
87
|
+
function flushPendingHeadlessToolInterrupts(values, tools, handledIds, options) {
|
|
88
|
+
if (!tools?.length || !values) return;
|
|
89
|
+
const interrupts = values.__interrupt__;
|
|
90
|
+
if (!Array.isArray(interrupts) || interrupts.length === 0) return;
|
|
91
|
+
const defer = options.defer ?? ((run) => run());
|
|
92
|
+
for (const interrupt of interrupts) {
|
|
93
|
+
if (!isHeadlessToolInterrupt(interrupt.value)) continue;
|
|
94
|
+
const headlessInterrupt = interrupt.value;
|
|
95
|
+
const interruptId = interrupt.id ?? headlessInterrupt.toolCall.id ?? "";
|
|
96
|
+
if (handledIds.has(interruptId)) continue;
|
|
97
|
+
handledIds.add(interruptId);
|
|
98
|
+
defer(() => {
|
|
99
|
+
handleHeadlessToolInterrupt(headlessInterrupt, tools, options.onTool).then((result) => {
|
|
100
|
+
options.resumeSubmit(headlessToolResumeCommand(result));
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//#endregion
|
|
106
|
+
exports.executeHeadlessTool = executeHeadlessTool;
|
|
107
|
+
exports.filterOutHeadlessToolInterrupts = filterOutHeadlessToolInterrupts;
|
|
108
|
+
exports.findHeadlessTool = findHeadlessTool;
|
|
109
|
+
exports.flushPendingHeadlessToolInterrupts = flushPendingHeadlessToolInterrupts;
|
|
110
|
+
exports.handleHeadlessToolInterrupt = handleHeadlessToolInterrupt;
|
|
111
|
+
exports.headlessToolResumeCommand = headlessToolResumeCommand;
|
|
112
|
+
exports.isHeadlessToolInterrupt = isHeadlessToolInterrupt;
|
|
113
|
+
|
|
114
|
+
//# sourceMappingURL=headless-tools.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless-tools.cjs","names":[],"sources":["../src/headless-tools.ts"],"sourcesContent":["import type { Interrupt } from \"./schema.js\";\n\n/**\n * Represents a headless tool interrupt payload emitted by LangChain's\n * schema-only `tool({ ... })` overload.\n */\nexport interface HeadlessToolInterrupt {\n type: \"tool\";\n toolCall: {\n id: string | undefined;\n name: string;\n args: unknown;\n };\n}\n\n/**\n * Client-side implementation returned by `headlessTool.implement(...)`.\n */\nexport interface HeadlessToolImplementation<Args = unknown, Output = unknown> {\n tool: {\n name: string;\n };\n execute: (args: Args) => Promise<Output>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyHeadlessToolImplementation = HeadlessToolImplementation<\n any,\n any\n>;\n\nexport interface ToolEvent {\n phase: \"start\" | \"success\" | \"error\";\n name: string;\n args: unknown;\n result?: unknown;\n error?: Error;\n duration?: number;\n}\n\nexport type OnToolCallback = (event: ToolEvent) => void;\n\n/**\n * Strip headless-tool interrupts from a user-facing interrupt list.\n */\nexport function filterOutHeadlessToolInterrupts<T extends { value?: unknown }>(\n interrupts: readonly T[]\n): T[] {\n return interrupts.filter(\n (interrupt) =>\n interrupt.value == null || !isHeadlessToolInterrupt(interrupt.value)\n );\n}\n\nexport function isHeadlessToolInterrupt(\n interrupt: unknown\n): interrupt is HeadlessToolInterrupt {\n if (typeof interrupt !== \"object\" || interrupt == null) {\n return false;\n }\n\n const value = interrupt as Record<string, unknown>;\n return (\n value.type === \"tool\" &&\n typeof value.toolCall === \"object\" &&\n value.toolCall != null &&\n typeof (value.toolCall as Record<string, unknown>).name === \"string\"\n );\n}\n\nexport function findHeadlessTool<Args = unknown, Output = unknown>(\n tools: HeadlessToolImplementation[],\n name: string\n): HeadlessToolImplementation<Args, Output> | undefined {\n return tools.find((tool) => tool.tool.name === name) as\n | HeadlessToolImplementation<Args, Output>\n | undefined;\n}\n\nexport async function executeHeadlessTool<Args = unknown, Output = unknown>(\n implementation: HeadlessToolImplementation<Args, Output>,\n args: Args,\n onTool?: OnToolCallback\n): Promise<\n { success: true; result: Output } | { success: false; error: Error }\n> {\n const startTime = Date.now();\n\n onTool?.({\n phase: \"start\",\n name: implementation.tool.name,\n args,\n });\n\n try {\n const result = await implementation.execute(args);\n const duration = Date.now() - startTime;\n\n onTool?.({\n phase: \"success\",\n name: implementation.tool.name,\n args,\n result,\n duration,\n });\n\n return { success: true, result };\n } catch (err) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n const error = err instanceof Error ? err : new Error(String(err));\n const duration = Date.now() - startTime;\n\n onTool?.({\n phase: \"error\",\n name: implementation.tool.name,\n args,\n error,\n duration,\n });\n\n return { success: false, error };\n }\n}\n\nexport async function handleHeadlessToolInterrupt(\n interrupt: HeadlessToolInterrupt,\n tools: HeadlessToolImplementation[],\n onTool?: OnToolCallback\n): Promise<{ toolCallId: string | undefined; value: unknown }> {\n const { toolCall } = interrupt;\n const implementation = findHeadlessTool(tools, toolCall.name);\n\n if (!implementation) {\n const error = new Error(\n `Headless tool \"${toolCall.name}\" is not registered. ` +\n `Available tools: ${tools.map((tool) => tool.tool.name).join(\", \") || \"none\"}`\n );\n\n onTool?.({\n phase: \"error\",\n name: toolCall.name,\n args: toolCall.args,\n error,\n duration: 0,\n });\n\n return {\n toolCallId: toolCall.id,\n value: { error: error.message },\n };\n }\n\n const result = await executeHeadlessTool(\n implementation,\n toolCall.args as never,\n onTool\n );\n\n if (result.success) {\n return {\n toolCallId: toolCall.id,\n value: result.result,\n };\n }\n\n return {\n toolCallId: toolCall.id,\n value: { error: result.error.message },\n };\n}\n\nexport function headlessToolResumeCommand(result: {\n toolCallId: string | undefined;\n value: unknown;\n}): { resume: unknown } {\n return {\n resume: result.toolCallId\n ? { [result.toolCallId]: result.value }\n : result.value,\n };\n}\n\nexport interface FlushPendingHeadlessToolInterruptsOptions {\n onTool?: OnToolCallback;\n resumeSubmit: (command: { resume: unknown }) => void | Promise<void>;\n defer?: (run: () => void) => void;\n}\n\n/**\n * Execute and resume all newly seen headless-tool interrupts from a values\n * payload. Callers own `handledIds` and should clear it when the thread changes.\n */\nexport function flushPendingHeadlessToolInterrupts(\n values: Record<string, unknown> | null | undefined,\n tools: HeadlessToolImplementation[] | undefined,\n handledIds: Set<string>,\n options: FlushPendingHeadlessToolInterruptsOptions\n): void {\n if (!tools?.length || !values) return;\n\n const interrupts = values.__interrupt__;\n if (!Array.isArray(interrupts) || interrupts.length === 0) return;\n\n const defer = options.defer ?? ((run) => run());\n\n for (const interrupt of interrupts as Interrupt[]) {\n if (!isHeadlessToolInterrupt(interrupt.value)) continue;\n const headlessInterrupt = interrupt.value;\n\n const interruptId = interrupt.id ?? headlessInterrupt.toolCall.id ?? \"\";\n if (handledIds.has(interruptId)) continue;\n handledIds.add(interruptId);\n\n defer(() => {\n void handleHeadlessToolInterrupt(\n headlessInterrupt,\n tools,\n options.onTool\n ).then((result) => {\n void options.resumeSubmit(headlessToolResumeCommand(result));\n });\n });\n }\n}\n"],"mappings":";;;;AA6CA,SAAgB,gCACd,YACK;AACL,QAAO,WAAW,QACf,cACC,UAAU,SAAS,QAAQ,CAAC,wBAAwB,UAAU,MAAM,CACvE;;AAGH,SAAgB,wBACd,WACoC;AACpC,KAAI,OAAO,cAAc,YAAY,aAAa,KAChD,QAAO;CAGT,MAAM,QAAQ;AACd,QACE,MAAM,SAAS,UACf,OAAO,MAAM,aAAa,YAC1B,MAAM,YAAY,QAClB,OAAQ,MAAM,SAAqC,SAAS;;AAIhE,SAAgB,iBACd,OACA,MACsD;AACtD,QAAO,MAAM,MAAM,SAAS,KAAK,KAAK,SAAS,KAAK;;AAKtD,eAAsB,oBACpB,gBACA,MACA,QAGA;CACA,MAAM,YAAY,KAAK,KAAK;AAE5B,UAAS;EACP,OAAO;EACP,MAAM,eAAe,KAAK;EAC1B;EACD,CAAC;AAEF,KAAI;EACF,MAAM,SAAS,MAAM,eAAe,QAAQ,KAAK;EACjD,MAAM,WAAW,KAAK,KAAK,GAAG;AAE9B,WAAS;GACP,OAAO;GACP,MAAM,eAAe,KAAK;GAC1B;GACA;GACA;GACD,CAAC;AAEF,SAAO;GAAE,SAAS;GAAM;GAAQ;UACzB,KAAK;EAEZ,MAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC;EACjE,MAAM,WAAW,KAAK,KAAK,GAAG;AAE9B,WAAS;GACP,OAAO;GACP,MAAM,eAAe,KAAK;GAC1B;GACA;GACA;GACD,CAAC;AAEF,SAAO;GAAE,SAAS;GAAO;GAAO;;;AAIpC,eAAsB,4BACpB,WACA,OACA,QAC6D;CAC7D,MAAM,EAAE,aAAa;CACrB,MAAM,iBAAiB,iBAAiB,OAAO,SAAS,KAAK;AAE7D,KAAI,CAAC,gBAAgB;EACnB,MAAM,wBAAQ,IAAI,MAChB,kBAAkB,SAAS,KAAK,wCACV,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,IAAI,SACzE;AAED,WAAS;GACP,OAAO;GACP,MAAM,SAAS;GACf,MAAM,SAAS;GACf;GACA,UAAU;GACX,CAAC;AAEF,SAAO;GACL,YAAY,SAAS;GACrB,OAAO,EAAE,OAAO,MAAM,SAAS;GAChC;;CAGH,MAAM,SAAS,MAAM,oBACnB,gBACA,SAAS,MACT,OACD;AAED,KAAI,OAAO,QACT,QAAO;EACL,YAAY,SAAS;EACrB,OAAO,OAAO;EACf;AAGH,QAAO;EACL,YAAY,SAAS;EACrB,OAAO,EAAE,OAAO,OAAO,MAAM,SAAS;EACvC;;AAGH,SAAgB,0BAA0B,QAGlB;AACtB,QAAO,EACL,QAAQ,OAAO,aACX,GAAG,OAAO,aAAa,OAAO,OAAO,GACrC,OAAO,OACZ;;;;;;AAaH,SAAgB,mCACd,QACA,OACA,YACA,SACM;AACN,KAAI,CAAC,OAAO,UAAU,CAAC,OAAQ;CAE/B,MAAM,aAAa,OAAO;AAC1B,KAAI,CAAC,MAAM,QAAQ,WAAW,IAAI,WAAW,WAAW,EAAG;CAE3D,MAAM,QAAQ,QAAQ,WAAW,QAAQ,KAAK;AAE9C,MAAK,MAAM,aAAa,YAA2B;AACjD,MAAI,CAAC,wBAAwB,UAAU,MAAM,CAAE;EAC/C,MAAM,oBAAoB,UAAU;EAEpC,MAAM,cAAc,UAAU,MAAM,kBAAkB,SAAS,MAAM;AACrE,MAAI,WAAW,IAAI,YAAY,CAAE;AACjC,aAAW,IAAI,YAAY;AAE3B,cAAY;AACL,+BACH,mBACA,OACA,QAAQ,OACT,CAAC,MAAM,WAAW;AACZ,YAAQ,aAAa,0BAA0B,OAAO,CAAC;KAC5D;IACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region src/headless-tools.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Represents a headless tool interrupt payload emitted by LangChain's
|
|
4
|
+
* schema-only `tool({ ... })` overload.
|
|
5
|
+
*/
|
|
6
|
+
interface HeadlessToolInterrupt {
|
|
7
|
+
type: "tool";
|
|
8
|
+
toolCall: {
|
|
9
|
+
id: string | undefined;
|
|
10
|
+
name: string;
|
|
11
|
+
args: unknown;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Client-side implementation returned by `headlessTool.implement(...)`.
|
|
16
|
+
*/
|
|
17
|
+
interface HeadlessToolImplementation<Args = unknown, Output = unknown> {
|
|
18
|
+
tool: {
|
|
19
|
+
name: string;
|
|
20
|
+
};
|
|
21
|
+
execute: (args: Args) => Promise<Output>;
|
|
22
|
+
}
|
|
23
|
+
type AnyHeadlessToolImplementation = HeadlessToolImplementation<any, any>;
|
|
24
|
+
interface ToolEvent {
|
|
25
|
+
phase: "start" | "success" | "error";
|
|
26
|
+
name: string;
|
|
27
|
+
args: unknown;
|
|
28
|
+
result?: unknown;
|
|
29
|
+
error?: Error;
|
|
30
|
+
duration?: number;
|
|
31
|
+
}
|
|
32
|
+
type OnToolCallback = (event: ToolEvent) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Strip headless-tool interrupts from a user-facing interrupt list.
|
|
35
|
+
*/
|
|
36
|
+
declare function filterOutHeadlessToolInterrupts<T extends {
|
|
37
|
+
value?: unknown;
|
|
38
|
+
}>(interrupts: readonly T[]): T[];
|
|
39
|
+
declare function isHeadlessToolInterrupt(interrupt: unknown): interrupt is HeadlessToolInterrupt;
|
|
40
|
+
declare function findHeadlessTool<Args = unknown, Output = unknown>(tools: HeadlessToolImplementation[], name: string): HeadlessToolImplementation<Args, Output> | undefined;
|
|
41
|
+
declare function executeHeadlessTool<Args = unknown, Output = unknown>(implementation: HeadlessToolImplementation<Args, Output>, args: Args, onTool?: OnToolCallback): Promise<{
|
|
42
|
+
success: true;
|
|
43
|
+
result: Output;
|
|
44
|
+
} | {
|
|
45
|
+
success: false;
|
|
46
|
+
error: Error;
|
|
47
|
+
}>;
|
|
48
|
+
declare function handleHeadlessToolInterrupt(interrupt: HeadlessToolInterrupt, tools: HeadlessToolImplementation[], onTool?: OnToolCallback): Promise<{
|
|
49
|
+
toolCallId: string | undefined;
|
|
50
|
+
value: unknown;
|
|
51
|
+
}>;
|
|
52
|
+
declare function headlessToolResumeCommand(result: {
|
|
53
|
+
toolCallId: string | undefined;
|
|
54
|
+
value: unknown;
|
|
55
|
+
}): {
|
|
56
|
+
resume: unknown;
|
|
57
|
+
};
|
|
58
|
+
interface FlushPendingHeadlessToolInterruptsOptions {
|
|
59
|
+
onTool?: OnToolCallback;
|
|
60
|
+
resumeSubmit: (command: {
|
|
61
|
+
resume: unknown;
|
|
62
|
+
}) => void | Promise<void>;
|
|
63
|
+
defer?: (run: () => void) => void;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Execute and resume all newly seen headless-tool interrupts from a values
|
|
67
|
+
* payload. Callers own `handledIds` and should clear it when the thread changes.
|
|
68
|
+
*/
|
|
69
|
+
declare function flushPendingHeadlessToolInterrupts(values: Record<string, unknown> | null | undefined, tools: HeadlessToolImplementation[] | undefined, handledIds: Set<string>, options: FlushPendingHeadlessToolInterruptsOptions): void;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { AnyHeadlessToolImplementation, FlushPendingHeadlessToolInterruptsOptions, HeadlessToolImplementation, HeadlessToolInterrupt, OnToolCallback, ToolEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt };
|
|
72
|
+
//# sourceMappingURL=headless-tools.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless-tools.d.cts","names":[],"sources":["../src/headless-tools.ts"],"mappings":";;AAMA;;;UAAiB,qBAAA;EACf,IAAA;EACA,QAAA;IACE,EAAA;IACA,IAAA;IACA,IAAA;EAAA;AAAA;AAOJ;;;AAAA,UAAiB,0BAAA;EACf,IAAA;IACE,IAAA;EAAA;EAEF,OAAA,GAAU,IAAA,EAAM,IAAA,KAAS,OAAA,CAAQ,MAAA;AAAA;AAAA,KAIvB,6BAAA,GAAgC,0BAAA;AAAA,UAK3B,SAAA;EACf,KAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA;EACA,KAAA,GAAQ,KAAA;EACR,QAAA;AAAA;AAAA,KAGU,cAAA,IAAkB,KAAA,EAAO,SAAA;AAdrC;;;AAAA,iBAmBgB,+BAAA;EAA4C,KAAA;AAAA,EAAA,CAC1D,UAAA,WAAqB,CAAA,KACpB,CAAA;AAAA,iBAOa,uBAAA,CACd,SAAA,YACC,SAAA,IAAa,qBAAA;AAAA,iBAcA,gBAAA,kCAAA,CACd,KAAA,EAAO,0BAAA,IACP,IAAA,WACC,0BAAA,CAA2B,IAAA,EAAM,MAAA;AAAA,iBAMd,mBAAA,kCAAA,CACpB,cAAA,EAAgB,0BAAA,CAA2B,IAAA,EAAM,MAAA,GACjD,IAAA,EAAM,IAAA,EACN,MAAA,GAAS,cAAA,GACR,OAAA;EACC,OAAA;EAAe,MAAA,EAAQ,MAAA;AAAA;EAAa,OAAA;EAAgB,KAAA,EAAO,KAAA;AAAA;AAAA,iBAwCzC,2BAAA,CACpB,SAAA,EAAW,qBAAA,EACX,KAAA,EAAO,0BAAA,IACP,MAAA,GAAS,cAAA,GACR,OAAA;EAAU,UAAA;EAAgC,KAAA;AAAA;AAAA,iBA2C7B,yBAAA,CAA0B,MAAA;EACxC,UAAA;EACA,KAAA;AAAA;EACI,MAAA;AAAA;AAAA,UAQW,yCAAA;EACf,MAAA,GAAS,cAAA;EACT,YAAA,GAAe,OAAA;IAAW,MAAA;EAAA,aAA6B,OAAA;EACvD,KAAA,IAAS,GAAA;AAAA;;;AAnIX;;iBA0IgB,kCAAA,CACd,MAAA,EAAQ,MAAA,sCACR,KAAA,EAAO,0BAAA,gBACP,UAAA,EAAY,GAAA,UACZ,OAAA,EAAS,yCAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region src/headless-tools.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Represents a headless tool interrupt payload emitted by LangChain's
|
|
4
|
+
* schema-only `tool({ ... })` overload.
|
|
5
|
+
*/
|
|
6
|
+
interface HeadlessToolInterrupt {
|
|
7
|
+
type: "tool";
|
|
8
|
+
toolCall: {
|
|
9
|
+
id: string | undefined;
|
|
10
|
+
name: string;
|
|
11
|
+
args: unknown;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Client-side implementation returned by `headlessTool.implement(...)`.
|
|
16
|
+
*/
|
|
17
|
+
interface HeadlessToolImplementation<Args = unknown, Output = unknown> {
|
|
18
|
+
tool: {
|
|
19
|
+
name: string;
|
|
20
|
+
};
|
|
21
|
+
execute: (args: Args) => Promise<Output>;
|
|
22
|
+
}
|
|
23
|
+
type AnyHeadlessToolImplementation = HeadlessToolImplementation<any, any>;
|
|
24
|
+
interface ToolEvent {
|
|
25
|
+
phase: "start" | "success" | "error";
|
|
26
|
+
name: string;
|
|
27
|
+
args: unknown;
|
|
28
|
+
result?: unknown;
|
|
29
|
+
error?: Error;
|
|
30
|
+
duration?: number;
|
|
31
|
+
}
|
|
32
|
+
type OnToolCallback = (event: ToolEvent) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Strip headless-tool interrupts from a user-facing interrupt list.
|
|
35
|
+
*/
|
|
36
|
+
declare function filterOutHeadlessToolInterrupts<T extends {
|
|
37
|
+
value?: unknown;
|
|
38
|
+
}>(interrupts: readonly T[]): T[];
|
|
39
|
+
declare function isHeadlessToolInterrupt(interrupt: unknown): interrupt is HeadlessToolInterrupt;
|
|
40
|
+
declare function findHeadlessTool<Args = unknown, Output = unknown>(tools: HeadlessToolImplementation[], name: string): HeadlessToolImplementation<Args, Output> | undefined;
|
|
41
|
+
declare function executeHeadlessTool<Args = unknown, Output = unknown>(implementation: HeadlessToolImplementation<Args, Output>, args: Args, onTool?: OnToolCallback): Promise<{
|
|
42
|
+
success: true;
|
|
43
|
+
result: Output;
|
|
44
|
+
} | {
|
|
45
|
+
success: false;
|
|
46
|
+
error: Error;
|
|
47
|
+
}>;
|
|
48
|
+
declare function handleHeadlessToolInterrupt(interrupt: HeadlessToolInterrupt, tools: HeadlessToolImplementation[], onTool?: OnToolCallback): Promise<{
|
|
49
|
+
toolCallId: string | undefined;
|
|
50
|
+
value: unknown;
|
|
51
|
+
}>;
|
|
52
|
+
declare function headlessToolResumeCommand(result: {
|
|
53
|
+
toolCallId: string | undefined;
|
|
54
|
+
value: unknown;
|
|
55
|
+
}): {
|
|
56
|
+
resume: unknown;
|
|
57
|
+
};
|
|
58
|
+
interface FlushPendingHeadlessToolInterruptsOptions {
|
|
59
|
+
onTool?: OnToolCallback;
|
|
60
|
+
resumeSubmit: (command: {
|
|
61
|
+
resume: unknown;
|
|
62
|
+
}) => void | Promise<void>;
|
|
63
|
+
defer?: (run: () => void) => void;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Execute and resume all newly seen headless-tool interrupts from a values
|
|
67
|
+
* payload. Callers own `handledIds` and should clear it when the thread changes.
|
|
68
|
+
*/
|
|
69
|
+
declare function flushPendingHeadlessToolInterrupts(values: Record<string, unknown> | null | undefined, tools: HeadlessToolImplementation[] | undefined, handledIds: Set<string>, options: FlushPendingHeadlessToolInterruptsOptions): void;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { AnyHeadlessToolImplementation, FlushPendingHeadlessToolInterruptsOptions, HeadlessToolImplementation, HeadlessToolInterrupt, OnToolCallback, ToolEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt };
|
|
72
|
+
//# sourceMappingURL=headless-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless-tools.d.ts","names":[],"sources":["../src/headless-tools.ts"],"mappings":";;AAMA;;;UAAiB,qBAAA;EACf,IAAA;EACA,QAAA;IACE,EAAA;IACA,IAAA;IACA,IAAA;EAAA;AAAA;AAOJ;;;AAAA,UAAiB,0BAAA;EACf,IAAA;IACE,IAAA;EAAA;EAEF,OAAA,GAAU,IAAA,EAAM,IAAA,KAAS,OAAA,CAAQ,MAAA;AAAA;AAAA,KAIvB,6BAAA,GAAgC,0BAAA;AAAA,UAK3B,SAAA;EACf,KAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA;EACA,KAAA,GAAQ,KAAA;EACR,QAAA;AAAA;AAAA,KAGU,cAAA,IAAkB,KAAA,EAAO,SAAA;AAdrC;;;AAAA,iBAmBgB,+BAAA;EAA4C,KAAA;AAAA,EAAA,CAC1D,UAAA,WAAqB,CAAA,KACpB,CAAA;AAAA,iBAOa,uBAAA,CACd,SAAA,YACC,SAAA,IAAa,qBAAA;AAAA,iBAcA,gBAAA,kCAAA,CACd,KAAA,EAAO,0BAAA,IACP,IAAA,WACC,0BAAA,CAA2B,IAAA,EAAM,MAAA;AAAA,iBAMd,mBAAA,kCAAA,CACpB,cAAA,EAAgB,0BAAA,CAA2B,IAAA,EAAM,MAAA,GACjD,IAAA,EAAM,IAAA,EACN,MAAA,GAAS,cAAA,GACR,OAAA;EACC,OAAA;EAAe,MAAA,EAAQ,MAAA;AAAA;EAAa,OAAA;EAAgB,KAAA,EAAO,KAAA;AAAA;AAAA,iBAwCzC,2BAAA,CACpB,SAAA,EAAW,qBAAA,EACX,KAAA,EAAO,0BAAA,IACP,MAAA,GAAS,cAAA,GACR,OAAA;EAAU,UAAA;EAAgC,KAAA;AAAA;AAAA,iBA2C7B,yBAAA,CAA0B,MAAA;EACxC,UAAA;EACA,KAAA;AAAA;EACI,MAAA;AAAA;AAAA,UAQW,yCAAA;EACf,MAAA,GAAS,cAAA;EACT,YAAA,GAAe,OAAA;IAAW,MAAA;EAAA,aAA6B,OAAA;EACvD,KAAA,IAAS,GAAA;AAAA;;;AAnIX;;iBA0IgB,kCAAA,CACd,MAAA,EAAQ,MAAA,sCACR,KAAA,EAAO,0BAAA,gBACP,UAAA,EAAY,GAAA,UACZ,OAAA,EAAS,yCAAA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
//#region src/headless-tools.ts
|
|
2
|
+
/**
|
|
3
|
+
* Strip headless-tool interrupts from a user-facing interrupt list.
|
|
4
|
+
*/
|
|
5
|
+
function filterOutHeadlessToolInterrupts(interrupts) {
|
|
6
|
+
return interrupts.filter((interrupt) => interrupt.value == null || !isHeadlessToolInterrupt(interrupt.value));
|
|
7
|
+
}
|
|
8
|
+
function isHeadlessToolInterrupt(interrupt) {
|
|
9
|
+
if (typeof interrupt !== "object" || interrupt == null) return false;
|
|
10
|
+
const value = interrupt;
|
|
11
|
+
return value.type === "tool" && typeof value.toolCall === "object" && value.toolCall != null && typeof value.toolCall.name === "string";
|
|
12
|
+
}
|
|
13
|
+
function findHeadlessTool(tools, name) {
|
|
14
|
+
return tools.find((tool) => tool.tool.name === name);
|
|
15
|
+
}
|
|
16
|
+
async function executeHeadlessTool(implementation, args, onTool) {
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
onTool?.({
|
|
19
|
+
phase: "start",
|
|
20
|
+
name: implementation.tool.name,
|
|
21
|
+
args
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
const result = await implementation.execute(args);
|
|
25
|
+
const duration = Date.now() - startTime;
|
|
26
|
+
onTool?.({
|
|
27
|
+
phase: "success",
|
|
28
|
+
name: implementation.tool.name,
|
|
29
|
+
args,
|
|
30
|
+
result,
|
|
31
|
+
duration
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
success: true,
|
|
35
|
+
result
|
|
36
|
+
};
|
|
37
|
+
} catch (err) {
|
|
38
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
39
|
+
const duration = Date.now() - startTime;
|
|
40
|
+
onTool?.({
|
|
41
|
+
phase: "error",
|
|
42
|
+
name: implementation.tool.name,
|
|
43
|
+
args,
|
|
44
|
+
error,
|
|
45
|
+
duration
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
error
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function handleHeadlessToolInterrupt(interrupt, tools, onTool) {
|
|
54
|
+
const { toolCall } = interrupt;
|
|
55
|
+
const implementation = findHeadlessTool(tools, toolCall.name);
|
|
56
|
+
if (!implementation) {
|
|
57
|
+
const error = /* @__PURE__ */ new Error(`Headless tool "${toolCall.name}" is not registered. Available tools: ${tools.map((tool) => tool.tool.name).join(", ") || "none"}`);
|
|
58
|
+
onTool?.({
|
|
59
|
+
phase: "error",
|
|
60
|
+
name: toolCall.name,
|
|
61
|
+
args: toolCall.args,
|
|
62
|
+
error,
|
|
63
|
+
duration: 0
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
toolCallId: toolCall.id,
|
|
67
|
+
value: { error: error.message }
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const result = await executeHeadlessTool(implementation, toolCall.args, onTool);
|
|
71
|
+
if (result.success) return {
|
|
72
|
+
toolCallId: toolCall.id,
|
|
73
|
+
value: result.result
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
toolCallId: toolCall.id,
|
|
77
|
+
value: { error: result.error.message }
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function headlessToolResumeCommand(result) {
|
|
81
|
+
return { resume: result.toolCallId ? { [result.toolCallId]: result.value } : result.value };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Execute and resume all newly seen headless-tool interrupts from a values
|
|
85
|
+
* payload. Callers own `handledIds` and should clear it when the thread changes.
|
|
86
|
+
*/
|
|
87
|
+
function flushPendingHeadlessToolInterrupts(values, tools, handledIds, options) {
|
|
88
|
+
if (!tools?.length || !values) return;
|
|
89
|
+
const interrupts = values.__interrupt__;
|
|
90
|
+
if (!Array.isArray(interrupts) || interrupts.length === 0) return;
|
|
91
|
+
const defer = options.defer ?? ((run) => run());
|
|
92
|
+
for (const interrupt of interrupts) {
|
|
93
|
+
if (!isHeadlessToolInterrupt(interrupt.value)) continue;
|
|
94
|
+
const headlessInterrupt = interrupt.value;
|
|
95
|
+
const interruptId = interrupt.id ?? headlessInterrupt.toolCall.id ?? "";
|
|
96
|
+
if (handledIds.has(interruptId)) continue;
|
|
97
|
+
handledIds.add(interruptId);
|
|
98
|
+
defer(() => {
|
|
99
|
+
handleHeadlessToolInterrupt(headlessInterrupt, tools, options.onTool).then((result) => {
|
|
100
|
+
options.resumeSubmit(headlessToolResumeCommand(result));
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//#endregion
|
|
106
|
+
export { executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt };
|
|
107
|
+
|
|
108
|
+
//# sourceMappingURL=headless-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless-tools.js","names":[],"sources":["../src/headless-tools.ts"],"sourcesContent":["import type { Interrupt } from \"./schema.js\";\n\n/**\n * Represents a headless tool interrupt payload emitted by LangChain's\n * schema-only `tool({ ... })` overload.\n */\nexport interface HeadlessToolInterrupt {\n type: \"tool\";\n toolCall: {\n id: string | undefined;\n name: string;\n args: unknown;\n };\n}\n\n/**\n * Client-side implementation returned by `headlessTool.implement(...)`.\n */\nexport interface HeadlessToolImplementation<Args = unknown, Output = unknown> {\n tool: {\n name: string;\n };\n execute: (args: Args) => Promise<Output>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyHeadlessToolImplementation = HeadlessToolImplementation<\n any,\n any\n>;\n\nexport interface ToolEvent {\n phase: \"start\" | \"success\" | \"error\";\n name: string;\n args: unknown;\n result?: unknown;\n error?: Error;\n duration?: number;\n}\n\nexport type OnToolCallback = (event: ToolEvent) => void;\n\n/**\n * Strip headless-tool interrupts from a user-facing interrupt list.\n */\nexport function filterOutHeadlessToolInterrupts<T extends { value?: unknown }>(\n interrupts: readonly T[]\n): T[] {\n return interrupts.filter(\n (interrupt) =>\n interrupt.value == null || !isHeadlessToolInterrupt(interrupt.value)\n );\n}\n\nexport function isHeadlessToolInterrupt(\n interrupt: unknown\n): interrupt is HeadlessToolInterrupt {\n if (typeof interrupt !== \"object\" || interrupt == null) {\n return false;\n }\n\n const value = interrupt as Record<string, unknown>;\n return (\n value.type === \"tool\" &&\n typeof value.toolCall === \"object\" &&\n value.toolCall != null &&\n typeof (value.toolCall as Record<string, unknown>).name === \"string\"\n );\n}\n\nexport function findHeadlessTool<Args = unknown, Output = unknown>(\n tools: HeadlessToolImplementation[],\n name: string\n): HeadlessToolImplementation<Args, Output> | undefined {\n return tools.find((tool) => tool.tool.name === name) as\n | HeadlessToolImplementation<Args, Output>\n | undefined;\n}\n\nexport async function executeHeadlessTool<Args = unknown, Output = unknown>(\n implementation: HeadlessToolImplementation<Args, Output>,\n args: Args,\n onTool?: OnToolCallback\n): Promise<\n { success: true; result: Output } | { success: false; error: Error }\n> {\n const startTime = Date.now();\n\n onTool?.({\n phase: \"start\",\n name: implementation.tool.name,\n args,\n });\n\n try {\n const result = await implementation.execute(args);\n const duration = Date.now() - startTime;\n\n onTool?.({\n phase: \"success\",\n name: implementation.tool.name,\n args,\n result,\n duration,\n });\n\n return { success: true, result };\n } catch (err) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n const error = err instanceof Error ? err : new Error(String(err));\n const duration = Date.now() - startTime;\n\n onTool?.({\n phase: \"error\",\n name: implementation.tool.name,\n args,\n error,\n duration,\n });\n\n return { success: false, error };\n }\n}\n\nexport async function handleHeadlessToolInterrupt(\n interrupt: HeadlessToolInterrupt,\n tools: HeadlessToolImplementation[],\n onTool?: OnToolCallback\n): Promise<{ toolCallId: string | undefined; value: unknown }> {\n const { toolCall } = interrupt;\n const implementation = findHeadlessTool(tools, toolCall.name);\n\n if (!implementation) {\n const error = new Error(\n `Headless tool \"${toolCall.name}\" is not registered. ` +\n `Available tools: ${tools.map((tool) => tool.tool.name).join(\", \") || \"none\"}`\n );\n\n onTool?.({\n phase: \"error\",\n name: toolCall.name,\n args: toolCall.args,\n error,\n duration: 0,\n });\n\n return {\n toolCallId: toolCall.id,\n value: { error: error.message },\n };\n }\n\n const result = await executeHeadlessTool(\n implementation,\n toolCall.args as never,\n onTool\n );\n\n if (result.success) {\n return {\n toolCallId: toolCall.id,\n value: result.result,\n };\n }\n\n return {\n toolCallId: toolCall.id,\n value: { error: result.error.message },\n };\n}\n\nexport function headlessToolResumeCommand(result: {\n toolCallId: string | undefined;\n value: unknown;\n}): { resume: unknown } {\n return {\n resume: result.toolCallId\n ? { [result.toolCallId]: result.value }\n : result.value,\n };\n}\n\nexport interface FlushPendingHeadlessToolInterruptsOptions {\n onTool?: OnToolCallback;\n resumeSubmit: (command: { resume: unknown }) => void | Promise<void>;\n defer?: (run: () => void) => void;\n}\n\n/**\n * Execute and resume all newly seen headless-tool interrupts from a values\n * payload. Callers own `handledIds` and should clear it when the thread changes.\n */\nexport function flushPendingHeadlessToolInterrupts(\n values: Record<string, unknown> | null | undefined,\n tools: HeadlessToolImplementation[] | undefined,\n handledIds: Set<string>,\n options: FlushPendingHeadlessToolInterruptsOptions\n): void {\n if (!tools?.length || !values) return;\n\n const interrupts = values.__interrupt__;\n if (!Array.isArray(interrupts) || interrupts.length === 0) return;\n\n const defer = options.defer ?? ((run) => run());\n\n for (const interrupt of interrupts as Interrupt[]) {\n if (!isHeadlessToolInterrupt(interrupt.value)) continue;\n const headlessInterrupt = interrupt.value;\n\n const interruptId = interrupt.id ?? headlessInterrupt.toolCall.id ?? \"\";\n if (handledIds.has(interruptId)) continue;\n handledIds.add(interruptId);\n\n defer(() => {\n void handleHeadlessToolInterrupt(\n headlessInterrupt,\n tools,\n options.onTool\n ).then((result) => {\n void options.resumeSubmit(headlessToolResumeCommand(result));\n });\n });\n }\n}\n"],"mappings":";;;;AA6CA,SAAgB,gCACd,YACK;AACL,QAAO,WAAW,QACf,cACC,UAAU,SAAS,QAAQ,CAAC,wBAAwB,UAAU,MAAM,CACvE;;AAGH,SAAgB,wBACd,WACoC;AACpC,KAAI,OAAO,cAAc,YAAY,aAAa,KAChD,QAAO;CAGT,MAAM,QAAQ;AACd,QACE,MAAM,SAAS,UACf,OAAO,MAAM,aAAa,YAC1B,MAAM,YAAY,QAClB,OAAQ,MAAM,SAAqC,SAAS;;AAIhE,SAAgB,iBACd,OACA,MACsD;AACtD,QAAO,MAAM,MAAM,SAAS,KAAK,KAAK,SAAS,KAAK;;AAKtD,eAAsB,oBACpB,gBACA,MACA,QAGA;CACA,MAAM,YAAY,KAAK,KAAK;AAE5B,UAAS;EACP,OAAO;EACP,MAAM,eAAe,KAAK;EAC1B;EACD,CAAC;AAEF,KAAI;EACF,MAAM,SAAS,MAAM,eAAe,QAAQ,KAAK;EACjD,MAAM,WAAW,KAAK,KAAK,GAAG;AAE9B,WAAS;GACP,OAAO;GACP,MAAM,eAAe,KAAK;GAC1B;GACA;GACA;GACD,CAAC;AAEF,SAAO;GAAE,SAAS;GAAM;GAAQ;UACzB,KAAK;EAEZ,MAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC;EACjE,MAAM,WAAW,KAAK,KAAK,GAAG;AAE9B,WAAS;GACP,OAAO;GACP,MAAM,eAAe,KAAK;GAC1B;GACA;GACA;GACD,CAAC;AAEF,SAAO;GAAE,SAAS;GAAO;GAAO;;;AAIpC,eAAsB,4BACpB,WACA,OACA,QAC6D;CAC7D,MAAM,EAAE,aAAa;CACrB,MAAM,iBAAiB,iBAAiB,OAAO,SAAS,KAAK;AAE7D,KAAI,CAAC,gBAAgB;EACnB,MAAM,wBAAQ,IAAI,MAChB,kBAAkB,SAAS,KAAK,wCACV,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,IAAI,SACzE;AAED,WAAS;GACP,OAAO;GACP,MAAM,SAAS;GACf,MAAM,SAAS;GACf;GACA,UAAU;GACX,CAAC;AAEF,SAAO;GACL,YAAY,SAAS;GACrB,OAAO,EAAE,OAAO,MAAM,SAAS;GAChC;;CAGH,MAAM,SAAS,MAAM,oBACnB,gBACA,SAAS,MACT,OACD;AAED,KAAI,OAAO,QACT,QAAO;EACL,YAAY,SAAS;EACrB,OAAO,OAAO;EACf;AAGH,QAAO;EACL,YAAY,SAAS;EACrB,OAAO,EAAE,OAAO,OAAO,MAAM,SAAS;EACvC;;AAGH,SAAgB,0BAA0B,QAGlB;AACtB,QAAO,EACL,QAAQ,OAAO,aACX,GAAG,OAAO,aAAa,OAAO,OAAO,GACrC,OAAO,OACZ;;;;;;AAaH,SAAgB,mCACd,QACA,OACA,YACA,SACM;AACN,KAAI,CAAC,OAAO,UAAU,CAAC,OAAQ;CAE/B,MAAM,aAAa,OAAO;AAC1B,KAAI,CAAC,MAAM,QAAQ,WAAW,IAAI,WAAW,WAAW,EAAG;CAE3D,MAAM,QAAQ,QAAQ,WAAW,QAAQ,KAAK;AAE9C,MAAK,MAAM,aAAa,YAA2B;AACjD,MAAI,CAAC,wBAAwB,UAAU,MAAM,CAAE;EAC/C,MAAM,oBAAoB,UAAU;EAEpC,MAAM,cAAc,UAAU,MAAM,kBAAkB,SAAS,MAAM;AACrE,MAAI,WAAW,IAAI,YAAY,CAAE;AACjC,aAAW,IAAI,YAAY;AAE3B,cAAY;AACL,+BACH,mBACA,OACA,QAAQ,OACT,CAAC,MAAM,WAAW;AACZ,YAAQ,aAAa,0BAA0B,OAAO,CAAC;KAC5D;IACF"}
|
package/dist/index.cjs
CHANGED
|
@@ -2,7 +2,15 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_fetch = require("./singletons/fetch.cjs");
|
|
3
3
|
const require_client = require("./client.cjs");
|
|
4
4
|
const require_errors = require("./ui/errors.cjs");
|
|
5
|
+
const require_headless_tools = require("./headless-tools.cjs");
|
|
5
6
|
exports.Client = require_client.Client;
|
|
6
7
|
exports.StreamError = require_errors.StreamError;
|
|
8
|
+
exports.executeHeadlessTool = require_headless_tools.executeHeadlessTool;
|
|
9
|
+
exports.filterOutHeadlessToolInterrupts = require_headless_tools.filterOutHeadlessToolInterrupts;
|
|
10
|
+
exports.findHeadlessTool = require_headless_tools.findHeadlessTool;
|
|
11
|
+
exports.flushPendingHeadlessToolInterrupts = require_headless_tools.flushPendingHeadlessToolInterrupts;
|
|
7
12
|
exports.getApiKey = require_client.getApiKey;
|
|
13
|
+
exports.handleHeadlessToolInterrupt = require_headless_tools.handleHeadlessToolInterrupt;
|
|
14
|
+
exports.headlessToolResumeCommand = require_headless_tools.headlessToolResumeCommand;
|
|
15
|
+
exports.isHeadlessToolInterrupt = require_headless_tools.isHeadlessToolInterrupt;
|
|
8
16
|
exports.overrideFetchImplementation = require_fetch.overrideFetchImplementation;
|
package/dist/index.d.cts
CHANGED
|
@@ -5,9 +5,10 @@ import { Command, OnConflictBehavior, RunsInvokePayload, StreamEvent } from "./t
|
|
|
5
5
|
import { Client, ClientConfig, RequestHook, getApiKey } from "./client.cjs";
|
|
6
6
|
import { overrideFetchImplementation } from "./singletons/fetch.cjs";
|
|
7
7
|
import { BagTemplate } from "./types.template.cjs";
|
|
8
|
+
import { AnyHeadlessToolImplementation, FlushPendingHeadlessToolInterruptsOptions, HeadlessToolImplementation, HeadlessToolInterrupt, OnToolCallback, ToolEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt } from "./headless-tools.cjs";
|
|
8
9
|
import { BaseStream } from "./ui/stream/base.cjs";
|
|
9
10
|
import { UseAgentStream, UseAgentStreamOptions } from "./ui/stream/agent.cjs";
|
|
10
11
|
import { UseDeepAgentStream, UseDeepAgentStreamOptions } from "./ui/stream/deep-agent.cjs";
|
|
11
12
|
import { InferBag, InferNodeNames, InferNodeReturnTypes, InferStateType, InferSubagentStates, InferToolCalls, ResolveStreamInterface, ResolveStreamOptions } from "./ui/stream/index.cjs";
|
|
12
13
|
import { StreamError } from "./ui/errors.cjs";
|
|
13
|
-
export { type AIMessage, type Assistant, type AssistantBase, type AssistantGraph, type AssistantVersion, type AssistantsSearchResponse, type BagTemplate, BaseStream, type Checkpoint, Client, type ClientConfig, type Command, type Config, type Cron, type CronCreateForThreadResponse, type CronCreateResponse, type CustomStreamEvent, type DebugStreamEvent, type DefaultToolCall, type DefaultValues, type ErrorStreamEvent, type EventsStreamEvent, type FeedbackStreamEvent, type FunctionMessage, type GraphSchema, type HumanMessage, InferBag, InferNodeNames, InferNodeReturnTypes, InferStateType, InferSubagentStates, InferToolCalls, type Interrupt, type Item, type ListNamespaceResponse, type Message, type MessagesStreamEvent, type MessagesTupleStreamEvent, type Metadata, type MetadataStreamEvent, type OnConflictBehavior, type RemoveMessage, type RequestHook, ResolveStreamInterface, ResolveStreamOptions, type Run, type RunsInvokePayload, type SearchItem, type SearchItemsResponse, StreamError, type StreamEvent, type StreamMode, type SystemMessage, type Thread, type ThreadState, type ThreadStatus, type ThreadTask, type ToolCallFromTool, type ToolCallState, type ToolCallWithResult, type ToolCallsFromTools, type ToolMessage, type ToolProgress, type ToolsStreamEvent, type UpdatesStreamEvent, UseAgentStream, UseAgentStreamOptions, UseDeepAgentStream, UseDeepAgentStreamOptions, type ValuesStreamEvent, getApiKey, overrideFetchImplementation };
|
|
14
|
+
export { type AIMessage, type AnyHeadlessToolImplementation, type Assistant, type AssistantBase, type AssistantGraph, type AssistantVersion, type AssistantsSearchResponse, type BagTemplate, BaseStream, type Checkpoint, Client, type ClientConfig, type Command, type Config, type Cron, type CronCreateForThreadResponse, type CronCreateResponse, type CustomStreamEvent, type DebugStreamEvent, type DefaultToolCall, type DefaultValues, type ErrorStreamEvent, type EventsStreamEvent, type FeedbackStreamEvent, type FlushPendingHeadlessToolInterruptsOptions, type FunctionMessage, type GraphSchema, type HeadlessToolImplementation, type HeadlessToolInterrupt, type HumanMessage, InferBag, InferNodeNames, InferNodeReturnTypes, InferStateType, InferSubagentStates, InferToolCalls, type Interrupt, type Item, type ListNamespaceResponse, type Message, type MessagesStreamEvent, type MessagesTupleStreamEvent, type Metadata, type MetadataStreamEvent, type OnConflictBehavior, type OnToolCallback, type RemoveMessage, type RequestHook, ResolveStreamInterface, ResolveStreamOptions, type Run, type RunsInvokePayload, type SearchItem, type SearchItemsResponse, StreamError, type StreamEvent, type StreamMode, type SystemMessage, type Thread, type ThreadState, type ThreadStatus, type ThreadTask, type ToolCallFromTool, type ToolCallState, type ToolCallWithResult, type ToolCallsFromTools, type ToolEvent, type ToolMessage, type ToolProgress, type ToolsStreamEvent, type UpdatesStreamEvent, UseAgentStream, UseAgentStreamOptions, UseDeepAgentStream, UseDeepAgentStreamOptions, type ValuesStreamEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getApiKey, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, overrideFetchImplementation };
|
package/dist/index.d.ts
CHANGED
|
@@ -5,9 +5,10 @@ import { Command, OnConflictBehavior, RunsInvokePayload, StreamEvent } from "./t
|
|
|
5
5
|
import { Client, ClientConfig, RequestHook, getApiKey } from "./client.js";
|
|
6
6
|
import { overrideFetchImplementation } from "./singletons/fetch.js";
|
|
7
7
|
import { BagTemplate } from "./types.template.js";
|
|
8
|
+
import { AnyHeadlessToolImplementation, FlushPendingHeadlessToolInterruptsOptions, HeadlessToolImplementation, HeadlessToolInterrupt, OnToolCallback, ToolEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt } from "./headless-tools.js";
|
|
8
9
|
import { BaseStream } from "./ui/stream/base.js";
|
|
9
10
|
import { UseAgentStream, UseAgentStreamOptions } from "./ui/stream/agent.js";
|
|
10
11
|
import { UseDeepAgentStream, UseDeepAgentStreamOptions } from "./ui/stream/deep-agent.js";
|
|
11
12
|
import { InferBag, InferNodeNames, InferNodeReturnTypes, InferStateType, InferSubagentStates, InferToolCalls, ResolveStreamInterface, ResolveStreamOptions } from "./ui/stream/index.js";
|
|
12
13
|
import { StreamError } from "./ui/errors.js";
|
|
13
|
-
export { type AIMessage, type Assistant, type AssistantBase, type AssistantGraph, type AssistantVersion, type AssistantsSearchResponse, type BagTemplate, BaseStream, type Checkpoint, Client, type ClientConfig, type Command, type Config, type Cron, type CronCreateForThreadResponse, type CronCreateResponse, type CustomStreamEvent, type DebugStreamEvent, type DefaultToolCall, type DefaultValues, type ErrorStreamEvent, type EventsStreamEvent, type FeedbackStreamEvent, type FunctionMessage, type GraphSchema, type HumanMessage, InferBag, InferNodeNames, InferNodeReturnTypes, InferStateType, InferSubagentStates, InferToolCalls, type Interrupt, type Item, type ListNamespaceResponse, type Message, type MessagesStreamEvent, type MessagesTupleStreamEvent, type Metadata, type MetadataStreamEvent, type OnConflictBehavior, type RemoveMessage, type RequestHook, ResolveStreamInterface, ResolveStreamOptions, type Run, type RunsInvokePayload, type SearchItem, type SearchItemsResponse, StreamError, type StreamEvent, type StreamMode, type SystemMessage, type Thread, type ThreadState, type ThreadStatus, type ThreadTask, type ToolCallFromTool, type ToolCallState, type ToolCallWithResult, type ToolCallsFromTools, type ToolMessage, type ToolProgress, type ToolsStreamEvent, type UpdatesStreamEvent, UseAgentStream, UseAgentStreamOptions, UseDeepAgentStream, UseDeepAgentStreamOptions, type ValuesStreamEvent, getApiKey, overrideFetchImplementation };
|
|
14
|
+
export { type AIMessage, type AnyHeadlessToolImplementation, type Assistant, type AssistantBase, type AssistantGraph, type AssistantVersion, type AssistantsSearchResponse, type BagTemplate, BaseStream, type Checkpoint, Client, type ClientConfig, type Command, type Config, type Cron, type CronCreateForThreadResponse, type CronCreateResponse, type CustomStreamEvent, type DebugStreamEvent, type DefaultToolCall, type DefaultValues, type ErrorStreamEvent, type EventsStreamEvent, type FeedbackStreamEvent, type FlushPendingHeadlessToolInterruptsOptions, type FunctionMessage, type GraphSchema, type HeadlessToolImplementation, type HeadlessToolInterrupt, type HumanMessage, InferBag, InferNodeNames, InferNodeReturnTypes, InferStateType, InferSubagentStates, InferToolCalls, type Interrupt, type Item, type ListNamespaceResponse, type Message, type MessagesStreamEvent, type MessagesTupleStreamEvent, type Metadata, type MetadataStreamEvent, type OnConflictBehavior, type OnToolCallback, type RemoveMessage, type RequestHook, ResolveStreamInterface, ResolveStreamOptions, type Run, type RunsInvokePayload, type SearchItem, type SearchItemsResponse, StreamError, type StreamEvent, type StreamMode, type SystemMessage, type Thread, type ThreadState, type ThreadStatus, type ThreadTask, type ToolCallFromTool, type ToolCallState, type ToolCallWithResult, type ToolCallsFromTools, type ToolEvent, type ToolMessage, type ToolProgress, type ToolsStreamEvent, type UpdatesStreamEvent, UseAgentStream, UseAgentStreamOptions, UseDeepAgentStream, UseDeepAgentStreamOptions, type ValuesStreamEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getApiKey, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, overrideFetchImplementation };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { overrideFetchImplementation } from "./singletons/fetch.js";
|
|
2
2
|
import { Client, getApiKey } from "./client.js";
|
|
3
3
|
import { StreamError } from "./ui/errors.js";
|
|
4
|
-
|
|
4
|
+
import { executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt } from "./headless-tools.js";
|
|
5
|
+
export { Client, StreamError, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, getApiKey, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, overrideFetchImplementation };
|
package/dist/react/index.cjs
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_headless_tools = require("../headless-tools.cjs");
|
|
2
3
|
const require_subagents = require("../ui/subagents.cjs");
|
|
3
4
|
const require_stream_custom = require("./stream.custom.cjs");
|
|
4
5
|
const require_stream = require("./stream.cjs");
|
|
5
6
|
exports.FetchStreamTransport = require_stream_custom.FetchStreamTransport;
|
|
6
7
|
exports.SubagentManager = require_subagents.SubagentManager;
|
|
7
8
|
exports.calculateDepthFromNamespace = require_subagents.calculateDepthFromNamespace;
|
|
9
|
+
exports.executeHeadlessTool = require_headless_tools.executeHeadlessTool;
|
|
8
10
|
exports.extractParentIdFromNamespace = require_subagents.extractParentIdFromNamespace;
|
|
9
11
|
exports.extractToolCallIdFromNamespace = require_subagents.extractToolCallIdFromNamespace;
|
|
12
|
+
exports.filterOutHeadlessToolInterrupts = require_headless_tools.filterOutHeadlessToolInterrupts;
|
|
13
|
+
exports.findHeadlessTool = require_headless_tools.findHeadlessTool;
|
|
14
|
+
exports.flushPendingHeadlessToolInterrupts = require_headless_tools.flushPendingHeadlessToolInterrupts;
|
|
15
|
+
exports.handleHeadlessToolInterrupt = require_headless_tools.handleHeadlessToolInterrupt;
|
|
16
|
+
exports.headlessToolResumeCommand = require_headless_tools.headlessToolResumeCommand;
|
|
17
|
+
exports.isHeadlessToolInterrupt = require_headless_tools.isHeadlessToolInterrupt;
|
|
10
18
|
exports.isSubagentNamespace = require_subagents.isSubagentNamespace;
|
|
11
19
|
exports.useStream = require_stream.useStream;
|
package/dist/react/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DefaultToolCall, ToolCallFromTool, ToolCallState, ToolCallWithResult, ToolCallsFromTools } from "../types.messages.cjs";
|
|
2
|
+
import { AnyHeadlessToolImplementation, FlushPendingHeadlessToolInterruptsOptions, HeadlessToolImplementation, HeadlessToolInterrupt, OnToolCallback, ToolEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt } from "../headless-tools.cjs";
|
|
2
3
|
import { AgentTypeConfigLike, BaseSubagentState, CompiledSubAgentLike, DeepAgentTypeConfigLike, DefaultSubagentStates, ExtractAgentConfig, ExtractDeepAgentConfig, ExtractSubAgentMiddleware, GetToolCallsType, InferAgentToolCalls, InferDeepAgentSubagents, InferSubagentByName, InferSubagentNames, InferSubagentState, IsAgentLike, IsDeepAgentLike, MessageMetadata, SubAgentLike, SubagentStateMap, SubagentStatus, SubagentStream, SubagentStreamInterface, SubagentToolCall, UseStreamCustomOptions, UseStreamOptions, UseStreamThread, UseStreamTransport } from "../ui/types.cjs";
|
|
3
4
|
import { BaseStream } from "../ui/stream/base.cjs";
|
|
4
5
|
import { UseAgentStream, UseAgentStreamOptions } from "../ui/stream/agent.cjs";
|
|
@@ -8,4 +9,4 @@ import { UseStream, UseStreamCustom } from "./types.cjs";
|
|
|
8
9
|
import { useStream } from "./stream.cjs";
|
|
9
10
|
import { FetchStreamTransport } from "./stream.custom.cjs";
|
|
10
11
|
import { SubagentManager, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace } from "../ui/subagents.cjs";
|
|
11
|
-
export { type AgentTypeConfigLike, type BaseStream, type BaseSubagentState, type CompiledSubAgentLike, type DeepAgentTypeConfigLike, type DefaultSubagentStates, type DefaultToolCall, type ExtractAgentConfig, type ExtractDeepAgentConfig, type ExtractSubAgentMiddleware, FetchStreamTransport, type GetToolCallsType, type InferAgentToolCalls, type InferBag, type InferDeepAgentSubagents, type InferNodeNames, type InferStateType, type InferSubagentByName, type InferSubagentNames, type InferSubagentState, type InferSubagentStates, type InferToolCalls, type IsAgentLike, type IsDeepAgentLike, type MessageMetadata, type ResolveStreamInterface, type ResolveStreamOptions, type SubAgentLike, SubagentManager, type SubagentStateMap, type SubagentStatus, type SubagentStream, type SubagentStreamInterface, type SubagentToolCall, type ToolCallFromTool, type ToolCallState, type ToolCallWithResult, type ToolCallsFromTools, type UseAgentStream, type UseAgentStreamOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStream, type UseStreamCustom, type UseStreamCustomOptions, type UseStreamOptions, type UseStreamThread, type UseStreamTransport, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace, useStream };
|
|
12
|
+
export { type AgentTypeConfigLike, type AnyHeadlessToolImplementation, type BaseStream, type BaseSubagentState, type CompiledSubAgentLike, type DeepAgentTypeConfigLike, type DefaultSubagentStates, type DefaultToolCall, type ExtractAgentConfig, type ExtractDeepAgentConfig, type ExtractSubAgentMiddleware, FetchStreamTransport, type FlushPendingHeadlessToolInterruptsOptions, type GetToolCallsType, type HeadlessToolImplementation, type HeadlessToolInterrupt, type InferAgentToolCalls, type InferBag, type InferDeepAgentSubagents, type InferNodeNames, type InferStateType, type InferSubagentByName, type InferSubagentNames, type InferSubagentState, type InferSubagentStates, type InferToolCalls, type IsAgentLike, type IsDeepAgentLike, type MessageMetadata, type OnToolCallback, type ResolveStreamInterface, type ResolveStreamOptions, type SubAgentLike, SubagentManager, type SubagentStateMap, type SubagentStatus, type SubagentStream, type SubagentStreamInterface, type SubagentToolCall, type ToolCallFromTool, type ToolCallState, type ToolCallWithResult, type ToolCallsFromTools, type ToolEvent, type UseAgentStream, type UseAgentStreamOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStream, type UseStreamCustom, type UseStreamCustomOptions, type UseStreamOptions, type UseStreamThread, type UseStreamTransport, calculateDepthFromNamespace, executeHeadlessTool, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, isSubagentNamespace, useStream };
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DefaultToolCall, ToolCallFromTool, ToolCallState, ToolCallWithResult, ToolCallsFromTools } from "../types.messages.js";
|
|
2
|
+
import { AnyHeadlessToolImplementation, FlushPendingHeadlessToolInterruptsOptions, HeadlessToolImplementation, HeadlessToolInterrupt, OnToolCallback, ToolEvent, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt } from "../headless-tools.js";
|
|
2
3
|
import { AgentTypeConfigLike, BaseSubagentState, CompiledSubAgentLike, DeepAgentTypeConfigLike, DefaultSubagentStates, ExtractAgentConfig, ExtractDeepAgentConfig, ExtractSubAgentMiddleware, GetToolCallsType, InferAgentToolCalls, InferDeepAgentSubagents, InferSubagentByName, InferSubagentNames, InferSubagentState, IsAgentLike, IsDeepAgentLike, MessageMetadata, SubAgentLike, SubagentStateMap, SubagentStatus, SubagentStream, SubagentStreamInterface, SubagentToolCall, UseStreamCustomOptions, UseStreamOptions, UseStreamThread, UseStreamTransport } from "../ui/types.js";
|
|
3
4
|
import { BaseStream } from "../ui/stream/base.js";
|
|
4
5
|
import { UseAgentStream, UseAgentStreamOptions } from "../ui/stream/agent.js";
|
|
@@ -8,4 +9,4 @@ import { UseStream, UseStreamCustom } from "./types.js";
|
|
|
8
9
|
import { useStream } from "./stream.js";
|
|
9
10
|
import { FetchStreamTransport } from "./stream.custom.js";
|
|
10
11
|
import { SubagentManager, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace } from "../ui/subagents.js";
|
|
11
|
-
export { type AgentTypeConfigLike, type BaseStream, type BaseSubagentState, type CompiledSubAgentLike, type DeepAgentTypeConfigLike, type DefaultSubagentStates, type DefaultToolCall, type ExtractAgentConfig, type ExtractDeepAgentConfig, type ExtractSubAgentMiddleware, FetchStreamTransport, type GetToolCallsType, type InferAgentToolCalls, type InferBag, type InferDeepAgentSubagents, type InferNodeNames, type InferStateType, type InferSubagentByName, type InferSubagentNames, type InferSubagentState, type InferSubagentStates, type InferToolCalls, type IsAgentLike, type IsDeepAgentLike, type MessageMetadata, type ResolveStreamInterface, type ResolveStreamOptions, type SubAgentLike, SubagentManager, type SubagentStateMap, type SubagentStatus, type SubagentStream, type SubagentStreamInterface, type SubagentToolCall, type ToolCallFromTool, type ToolCallState, type ToolCallWithResult, type ToolCallsFromTools, type UseAgentStream, type UseAgentStreamOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStream, type UseStreamCustom, type UseStreamCustomOptions, type UseStreamOptions, type UseStreamThread, type UseStreamTransport, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace, useStream };
|
|
12
|
+
export { type AgentTypeConfigLike, type AnyHeadlessToolImplementation, type BaseStream, type BaseSubagentState, type CompiledSubAgentLike, type DeepAgentTypeConfigLike, type DefaultSubagentStates, type DefaultToolCall, type ExtractAgentConfig, type ExtractDeepAgentConfig, type ExtractSubAgentMiddleware, FetchStreamTransport, type FlushPendingHeadlessToolInterruptsOptions, type GetToolCallsType, type HeadlessToolImplementation, type HeadlessToolInterrupt, type InferAgentToolCalls, type InferBag, type InferDeepAgentSubagents, type InferNodeNames, type InferStateType, type InferSubagentByName, type InferSubagentNames, type InferSubagentState, type InferSubagentStates, type InferToolCalls, type IsAgentLike, type IsDeepAgentLike, type MessageMetadata, type OnToolCallback, type ResolveStreamInterface, type ResolveStreamOptions, type SubAgentLike, SubagentManager, type SubagentStateMap, type SubagentStatus, type SubagentStream, type SubagentStreamInterface, type SubagentToolCall, type ToolCallFromTool, type ToolCallState, type ToolCallWithResult, type ToolCallsFromTools, type ToolEvent, type UseAgentStream, type UseAgentStreamOptions, type UseDeepAgentStream, type UseDeepAgentStreamOptions, type UseStream, type UseStreamCustom, type UseStreamCustomOptions, type UseStreamOptions, type UseStreamThread, type UseStreamTransport, calculateDepthFromNamespace, executeHeadlessTool, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, isSubagentNamespace, useStream };
|
package/dist/react/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
+
import { executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt } from "../headless-tools.js";
|
|
1
2
|
import { SubagentManager, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace } from "../ui/subagents.js";
|
|
2
3
|
import { FetchStreamTransport } from "./stream.custom.js";
|
|
3
4
|
import { useStream } from "./stream.js";
|
|
4
|
-
export { FetchStreamTransport, SubagentManager, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace, useStream };
|
|
5
|
+
export { FetchStreamTransport, SubagentManager, calculateDepthFromNamespace, executeHeadlessTool, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, isSubagentNamespace, useStream };
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
require("../_virtual/_rolldown/runtime.cjs");
|
|
3
3
|
const require_sse = require("../utils/sse.cjs");
|
|
4
4
|
const require_stream = require("../utils/stream.cjs");
|
|
5
|
+
const require_headless_tools = require("../headless-tools.cjs");
|
|
5
6
|
const require_messages = require("../ui/messages.cjs");
|
|
6
7
|
const require_tools = require("../utils/tools.cjs");
|
|
7
8
|
const require_manager = require("../ui/manager.cjs");
|
|
@@ -125,6 +126,24 @@ function useStreamCustom(options) {
|
|
|
125
126
|
}
|
|
126
127
|
});
|
|
127
128
|
};
|
|
129
|
+
const handledToolsRef = (0, react.useRef)(/* @__PURE__ */ new Set());
|
|
130
|
+
(0, react.useEffect)(() => {
|
|
131
|
+
handledToolsRef.current.clear();
|
|
132
|
+
}, [threadId]);
|
|
133
|
+
(0, react.useEffect)(() => {
|
|
134
|
+
require_headless_tools.flushPendingHeadlessToolInterrupts(stream.values, options.tools, handledToolsRef.current, {
|
|
135
|
+
onTool: options.onTool,
|
|
136
|
+
defer: (run) => {
|
|
137
|
+
Promise.resolve().then(run);
|
|
138
|
+
},
|
|
139
|
+
resumeSubmit: (command) => submit(null, { command })
|
|
140
|
+
});
|
|
141
|
+
}, [
|
|
142
|
+
options.onTool,
|
|
143
|
+
options.tools,
|
|
144
|
+
stream.values,
|
|
145
|
+
submit
|
|
146
|
+
]);
|
|
128
147
|
return {
|
|
129
148
|
get values() {
|
|
130
149
|
return stream.values ?? {};
|
|
@@ -134,11 +153,7 @@ function useStreamCustom(options) {
|
|
|
134
153
|
stop,
|
|
135
154
|
submit,
|
|
136
155
|
get interrupts() {
|
|
137
|
-
if (stream.values != null && "__interrupt__" in stream.values && Array.isArray(stream.values.__interrupt__))
|
|
138
|
-
const valueInterrupts = stream.values.__interrupt__;
|
|
139
|
-
if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
|
|
140
|
-
return require_interrupts.normalizeInterruptsList(valueInterrupts);
|
|
141
|
-
}
|
|
156
|
+
if (stream.values != null && "__interrupt__" in stream.values && Array.isArray(stream.values.__interrupt__)) return require_interrupts.userFacingInterruptsFromValuesArray(stream.values.__interrupt__);
|
|
142
157
|
return [];
|
|
143
158
|
},
|
|
144
159
|
get interrupt() {
|