@providerprotocol/agents 0.0.3 → 0.0.5
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/LICENSE +21 -0
- package/dist/checkpoint/index.d.ts +2 -2
- package/dist/checkpoint/index.js +9 -0
- package/dist/checkpoint/index.js.map +1 -1
- package/dist/{chunk-4ESYN66B.js → chunk-CEHXAE4Z.js} +38 -3
- package/dist/chunk-CEHXAE4Z.js.map +1 -0
- package/dist/{chunk-PHI5ULBV.js → chunk-T47B3VAF.js} +6 -6
- package/dist/chunk-T47B3VAF.js.map +1 -0
- package/dist/execution/index.d.ts +67 -4
- package/dist/execution/index.js +71 -2
- package/dist/execution/index.js.map +1 -1
- package/dist/index.d.ts +125 -7
- package/dist/index.js +123 -22
- package/dist/index.js.map +1 -1
- package/dist/middleware/index.d.ts +4 -4
- package/dist/thread-tree/index.js +1 -1
- package/dist/tool-context-Cc_qNVud.d.ts +72 -0
- package/dist/{types-NGQMdnaD.d.ts → types-B9VuAOo6.d.ts} +1 -1
- package/dist/{types-DR02gtFv.d.ts → types-DC8XeoaI.d.ts} +40 -2
- package/dist/{types-BhX9uD_d.d.ts → types-DChRdQoX.d.ts} +7 -0
- package/package.json +3 -3
- package/dist/chunk-4ESYN66B.js.map +0 -1
- package/dist/chunk-PHI5ULBV.js.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025, 2026 ProviderProtocol
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as FileCheckpointOptions, C as CheckpointStore } from '../types-
|
|
2
|
-
export { b as CheckpointData, a as CheckpointMetadata } from '../types-
|
|
1
|
+
import { F as FileCheckpointOptions, C as CheckpointStore } from '../types-DChRdQoX.js';
|
|
2
|
+
export { b as CheckpointData, a as CheckpointMetadata } from '../types-DChRdQoX.js';
|
|
3
3
|
import '../types-2Vsthzyu.js';
|
|
4
4
|
import '@providerprotocol/ai';
|
|
5
5
|
|
package/dist/checkpoint/index.js
CHANGED
|
@@ -40,6 +40,15 @@ function fileCheckpoints(options = {}) {
|
|
|
40
40
|
return null;
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
|
+
async loadMetadata(sessionId) {
|
|
44
|
+
const { metadataPath } = getPaths(sessionId);
|
|
45
|
+
try {
|
|
46
|
+
const content = await readFile(metadataPath, "utf-8");
|
|
47
|
+
return JSON.parse(content);
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
43
52
|
async delete(sessionId) {
|
|
44
53
|
const sessionDir = join(dir, sessionId);
|
|
45
54
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/checkpoint/file.ts"],"names":[],"mappings":";;;;AAcA,IAAM,WAAA,GAAc,cAAA;AA6Bb,SAAS,eAAA,CAAgB,OAAA,GAAiC,EAAC,EAAoB;AACpF,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,WAAA;AAK3B,EAAA,eAAe,iBAAiB,SAAA,EAAoC;AAClE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AACtC,IAAA,MAAM,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,IAAA,OAAO,UAAA;AAAA,EACT;AAKA,EAAA,SAAS,SAAS,SAAA,EAAqE;AACrF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA,CAAK,UAAA,EAAY,iBAAiB,CAAA;AAAA,MAClD,YAAA,EAAc,IAAA,CAAK,UAAA,EAAY,eAAe;AAAA,KAChD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,SAAA,EAAmB,KAAA,EAAsC;AAClE,MAAA,MAAM,iBAAiB,SAAS,CAAA;AAChC,MAAA,MAAM,EAAE,cAAA,EAAgB,YAAA,EAAa,GAAI,SAAS,SAAS,CAAA;AAG3D,MAAA,MAAM,QAAA,GAA+B;AAAA,QACnC,SAAA;AAAA,QACA,cAAc,YAAA,EAAa;AAAA,QAC3B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,OAAA,IAAqB;AAAA,OAC/C;AAGA,MAAA,MAAM,SAAA,CAAU,gBAAgB,IAAA,CAAK,SAAA,CAAU,OAAO,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AACvE,MAAA,MAAM,SAAA,CAAU,cAAc,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAAA,IAC1E,CAAA;AAAA,IAEA,MAAM,KAAK,SAAA,EAAmD;AAC5D,MAAA,MAAM,EAAE,cAAA,EAAe,GAAI,QAAA,CAAS,SAAS,CAAA;AAE7C,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,cAAA,EAAgB,OAAO,CAAA;AACtD,QAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAO,SAAA,EAAkC;AAC7C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,GAAG,UAAA,EAAY,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,IAAA,GAA0B;AAC9B,MAAA,IAAI;AAEF,QAAA,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAEpC,QAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC1D,QAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,WAAA,EAAa,CAAA,CACrC,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAI,CAAA;AAAA,MAC9B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF;AAAA,GACF;AACF","file":"index.js","sourcesContent":["/**\n * File-based Checkpoint Store\n *\n * Reference implementation of CheckpointStore using the filesystem.\n *\n * @see UAP-1.0 Spec Section 12.4.3\n */\n\nimport { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { AgentStateJSON } from '../state/types.ts';\nimport type { CheckpointStore, FileCheckpointOptions, CheckpointMetadata } from './types.ts';\nimport { generateUUID } from '../utils/uuid.ts';\n\nconst DEFAULT_DIR = '.checkpoints';\n\n/**\n * Create a file-based checkpoint store.\n *\n * Stores checkpoints as JSON files in a directory structure:\n * ```\n * {dir}/\n * {sessionId}/\n * checkpoint.json # Latest state\n * metadata.json # Session metadata\n * ```\n *\n * @param options - Configuration options\n * @returns CheckpointStore implementation\n *\n * @example\n * ```typescript\n * import { fileCheckpoints } from '@providerprotocol/agents/checkpoint';\n *\n * const store = fileCheckpoints({ dir: './my-checkpoints' });\n *\n * // Save a checkpoint\n * await store.save('session-123', state.toJSON());\n *\n * // Load a checkpoint\n * const saved = await store.load('session-123');\n * ```\n */\nexport function fileCheckpoints(options: FileCheckpointOptions = {}): CheckpointStore {\n const dir = options.dir ?? DEFAULT_DIR;\n\n /**\n * Ensure session directory exists.\n */\n async function ensureSessionDir(sessionId: string): Promise<string> {\n const sessionDir = join(dir, sessionId);\n await mkdir(sessionDir, { recursive: true });\n return sessionDir;\n }\n\n /**\n * Get paths for checkpoint files.\n */\n function getPaths(sessionId: string): { checkpointPath: string; metadataPath: string } {\n const sessionDir = join(dir, sessionId);\n return {\n checkpointPath: join(sessionDir, 'checkpoint.json'),\n metadataPath: join(sessionDir, 'metadata.json'),\n };\n }\n\n return {\n async save(sessionId: string, state: AgentStateJSON): Promise<void> {\n await ensureSessionDir(sessionId);\n const { checkpointPath, metadataPath } = getPaths(sessionId);\n\n // Build metadata\n const metadata: CheckpointMetadata = {\n sessionId,\n checkpointId: generateUUID(),\n timestamp: new Date().toISOString(),\n step: state.step,\n agentId: state.metadata.agentId as string ?? 'unknown',\n };\n\n // Write checkpoint first, then metadata (sequential to avoid race conditions)\n await writeFile(checkpointPath, JSON.stringify(state, null, 2), 'utf-8');\n await writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');\n },\n\n async load(sessionId: string): Promise<AgentStateJSON | null> {\n const { checkpointPath } = getPaths(sessionId);\n\n try {\n const content = await readFile(checkpointPath, 'utf-8');\n return JSON.parse(content) as AgentStateJSON;\n } catch {\n // File doesn't exist or is invalid\n return null;\n }\n },\n\n async delete(sessionId: string): Promise<void> {\n const sessionDir = join(dir, sessionId);\n try {\n await rm(sessionDir, { recursive: true, force: true });\n } catch {\n // Directory might not exist, ignore\n }\n },\n\n async list(): Promise<string[]> {\n try {\n // Ensure base directory exists\n await mkdir(dir, { recursive: true });\n\n const entries = await readdir(dir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n } catch {\n return [];\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/checkpoint/file.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * File-based Checkpoint Store\n *\n * Reference implementation of CheckpointStore using the filesystem.\n *\n * @see UAP-1.0 Spec Section 12.4.3\n */\n\nimport { mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { AgentStateJSON } from '../state/types.ts';\nimport type { CheckpointStore, FileCheckpointOptions, CheckpointMetadata } from './types.ts';\nimport { generateUUID } from '../utils/uuid.ts';\n\nconst DEFAULT_DIR = '.checkpoints';\n\n/**\n * Create a file-based checkpoint store.\n *\n * Stores checkpoints as JSON files in a directory structure:\n * ```\n * {dir}/\n * {sessionId}/\n * checkpoint.json # Latest state\n * metadata.json # Session metadata\n * ```\n *\n * @param options - Configuration options\n * @returns CheckpointStore implementation\n *\n * @example\n * ```typescript\n * import { fileCheckpoints } from '@providerprotocol/agents/checkpoint';\n *\n * const store = fileCheckpoints({ dir: './my-checkpoints' });\n *\n * // Save a checkpoint\n * await store.save('session-123', state.toJSON());\n *\n * // Load a checkpoint\n * const saved = await store.load('session-123');\n * ```\n */\nexport function fileCheckpoints(options: FileCheckpointOptions = {}): CheckpointStore {\n const dir = options.dir ?? DEFAULT_DIR;\n\n /**\n * Ensure session directory exists.\n */\n async function ensureSessionDir(sessionId: string): Promise<string> {\n const sessionDir = join(dir, sessionId);\n await mkdir(sessionDir, { recursive: true });\n return sessionDir;\n }\n\n /**\n * Get paths for checkpoint files.\n */\n function getPaths(sessionId: string): { checkpointPath: string; metadataPath: string } {\n const sessionDir = join(dir, sessionId);\n return {\n checkpointPath: join(sessionDir, 'checkpoint.json'),\n metadataPath: join(sessionDir, 'metadata.json'),\n };\n }\n\n return {\n async save(sessionId: string, state: AgentStateJSON): Promise<void> {\n await ensureSessionDir(sessionId);\n const { checkpointPath, metadataPath } = getPaths(sessionId);\n\n // Build metadata\n const metadata: CheckpointMetadata = {\n sessionId,\n checkpointId: generateUUID(),\n timestamp: new Date().toISOString(),\n step: state.step,\n agentId: state.metadata.agentId as string ?? 'unknown',\n };\n\n // Write checkpoint first, then metadata (sequential to avoid race conditions)\n await writeFile(checkpointPath, JSON.stringify(state, null, 2), 'utf-8');\n await writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');\n },\n\n async load(sessionId: string): Promise<AgentStateJSON | null> {\n const { checkpointPath } = getPaths(sessionId);\n\n try {\n const content = await readFile(checkpointPath, 'utf-8');\n return JSON.parse(content) as AgentStateJSON;\n } catch {\n // File doesn't exist or is invalid\n return null;\n }\n },\n\n async loadMetadata(sessionId: string): Promise<CheckpointMetadata | null> {\n const { metadataPath } = getPaths(sessionId);\n\n try {\n const content = await readFile(metadataPath, 'utf-8');\n return JSON.parse(content) as CheckpointMetadata;\n } catch {\n // File doesn't exist or is invalid\n return null;\n }\n },\n\n async delete(sessionId: string): Promise<void> {\n const sessionDir = join(dir, sessionId);\n try {\n await rm(sessionDir, { recursive: true, force: true });\n } catch {\n // Directory might not exist, ignore\n }\n },\n\n async list(): Promise<string[]> {\n try {\n // Ensure base directory exists\n await mkdir(dir, { recursive: true });\n\n const entries = await readdir(dir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n } catch {\n return [];\n }\n },\n };\n}\n"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { generateUUID } from './chunk-EKRXMSDX.js';
|
|
2
|
+
|
|
1
3
|
// src/execution/loop.ts
|
|
2
4
|
var DEFAULT_LOOP_OPTIONS = {
|
|
3
5
|
maxIterations: Infinity
|
|
@@ -197,6 +199,39 @@ function loop(options = {}) {
|
|
|
197
199
|
};
|
|
198
200
|
}
|
|
199
201
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
202
|
+
// src/execution/tool-context.ts
|
|
203
|
+
function injectToolContext(tools, context, options = {}) {
|
|
204
|
+
return tools.map((tool) => wrapToolWithContext(tool, context, options));
|
|
205
|
+
}
|
|
206
|
+
function wrapToolWithContext(tool, context, options) {
|
|
207
|
+
const originalRun = tool.run;
|
|
208
|
+
return {
|
|
209
|
+
...tool,
|
|
210
|
+
run: async (params) => {
|
|
211
|
+
const toolContext = {
|
|
212
|
+
agentId: context.agent.id,
|
|
213
|
+
stateId: context.state.id,
|
|
214
|
+
toolCallId: generateUUID(),
|
|
215
|
+
// Generate unique ID for this call
|
|
216
|
+
onSubagentEvent: options.onSubagentEvent
|
|
217
|
+
};
|
|
218
|
+
if (originalRun.length > 1) {
|
|
219
|
+
return originalRun(params, toolContext);
|
|
220
|
+
}
|
|
221
|
+
return originalRun(params);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function isContextAwareTool(tool) {
|
|
226
|
+
return tool.run.length > 1;
|
|
227
|
+
}
|
|
228
|
+
function withToolContext(tool, handler) {
|
|
229
|
+
return {
|
|
230
|
+
...tool,
|
|
231
|
+
run: handler
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export { injectToolContext, isContextAwareTool, loop, withToolContext };
|
|
236
|
+
//# sourceMappingURL=chunk-CEHXAE4Z.js.map
|
|
237
|
+
//# sourceMappingURL=chunk-CEHXAE4Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/execution/loop.ts","../src/execution/tool-context.ts"],"names":[],"mappings":"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","file":"chunk-CEHXAE4Z.js","sourcesContent":["import type { Turn, StreamEvent } from '@providerprotocol/ai';\nimport type {\n ExecutionStrategy,\n ExecutionContext,\n ExecutionResult,\n LoopOptions,\n AgentStreamResult,\n AgentStreamEvent,\n} from './types.ts';\n\nconst DEFAULT_LOOP_OPTIONS: Required<LoopOptions> = {\n maxIterations: Infinity,\n};\n\n/**\n * Create a loop execution strategy.\n * The simplest strategy - equivalent to UPP's tool loop behavior.\n *\n * Behavior:\n * 1. Send input to LLM\n * 2. If response has tool calls, execute tools and loop\n * 3. Continue until no tool calls or maxIterations reached\n * 4. Return final response as UPP Turn\n *\n * @param options - Loop configuration options\n * @returns ExecutionStrategy\n */\nexport function loop(options: LoopOptions = {}): ExecutionStrategy {\n const opts = { ...DEFAULT_LOOP_OPTIONS, ...options };\n\n return {\n name: 'loop',\n\n async execute(context: ExecutionContext): Promise<ExecutionResult> {\n const { llm, input, state, strategy, signal } = context;\n\n // Add input message to state and set agentId in metadata\n // This ensures checkpoints include the full conversation\n let currentState = state\n .withMessage(input)\n .withMetadata('agentId', context.agent.id);\n let iteration = 0;\n let finalTurn: Turn | undefined;\n\n // Messages for LLM generation (includes input we just added)\n const inputMessages = [...currentState.messages];\n\n while (true) {\n iteration++;\n currentState = currentState.withStep(iteration);\n\n // Check abort signal\n if (signal?.aborted) {\n throw new Error('Execution aborted');\n }\n\n // Call strategy hooks\n strategy.onStepStart?.(iteration, currentState);\n\n // Generate response - llm.generate uses rest params, pass messages array\n const turn = await llm.generate(inputMessages);\n finalTurn = turn;\n\n // Update state with messages from this turn\n currentState = currentState.withMessages(turn.messages);\n\n // Call action hook if there were tool calls\n if (turn.response.hasToolCalls) {\n strategy.onAct?.(iteration, turn.response.toolCalls ?? []);\n }\n\n // Call observe hook if there were tool executions\n if (turn.toolExecutions && turn.toolExecutions.length > 0) {\n strategy.onObserve?.(iteration, turn.toolExecutions);\n }\n\n // Call step end hook\n strategy.onStepEnd?.(iteration, { turn, state: currentState });\n\n // Save checkpoint after step completes (fire-and-forget, log errors)\n if (context.checkpoints && context.sessionId) {\n context.checkpoints.save(context.sessionId, currentState.toJSON()).catch((err) => {\n console.error('[UAP] Checkpoint save failed:', err);\n });\n }\n\n // Check stop condition\n const shouldStop = await strategy.stopCondition?.(currentState);\n if (shouldStop) {\n break;\n }\n\n // Check if there are more tool calls to process\n // UPP's llm.generate handles the tool loop internally,\n // so we only need one iteration unless we're doing multi-step\n if (!turn.response.hasToolCalls) {\n break;\n }\n\n // Check iteration limit\n if (opts.maxIterations !== Infinity && iteration >= opts.maxIterations) {\n break;\n }\n\n // For next iteration, use the updated messages\n inputMessages.length = 0;\n inputMessages.push(...currentState.messages);\n }\n\n if (!finalTurn) {\n throw new Error('No turn generated');\n }\n\n // Include sessionId in state metadata if checkpointing is enabled\n // Per UAP spec Section 3.4: sessionId MUST be included in state.metadata\n let finalState = currentState;\n if (context.sessionId) {\n finalState = currentState.withMetadata('sessionId', context.sessionId);\n }\n\n const result: ExecutionResult = {\n turn: finalTurn,\n state: finalState,\n };\n\n strategy.onComplete?.(result);\n\n return result;\n },\n\n stream(context: ExecutionContext): AgentStreamResult {\n const { llm, input, state, strategy, signal } = context;\n const agentId = context.agent.id;\n\n let aborted = false;\n const abortController = new AbortController();\n\n // Combine signals if one was provided\n if (signal) {\n signal.addEventListener('abort', () => abortController.abort());\n }\n\n let resolveResult: (result: ExecutionResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<ExecutionResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<AgentStreamEvent> {\n // Add input message to state and set agentId in metadata\n // This ensures checkpoints include the full conversation\n let currentState = state\n .withMessage(input)\n .withMetadata('agentId', context.agent.id);\n let iteration = 0;\n let finalTurn: Turn | undefined;\n\n // Messages for LLM generation (includes input we just added)\n const inputMessages = [...currentState.messages];\n\n try {\n while (!aborted) {\n iteration++;\n currentState = currentState.withStep(iteration);\n\n if (abortController.signal.aborted) {\n throw new Error('Execution aborted');\n }\n\n strategy.onStepStart?.(iteration, currentState);\n\n // Emit step start event\n yield {\n source: 'uap',\n uap: {\n type: 'step_start',\n step: iteration,\n agentId,\n data: { iteration },\n },\n };\n\n // Stream the LLM response\n const streamResult = llm.stream(inputMessages);\n\n for await (const event of streamResult as AsyncIterable<StreamEvent>) {\n if (abortController.signal.aborted) {\n throw new Error('Execution aborted');\n }\n\n // Yield UPP events\n yield {\n source: 'upp',\n upp: event,\n };\n }\n\n // Get the final turn from the stream\n const turn = await streamResult.turn;\n finalTurn = turn;\n\n currentState = currentState.withMessages(turn.messages);\n\n if (turn.response.hasToolCalls) {\n strategy.onAct?.(iteration, turn.response.toolCalls ?? []);\n\n yield {\n source: 'uap',\n uap: {\n type: 'action',\n step: iteration,\n agentId,\n data: { toolCalls: turn.response.toolCalls },\n },\n };\n }\n\n if (turn.toolExecutions && turn.toolExecutions.length > 0) {\n strategy.onObserve?.(iteration, turn.toolExecutions);\n\n yield {\n source: 'uap',\n uap: {\n type: 'observation',\n step: iteration,\n agentId,\n data: { observations: turn.toolExecutions },\n },\n };\n }\n\n strategy.onStepEnd?.(iteration, { turn, state: currentState });\n\n // Save checkpoint after step completes (fire-and-forget, log errors)\n if (context.checkpoints && context.sessionId) {\n context.checkpoints.save(context.sessionId, currentState.toJSON()).catch((err) => {\n console.error('[UAP] Checkpoint save failed:', err);\n });\n }\n\n yield {\n source: 'uap',\n uap: {\n type: 'step_end',\n step: iteration,\n agentId,\n data: { iteration },\n },\n };\n\n const shouldStop = await strategy.stopCondition?.(currentState);\n if (shouldStop) {\n break;\n }\n\n if (!turn.response.hasToolCalls) {\n break;\n }\n\n if (opts.maxIterations !== Infinity && iteration >= opts.maxIterations) {\n break;\n }\n\n inputMessages.length = 0;\n inputMessages.push(...currentState.messages);\n }\n\n if (!finalTurn) {\n throw new Error('No turn generated');\n }\n\n // Include sessionId in state metadata if checkpointing is enabled\n // Per UAP spec Section 3.4: sessionId MUST be included in state.metadata\n let finalState = currentState;\n if (context.sessionId) {\n finalState = currentState.withMetadata('sessionId', context.sessionId);\n }\n\n const result: ExecutionResult = {\n turn: finalTurn,\n state: finalState,\n };\n\n strategy.onComplete?.(result);\n resolveResult(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n strategy.onError?.(err, currentState);\n rejectResult(err);\n throw err;\n }\n }\n\n const iterator = generateEvents();\n\n return {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n result: resultPromise,\n abort() {\n aborted = true;\n abortController.abort();\n },\n };\n },\n };\n}\n","import type { Tool } from '@providerprotocol/ai';\nimport type {\n ExecutionContext,\n ToolExecutionContext,\n OnSubagentEvent,\n ContextAwareToolRun,\n} from './types.ts';\nimport { generateUUID } from '../utils/uuid.ts';\n\n/**\n * Options for tool context injection.\n */\nexport interface InjectToolContextOptions {\n /** Callback for sub-agent events from tools */\n onSubagentEvent?: OnSubagentEvent;\n}\n\n/**\n * Wrap tools to inject execution context when they support it.\n *\n * Per UAP-1.0 Section 8.4, tools that accept a second parameter\n * should receive execution context including agentId, stateId,\n * and sub-agent event callbacks.\n *\n * This enables:\n * - Sub-agent model/config inheritance\n * - Execution hierarchy tracking\n * - Sub-agent event propagation\n *\n * @param tools - Original tool array\n * @param context - Execution context from the agent\n * @param options - Additional options like event callbacks\n * @returns Wrapped tools with context injection\n *\n * @example\n * ```typescript\n * // In execution strategy\n * const wrappedTools = injectToolContext(tools, context, {\n * onSubagentEvent: (event) => {\n * // Handle sub-agent events\n * yield { source: 'uap', uap: { type: event.type, ... } };\n * },\n * });\n *\n * // Pass wrapped tools to LLM\n * const llmWithContext = llm({ model, tools: wrappedTools });\n * ```\n */\nexport function injectToolContext(\n tools: Tool[],\n context: ExecutionContext,\n options: InjectToolContextOptions = {},\n): Tool[] {\n return tools.map((tool) => wrapToolWithContext(tool, context, options));\n}\n\n/**\n * Wrap a single tool with context injection.\n */\nfunction wrapToolWithContext(\n tool: Tool,\n context: ExecutionContext,\n options: InjectToolContextOptions,\n): Tool {\n const originalRun = tool.run;\n\n return {\n ...tool,\n run: async (params: Record<string, unknown>): Promise<unknown> => {\n // Build execution context for this tool call\n const toolContext: ToolExecutionContext = {\n agentId: context.agent.id,\n stateId: context.state.id,\n toolCallId: generateUUID(), // Generate unique ID for this call\n onSubagentEvent: options.onSubagentEvent,\n };\n\n // Check if tool accepts context (function has arity > 1)\n // We detect this by checking if the function expects more than 1 parameter\n if (originalRun.length > 1) {\n // Tool expects context as second argument\n return (originalRun as ContextAwareToolRun)(params, toolContext);\n }\n\n // Standard tool - just pass params\n return originalRun(params);\n },\n };\n}\n\n/**\n * Check if a tool is context-aware (accepts second parameter).\n *\n * @param tool - Tool to check\n * @returns true if tool.run accepts more than one parameter\n */\nexport function isContextAwareTool(tool: Tool): boolean {\n return tool.run.length > 1;\n}\n\n/**\n * Create a context-aware tool wrapper for existing tools.\n * This is useful when you want to add context support to a tool\n * that doesn't natively support it.\n *\n * @param tool - Original tool\n * @param handler - Function that receives params and context, returns result\n * @returns New tool with context support\n *\n * @example\n * ```typescript\n * const originalTool = { name: 'my_tool', run: async (p) => 'result', ... };\n *\n * const contextAware = withToolContext(originalTool, async (params, context) => {\n * console.log('Agent ID:', context?.agentId);\n * // Call original or do something with context\n * return originalTool.run(params);\n * });\n * ```\n */\nexport function withToolContext(\n tool: Tool,\n handler: ContextAwareToolRun,\n): Tool {\n return {\n ...tool,\n run: handler as Tool['run'],\n };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { generateUUID } from './chunk-EKRXMSDX.js';
|
|
2
|
-
import {
|
|
2
|
+
import { isUserMessage, isAssistantMessage, isToolResultMessage, ToolResultMessage, AssistantMessage, UserMessage } from '@providerprotocol/ai';
|
|
3
3
|
|
|
4
4
|
// src/state/types.ts
|
|
5
5
|
var UAP_VERSION = "1.0.0";
|
|
@@ -184,14 +184,14 @@ var AgentState = class _AgentState {
|
|
|
184
184
|
}
|
|
185
185
|
};
|
|
186
186
|
function serializeMessage(message) {
|
|
187
|
-
if (message
|
|
187
|
+
if (isUserMessage(message)) {
|
|
188
188
|
return {
|
|
189
189
|
role: "user",
|
|
190
190
|
content: message.content,
|
|
191
191
|
metadata: message.metadata
|
|
192
192
|
};
|
|
193
193
|
}
|
|
194
|
-
if (message
|
|
194
|
+
if (isAssistantMessage(message)) {
|
|
195
195
|
return {
|
|
196
196
|
role: "assistant",
|
|
197
197
|
content: {
|
|
@@ -201,7 +201,7 @@ function serializeMessage(message) {
|
|
|
201
201
|
metadata: message.metadata
|
|
202
202
|
};
|
|
203
203
|
}
|
|
204
|
-
if (message
|
|
204
|
+
if (isToolResultMessage(message)) {
|
|
205
205
|
return {
|
|
206
206
|
role: "tool_result",
|
|
207
207
|
content: message.results,
|
|
@@ -423,5 +423,5 @@ var ThreadTree = class _ThreadTree {
|
|
|
423
423
|
};
|
|
424
424
|
|
|
425
425
|
export { AgentState, ThreadNode, ThreadTree };
|
|
426
|
-
//# sourceMappingURL=chunk-
|
|
427
|
-
//# sourceMappingURL=chunk-
|
|
426
|
+
//# sourceMappingURL=chunk-T47B3VAF.js.map
|
|
427
|
+
//# sourceMappingURL=chunk-T47B3VAF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/state/types.ts","../src/state/index.ts","../src/thread-tree/index.ts"],"names":[],"mappings":";;;;AA4KO,IAAM,WAAA,GAAc,OAAA;;;AC/IpB,IAAM,UAAA,GAAN,MAAM,WAAA,CAA0C;AAAA,EAC5C,EAAA;AAAA,EAEA,QAAA;AAAA,EAEA,IAAA;AAAA,EAEA,QAAA;AAAA,EAEA,SAAA;AAAA,EAEA,IAAA;AAAA,EAEA,cAAA;AAAA,EAED,YACN,EAAA,EACA,QAAA,EACA,MACA,QAAA,EACA,SAAA,EACA,MACA,cAAA,EACA;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,GAAsB;AAC3B,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,EAAC;AAAA,MACD,CAAA;AAAA,MACA,EAAC;AAAA,MACD,EAAC;AAAA,MACD,MAAA;AAAA,MACA;AAAC,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAA,EAA8B;AACxC,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,CAAC,GAAG,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AAAA,MAC1B,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,EAAiC;AAC5C,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,CAAC,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,QAAQ,CAAA;AAAA,MAC9B,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,QAAA,EAAiC;AAC3C,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,CAAC,GAAG,QAAQ,CAAA;AAAA,MACZ,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAA0B;AACjC,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,IAAA,CAAK,QAAA;AAAA,MACL,IAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,KAAa,KAAA,EAA4B;AACpD,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,EAAE,GAAG,IAAA,CAAK,UAAU,CAAC,GAAG,GAAG,KAAA,EAAM;AAAA,MACjC,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAA,EAA+B;AAC3C,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,CAAC,GAAG,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAAA,MAC7B,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAA8B;AACrC,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,CAAC,GAAG,IAAI,CAAA;AAAA,MACR,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,KAAA,EAA2C;AAC3D,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,YAAA,EAAa;AAAA,MACb,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,CAAC,GAAG,IAAA,CAAK,cAAA,EAAgB,KAAK;AAAA,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAyB;AACvB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,WAAA;AAAA,MACT,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,QAAA,EAAU,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MAC1D,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAAA,MAC7B,SAAA,EAAW,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,MAC7B,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA,GAAI,MAAA;AAAA,MACrD,cAAA,EAAgB,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,IACzC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,GAAI,CAAA,GACzC;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,IAAA,EAAkC;AAChD,IAAA,IAAI,IAAA,CAAK,YAAY,WAAA,EAAa;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,KAAK,OAAO,CAAA,YAAA,EAAe,WAAW,CAAA,CAAE,CAAA;AAAA,IACtF;AAEA,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,IAAA,CAAK,EAAA;AAAA,MACL,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,MAClD,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA,GAAI,MAAA;AAAA,MAC/C,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA,GAAI;AAAC,KACtE;AAAA,EACF;AACF;AAKA,SAAS,iBAAiB,OAAA,EAA+B;AACvD,EAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,UAAU,OAAA,CAAQ;AAAA,KACpB;AAAA,EACF;AACA,EAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAW,OAAA,CAAQ;AAAA,OACrB;AAAA,MACA,UAAU,OAAA,CAAQ;AAAA,KACpB;AAAA,EACF;AACA,EAAA,IAAI,mBAAA,CAAoB,OAAO,CAAA,EAAG;AAChC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,UAAU,OAAA,CAAQ;AAAA,KACpB;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,OAAO,OAAO,CAAA,CAAE,CAAA;AAC3D;AAKA,SAAS,mBAAmB,IAAA,EAA4B;AACtD,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA;AACH,MAAA,OAAO,IAAI,WAAA;AAAA,QACT,IAAA,CAAK,OAAA;AAAA,QACL,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,OAC5B;AAAA,IACF,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,mBAAmB,IAAA,CAAK,OAAA;AAI9B,MAAA,OAAO,IAAI,gBAAA;AAAA,QACT,gBAAA,CAAiB,OAAA;AAAA,QACjB,gBAAA,CAAiB,SAAA;AAAA,QACjB,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,OAC5B;AAAA,IACF;AAAA,IACA,KAAK,aAAA;AACH,MAAA,OAAO,IAAI,iBAAA;AAAA,QACT,IAAA,CAAK,OAAA;AAAA,QACL,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,OAC5B;AAAA,IACF;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA;AAE1D;;;AClSO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA;AAAA,EAEb,EAAA;AAAA;AAAA,EAGA,QAAA;AAAA;AAAA,EAGT,KAAA;AAAA;AAAA,EAGA,IAAA;AAAA;AAAA,EAGS,QAAA;AAAA,EAET,YACE,EAAA,EACA,QAAA,EACA,OACA,IAAA,EACA,QAAA,GAAqB,EAAC,EACtB;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAyB;AACvB,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,MACzB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA,EAAU,CAAC,GAAG,IAAA,CAAK,QAAQ;AAAA,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,IAAA,EAAkC;AAChD,IAAA,OAAO,IAAI,WAAA;AAAA,MACT,IAAA,CAAK,EAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,MAC9B,IAAA,CAAK,IAAA;AAAA,MACL,CAAC,GAAG,IAAA,CAAK,QAAQ;AAAA,KACnB;AAAA,EACF;AACF;AAMO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA;AAAA,EAEb,IAAA;AAAA;AAAA,EAGD,WAAA;AAAA;AAAA,EAGC,KAAA;AAAA,EAET,YAAY,IAAA,EAAmB;AAC7B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,KAAA,uBAAY,GAAA,CAAI,CAAC,CAAC,IAAA,CAAK,EAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,IAAI,UAAA;AAAA,QACnB,YAAA,EAAa;AAAA,QACb,IAAA;AAAA,QACA,WAAW,OAAA,EAAQ;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,MAAA,IAAA,CAAK,WAAA,GAAc,QAAA;AACnB,MAAA,IAAA,CAAK,KAAA,uBAAY,GAAA,CAAI,CAAC,CAAC,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAC,CAAC,CAAA;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,CAAO,QAAgB,IAAA,EAAuB;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,UAAU,IAAI,UAAA;AAAA,MAClB,YAAA,EAAa;AAAA,MACb,MAAA;AAAA,MACA,MAAA,CAAO,KAAA;AAAA;AAAA,MACP;AAAA,KACF;AAGA,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAG/B,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAElC,IAAA,OAAO,OAAA,CAAQ,EAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAAA,EAAsB;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,GAAsB;AACpB,IAAA,OAAO,KAAK,WAAA,CAAY,KAAA,CACrB,aAAa,mBAAA,EAAqB,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAsB;AACpB,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,KAAK,KAAA,EAAO;AACnC,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,GAA+C;AAC7C,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAgC;AAErD,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,KAAK,KAAA,EAAO;AACnC,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAyB;AACvB,IAAA,MAAM,QAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAK,IAAA,CAAK,EAAA;AAAA,MAClB,SAAA,EAAW,KAAK,WAAA,CAAY,EAAA;AAAA,MAC5B;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,IAAA,EAAkC;AAEhD,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAwB;AAE7C,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,KAAA,EAAO;AACjC,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA;AACzC,MAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,IAC5B;AAGA,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAE3C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,CAAW,IAAI,CAAA;AAGhC,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,QAAA,EAAU;AACjC,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AAAA,IACzB;AAGA,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,EAAE,CAAA;AAExB,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"chunk-T47B3VAF.js","sourcesContent":["import type { Message, MessageMetadata, TokenUsage } from '@providerprotocol/ai';\n\n/**\n * Status of a plan step during execution.\n */\nexport type PlanStepStatus = 'pending' | 'in_progress' | 'completed' | 'failed';\n\n/**\n * A single tool execution trace from a sub-agent.\n * Per UAP spec Section 8.8.\n */\nexport interface ToolExecutionTrace {\n /** Name of the tool */\n toolName: string;\n /** Tool call ID */\n toolCallId?: string;\n /** Arguments passed to the tool */\n arguments: Record<string, unknown>;\n /** Tool result */\n result: string;\n /** Whether the tool errored */\n isError?: boolean;\n /** Execution time in milliseconds */\n duration?: number;\n}\n\n/**\n * Sub-agent execution trace for checkpoint persistence.\n * Per UAP spec Section 8.8.\n */\nexport interface SubagentExecutionTrace {\n /** Unique ID of the sub-agent instance */\n subagentId: string;\n /** Type/name of the sub-agent */\n subagentType: string;\n /** Tool call ID that spawned this sub-agent */\n parentToolCallId: string;\n /** The task given to the sub-agent */\n prompt: string;\n /** Start timestamp (ms since epoch) */\n startTime: number;\n /** End timestamp (ms since epoch) */\n endTime: number;\n /** Whether execution succeeded */\n success: boolean;\n /** Sub-agent's response (if successful) */\n result?: string;\n /** Error message (if failed) */\n error?: string;\n /** Tools used by sub-agent */\n toolExecutions?: ToolExecutionTrace[];\n /** Token usage for sub-agent */\n usage?: TokenUsage;\n}\n\n/**\n * Serialized form of SubagentExecutionTrace.\n */\nexport interface SubagentExecutionTraceJSON {\n subagentId: string;\n subagentType: string;\n parentToolCallId: string;\n prompt: string;\n startTime: number;\n endTime: number;\n success: boolean;\n result?: string;\n error?: string;\n toolExecutions?: ToolExecutionTrace[];\n usage?: TokenUsage;\n}\n\n/**\n * A single step in an execution plan.\n */\nexport interface PlanStep {\n /** Unique step identifier */\n id: string;\n /** Description of what this step does */\n description: string;\n /** Tool to use (if applicable) */\n tool?: string;\n /** IDs of steps this depends on */\n dependsOn: string[];\n /** Current status */\n status: PlanStepStatus;\n}\n\n/**\n * Serialized form of a PlanStep.\n */\nexport interface PlanStepJSON {\n id: string;\n description: string;\n tool?: string;\n dependsOn: string[];\n status: PlanStepStatus;\n}\n\n/**\n * Serialized form of AgentState for persistence.\n */\nexport interface AgentStateJSON {\n /** UAP version */\n version: string;\n /** State snapshot ID */\n id: string;\n /** Serialized messages */\n messages: MessageJSON[];\n /** Current step number */\n step: number;\n /** User-defined metadata */\n metadata: Record<string, unknown>;\n /** Reasoning traces (for ReAct) */\n reasoning: string[];\n /** Execution plan (for Plan strategy) */\n plan?: PlanStepJSON[];\n /** Sub-agent execution traces (per UAP spec Section 8.8) */\n subagentTraces?: SubagentExecutionTraceJSON[];\n}\n\n/**\n * Serialized form of a Message.\n * This preserves the UPP Message structure for serialization.\n */\nexport interface MessageJSON {\n role: 'user' | 'assistant' | 'tool_result';\n content: unknown;\n metadata?: MessageMetadata;\n}\n\n/**\n * Interface for AgentState operations.\n * All operations return new instances (immutable).\n */\nexport interface AgentStateInterface {\n /** State snapshot ID (UUIDv4) */\n readonly id: string;\n /** Conversation history (UPP Messages) */\n readonly messages: readonly Message[];\n /** Current step number */\n readonly step: number;\n /** User-defined metadata */\n readonly metadata: Readonly<Record<string, unknown>>;\n /** Reasoning traces (for ReAct) */\n readonly reasoning: readonly string[];\n /** Execution plan (for Plan strategy) */\n readonly plan: readonly PlanStep[] | undefined;\n /** Sub-agent execution traces (per UAP spec Section 8.8) */\n readonly subagentTraces: readonly SubagentExecutionTrace[];\n\n /** Return new state with message added */\n withMessage(message: Message): AgentStateInterface;\n /** Return new state with messages added */\n withMessages(messages: Message[]): AgentStateInterface;\n /** Return new state with context replaced (all messages) */\n withContext(messages: Message[]): AgentStateInterface;\n /** Return new state with updated step */\n withStep(step: number): AgentStateInterface;\n /** Return new state with metadata entry */\n withMetadata(key: string, value: unknown): AgentStateInterface;\n /** Return new state with reasoning added */\n withReasoning(reasoning: string): AgentStateInterface;\n /** Return new state with plan set */\n withPlan(plan: PlanStep[]): AgentStateInterface;\n /** Return new state with sub-agent trace added */\n withSubagentTrace(trace: SubagentExecutionTrace): AgentStateInterface;\n /** Serialize to JSON */\n toJSON(): AgentStateJSON;\n}\n\n/** UAP version for serialization */\nexport const UAP_VERSION = '1.0.0';\n","import type {\n Message,\n UserContent,\n AssistantContent,\n ToolCall,\n ToolResult,\n} from '@providerprotocol/ai';\nimport {\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '@providerprotocol/ai';\nimport { generateUUID } from '../utils/uuid.ts';\nimport type {\n AgentStateInterface,\n AgentStateJSON,\n PlanStep,\n MessageJSON,\n SubagentExecutionTrace,\n} from './types.ts';\nimport { UAP_VERSION } from './types.ts';\n\n/**\n * Immutable agent state snapshot.\n * All operations return new instances - the original state is never mutated.\n */\nexport class AgentState implements AgentStateInterface {\n readonly id: string;\n\n readonly messages: readonly Message[];\n\n readonly step: number;\n\n readonly metadata: Readonly<Record<string, unknown>>;\n\n readonly reasoning: readonly string[];\n\n readonly plan: readonly PlanStep[] | undefined;\n\n readonly subagentTraces: readonly SubagentExecutionTrace[];\n\n private constructor(\n id: string,\n messages: readonly Message[],\n step: number,\n metadata: Readonly<Record<string, unknown>>,\n reasoning: readonly string[],\n plan: readonly PlanStep[] | undefined,\n subagentTraces: readonly SubagentExecutionTrace[],\n ) {\n this.id = id;\n this.messages = messages;\n this.step = step;\n this.metadata = metadata;\n this.reasoning = reasoning;\n this.plan = plan;\n this.subagentTraces = subagentTraces;\n }\n\n /**\n * Create an initial empty state.\n */\n static initial(): AgentState {\n return new AgentState(\n generateUUID(),\n [],\n 0,\n {},\n [],\n undefined,\n [],\n );\n }\n\n /**\n * Return new state with a message added.\n */\n withMessage(message: Message): AgentState {\n return new AgentState(\n generateUUID(),\n [...this.messages, message],\n this.step,\n this.metadata,\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with messages added.\n */\n withMessages(messages: Message[]): AgentState {\n return new AgentState(\n generateUUID(),\n [...this.messages, ...messages],\n this.step,\n this.metadata,\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with context replaced (all messages).\n * Use for context window management (pruning, summarization).\n */\n withContext(messages: Message[]): AgentState {\n return new AgentState(\n generateUUID(),\n [...messages],\n this.step,\n this.metadata,\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with updated step number.\n */\n withStep(step: number): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n step,\n this.metadata,\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with metadata entry added/updated.\n */\n withMetadata(key: string, value: unknown): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n this.step,\n { ...this.metadata, [key]: value },\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with reasoning trace added.\n */\n withReasoning(reasoning: string): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n this.step,\n this.metadata,\n [...this.reasoning, reasoning],\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with plan set.\n */\n withPlan(plan: PlanStep[]): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n this.step,\n this.metadata,\n this.reasoning,\n [...plan],\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with sub-agent trace added.\n * Per UAP spec Section 8.8.\n */\n withSubagentTrace(trace: SubagentExecutionTrace): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n this.step,\n this.metadata,\n this.reasoning,\n this.plan,\n [...this.subagentTraces, trace],\n );\n }\n\n /**\n * Serialize state to JSON for persistence.\n */\n toJSON(): AgentStateJSON {\n return {\n version: UAP_VERSION,\n id: this.id,\n messages: this.messages.map((msg) => serializeMessage(msg)),\n step: this.step,\n metadata: { ...this.metadata },\n reasoning: [...this.reasoning],\n plan: this.plan ? this.plan.map((s) => ({ ...s })) : undefined,\n subagentTraces: this.subagentTraces.length > 0\n ? this.subagentTraces.map((t) => ({ ...t }))\n : undefined,\n };\n }\n\n /**\n * Deserialize state from JSON.\n */\n static fromJSON(json: AgentStateJSON): AgentState {\n if (json.version !== UAP_VERSION) {\n throw new Error(`Unsupported UAP version: ${json.version}. Expected: ${UAP_VERSION}`);\n }\n\n return new AgentState(\n json.id,\n json.messages.map((msg) => deserializeMessage(msg)),\n json.step,\n json.metadata,\n json.reasoning,\n json.plan ? json.plan.map((s) => ({ ...s })) : undefined,\n json.subagentTraces ? json.subagentTraces.map((t) => ({ ...t })) : [],\n );\n }\n}\n\n/**\n * Serialize a UPP Message to JSON.\n */\nfunction serializeMessage(message: Message): MessageJSON {\n if (isUserMessage(message)) {\n return {\n role: 'user',\n content: message.content,\n metadata: message.metadata,\n };\n }\n if (isAssistantMessage(message)) {\n return {\n role: 'assistant',\n content: {\n content: message.content,\n toolCalls: message.toolCalls,\n },\n metadata: message.metadata,\n };\n }\n if (isToolResultMessage(message)) {\n return {\n role: 'tool_result',\n content: message.results,\n metadata: message.metadata,\n };\n }\n throw new Error(`Unknown message type: ${typeof message}`);\n}\n\n/**\n * Deserialize a JSON message to UPP Message.\n */\nfunction deserializeMessage(json: MessageJSON): Message {\n switch (json.role) {\n case 'user':\n return new UserMessage(\n json.content as string | UserContent[],\n { metadata: json.metadata },\n );\n case 'assistant': {\n const assistantContent = json.content as {\n content: string | AssistantContent[];\n toolCalls?: ToolCall[];\n };\n return new AssistantMessage(\n assistantContent.content,\n assistantContent.toolCalls,\n { metadata: json.metadata },\n );\n }\n case 'tool_result':\n return new ToolResultMessage(\n json.content as ToolResult[],\n { metadata: json.metadata },\n );\n default:\n throw new Error(`Unknown message role: ${json.role}`);\n }\n}\n\nexport type {\n AgentStateInterface,\n AgentStateJSON,\n PlanStep,\n PlanStepStatus,\n SubagentExecutionTrace,\n SubagentExecutionTraceJSON,\n ToolExecutionTrace,\n} from './types.ts';\n","import { generateUUID } from '../utils/uuid.ts';\nimport { AgentState } from '../state/index.ts';\nimport type { ThreadNodeJSON, ThreadTreeJSON } from './types.ts';\n\n/**\n * A node in the thread tree representing a conversation state snapshot.\n */\nexport class ThreadNode {\n /** Node ID (UUIDv4) */\n readonly id: string;\n\n /** Parent node ID (null for root) */\n readonly parentId: string | null;\n\n /** State snapshot at this node */\n state: AgentState;\n\n /** Optional branch name */\n name?: string;\n\n /** Child node IDs */\n readonly children: string[];\n\n constructor(\n id: string,\n parentId: string | null,\n state: AgentState,\n name?: string,\n children: string[] = [],\n ) {\n this.id = id;\n this.parentId = parentId;\n this.state = state;\n this.name = name;\n this.children = children;\n }\n\n /**\n * Serialize to JSON.\n */\n toJSON(): ThreadNodeJSON {\n return {\n id: this.id,\n parentId: this.parentId,\n state: this.state.toJSON(),\n name: this.name,\n children: [...this.children],\n };\n }\n\n /**\n * Deserialize from JSON.\n */\n static fromJSON(json: ThreadNodeJSON): ThreadNode {\n return new ThreadNode(\n json.id,\n json.parentId,\n AgentState.fromJSON(json.state),\n json.name,\n [...json.children],\n );\n }\n}\n\n/**\n * A tree-structured collection of conversation threads with parent-child relationships.\n * Enables branching conversations and easy switching between alternative paths.\n */\nexport class ThreadTree {\n /** Root node */\n readonly root: ThreadNode;\n\n /** Currently active node */\n private currentNode: ThreadNode;\n\n /** All nodes by ID */\n readonly nodes: Map<string, ThreadNode>;\n\n constructor(root?: ThreadNode) {\n if (root) {\n this.root = root;\n this.currentNode = root;\n this.nodes = new Map([[root.id, root]]);\n } else {\n const rootNode = new ThreadNode(\n generateUUID(),\n null,\n AgentState.initial(),\n 'root',\n );\n this.root = rootNode;\n this.currentNode = rootNode;\n this.nodes = new Map([[rootNode.id, rootNode]]);\n }\n }\n\n /**\n * Get the currently active node.\n */\n get current(): ThreadNode {\n return this.currentNode;\n }\n\n /**\n * Create a branch from a node.\n *\n * @param fromId - ID of the node to branch from\n * @param name - Optional name for the branch\n * @returns ID of the new node\n */\n branch(fromId: string, name?: string): string {\n const parent = this.nodes.get(fromId);\n if (!parent) {\n throw new Error(`Node not found: ${fromId}`);\n }\n\n const newNode = new ThreadNode(\n generateUUID(),\n fromId,\n parent.state, // Copy parent's state\n name,\n );\n\n // Add to parent's children\n parent.children.push(newNode.id);\n\n // Add to nodes map\n this.nodes.set(newNode.id, newNode);\n\n return newNode.id;\n }\n\n /**\n * Switch to a different node.\n *\n * @param nodeId - ID of the node to switch to\n */\n checkout(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node not found: ${nodeId}`);\n }\n\n this.currentNode = node;\n }\n\n /**\n * Get the AgentState representing the full history from root to current node.\n * Since nodes store full state snapshots, this returns the current node's state.\n *\n * @returns AgentState with combined history\n */\n history(): AgentState {\n return this.currentNode.state\n .withMetadata('_threadTreeNodeId', this.currentNode.id);\n }\n\n /**\n * Get all leaf nodes (nodes with no children).\n *\n * @returns Array of leaf node IDs\n */\n getLeaves(): string[] {\n const leaves: string[] = [];\n\n for (const [id, node] of this.nodes) {\n if (node.children.length === 0) {\n leaves.push(id);\n }\n }\n\n return leaves;\n }\n\n /**\n * Get all branch names.\n *\n * @returns Map of node IDs to branch names\n */\n getBranches(): Map<string, string | undefined> {\n const branches = new Map<string, string | undefined>();\n\n for (const [id, node] of this.nodes) {\n if (node.name) {\n branches.set(id, node.name);\n }\n }\n\n return branches;\n }\n\n /**\n * Serialize to JSON.\n */\n toJSON(): ThreadTreeJSON {\n const nodes: ThreadNodeJSON[] = [];\n\n for (const node of this.nodes.values()) {\n nodes.push(node.toJSON());\n }\n\n return {\n rootId: this.root.id,\n currentId: this.currentNode.id,\n nodes,\n };\n }\n\n /**\n * Deserialize from JSON.\n */\n static fromJSON(json: ThreadTreeJSON): ThreadTree {\n // First, create all nodes\n const nodesMap = new Map<string, ThreadNode>();\n\n for (const nodeJson of json.nodes) {\n const node = ThreadNode.fromJSON(nodeJson);\n nodesMap.set(node.id, node);\n }\n\n // Find root and current nodes\n const root = nodesMap.get(json.rootId);\n const current = nodesMap.get(json.currentId);\n\n if (!root) {\n throw new Error(`Root node not found: ${json.rootId}`);\n }\n\n if (!current) {\n throw new Error(`Current node not found: ${json.currentId}`);\n }\n\n // Create tree with root\n const tree = new ThreadTree(root);\n\n // Replace the nodes map\n tree.nodes.clear();\n for (const [id, node] of nodesMap) {\n tree.nodes.set(id, node);\n }\n\n // Set current node\n tree.checkout(current.id);\n\n return tree;\n }\n}\n\nexport type { ThreadNodeJSON, ThreadTreeJSON } from './types.ts';\n"]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { L as LoopOptions, E as ExecutionStrategy, R as ReactOptions, P as PlanOptions } from '../types-
|
|
2
|
-
export { A as AgentStrategy, b as AgentStreamEvent, a as AgentStreamResult, h as ExecutionContext, i as ExecutionResult, G as GenerateResult, O as OnSubagentEvent,
|
|
1
|
+
import { L as LoopOptions, E as ExecutionStrategy, R as ReactOptions, P as PlanOptions } from '../types-DC8XeoaI.js';
|
|
2
|
+
export { A as AgentStrategy, b as AgentStreamEvent, a as AgentStreamResult, C as ContextAwareToolRun, h as ExecutionContext, i as ExecutionResult, G as GenerateResult, O as OnSubagentEvent, l as OrderedToolCall, f as SubagentEndEvent, g as SubagentEvent, c as SubagentEventBase, S as SubagentEventType, e as SubagentInnerEvent, d as SubagentStartEvent, j as ToolDependencyOptions, T as ToolExecutionContext, k as ToolWithDependencies, U as UAPEventType } from '../types-DC8XeoaI.js';
|
|
3
3
|
import { ToolCall, Tool } from '@providerprotocol/ai';
|
|
4
|
+
export { I as InjectToolContextOptions, i as injectToolContext, a as isContextAwareTool, w as withToolContext } from '../tool-context-Cc_qNVud.js';
|
|
4
5
|
import '../index-qsPwbY86.js';
|
|
5
6
|
import '../types-2Vsthzyu.js';
|
|
6
|
-
import '../types-
|
|
7
|
+
import '../types-DChRdQoX.js';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Create a loop execution strategy.
|
|
@@ -101,5 +102,67 @@ declare function hasToolDependencies(tools: Tool[]): boolean;
|
|
|
101
102
|
* @returns true if any call has the `after` field set
|
|
102
103
|
*/
|
|
103
104
|
declare function hasCallDependencies(toolCalls: ToolCall[]): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Result of executing a tool call.
|
|
107
|
+
*/
|
|
108
|
+
interface ToolExecutionResult {
|
|
109
|
+
/** The tool call that was executed */
|
|
110
|
+
call: ToolCall;
|
|
111
|
+
/** The result from the tool */
|
|
112
|
+
result: unknown;
|
|
113
|
+
/** Whether the tool threw an error */
|
|
114
|
+
isError: boolean;
|
|
115
|
+
/** Error message if isError is true */
|
|
116
|
+
error?: string;
|
|
117
|
+
/** Execution duration in milliseconds */
|
|
118
|
+
duration: number;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Function type for executing a single tool call.
|
|
122
|
+
*/
|
|
123
|
+
type ToolExecutor = (call: ToolCall, tool: Tool) => Promise<unknown>;
|
|
124
|
+
/**
|
|
125
|
+
* Execute tool calls respecting dependency ordering.
|
|
126
|
+
*
|
|
127
|
+
* This function takes tool calls, orders them using `orderToolCalls()`,
|
|
128
|
+
* and executes them respecting barriers (sequential tools) and
|
|
129
|
+
* dependencies (dependsOn, after).
|
|
130
|
+
*
|
|
131
|
+
* Per UAP-1.0 Sections 8.5 and 8.6:
|
|
132
|
+
* - Tools with `sequential: true` execute alone (barrier)
|
|
133
|
+
* - Tools with `dependsOn` wait for named tools to complete
|
|
134
|
+
* - Tool calls with `after` wait for specific call IDs to complete
|
|
135
|
+
*
|
|
136
|
+
* @param toolCalls - Tool calls from the model response
|
|
137
|
+
* @param tools - Tool definitions with potential dependencies
|
|
138
|
+
* @param executor - Function to execute a single tool call
|
|
139
|
+
* @returns Array of execution results in completion order
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* import { executeOrderedToolCalls } from '@providerprotocol/agents/execution';
|
|
144
|
+
*
|
|
145
|
+
* // Define tools with dependencies
|
|
146
|
+
* const readTool: ToolWithDependencies = {
|
|
147
|
+
* name: 'read_file',
|
|
148
|
+
* sequential: true, // Must complete before others
|
|
149
|
+
* run: async (params) => readFile(params.path),
|
|
150
|
+
* };
|
|
151
|
+
*
|
|
152
|
+
* const processTool: ToolWithDependencies = {
|
|
153
|
+
* name: 'process',
|
|
154
|
+
* dependsOn: ['read_file'], // Wait for read_file
|
|
155
|
+
* run: async (params) => process(params.data),
|
|
156
|
+
* };
|
|
157
|
+
*
|
|
158
|
+
* // Execute with ordering
|
|
159
|
+
* const results = await executeOrderedToolCalls(
|
|
160
|
+
* turn.response.toolCalls,
|
|
161
|
+
* [readTool, processTool],
|
|
162
|
+
* async (call, tool) => tool.run(call.arguments),
|
|
163
|
+
* );
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
declare function executeOrderedToolCalls(toolCalls: ToolCall[], tools: Tool[], executor: ToolExecutor): Promise<ToolExecutionResult[]>;
|
|
104
167
|
|
|
105
|
-
export { type ExecutionGroup, ExecutionStrategy, LoopOptions, PlanOptions, ReactOptions, hasCallDependencies, hasToolDependencies, loop, orderToolCalls, plan, react };
|
|
168
|
+
export { type ExecutionGroup, ExecutionStrategy, LoopOptions, PlanOptions, ReactOptions, type ToolExecutionResult, type ToolExecutor, executeOrderedToolCalls, hasCallDependencies, hasToolDependencies, loop, orderToolCalls, plan, react };
|
package/dist/execution/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { loop } from '../chunk-
|
|
1
|
+
export { injectToolContext, isContextAwareTool, loop, withToolContext } from '../chunk-CEHXAE4Z.js';
|
|
2
2
|
import { generateUUID } from '../chunk-EKRXMSDX.js';
|
|
3
3
|
import { UserMessage } from '@providerprotocol/ai';
|
|
4
4
|
|
|
@@ -673,7 +673,76 @@ function hasCallDependencies(toolCalls) {
|
|
|
673
673
|
}
|
|
674
674
|
return false;
|
|
675
675
|
}
|
|
676
|
+
async function executeOrderedToolCalls(toolCalls, tools, executor) {
|
|
677
|
+
if (toolCalls.length === 0) {
|
|
678
|
+
return [];
|
|
679
|
+
}
|
|
680
|
+
const toolMap = /* @__PURE__ */ new Map();
|
|
681
|
+
for (const tool of tools) {
|
|
682
|
+
toolMap.set(tool.name, tool);
|
|
683
|
+
}
|
|
684
|
+
const groups = orderToolCalls(toolCalls, tools);
|
|
685
|
+
const results = [];
|
|
686
|
+
for (const group of groups) {
|
|
687
|
+
if (group.isBarrier) {
|
|
688
|
+
for (const call of group.calls) {
|
|
689
|
+
const tool = toolMap.get(call.toolName);
|
|
690
|
+
if (!tool) {
|
|
691
|
+
results.push({
|
|
692
|
+
call,
|
|
693
|
+
result: null,
|
|
694
|
+
isError: true,
|
|
695
|
+
error: `Tool not found: ${call.toolName}`,
|
|
696
|
+
duration: 0
|
|
697
|
+
});
|
|
698
|
+
continue;
|
|
699
|
+
}
|
|
700
|
+
const result = await executeOne(call, tool, executor);
|
|
701
|
+
results.push(result);
|
|
702
|
+
}
|
|
703
|
+
} else {
|
|
704
|
+
const groupResults = await Promise.all(
|
|
705
|
+
group.calls.map(async (call) => {
|
|
706
|
+
const tool = toolMap.get(call.toolName);
|
|
707
|
+
if (!tool) {
|
|
708
|
+
return {
|
|
709
|
+
call,
|
|
710
|
+
result: null,
|
|
711
|
+
isError: true,
|
|
712
|
+
error: `Tool not found: ${call.toolName}`,
|
|
713
|
+
duration: 0
|
|
714
|
+
};
|
|
715
|
+
}
|
|
716
|
+
return executeOne(call, tool, executor);
|
|
717
|
+
})
|
|
718
|
+
);
|
|
719
|
+
results.push(...groupResults);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
return results;
|
|
723
|
+
}
|
|
724
|
+
async function executeOne(call, tool, executor) {
|
|
725
|
+
const startTime = Date.now();
|
|
726
|
+
try {
|
|
727
|
+
const result = await executor(call, tool);
|
|
728
|
+
return {
|
|
729
|
+
call,
|
|
730
|
+
result,
|
|
731
|
+
isError: false,
|
|
732
|
+
duration: Date.now() - startTime
|
|
733
|
+
};
|
|
734
|
+
} catch (error) {
|
|
735
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
736
|
+
return {
|
|
737
|
+
call,
|
|
738
|
+
result: null,
|
|
739
|
+
isError: true,
|
|
740
|
+
error: err.message,
|
|
741
|
+
duration: Date.now() - startTime
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
}
|
|
676
745
|
|
|
677
|
-
export { hasCallDependencies, hasToolDependencies, orderToolCalls, plan, react };
|
|
746
|
+
export { executeOrderedToolCalls, hasCallDependencies, hasToolDependencies, orderToolCalls, plan, react };
|
|
678
747
|
//# sourceMappingURL=index.js.map
|
|
679
748
|
//# sourceMappingURL=index.js.map
|