@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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n llm,\n UserMessage,\n} from '@providerprotocol/ai';\nimport type {\n LLMInstance,\n Message,\n Turn,\n} from '@providerprotocol/ai';\nimport { generateUUID } from '../utils/uuid.ts';\nimport { AgentState } from '../state/index.ts';\nimport { loop } from '../execution/loop.ts';\nimport type {\n ExecutionContext,\n GenerateResult,\n AgentStreamResult,\n AgentStrategy,\n} from '../execution/types.ts';\nimport type { Middleware, MiddlewareContext } from '../middleware/types.ts';\nimport type { Agent, AgentOptions } from './types.ts';\n\n/**\n * Create an agent instance.\n *\n * @param options - Agent configuration\n * @returns Agent instance\n *\n * @example\n * ```typescript\n * import { agent, AgentState } from '@providerprotocol/agents';\n * import { anthropic } from '@providerprotocol/ai/anthropic';\n *\n * const coder = agent({\n * model: anthropic('claude-sonnet-4-20250514'),\n * tools: [Bash, Read, Write],\n * system: 'You are a coding assistant.',\n * });\n *\n * const state = AgentState.initial();\n * const { turn, state: newState } = await coder.generate('Hello', state);\n * ```\n */\nexport function agent(options: AgentOptions): Agent {\n const {\n // UAP-specific options\n execution = loop(),\n middleware = [],\n strategy = {},\n checkpoints,\n sessionId: providedSessionId,\n _llmInstance,\n // LLM options (passthrough to UPP)\n model,\n params = {},\n config,\n tools = [],\n system,\n structure,\n toolStrategy,\n } = options;\n\n const agentId = generateUUID();\n // Generate sessionId (UUIDv4) if checkpoints provided but no sessionId\n // Per UAP spec Section 3.4: Session IDs MUST be UUIDv4\n const sessionId = checkpoints ? (providedSessionId ?? generateUUID()) : providedSessionId;\n\n // Create the LLM instance with full UPP passthrough (or use injected instance for testing)\n const llmInstance: LLMInstance = _llmInstance ?? llm({\n model,\n params,\n config,\n system,\n structure,\n tools,\n toolStrategy,\n });\n\n /**\n * Normalize input to a Message.\n */\n function normalizeInput(input: string | Message): Message {\n if (typeof input === 'string') {\n return new UserMessage(input);\n }\n return input;\n }\n\n /**\n * Run middleware before hooks.\n */\n async function runBeforeMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n ): Promise<MiddlewareContext> {\n let currentContext = context;\n\n for (const mw of middlewares) {\n if (mw.before) {\n const result = await mw.before(currentContext);\n if (result) {\n currentContext = result;\n }\n }\n }\n\n return currentContext;\n }\n\n /**\n * Run middleware after hooks (in reverse order).\n */\n async function runAfterMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n result: GenerateResult,\n ): Promise<GenerateResult> {\n let currentResult = result;\n\n // Run in reverse order\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const mw = middlewares[i];\n if (mw?.after) {\n currentResult = await mw.after(context, currentResult);\n }\n }\n\n return currentResult;\n }\n\n /**\n * Run middleware error hooks (in reverse order).\n */\n async function runErrorMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n error: Error,\n ): Promise<GenerateResult | undefined> {\n // Run in reverse order\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const mw = middlewares[i];\n if (mw?.onError) {\n const result = await mw.onError(context, error);\n if (result) {\n return result;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Build execution context.\n */\n function buildExecutionContext(\n input: Message,\n state: AgentState,\n resolvedStrategy: AgentStrategy,\n signal?: AbortSignal,\n ): ExecutionContext {\n return {\n agent: { id: agentId, system },\n llm: llmInstance,\n input,\n state,\n tools,\n strategy: resolvedStrategy,\n signal,\n checkpoints,\n sessionId,\n };\n }\n\n const agentInstance: Agent = {\n id: agentId,\n model,\n tools,\n system,\n\n async generate(\n input: string | Message,\n state: AgentState,\n ): Promise<GenerateResult> {\n const normalizedInput = normalizeInput(input);\n\n // Create middleware context\n const middlewareContext: MiddlewareContext = {\n agent: { id: agentId, system },\n input: normalizedInput,\n state,\n metadata: new Map(),\n };\n\n try {\n // Run before middleware\n const processedContext = await runBeforeMiddleware(middleware, middlewareContext);\n\n // Build execution context\n const executionContext = buildExecutionContext(\n processedContext.input,\n processedContext.state,\n strategy,\n );\n\n // Execute strategy\n const result = await execution.execute(executionContext);\n\n // Run after middleware\n const finalResult = await runAfterMiddleware(\n middleware,\n processedContext,\n result,\n );\n\n return finalResult;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Try to recover with error middleware\n const recovered = await runErrorMiddleware(middleware, middlewareContext, err);\n if (recovered) {\n return recovered;\n }\n\n throw err;\n }\n },\n\n stream(\n input: string | Message,\n state: AgentState,\n ): AgentStreamResult {\n const normalizedInput = normalizeInput(input);\n\n // Create middleware context\n const middlewareContext: MiddlewareContext = {\n agent: { id: agentId, system },\n input: normalizedInput,\n state,\n metadata: new Map(),\n };\n\n // We need to run before middleware synchronously enough to get the context\n // but streaming is inherently async. We'll handle this by wrapping the stream.\n let aborted = false;\n const abortController = new AbortController();\n\n let resolveResult: (result: GenerateResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<GenerateResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const createStream = async function* () {\n try {\n // Run before middleware\n const processedContext = await runBeforeMiddleware(middleware, middlewareContext);\n\n // Build execution context\n const executionContext = buildExecutionContext(\n processedContext.input,\n processedContext.state,\n strategy,\n abortController.signal,\n );\n\n // Get the stream from the execution strategy\n const streamResult = execution.stream(executionContext);\n\n // Yield events from the stream\n for await (const event of streamResult) {\n if (aborted) {\n break;\n }\n yield event;\n }\n\n // Get the final result\n const result = await streamResult.result;\n\n // Run after middleware\n const finalResult = await runAfterMiddleware(\n middleware,\n processedContext,\n result,\n );\n\n resolveResult(finalResult);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Try to recover with error middleware\n const recovered = await runErrorMiddleware(middleware, middlewareContext, err);\n if (recovered) {\n resolveResult(recovered);\n return;\n }\n\n rejectResult(err);\n throw err;\n }\n };\n\n const iterator = createStream();\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 async ask(\n input: string | Message,\n state: AgentState,\n ): Promise<GenerateResult> {\n const normalizedInput = normalizeInput(input);\n\n // Generate with original state - execution strategy adds input to LLM call\n const result = await agentInstance.generate(normalizedInput, state);\n\n // Build final state with correct message order:\n // original messages + input + response messages from this turn\n const responseMessages = result.state.messages.slice(state.messages.length);\n const finalState = state\n .withMessage(normalizedInput)\n .withMessages(responseMessages)\n .withStep(result.state.step);\n\n // Preserve metadata from execution\n let stateWithMetadata = finalState;\n for (const [key, value] of Object.entries(result.state.metadata)) {\n stateWithMetadata = stateWithMetadata.withMetadata(key, value);\n }\n\n // Preserve reasoning traces\n for (const reasoning of result.state.reasoning) {\n stateWithMetadata = stateWithMetadata.withReasoning(reasoning);\n }\n\n // Preserve plan if present\n if (result.state.plan) {\n stateWithMetadata = stateWithMetadata.withPlan([...result.state.plan]);\n }\n\n return {\n turn: result.turn,\n state: stateWithMetadata,\n };\n },\n\n async query(input: string | Message): Promise<Turn> {\n const initialState = AgentState.initial();\n const result = await agentInstance.generate(input, initialState);\n return result.turn;\n },\n };\n\n return agentInstance;\n}\n\nexport type { Agent, AgentOptions } from './types.ts';\nexport type {\n GenerateResult,\n AgentStreamResult,\n AgentStreamEvent,\n UAPEventType,\n AgentStrategy,\n // Sub-agent event types (Section 8.7)\n SubagentEventType,\n SubagentEventBase,\n SubagentStartEvent,\n SubagentInnerEvent,\n SubagentEndEvent,\n SubagentEvent,\n OnSubagentEvent,\n} from '../execution/types.ts';\n"]}
1
+ {"version":3,"sources":["../src/agent/index.ts","../src/subagent/index.ts"],"names":["agent"],"mappings":";;;;;;;AA0CO,SAAS,MAAM,OAAA,EAA8B;AAClD,EAAA,MAAM;AAAA;AAAA,IAEJ,YAAY,IAAA,EAAK;AAAA,IACjB,aAAa,EAAC;AAAA,IACd,WAAW,EAAC;AAAA,IACZ,WAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,YAAA;AAAA;AAAA,IAEA,KAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,MAAA;AAAA,IACA,QAAQ,EAAC;AAAA,IACT,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAU,YAAA,EAAa;AAG7B,EAAA,MAAM,SAAA,GAAY,WAAA,GAAe,iBAAA,IAAqB,YAAA,EAAa,GAAK,iBAAA;AAGxE,EAAA,MAAM,WAAA,GAA2B,gBAAgB,GAAA,CAAI;AAAA,IACnD,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AAKD,EAAA,SAAS,eAAe,KAAA,EAAkC;AACxD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAKA,EAAA,eAAe,mBAAA,CACb,aACA,OAAA,EAC4B;AAC5B,IAAA,IAAI,cAAA,GAAiB,OAAA;AAErB,IAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,MAAA,IAAI,GAAG,MAAA,EAAQ;AACb,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,CAAO,cAAc,CAAA;AAC7C,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,cAAA,GAAiB,MAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,cAAA;AAAA,EACT;AAKA,EAAA,eAAe,kBAAA,CACb,WAAA,EACA,OAAA,EACA,MAAA,EACyB;AACzB,IAAA,IAAI,aAAA,GAAgB,MAAA;AAGpB,IAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,MAAA,IAAI,IAAI,KAAA,EAAO;AACb,QAAA,aAAA,GAAgB,MAAM,EAAA,CAAG,KAAA,CAAM,OAAA,EAAS,aAAa,CAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,EACT;AAKA,EAAA,eAAe,kBAAA,CACb,WAAA,EACA,OAAA,EACA,KAAA,EACqC;AAErC,IAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,SAAS,KAAK,CAAA;AAC9C,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAKA,EAAA,SAAS,qBAAA,CACP,KAAA,EACA,KAAA,EACA,gBAAA,EACA,MAAA,EACkB;AAClB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,EAAE,EAAA,EAAI,OAAA,EAAS,MAAA,EAAO;AAAA,MAC7B,GAAA,EAAK,WAAA;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA,EAAU,gBAAA;AAAA,MACV,MAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAuB;AAAA,IAC3B,EAAA,EAAI,OAAA;AAAA,IACJ,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IAEA,MAAM,QAAA,CACJ,KAAA,EACA,KAAA,EACyB;AACzB,MAAA,MAAM,eAAA,GAAkB,eAAe,KAAK,CAAA;AAG5C,MAAA,MAAM,iBAAA,GAAuC;AAAA,QAC3C,KAAA,EAAO,EAAE,EAAA,EAAI,OAAA,EAAS,MAAA,EAAO;AAAA,QAC7B,KAAA,EAAO,eAAA;AAAA,QACP,KAAA;AAAA,QACA,QAAA,sBAAc,GAAA;AAAI,OACpB;AAEA,MAAA,IAAI;AAEF,QAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,UAAA,EAAY,iBAAiB,CAAA;AAGhF,QAAA,MAAM,gBAAA,GAAmB,qBAAA;AAAA,UACvB,gBAAA,CAAiB,KAAA;AAAA,UACjB,gBAAA,CAAiB,KAAA;AAAA,UACjB;AAAA,SACF;AAGA,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,OAAA,CAAQ,gBAAgB,CAAA;AAGvD,QAAA,MAAM,cAAc,MAAM,kBAAA;AAAA,UACxB,UAAA;AAAA,UACA,gBAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,WAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGpE,QAAA,MAAM,SAAA,GAAY,MAAM,kBAAA,CAAmB,UAAA,EAAY,mBAAmB,GAAG,CAAA;AAC7E,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,OAAO,SAAA;AAAA,QACT;AAEA,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IAEA,MAAA,CACE,OACA,KAAA,EACmB;AACnB,MAAA,MAAM,eAAA,GAAkB,eAAe,KAAK,CAAA;AAG5C,MAAA,MAAM,iBAAA,GAAuC;AAAA,QAC3C,KAAA,EAAO,EAAE,EAAA,EAAI,OAAA,EAAS,MAAA,EAAO;AAAA,QAC7B,KAAA,EAAO,eAAA;AAAA,QACP,KAAA;AAAA,QACA,QAAA,sBAAc,GAAA;AAAI,OACpB;AAIA,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAE5C,MAAA,IAAI,aAAA;AACJ,MAAA,IAAI,YAAA;AAEJ,MAAA,MAAM,aAAA,GAAgB,IAAI,OAAA,CAAwB,CAAC,SAAS,MAAA,KAAW;AACrE,QAAA,aAAA,GAAgB,OAAA;AAChB,QAAA,YAAA,GAAe,MAAA;AAAA,MACjB,CAAC,CAAA;AAED,MAAA,MAAM,eAAe,mBAAmB;AACtC,QAAA,IAAI;AAEF,UAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,UAAA,EAAY,iBAAiB,CAAA;AAGhF,UAAA,MAAM,gBAAA,GAAmB,qBAAA;AAAA,YACvB,gBAAA,CAAiB,KAAA;AAAA,YACjB,gBAAA,CAAiB,KAAA;AAAA,YACjB,QAAA;AAAA,YACA,eAAA,CAAgB;AAAA,WAClB;AAGA,UAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,CAAO,gBAAgB,CAAA;AAGtD,UAAA,WAAA,MAAiB,SAAS,YAAA,EAAc;AACtC,YAAA,IAAI,OAAA,EAAS;AACX,cAAA;AAAA,YACF;AACA,YAAA,MAAM,KAAA;AAAA,UACR;AAGA,UAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,MAAA;AAGlC,UAAA,MAAM,cAAc,MAAM,kBAAA;AAAA,YACxB,UAAA;AAAA,YACA,gBAAA;AAAA,YACA;AAAA,WACF;AAEA,UAAA,aAAA,CAAc,WAAW,CAAA;AAAA,QAC3B,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGpE,UAAA,MAAM,SAAA,GAAY,MAAM,kBAAA,CAAmB,UAAA,EAAY,mBAAmB,GAAG,CAAA;AAC7E,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,aAAA,CAAc,SAAS,CAAA;AACvB,YAAA;AAAA,UACF;AAEA,UAAA,YAAA,CAAa,GAAG,CAAA;AAChB,UAAA,MAAM,GAAA;AAAA,QACR;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,WAAW,YAAA,EAAa;AAE9B,MAAA,OAAO;AAAA,QACL,CAAC,MAAA,CAAO,aAAa,CAAA,GAAI;AACvB,UAAA,OAAO,QAAA;AAAA,QACT,CAAA;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,KAAA,GAAQ;AACN,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,QACxB;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,GAAA,CACJ,KAAA,EACA,KAAA,EACyB;AAQzB,MAAA,OAAO,aAAA,CAAc,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,MAAM,MAAM,KAAA,EAAwC;AAClD,MAAA,MAAM,YAAA,GAAe,WAAW,OAAA,EAAQ;AACxC,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,QAAA,CAAS,OAAO,YAAY,CAAA;AAC/D,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AAAA,GACF;AAEA,EAAA,OAAO,aAAA;AACT;;;AC3NO,SAAS,mBAAmB,OAAA,EAA0C;AAC3E,EAAA,MAAM;AAAA,IACJ,KAAA,EAAAA,MAAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA,GAAe,IAAA;AAAA,IACf,QAAQ,YAAA,GAAe;AAAA,GACzB,GAAI,OAAA;AAEJ,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAA,EAAK,OACH,MAAA,EACA,OAAA,KACoB;AACpB,MAAA,MAAM,aAAa,YAAA,EAAa;AAChC,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,YAAA,EAAa;AACvD,MAAA,MAAM,OAAO,OAAA,EAAS,eAAA;AACtB,MAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,MAAA,MAAM,UAAA,GAAiC;AAAA,QACrC,IAAA,EAAM,gBAAA;AAAA,QACN,UAAA;AAAA,QACA,YAAA;AAAA,QACA,gBAAA,EAAkB,UAAA;AAAA,QAClB,MAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACb;AACA,MAAA,IAAA,GAAO,UAAU,CAAA;AAEjB,MAAA,IAAI;AACF,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,OAAO,MAAM,oBAAA;AAAA,YACXA,MAAAA;AAAA,YACA,MAAA;AAAA,YACA,UAAA;AAAA,YACA,YAAA;AAAA,YACA,UAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAO,MAAM,uBAAA;AAAA,UACXA,MAAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACA,YAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGpE,QAAA,MAAM,QAAA,GAA6B;AAAA,UACjC,IAAA,EAAM,cAAA;AAAA,UACN,UAAA;AAAA,UACA,YAAA;AAAA,UACA,gBAAA,EAAkB,UAAA;AAAA,UAClB,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,GAAA,CAAI,OAAA;AAAA,UACX,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AACA,QAAA,IAAA,GAAO,QAAQ,CAAA;AAEf,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF;AAAA,GACF;AACF;AAKA,eAAe,qBACbA,MAAAA,EACA,MAAA,EACA,UAAA,EACA,YAAA,EACA,YACA,IAAA,EACiB;AACjB,EAAA,MAAM,SAASA,MAAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,UAAA,CAAW,SAAS,CAAA;AAGxD,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,IAAA,GAAO;AAAA,MACL,IAAA,EAAM,gBAAA;AAAA,MACN,UAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA,EAAkB,UAAA;AAAA,MAClB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA;AAG5B,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,IAAA,EAAM,cAAA;AAAA,IACN,UAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA,EAAkB,UAAA;AAAA,IAClB,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAA;AAAA,IAC7B,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,gBAAgB,MAAA,CAAO,IAAA,CAAK,cAAA,EAAgB,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MACvD,UAAU,EAAA,CAAG,QAAA;AAAA,MACb,WAAW,EAAA,CAAG,SAAA;AAAA,MACd,MAAA,EAAQ,MAAA,CAAO,EAAA,CAAG,MAAM;AAAA,KAC1B,CAAE,CAAA;AAAA,IACF,KAAA,EAAO,OAAO,IAAA,CAAK;AAAA,GACrB;AACA,EAAA,IAAA,GAAO,QAAQ,CAAA;AAEf,EAAA,OAAO,MAAA,CAAO,KAAK,QAAA,CAAS,IAAA;AAC9B;AAKA,eAAe,wBACbA,MAAAA,EACA,MAAA,EACA,UAAA,EACA,YAAA,EACA,YACA,IAAA,EACiB;AACjB,EAAA,MAAM,SAAS,MAAMA,MAAAA,CAAM,SAAS,MAAA,EAAQ,UAAA,CAAW,SAAS,CAAA;AAGhE,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,IAAA,EAAM,cAAA;AAAA,IACN,UAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA,EAAkB,UAAA;AAAA,IAClB,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAA;AAAA,IAC7B,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,gBAAgB,MAAA,CAAO,IAAA,CAAK,cAAA,EAAgB,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MACvD,UAAU,EAAA,CAAG,QAAA;AAAA,MACb,WAAW,EAAA,CAAG,SAAA;AAAA,MACd,MAAA,EAAQ,MAAA,CAAO,EAAA,CAAG,MAAM;AAAA,KAC1B,CAAE,CAAA;AAAA,IACF,KAAA,EAAO,OAAO,IAAA,CAAK;AAAA,GACrB;AACA,EAAA,IAAA,GAAO,QAAQ,CAAA;AAEf,EAAA,OAAO,MAAA,CAAO,KAAK,QAAA,CAAS,IAAA;AAC9B","file":"index.js","sourcesContent":["import {\n llm,\n UserMessage,\n} from '@providerprotocol/ai';\nimport type {\n LLMInstance,\n Message,\n Turn,\n} from '@providerprotocol/ai';\nimport { generateUUID } from '../utils/uuid.ts';\nimport { AgentState } from '../state/index.ts';\nimport { loop } from '../execution/loop.ts';\nimport type {\n ExecutionContext,\n GenerateResult,\n AgentStreamResult,\n AgentStrategy,\n} from '../execution/types.ts';\nimport type { Middleware, MiddlewareContext } from '../middleware/types.ts';\nimport type { Agent, AgentOptions } from './types.ts';\n\n/**\n * Create an agent instance.\n *\n * @param options - Agent configuration\n * @returns Agent instance\n *\n * @example\n * ```typescript\n * import { agent, AgentState } from '@providerprotocol/agents';\n * import { anthropic } from '@providerprotocol/ai/anthropic';\n *\n * const coder = agent({\n * model: anthropic('claude-sonnet-4-20250514'),\n * tools: [Bash, Read, Write],\n * system: 'You are a coding assistant.',\n * });\n *\n * const state = AgentState.initial();\n * const { turn, state: newState } = await coder.generate('Hello', state);\n * ```\n */\nexport function agent(options: AgentOptions): Agent {\n const {\n // UAP-specific options\n execution = loop(),\n middleware = [],\n strategy = {},\n checkpoints,\n sessionId: providedSessionId,\n _llmInstance,\n // LLM options (passthrough to UPP)\n model,\n params = {},\n config,\n tools = [],\n system,\n structure,\n toolStrategy,\n } = options;\n\n const agentId = generateUUID();\n // Generate sessionId (UUIDv4) if checkpoints provided but no sessionId\n // Per UAP spec Section 3.4: Session IDs MUST be UUIDv4\n const sessionId = checkpoints ? (providedSessionId ?? generateUUID()) : providedSessionId;\n\n // Create the LLM instance with full UPP passthrough (or use injected instance for testing)\n const llmInstance: LLMInstance = _llmInstance ?? llm({\n model,\n params,\n config,\n system,\n structure,\n tools,\n toolStrategy,\n });\n\n /**\n * Normalize input to a Message.\n */\n function normalizeInput(input: string | Message): Message {\n if (typeof input === 'string') {\n return new UserMessage(input);\n }\n return input;\n }\n\n /**\n * Run middleware before hooks.\n */\n async function runBeforeMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n ): Promise<MiddlewareContext> {\n let currentContext = context;\n\n for (const mw of middlewares) {\n if (mw.before) {\n const result = await mw.before(currentContext);\n if (result) {\n currentContext = result;\n }\n }\n }\n\n return currentContext;\n }\n\n /**\n * Run middleware after hooks (in reverse order).\n */\n async function runAfterMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n result: GenerateResult,\n ): Promise<GenerateResult> {\n let currentResult = result;\n\n // Run in reverse order\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const mw = middlewares[i];\n if (mw?.after) {\n currentResult = await mw.after(context, currentResult);\n }\n }\n\n return currentResult;\n }\n\n /**\n * Run middleware error hooks (in reverse order).\n */\n async function runErrorMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n error: Error,\n ): Promise<GenerateResult | undefined> {\n // Run in reverse order\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const mw = middlewares[i];\n if (mw?.onError) {\n const result = await mw.onError(context, error);\n if (result) {\n return result;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Build execution context.\n */\n function buildExecutionContext(\n input: Message,\n state: AgentState,\n resolvedStrategy: AgentStrategy,\n signal?: AbortSignal,\n ): ExecutionContext {\n return {\n agent: { id: agentId, system },\n llm: llmInstance,\n input,\n state,\n tools,\n strategy: resolvedStrategy,\n signal,\n checkpoints,\n sessionId,\n };\n }\n\n const agentInstance: Agent = {\n id: agentId,\n model,\n tools,\n system,\n\n async generate(\n input: string | Message,\n state: AgentState,\n ): Promise<GenerateResult> {\n const normalizedInput = normalizeInput(input);\n\n // Create middleware context\n const middlewareContext: MiddlewareContext = {\n agent: { id: agentId, system },\n input: normalizedInput,\n state,\n metadata: new Map(),\n };\n\n try {\n // Run before middleware\n const processedContext = await runBeforeMiddleware(middleware, middlewareContext);\n\n // Build execution context\n const executionContext = buildExecutionContext(\n processedContext.input,\n processedContext.state,\n strategy,\n );\n\n // Execute strategy\n const result = await execution.execute(executionContext);\n\n // Run after middleware\n const finalResult = await runAfterMiddleware(\n middleware,\n processedContext,\n result,\n );\n\n return finalResult;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Try to recover with error middleware\n const recovered = await runErrorMiddleware(middleware, middlewareContext, err);\n if (recovered) {\n return recovered;\n }\n\n throw err;\n }\n },\n\n stream(\n input: string | Message,\n state: AgentState,\n ): AgentStreamResult {\n const normalizedInput = normalizeInput(input);\n\n // Create middleware context\n const middlewareContext: MiddlewareContext = {\n agent: { id: agentId, system },\n input: normalizedInput,\n state,\n metadata: new Map(),\n };\n\n // We need to run before middleware synchronously enough to get the context\n // but streaming is inherently async. We'll handle this by wrapping the stream.\n let aborted = false;\n const abortController = new AbortController();\n\n let resolveResult: (result: GenerateResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<GenerateResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const createStream = async function* () {\n try {\n // Run before middleware\n const processedContext = await runBeforeMiddleware(middleware, middlewareContext);\n\n // Build execution context\n const executionContext = buildExecutionContext(\n processedContext.input,\n processedContext.state,\n strategy,\n abortController.signal,\n );\n\n // Get the stream from the execution strategy\n const streamResult = execution.stream(executionContext);\n\n // Yield events from the stream\n for await (const event of streamResult) {\n if (aborted) {\n break;\n }\n yield event;\n }\n\n // Get the final result\n const result = await streamResult.result;\n\n // Run after middleware\n const finalResult = await runAfterMiddleware(\n middleware,\n processedContext,\n result,\n );\n\n resolveResult(finalResult);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Try to recover with error middleware\n const recovered = await runErrorMiddleware(middleware, middlewareContext, err);\n if (recovered) {\n resolveResult(recovered);\n return;\n }\n\n rejectResult(err);\n throw err;\n }\n };\n\n const iterator = createStream();\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 async ask(\n input: string | Message,\n state: AgentState,\n ): Promise<GenerateResult> {\n // Per UAP-1.0 Section 4.6: ask() is a convenience method for multi-turn execution.\n // The execution strategy handles adding input to state and appending response.\n // We delegate directly to generate() to:\n // 1. Preserve middleware before() modifications (e.g., context pruning via withContext)\n // 2. Preserve middleware after() modifications\n // 3. Avoid message duplication (strategy already adds input)\n // 4. Return the correctly built state from the execution pipeline\n return agentInstance.generate(input, state);\n },\n\n async query(input: string | Message): Promise<Turn> {\n const initialState = AgentState.initial();\n const result = await agentInstance.generate(input, initialState);\n return result.turn;\n },\n };\n\n return agentInstance;\n}\n\nexport type { Agent, AgentOptions } from './types.ts';\nexport type {\n GenerateResult,\n AgentStreamResult,\n AgentStreamEvent,\n UAPEventType,\n AgentStrategy,\n // Sub-agent event types (Section 8.7)\n SubagentEventType,\n SubagentEventBase,\n SubagentStartEvent,\n SubagentInnerEvent,\n SubagentEndEvent,\n SubagentEvent,\n OnSubagentEvent,\n} from '../execution/types.ts';\n","/**\n * Sub-agent tool creation utilities.\n *\n * Per UAP-1.0 Section 8.7, implementations SHOULD provide helper utilities\n * for creating sub-agent tools with event propagation.\n *\n * @example\n * ```typescript\n * import { agent } from '@providerprotocol/agents';\n * import { createSubAgentTool } from '@providerprotocol/agents/subagent';\n *\n * // Create a sub-agent\n * const explorer = agent({\n * model: anthropic('claude-haiku-4-20250514'),\n * tools: [Glob, Grep, Read],\n * system: 'You explore codebases.',\n * });\n *\n * // Wrap as a tool with event propagation\n * const explorerTool = createSubAgentTool({\n * agent: explorer,\n * name: 'explore_codebase',\n * description: 'Explore and find relevant code',\n * parameters: {\n * type: 'object',\n * properties: {\n * query: { type: 'string', description: 'What to find' },\n * },\n * required: ['query'],\n * },\n * buildPrompt: (params) => `Find: ${params.query}`,\n * subagentType: 'explorer',\n * });\n *\n * // Use in parent agent\n * const coder = agent({\n * model: anthropic('claude-sonnet-4-20250514'),\n * tools: [Bash, Write, explorerTool],\n * });\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { Tool, JSONSchema } from '@providerprotocol/ai';\nimport type { Agent } from '../agent/types.ts';\nimport type {\n ToolExecutionContext,\n SubagentEvent,\n SubagentStartEvent,\n SubagentEndEvent,\n} from '../execution/types.ts';\nimport { AgentState } from '../state/index.ts';\nimport { generateUUID } from '../utils/uuid.ts';\n\n/**\n * Options for creating a sub-agent tool.\n */\nexport interface CreateSubAgentToolOptions {\n /** The sub-agent to expose as a tool */\n agent: Agent;\n /** Tool name (must be unique within parent agent's tools) */\n name: string;\n /** Tool description for the model */\n description: string;\n /** JSON Schema for tool parameters */\n parameters: JSONSchema;\n /** Convert tool parameters to a prompt for the sub-agent */\n buildPrompt: (params: Record<string, unknown>) => string;\n /**\n * Identifier for the sub-agent type (used in events).\n * Defaults to the tool name.\n */\n subagentType?: string;\n /**\n * Whether to stream the sub-agent execution.\n * When true, inner events are forwarded to parent.\n * Default: true\n */\n stream?: boolean;\n}\n\n/**\n * Create a UPP Tool from a UAP Agent with full event propagation.\n *\n * Per UAP-1.0 Section 8.7, this helper:\n * 1. Emits `subagent_start` before execution begins\n * 2. Forwards inner events during streaming execution\n * 3. Emits `subagent_end` after completion (success or failure)\n * 4. Provides execution context to sub-agent for tracing\n *\n * The created tool accepts an optional `ToolExecutionContext` as a second\n * parameter, which is injected by `injectToolContext()` during execution.\n *\n * @param options - Configuration for the sub-agent tool\n * @returns A Tool that executes the sub-agent and propagates events\n *\n * @example\n * ```typescript\n * const summarizer = agent({\n * model: anthropic('claude-haiku-4-20250514'),\n * system: 'You summarize text concisely.',\n * });\n *\n * const summarizerTool = createSubAgentTool({\n * agent: summarizer,\n * name: 'summarize',\n * description: 'Summarize the given text',\n * parameters: {\n * type: 'object',\n * properties: {\n * text: { type: 'string', description: 'Text to summarize' },\n * maxLength: { type: 'number', description: 'Max summary length' },\n * },\n * required: ['text'],\n * },\n * buildPrompt: (params) =>\n * `Summarize this in ${params.maxLength ?? 100} words:\\n\\n${params.text}`,\n * subagentType: 'summarizer',\n * });\n * ```\n */\nexport function createSubAgentTool(options: CreateSubAgentToolOptions): Tool {\n const {\n agent,\n name,\n description,\n parameters,\n buildPrompt,\n subagentType = name,\n stream: shouldStream = true,\n } = options;\n\n return {\n name,\n description,\n parameters,\n run: async (\n params: Record<string, unknown>,\n context?: ToolExecutionContext,\n ): Promise<string> => {\n const subagentId = generateUUID();\n const toolCallId = context?.toolCallId ?? generateUUID();\n const emit = context?.onSubagentEvent;\n const prompt = buildPrompt(params);\n const startTime = Date.now();\n\n // Emit start event\n const startEvent: SubagentStartEvent = {\n type: 'subagent_start',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n prompt,\n timestamp: startTime,\n };\n emit?.(startEvent);\n\n try {\n if (shouldStream) {\n return await executeWithStreaming(\n agent,\n prompt,\n subagentId,\n subagentType,\n toolCallId,\n emit,\n );\n }\n return await executeWithoutStreaming(\n agent,\n prompt,\n subagentId,\n subagentType,\n toolCallId,\n emit,\n );\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Emit end event with error\n const endEvent: SubagentEndEvent = {\n type: 'subagent_end',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n success: false,\n error: err.message,\n timestamp: Date.now(),\n };\n emit?.(endEvent);\n\n throw err;\n }\n },\n };\n}\n\n/**\n * Execute sub-agent with streaming and forward events.\n */\nasync function executeWithStreaming(\n agent: Agent,\n prompt: string,\n subagentId: string,\n subagentType: string,\n toolCallId: string,\n emit?: (event: SubagentEvent) => void,\n): Promise<string> {\n const stream = agent.stream(prompt, AgentState.initial());\n\n // Forward inner events\n for await (const event of stream) {\n emit?.({\n type: 'subagent_event',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n innerEvent: event,\n });\n }\n\n const result = await stream.result;\n\n // Emit end event\n const endEvent: SubagentEndEvent = {\n type: 'subagent_end',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n success: true,\n result: result.turn.response.text,\n timestamp: Date.now(),\n toolExecutions: result.turn.toolExecutions?.map((te) => ({\n toolName: te.toolName,\n arguments: te.arguments as Record<string, unknown>,\n result: String(te.result),\n })),\n usage: result.turn.usage,\n };\n emit?.(endEvent);\n\n return result.turn.response.text;\n}\n\n/**\n * Execute sub-agent without streaming (simpler, but no inner events).\n */\nasync function executeWithoutStreaming(\n agent: Agent,\n prompt: string,\n subagentId: string,\n subagentType: string,\n toolCallId: string,\n emit?: (event: SubagentEvent) => void,\n): Promise<string> {\n const result = await agent.generate(prompt, AgentState.initial());\n\n // Emit end event\n const endEvent: SubagentEndEvent = {\n type: 'subagent_end',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n success: true,\n result: result.turn.response.text,\n timestamp: Date.now(),\n toolExecutions: result.turn.toolExecutions?.map((te) => ({\n toolName: te.toolName,\n arguments: te.arguments as Record<string, unknown>,\n result: String(te.result),\n })),\n usage: result.turn.usage,\n };\n emit?.(endEvent);\n\n return result.turn.response.text;\n}\n\n/**\n * Type for the run function of a sub-agent tool.\n * Accepts params and optional execution context.\n */\nexport type SubAgentToolRun = (\n params: Record<string, unknown>,\n context?: ToolExecutionContext,\n) => Promise<string>;\n"]}
@@ -1,10 +1,10 @@
1
- import { L as LoggingOptions, M as Middleware } from '../types-NGQMdnaD.js';
2
- export { a as MiddlewareContext } from '../types-NGQMdnaD.js';
1
+ import { L as LoggingOptions, M as Middleware } from '../types-B9VuAOo6.js';
2
+ export { a as MiddlewareContext } from '../types-B9VuAOo6.js';
3
3
  import '@providerprotocol/ai';
4
4
  import '../index-qsPwbY86.js';
5
5
  import '../types-2Vsthzyu.js';
6
- import '../types-DR02gtFv.js';
7
- import '../types-BhX9uD_d.js';
6
+ import '../types-DC8XeoaI.js';
7
+ import '../types-DChRdQoX.js';
8
8
 
9
9
  /**
10
10
  * Create a logging middleware.
@@ -1,4 +1,4 @@
1
- export { ThreadNode, ThreadTree } from '../chunk-PHI5ULBV.js';
1
+ export { ThreadNode, ThreadTree } from '../chunk-T47B3VAF.js';
2
2
  import '../chunk-EKRXMSDX.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,72 @@
1
+ import { Tool } from '@providerprotocol/ai';
2
+ import { h as ExecutionContext, O as OnSubagentEvent, C as ContextAwareToolRun } from './types-DC8XeoaI.js';
3
+
4
+ /**
5
+ * Options for tool context injection.
6
+ */
7
+ interface InjectToolContextOptions {
8
+ /** Callback for sub-agent events from tools */
9
+ onSubagentEvent?: OnSubagentEvent;
10
+ }
11
+ /**
12
+ * Wrap tools to inject execution context when they support it.
13
+ *
14
+ * Per UAP-1.0 Section 8.4, tools that accept a second parameter
15
+ * should receive execution context including agentId, stateId,
16
+ * and sub-agent event callbacks.
17
+ *
18
+ * This enables:
19
+ * - Sub-agent model/config inheritance
20
+ * - Execution hierarchy tracking
21
+ * - Sub-agent event propagation
22
+ *
23
+ * @param tools - Original tool array
24
+ * @param context - Execution context from the agent
25
+ * @param options - Additional options like event callbacks
26
+ * @returns Wrapped tools with context injection
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // In execution strategy
31
+ * const wrappedTools = injectToolContext(tools, context, {
32
+ * onSubagentEvent: (event) => {
33
+ * // Handle sub-agent events
34
+ * yield { source: 'uap', uap: { type: event.type, ... } };
35
+ * },
36
+ * });
37
+ *
38
+ * // Pass wrapped tools to LLM
39
+ * const llmWithContext = llm({ model, tools: wrappedTools });
40
+ * ```
41
+ */
42
+ declare function injectToolContext(tools: Tool[], context: ExecutionContext, options?: InjectToolContextOptions): Tool[];
43
+ /**
44
+ * Check if a tool is context-aware (accepts second parameter).
45
+ *
46
+ * @param tool - Tool to check
47
+ * @returns true if tool.run accepts more than one parameter
48
+ */
49
+ declare function isContextAwareTool(tool: Tool): boolean;
50
+ /**
51
+ * Create a context-aware tool wrapper for existing tools.
52
+ * This is useful when you want to add context support to a tool
53
+ * that doesn't natively support it.
54
+ *
55
+ * @param tool - Original tool
56
+ * @param handler - Function that receives params and context, returns result
57
+ * @returns New tool with context support
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * const originalTool = { name: 'my_tool', run: async (p) => 'result', ... };
62
+ *
63
+ * const contextAware = withToolContext(originalTool, async (params, context) => {
64
+ * console.log('Agent ID:', context?.agentId);
65
+ * // Call original or do something with context
66
+ * return originalTool.run(params);
67
+ * });
68
+ * ```
69
+ */
70
+ declare function withToolContext(tool: Tool, handler: ContextAwareToolRun): Tool;
71
+
72
+ export { type InjectToolContextOptions as I, isContextAwareTool as a, injectToolContext as i, withToolContext as w };
@@ -1,6 +1,6 @@
1
1
  import { Message } from '@providerprotocol/ai';
2
2
  import { A as AgentState } from './index-qsPwbY86.js';
3
- import { G as GenerateResult } from './types-DR02gtFv.js';
3
+ import { G as GenerateResult } from './types-DC8XeoaI.js';
4
4
 
5
5
  /**
6
6
  * Forward declaration of Agent for use in MiddlewareContext.
@@ -1,6 +1,6 @@
1
1
  import { LLMInstance, Message, Tool, ToolCall, ToolExecution, Turn, StreamEvent, TokenUsage } from '@providerprotocol/ai';
2
2
  import { A as AgentState } from './index-qsPwbY86.js';
3
- import { C as CheckpointStore } from './types-BhX9uD_d.js';
3
+ import { C as CheckpointStore } from './types-DChRdQoX.js';
4
4
 
5
5
  /**
6
6
  * Result of agent generation.
@@ -266,5 +266,43 @@ type SubagentEvent = SubagentStartEvent | SubagentInnerEvent | SubagentEndEvent;
266
266
  * Tools that spawn sub-agents SHOULD accept this callback.
267
267
  */
268
268
  type OnSubagentEvent = (event: SubagentEvent) => void;
269
+ /**
270
+ * Context injected into tools during execution.
271
+ * Per UAP-1.0 Section 8.4, ExecutionStrategy MUST inject this context
272
+ * when invoking tools that accept a second parameter.
273
+ *
274
+ * @see UAP-1.0 Spec Section 8.4
275
+ */
276
+ interface ToolExecutionContext {
277
+ /** Agent instance ID */
278
+ agentId: string;
279
+ /** Current state snapshot ID */
280
+ stateId: string;
281
+ /** Tool call ID from the model response */
282
+ toolCallId: string;
283
+ /** Callback for sub-agent events */
284
+ onSubagentEvent?: OnSubagentEvent;
285
+ }
286
+ /**
287
+ * Type for a tool that accepts execution context as a second parameter.
288
+ * Tools can optionally accept this context for sub-agent inheritance
289
+ * and event propagation.
290
+ *
291
+ * @example
292
+ * ```typescript
293
+ * const contextAwareTool: Tool = {
294
+ * name: 'my_tool',
295
+ * description: 'Tool that uses execution context',
296
+ * parameters: { ... },
297
+ * run: async (params, context?: ToolExecutionContext) => {
298
+ * if (context?.onSubagentEvent) {
299
+ * // Can propagate sub-agent events
300
+ * }
301
+ * return 'result';
302
+ * },
303
+ * };
304
+ * ```
305
+ */
306
+ type ContextAwareToolRun = (params: Record<string, unknown>, context?: ToolExecutionContext) => Promise<unknown>;
269
307
 
270
- export type { AgentStrategy as A, ExecutionStrategy as E, GenerateResult as G, LoopOptions as L, OnSubagentEvent as O, PlanOptions as P, ReactOptions as R, SubagentEventType as S, ToolDependencyOptions as T, UAPEventType as U, AgentStreamResult as a, AgentStreamEvent as b, SubagentEventBase as c, SubagentStartEvent as d, SubagentInnerEvent as e, SubagentEndEvent as f, SubagentEvent as g, ExecutionContext as h, ExecutionResult as i, ToolWithDependencies as j, OrderedToolCall as k };
308
+ export type { AgentStrategy as A, ContextAwareToolRun as C, ExecutionStrategy as E, GenerateResult as G, LoopOptions as L, OnSubagentEvent as O, PlanOptions as P, ReactOptions as R, SubagentEventType as S, ToolExecutionContext as T, UAPEventType as U, AgentStreamResult as a, AgentStreamEvent as b, SubagentEventBase as c, SubagentStartEvent as d, SubagentInnerEvent as e, SubagentEndEvent as f, SubagentEvent as g, ExecutionContext as h, ExecutionResult as i, ToolDependencyOptions as j, ToolWithDependencies as k, OrderedToolCall as l };
@@ -43,6 +43,13 @@ interface CheckpointStore {
43
43
  * @returns Serialized state or null if not found
44
44
  */
45
45
  load(sessionId: string): Promise<AgentStateJSON | null>;
46
+ /**
47
+ * Load metadata for a session without loading full state.
48
+ *
49
+ * @param sessionId - Session identifier
50
+ * @returns Checkpoint metadata or null if not found
51
+ */
52
+ loadMetadata(sessionId: string): Promise<CheckpointMetadata | null>;
46
53
  /**
47
54
  * Delete all checkpoints for a session.
48
55
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@providerprotocol/agents",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Unified Agent Protocol (UAP) 1.0 implementation for @providerprotocol/ai",
5
5
  "type": "module",
6
6
  "author": {
@@ -57,13 +57,13 @@
57
57
  "@providerprotocol/ai": ">=0.0.11"
58
58
  },
59
59
  "devDependencies": {
60
- "@providerprotocol/ai": "^0.0.11",
60
+ "@providerprotocol/ai": "^0.0.12",
61
61
  "@types/bun": "^1.3.5",
62
62
  "@typescript-eslint/eslint-plugin": "^8.52.0",
63
63
  "@typescript-eslint/parser": "^8.52.0",
64
64
  "eslint": "^9.39.2",
65
65
  "eslint-plugin-import": "^2.32.0",
66
66
  "tsup": "^8.5.1",
67
- "typescript": "^5.7.3"
67
+ "typescript": "^5.9.3"
68
68
  }
69
69
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/execution/loop.ts"],"names":[],"mappings":"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","file":"chunk-4ESYN66B.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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/state/types.ts","../src/state/index.ts","../src/thread-tree/index.ts"],"names":[],"mappings":"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","file":"chunk-PHI5ULBV.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 { UserMessage, AssistantMessage, ToolResultMessage } 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 (message instanceof UserMessage) {\n return {\n role: 'user',\n content: message.content,\n metadata: message.metadata,\n };\n }\n if (message instanceof AssistantMessage) {\n return {\n role: 'assistant',\n content: {\n content: message.content,\n toolCalls: message.toolCalls,\n },\n metadata: message.metadata,\n };\n }\n if (message instanceof ToolResultMessage) {\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"]}