@anvia/client 1.5.0 → 1.7.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-chat.js","names":[],"sources":["../src/durable-chat-map.ts","../src/durable-chat.ts"],"sourcesContent":["import type { AgentInteractionRequest } from \"@anvia/core/agent/interactions\";\nimport type {\n AssistantContentPart,\n ContextUsage,\n JsonObject,\n JsonValue,\n ProviderToolCall,\n ReasoningContentType,\n ReasoningDetail,\n ToolCallPart,\n ToolResultContentPart,\n ToolResultOutput,\n Usage,\n} from \"@anvia/core/completion\";\nimport { isJsonValue } from \"@anvia/core/completion\";\nimport type { CompletionSource } from \"@anvia/core/completion\";\nimport type { MemoryCompactionInfo } from \"@anvia/core/memory\";\nimport type { DurableEvent } from \"@anvia/durable/protocol\";\nimport type { ClientStreamEvent } from \"./types\";\n\n/**\n * Pure projection from durable journal events to `anvia.client.v3` stream events.\n *\n * Durable `sequence` values are a global autoincrement across every run in the store, so they\n * are not contiguous inside one chat stream. `validateFrameSequence` (client-transport.ts)\n * requires each `eventId` to be exactly `last + 1` and would reject a replay, a resume cursor,\n * or any stream that shares the database with other runs. This mapper therefore uses the durable\n * sequence itself as the event id, which is also the cursor `stream({ after })` expects. Callers\n * must not wrap the resulting frames in the standard contiguous frame validator.\n *\n * Message ids are one per model operation (`${runId}:${operationId}`); part ids add a suffix.\n * Replaying the same journal on reconnect assigns the same identities.\n */\nexport type DurableChatMapState = {\n /** Assistant message open for the model operation currently streaming. */\n messageId?: string | undefined;\n /** Last durable sequence applied. The next resume starts after this cursor. */\n sequence: number;\n /** Model operations that already opened a message, so a later attempt resets it. */\n openedOperations: Set<string>;\n /** Parts that already emitted their `*_start`, so a replay of one event does not repeat it. */\n openedParts: Set<string>;\n /** Tool calls seen on `tool_started`, keyed by operation id, so `tool_completed` can match them. */\n tools: Map<string, ToolCallPart>;\n /** True once `run_start` has been emitted for this projection. */\n runOpened: boolean;\n};\n\n/** `Omit` over a union collapses to common keys; this distributes over every event variant. */\ntype WithoutRunId<T> = T extends unknown ? Omit<T, \"runId\"> : never;\n\nexport function createDurableChatMapState(sequence = 0): DurableChatMapState {\n return {\n sequence,\n openedOperations: new Set(),\n openedParts: new Set(),\n tools: new Map(),\n runOpened: false,\n };\n}\n\nexport type DurableChatMapped = {\n events: readonly ClientStreamEvent[];\n state: DurableChatMapState;\n};\n\n/**\n * Map one durable event. Events at or before the applied cursor produce nothing, so a reconnect\n * that overlaps the stored sequence does not double-apply.\n */\nexport function mapDurableChatEvent(\n event: DurableEvent,\n state: DurableChatMapState,\n): DurableChatMapped {\n if (!Number.isSafeInteger(event.sequence) || event.sequence <= state.sequence) {\n return { events: [], state };\n }\n const draft = fork(state, event.sequence);\n const events = project(event, draft);\n return { events, state: draft };\n}\n\n/**\n * One assistant message per model operation. Retries keep the identity and reset its parts, so a\n * streamed journal never leaves the empty placeholders that per-attempt ids would create.\n */\nexport function durableChatMessageId(runId: string, operationId: string): string {\n return `${runId}:${operationId}`;\n}\n\nfunction project(event: DurableEvent, state: DurableChatMapState): ClientStreamEvent[] {\n const data = asRecord(event.data);\n switch (event.type) {\n case \"submitted\":\n return openRun(event.runId, state);\n case \"status\":\n return mapStatus(event, data, state);\n case \"model_started\":\n return mapModelStarted(event, data, state);\n case \"model_attempt_started\":\n return mapAttemptStarted(event, data, state);\n case \"model_delta\":\n return mapModelDelta(event, data, state);\n case \"model_attempt_failed\":\n return mapAttemptFailed(event, data, state);\n case \"model_completed\":\n return mapModelCompleted(event, data, state);\n case \"tool_started\":\n return mapToolStarted(event, data, state);\n case \"tool_completed\":\n return mapToolCompleted(event, data, state);\n case \"compaction_completed\":\n return mapCompaction(event, data);\n case \"steering_queued\":\n case \"steering_applied\":\n return [\n located(event, { type: \"data\", name: event.type, data: data ?? {}, transient: true }),\n ];\n default:\n return [];\n }\n}\n\nfunction mapStatus(\n event: DurableEvent,\n data: JsonObject | undefined,\n state: DurableChatMapState,\n): ClientStreamEvent[] {\n const status = text(data, \"status\");\n if (status === \"needs_attention\") return needsAttention(event, data);\n if (status === \"failed\") return failed(event, data);\n if (status === \"cancelled\") return [located(event, { type: \"run_end\", status: \"cancelled\" })];\n if (status === \"waiting\" || status === \"completed\") return settled(event, data, status);\n // The first non-terminal status stands in for `submitted` when a replay starts mid-journal.\n if (!state.runOpened && (status === \"queued\" || status === \"pending\" || status === \"running\")) {\n return openRun(event.runId, state);\n }\n return [];\n}\n\nfunction openRun(runId: string, state: DurableChatMapState): ClientStreamEvent[] {\n state.runOpened = true;\n // The first model operation opens the assistant message; opening one here would leave an\n // empty message ahead of the real one on every turn.\n return [{ type: \"run_start\", source: \"agent\", runId }];\n}\n\nfunction mapModelStarted(\n event: DurableEvent,\n data: JsonObject | undefined,\n state: DurableChatMapState,\n): ClientStreamEvent[] {\n const operationId = text(data, \"operationId\") ?? \"model\";\n const messageId = durableChatMessageId(event.runId, operationId);\n state.openedOperations.add(operationId);\n state.messageId = messageId;\n const generation: ClientStreamEvent = { type: \"generation_start\", runId: event.runId };\n const model = modelOf(data);\n if (model !== undefined) generation.model = model;\n // `run_start` belongs to submitted / the first status. Repeat it only when this event is the\n // first one the projection has seen, so a normal journal does not open the run twice.\n const events: ClientStreamEvent[] = [];\n if (!state.runOpened) events.push({ type: \"run_start\", source: \"agent\", runId: event.runId });\n state.runOpened = true;\n events.push({ type: \"turn_start\", runId: event.runId }, generation, {\n type: \"message_start\",\n messageId,\n role: \"assistant\",\n runId: event.runId,\n });\n return events;\n}\n\nfunction mapAttemptStarted(\n event: DurableEvent,\n data: JsonObject | undefined,\n state: DurableChatMapState,\n): ClientStreamEvent[] {\n const operationId = text(data, \"operationId\");\n if (operationId === undefined) return [];\n const attempt = number(data, \"attempt\");\n const messageId = state.messageId ?? durableChatMessageId(event.runId, operationId);\n const opened = state.openedOperations.has(operationId);\n const retried = opened && (attempt === undefined || attempt > 1);\n const events: ClientStreamEvent[] = [];\n if (retried && state.messageId !== undefined) {\n // Discard the partial attempt but keep the message identity the reducer already holds.\n events.push({ type: \"message_reset\", messageId: state.messageId, runId: event.runId });\n } else if (!opened) {\n // A replay can start at the attempt rather than at `model_started`.\n events.push({ type: \"message_start\", messageId, role: \"assistant\", runId: event.runId });\n }\n state.openedOperations.add(operationId);\n state.messageId = messageId;\n return events;\n}\n\nfunction mapModelDelta(\n event: DurableEvent,\n data: JsonObject | undefined,\n state: DurableChatMapState,\n): ClientStreamEvent[] {\n const nested = asRecord(data?.event);\n const kind = text(nested, \"type\");\n if (nested === undefined || kind === undefined) return [];\n const operationId = text(data, \"operationId\") ?? \"model\";\n const messageId = state.messageId ?? durableChatMessageId(event.runId, operationId);\n state.messageId = messageId;\n const turn = number(nested, \"turn\");\n\n if (kind === \"text_delta\") {\n const delta = text(nested, \"delta\");\n if (delta === undefined) return [];\n return withStart(state, messageId, \"text\", undefined, event.runId, turn, (partId, started) => {\n const events: ClientStreamEvent[] = [];\n if (!started) events.push(part(event.runId, turn, { type: \"text_start\", messageId, partId }));\n events.push(part(event.runId, turn, { type: \"text_delta\", messageId, partId, delta }));\n return events;\n });\n }\n\n if (kind === \"reasoning_delta\") {\n const delta = text(nested, \"delta\");\n if (delta === undefined) return [];\n const reasoningId = text(nested, \"id\");\n return withStart(\n state,\n messageId,\n \"reasoning\",\n reasoningId ?? \"default\",\n event.runId,\n turn,\n (partId, started) => {\n const events: ClientStreamEvent[] = [];\n if (!started) {\n const start = part(event.runId, turn, { type: \"reasoning_start\", messageId, partId });\n if (reasoningId !== undefined && start.type === \"reasoning_start\") {\n start.reasoningId = reasoningId;\n }\n events.push(start);\n }\n const deltaEvent = part(event.runId, turn, {\n type: \"reasoning_delta\",\n messageId,\n partId,\n delta,\n });\n const contentType = reasoningType(text(nested, \"contentType\"));\n const signature = text(nested, \"signature\");\n if (deltaEvent.type === \"reasoning_delta\") {\n if (contentType !== undefined) deltaEvent.contentType = contentType;\n if (signature !== undefined) deltaEvent.signature = signature;\n }\n events.push(deltaEvent);\n return events;\n },\n );\n }\n\n if (kind === \"tool_call_delta\") {\n const toolCallId = text(nested, \"id\");\n if (toolCallId === undefined) return [];\n return withStart(state, messageId, \"tool\", toolCallId, event.runId, turn, (partId, started) => {\n const events: ClientStreamEvent[] = [];\n const callId = text(nested, \"callId\");\n const toolName = text(nested, \"name\");\n if (!started) {\n const start = part(event.runId, turn, {\n type: \"tool_call_start\",\n messageId,\n partId,\n toolCallId,\n });\n if (start.type === \"tool_call_start\") {\n if (callId !== undefined) start.callId = callId;\n if (toolName !== undefined) start.toolName = toolName;\n }\n events.push(start);\n }\n const delta = text(nested, \"argumentsDelta\");\n if (delta === undefined) return events;\n const tool = part(event.runId, turn, {\n type: \"tool_call_delta\",\n messageId,\n partId,\n toolCallId,\n delta,\n mode: nested.argumentsMode === \"replace\" ? \"replace\" : \"append\",\n });\n if (tool.type === \"tool_call_delta\") {\n if (callId !== undefined) tool.callId = callId;\n if (toolName !== undefined) tool.toolName = toolName;\n const signature = text(nested, \"signature\");\n if (signature !== undefined) tool.signature = signature;\n }\n events.push(tool);\n return events;\n });\n }\n\n if (kind === \"tool_call\") {\n const call = asToolCall(nested.toolCall);\n return call === undefined ? [] : [toolCallEnd(event.runId, messageId, call, turn)];\n }\n if (kind === \"source\") {\n const source = asSource(nested.source);\n if (source === undefined) return [];\n return [\n part(event.runId, turn, {\n type: \"source\",\n messageId,\n partId: partId(messageId, \"source\", JSON.stringify(source)),\n source,\n }),\n ];\n }\n if (kind === \"provider_tool_call\") {\n const toolCall = asProviderToolCall(nested.toolCall);\n return toolCall === undefined\n ? []\n : [part(event.runId, turn, { type: \"provider_tool_call\", toolCall })];\n }\n return [];\n}\n\nfunction mapAttemptFailed(\n event: DurableEvent,\n data: JsonObject | undefined,\n state: DurableChatMapState,\n): ClientStreamEvent[] {\n // A failed attempt is not a failed run: `retry_wait` may follow. Emit a transient data\n // event instead of `error`, which would leave `useChat` in a sticky error state even when\n // the next attempt succeeds. The next `message_reset` clears the partial attempt.\n const attemptId = text(data, \"attemptId\");\n return [\n located(event, {\n type: \"data\",\n name: \"durable_model_attempt_failed\",\n data: {\n operationId: text(data, \"operationId\") ?? null,\n attemptId: attemptId ?? null,\n messageId: state.messageId ?? null,\n error: text(data, \"error\") ?? \"Durable model attempt failed.\",\n },\n transient: true,\n }),\n ];\n}\n\nfunction mapModelCompleted(\n event: DurableEvent,\n data: JsonObject | undefined,\n state: DurableChatMapState,\n): ClientStreamEvent[] {\n const operationId = text(data, \"operationId\") ?? \"model\";\n const messageId = state.messageId ?? durableChatMessageId(event.runId, operationId);\n state.messageId = messageId;\n const result = asRecord(data?.result);\n const choice = assistantParts(result?.choice);\n const events: ClientStreamEvent[] = [];\n const texts = choice.filter((part) => part.type === \"text\");\n const textJoined = texts.map((part) => part.text).join(\"\");\n const textPartId = partId(messageId, \"text\");\n if (textJoined.length > 0 || state.openedParts.has(textPartId)) {\n if (!state.openedParts.has(textPartId)) {\n state.openedParts.add(textPartId);\n events.push({ type: \"text_start\", messageId, partId: textPartId, runId: event.runId });\n }\n const end: ClientStreamEvent = {\n type: \"text_end\",\n messageId,\n partId: textPartId,\n text: textJoined,\n runId: event.runId,\n };\n const signature = texts.length === 1 ? texts[0]?.signature : undefined;\n if (signature !== undefined && end.type === \"text_end\") end.signature = signature;\n events.push(end);\n }\n for (const content of choice) {\n if (content.type === \"reasoning\")\n events.push(reasoningEnd(event.runId, messageId, content, state));\n if (content.type === \"tool-call\") events.push(toolCallEnd(event.runId, messageId, content));\n }\n const messageEnd: ClientStreamEvent = { type: \"message_end\", messageId, runId: event.runId };\n const usage = asUsage(result?.usage);\n const contextUsage = asContextUsage(result?.contextUsage);\n if (usage !== undefined && messageEnd.type === \"message_end\") messageEnd.usage = usage;\n if (contextUsage !== undefined && messageEnd.type === \"message_end\") {\n messageEnd.contextUsage = contextUsage;\n }\n if (typeof result?.messageId === \"string\" && messageEnd.type === \"message_end\") {\n messageEnd.modelMessageId = result.messageId;\n }\n events.push(messageEnd);\n return events;\n}\n\nfunction mapToolStarted(\n event: DurableEvent,\n data: JsonObject | undefined,\n state: DurableChatMapState,\n): ClientStreamEvent[] {\n const operationId = text(data, \"operationId\");\n const call = asToolCall(asRecord(data?.input)?.toolCall);\n if (operationId === undefined || call === undefined) return [];\n state.tools.set(operationId, call);\n const messageId = state.messageId ?? durableChatMessageId(event.runId, operationId);\n return [toolCallEnd(event.runId, messageId, call)];\n}\n\nfunction mapToolCompleted(\n event: DurableEvent,\n data: JsonObject | undefined,\n state: DurableChatMapState,\n): ClientStreamEvent[] {\n const operationId = text(data, \"operationId\");\n // `tool_completed` carries only the result; the call was recorded by `tool_started`.\n const call = operationId === undefined ? undefined : state.tools.get(operationId);\n const saved = asRecord(data?.result);\n const output = asToolOutput(saved?.output);\n if (output === undefined) return [];\n const messageId = state.messageId ?? durableChatMessageId(event.runId, operationId ?? \"tools\");\n const toolCallId = call?.toolCallId ?? operationId ?? \"tool\";\n const failed = saved?.failed === true;\n const result: ClientStreamEvent = {\n type: \"tool_result\",\n messageId,\n partId: partId(messageId, \"tool\", toolCallId),\n toolCallId,\n toolName: call?.toolName ?? \"tool\",\n input: call?.input ?? null,\n runId: event.runId,\n result: failed\n ? {\n status: \"error\",\n error: { message: text(saved, \"error\") ?? \"Tool failed.\", retryable: false },\n }\n : { status: \"success\", output: toolOutputValue(output) },\n };\n if (call?.callId !== undefined && result.type === \"tool_result\") result.callId = call.callId;\n return [result];\n}\n\nfunction mapCompaction(event: DurableEvent, data: JsonObject | undefined): ClientStreamEvent[] {\n const info = asCompaction(data);\n return info === undefined ? [] : [located(event, { type: \"memory_compaction\", ...info })];\n}\n\nfunction needsAttention(event: DurableEvent, data: JsonObject | undefined): ClientStreamEvent[] {\n const operationId = text(data, \"blockedOperation\");\n const details: JsonObject = { retryable: true };\n if (operationId !== undefined) details.operationId = operationId;\n return [\n located(event, {\n type: \"error\",\n error: {\n name: \"DurableNeedsAttention\",\n message: text(data, \"error\") ?? \"Durable run needs attention.\",\n code: \"needs_attention\",\n retryable: true,\n details,\n },\n }),\n located(event, { type: \"run_end\", status: \"error\" }),\n ];\n}\n\nfunction failed(event: DurableEvent, data: JsonObject | undefined): ClientStreamEvent[] {\n const outcome = asRecord(data?.outcome);\n const error = located(event, {\n type: \"error\",\n error: {\n name: \"DurableRunError\",\n message: text(data, \"error\") ?? \"Durable run failed.\",\n code: \"failed\",\n retryable: false,\n },\n });\n const usage = asUsage(outcome?.usage);\n if (usage !== undefined && error.type === \"error\") error.usage = usage;\n return [error, runEnd(event, outcome, \"error\")];\n}\n\nfunction settled(\n event: DurableEvent,\n data: JsonObject | undefined,\n status: \"waiting\" | \"completed\",\n): ClientStreamEvent[] {\n const outcome = asRecord(data?.outcome);\n const outcomeType = text(outcome, \"type\");\n if (status === \"waiting\" || outcomeType === \"interaction\") {\n const interaction = asInteraction(outcome?.interaction);\n const events: ClientStreamEvent[] = [];\n if (interaction !== undefined)\n events.push(located(event, { type: \"interaction\", interaction }));\n events.push(runEnd(event, outcome, \"suspended\"));\n return events;\n }\n if (outcomeType === \"blocked\") return [runEnd(event, outcome, \"blocked\")];\n return [runEnd(event, outcome, \"completed\")];\n}\n\nfunction runEnd(\n event: DurableEvent,\n outcome: JsonObject | undefined,\n status: \"completed\" | \"blocked\" | \"suspended\" | \"error\",\n): ClientStreamEvent {\n const end = located(event, { type: \"run_end\", status });\n if (end.type !== \"run_end\") return end;\n const value = text(outcome, \"text\");\n const usage = asUsage(outcome?.usage);\n const contextUsage = asContextUsage(outcome?.contextUsage);\n const trace = asTrace(outcome?.trace);\n const compaction = asCompaction(asRecord(outcome?.memoryCompaction));\n if (value !== undefined) end.text = value;\n if (outcome?.output !== undefined && isJsonValue(outcome.output)) end.output = outcome.output;\n if (usage !== undefined) end.usage = usage;\n if (contextUsage !== undefined) end.contextUsage = contextUsage;\n if (trace !== undefined) end.trace = trace;\n if (compaction !== undefined) end.memoryCompaction = compaction;\n return end;\n}\n\nfunction reasoningEnd(\n runId: string,\n messageId: string,\n content: Extract<AssistantContentPart, { type: \"reasoning\" }>,\n state: DurableChatMapState,\n): ClientStreamEvent {\n const id = partId(messageId, \"reasoning\", content.id ?? \"default\");\n const end: ClientStreamEvent = {\n type: \"reasoning_end\",\n messageId,\n partId: id,\n text: content.text,\n runId,\n };\n if (!state.openedParts.has(id)) state.openedParts.add(id);\n if (content.details !== undefined && end.type === \"reasoning_end\") end.content = content.details;\n return end;\n}\n\nfunction toolCallEnd(\n runId: string,\n messageId: string,\n call: ToolCallPart,\n turn?: number,\n): ClientStreamEvent {\n const event = part(runId, turn, {\n type: \"tool_call_end\",\n messageId,\n partId: partId(messageId, \"tool\", call.toolCallId),\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n });\n if (event.type !== \"tool_call_end\") return event;\n if (call.callId !== undefined) event.callId = call.callId;\n if (call.signature !== undefined) event.signature = call.signature;\n return event;\n}\n\nfunction withStart(\n state: DurableChatMapState,\n messageId: string,\n kind: string,\n suffix: string | undefined,\n runId: string,\n turn: number | undefined,\n build: (partId: string, started: boolean) => ClientStreamEvent[],\n): ClientStreamEvent[] {\n void runId;\n void turn;\n const id = partId(messageId, kind, suffix);\n const started = state.openedParts.has(id);\n if (!started) state.openedParts.add(id);\n return build(id, started);\n}\n\nfunction part(\n runId: string,\n turn: number | undefined,\n event: WithoutRunId<ClientStreamEvent>,\n): ClientStreamEvent {\n const locatedEvent = { ...event, runId } as ClientStreamEvent;\n if (turn !== undefined && \"turn\" in locatedEvent) locatedEvent.turn = turn;\n else if (turn !== undefined) return { ...locatedEvent, turn };\n return locatedEvent;\n}\n\nfunction located(event: DurableEvent, fields: WithoutRunId<ClientStreamEvent>): ClientStreamEvent {\n return { ...fields, runId: event.runId } as ClientStreamEvent;\n}\n\nfunction fork(state: DurableChatMapState, sequence: number): DurableChatMapState {\n return {\n messageId: state.messageId,\n sequence,\n openedOperations: new Set(state.openedOperations),\n openedParts: new Set(state.openedParts),\n tools: new Map(state.tools),\n runOpened: state.runOpened,\n };\n}\n\nfunction partId(messageId: string, kind: string, suffix?: string): string {\n return suffix === undefined ? `${messageId}:${kind}` : `${messageId}:${kind}:${suffix}`;\n}\n\nfunction asRecord(value: unknown): JsonObject | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value) || !isJsonValue(value)) {\n return undefined;\n }\n return value as JsonObject;\n}\n\nfunction text(value: JsonObject | undefined, key: string): string | undefined {\n const field = value?.[key];\n return typeof field === \"string\" ? field : undefined;\n}\n\nfunction number(value: JsonObject | undefined, key: string): number | undefined {\n const field = value?.[key];\n return typeof field === \"number\" && Number.isFinite(field) ? field : undefined;\n}\n\nfunction modelOf(data: JsonObject | undefined): { provider: string; modelId: string } | undefined {\n const input = asRecord(data?.input);\n const provider = text(input, \"provider\");\n const modelId = text(input, \"modelId\");\n return provider === undefined || modelId === undefined ? undefined : { provider, modelId };\n}\n\nconst REASONING: readonly ReasoningContentType[] = [\"text\", \"summary\", \"encrypted\", \"redacted\"];\n\nfunction reasoningType(value: string | undefined): ReasoningContentType | undefined {\n return REASONING.find((type) => type === value);\n}\n\nfunction asToolCall(value: unknown): ToolCallPart | undefined {\n const call = asRecord(value);\n if (call?.type !== \"tool-call\") return undefined;\n const toolCallId = text(call, \"toolCallId\");\n const toolName = text(call, \"toolName\");\n if (toolCallId === undefined || toolName === undefined || !isJsonValue(call.input))\n return undefined;\n const parsed: ToolCallPart = { type: \"tool-call\", toolCallId, toolName, input: call.input };\n const callId = text(call, \"callId\");\n const signature = text(call, \"signature\");\n if (callId === undefined) {\n return signature === undefined ? parsed : { ...parsed, signature };\n }\n if (signature === undefined) return { ...parsed, callId };\n return { ...parsed, callId, signature };\n}\n\nfunction asSource(value: unknown): CompletionSource | undefined {\n return asRecord(value) as CompletionSource | undefined;\n}\n\nfunction asProviderToolCall(value: unknown): ProviderToolCall | undefined {\n const call = asRecord(value);\n return call === undefined ? undefined : (call as ProviderToolCall);\n}\n\nfunction assistantParts(value: unknown): AssistantContentPart[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n const part = assistantPart(item);\n return part === undefined ? [] : [part];\n });\n}\n\nfunction assistantPart(value: unknown): AssistantContentPart | undefined {\n const part = asRecord(value);\n const type = text(part, \"type\");\n if (part === undefined || type === undefined) return undefined;\n if (type === \"text\" && typeof part.text === \"string\") {\n return typeof part.signature === \"string\"\n ? { type: \"text\", text: part.text, signature: part.signature }\n : { type: \"text\", text: part.text };\n }\n if (type === \"reasoning\" && typeof part.text === \"string\") {\n const details = asReasoningDetails(part.details);\n const base = { type: \"reasoning\" as const, text: part.text };\n if (typeof part.id !== \"string\") return details === undefined ? base : { ...base, details };\n return details === undefined ? { ...base, id: part.id } : { ...base, id: part.id, details };\n }\n if (type === \"tool-call\") return asToolCall(part);\n return undefined;\n}\n\nfunction asReasoningDetails(value: unknown): readonly ReasoningDetail[] | undefined {\n if (!Array.isArray(value) || !isJsonValue(value)) return undefined;\n return value as readonly ReasoningDetail[];\n}\n\nfunction asUsage(value: unknown): Usage | undefined {\n const usage = asRecord(value);\n if (usage === undefined) return undefined;\n const keys = [\n \"inputTokens\",\n \"outputTokens\",\n \"totalTokens\",\n \"cachedInputTokens\",\n \"cacheCreationInputTokens\",\n ] as const;\n const counts: Partial<Usage> = {};\n for (const key of keys) {\n const count = number(usage, key);\n if (count === undefined) return undefined;\n counts[key] = count;\n }\n const parsed = counts as Usage;\n const details = asRecord(usage.details);\n if (details !== undefined && Object.values(details).every((item) => typeof item === \"number\")) {\n parsed.details = details as Record<string, number>;\n }\n return parsed;\n}\n\nfunction asContextUsage(value: unknown): ContextUsage | undefined {\n const usage = asRecord(value);\n const model = asRecord(usage?.model);\n const context = asRecord(model?.context);\n if (usage === undefined || typeof model?.modelId !== \"string\" || context === undefined)\n return undefined;\n const contextWindow = number(context, \"contextWindow\");\n const usedTokens = number(usage, \"usedTokens\");\n const remainingTokens = number(usage, \"remainingTokens\");\n const usedPercent = number(usage, \"usedPercent\");\n const remainingPercent = number(usage, \"remainingPercent\");\n if (\n contextWindow === undefined ||\n usedTokens === undefined ||\n remainingTokens === undefined ||\n usedPercent === undefined ||\n remainingPercent === undefined\n ) {\n return undefined;\n }\n const parsed: ContextUsage = {\n model: { modelId: model.modelId, context: { contextWindow } },\n usedTokens,\n remainingTokens,\n usedPercent,\n remainingPercent,\n };\n const maxInputTokens = number(context, \"maxInputTokens\");\n const maxOutputTokens = number(context, \"maxOutputTokens\");\n if (maxInputTokens !== undefined) parsed.model.context.maxInputTokens = maxInputTokens;\n if (maxOutputTokens !== undefined) parsed.model.context.maxOutputTokens = maxOutputTokens;\n return parsed;\n}\n\nfunction asTrace(\n value: unknown,\n): { observer: string; traceId?: string; observationId?: string } | undefined {\n const trace = asRecord(value);\n const observer = text(trace, \"observer\");\n if (observer === undefined) return undefined;\n const parsed: { observer: string; traceId?: string; observationId?: string } = { observer };\n const traceId = text(trace, \"traceId\");\n const observationId = text(trace, \"observationId\");\n if (traceId !== undefined) parsed.traceId = traceId;\n if (observationId !== undefined) parsed.observationId = observationId;\n return parsed;\n}\n\nfunction asCompaction(value: JsonObject | undefined): MemoryCompactionInfo | undefined {\n if (value === undefined) return undefined;\n const keys = [\n \"originalMessageCount\",\n \"compactedMessageCount\",\n \"retainedMessageCount\",\n \"originalTokenCount\",\n \"compactedTokenCount\",\n \"retainedTokenCount\",\n \"resultTokenCount\",\n \"attempts\",\n ] as const;\n const info: Partial<Record<(typeof keys)[number], number>> = {};\n for (const key of keys) {\n const count = number(value, key);\n if (count === undefined) return undefined;\n info[key] = count;\n }\n const usage = asUsage(value.usage);\n if (usage === undefined) return undefined;\n return { ...(info as Omit<MemoryCompactionInfo, \"usage\">), usage };\n}\n\nfunction asInteraction(value: unknown): AgentInteractionRequest | undefined {\n const request = asRecord(value);\n const type = text(request, \"type\");\n const id = text(request, \"id\");\n const toolName = text(request, \"toolName\");\n const toolCallId = text(request, \"toolCallId\");\n const internalCallId = text(request, \"internalCallId\");\n if (\n request === undefined ||\n id === undefined ||\n toolName === undefined ||\n toolCallId === undefined ||\n internalCallId === undefined\n ) {\n return undefined;\n }\n const callId = text(request, \"callId\");\n const base: {\n id: string;\n toolName: string;\n toolCallId: string;\n internalCallId: string;\n callId?: string;\n } = { id, toolName, toolCallId, internalCallId };\n if (callId !== undefined) base.callId = callId;\n if (type === \"tool-approval\" && isJsonValue(request.input)) {\n const approval = { ...base, type: \"tool-approval\" as const, input: request.input };\n const reason = text(request, \"reason\");\n return reason === undefined ? approval : { ...approval, reason };\n }\n if (\n type === \"tool-question\" &&\n Array.isArray(request.questions) &&\n isJsonValue(request.questions)\n ) {\n return {\n ...base,\n type,\n questions: request.questions as Extract<\n AgentInteractionRequest,\n { type: \"tool-question\" }\n >[\"questions\"],\n };\n }\n return undefined;\n}\n\nfunction asToolOutput(value: unknown): ToolResultOutput | undefined {\n const output = asRecord(value);\n const type = text(output, \"type\");\n if (output === undefined || type === undefined) return undefined;\n if ((type === \"text\" || type === \"error-text\") && typeof output.value === \"string\") {\n return { type, value: output.value };\n }\n if ((type === \"json\" || type === \"error-json\") && isJsonValue(output.value)) {\n return { type, value: output.value };\n }\n if (type === \"execution-denied\") {\n const reason = text(output, \"reason\");\n return reason === undefined ? { type } : { type, reason };\n }\n if (type === \"content\" && Array.isArray(output.value) && isJsonValue(output.value)) {\n return { type, value: output.value as readonly ToolResultContentPart[] };\n }\n return undefined;\n}\n\nfunction toolOutputValue(output: ToolResultOutput): JsonValue {\n if (output.type === \"execution-denied\") {\n return output.reason === undefined\n ? { type: output.type }\n : { type: output.type, reason: output.reason };\n }\n return output.value as JsonValue;\n}\n","import type { AgentPrompt } from \"@anvia/core/agent\";\nimport type { Message, ToolResultOutput } from \"@anvia/core/completion\";\nimport { DurableHttpError, type DurableClient } from \"./durable\";\nimport {\n createDurableChatMapState,\n mapDurableChatEvent,\n type DurableChatMapState,\n} from \"./durable-chat-map\";\nimport { createClientId } from \"./messages\";\nimport {\n CLIENT_STREAM_PROTOCOL,\n type ClientStreamCursor,\n type ClientStreamFrame,\n type ClientStreamRequest,\n type ClientTransport,\n type ClientTransportSendOptions,\n} from \"./types\";\n\n/**\n * Thrown when a submission is rejected because the session already has unfinished work (HTTP 409).\n * `runId` is that run when it could be read back from the session; `undefined` when the lookup\n * failed. Reattach to `runId` instead of submitting again. Aborting a stream never raises this.\n */\nexport class DurableBusyError extends Error {\n readonly code = \"session_busy\" as const;\n\n constructor(\n readonly runId: string | undefined,\n message = \"Session already has unfinished work.\",\n ) {\n super(message);\n this.name = \"DurableBusyError\";\n }\n}\n\nconst UNFINISHED = new Set([\n \"queued\",\n \"retry_wait\",\n \"pending\",\n \"running\",\n \"waiting\",\n \"needs_attention\",\n]);\n\n/** Methods the adapter needs. A structural subset of `DurableClient`, so tests can fake it. */\nexport type DurableChatClient = Pick<\n DurableClient,\n \"submit\" | \"stream\" | \"respond\" | \"resolveTool\" | \"retry\" | \"cancel\" | \"listRuns\"\n>;\n\n/**\n * Run controls that `useChat` does not expose. `stop()` only aborts the subscription; cancellation\n * is always this explicit `cancel()`.\n */\nexport type DurableChatController = {\n /** Run last submitted or reattached. Undefined before the first successful send. */\n readonly activeRunId: string | undefined;\n /** Point later interaction responses and `send({ resume })` at an existing run. */\n reattach(runId: string, after?: number): void;\n cancel(runId?: string): Promise<void>;\n retry(runId?: string): Promise<void>;\n resolveTool(operationId: string, output: ToolResultOutput, runId?: string): Promise<void>;\n};\n\nexport type CreateDurableChatTransportOptions = {\n client: DurableChatClient;\n agentId: string;\n sessionId: string;\n /** Defaults to a UUID per submission. Return a stable id to deduplicate one prompt. */\n requestId?: () => string;\n /** Queue behind unfinished session work instead of failing. Defaults to true. */\n enqueue?: boolean;\n};\n\nexport type DurableChatTransport = ClientTransport<ClientStreamRequest> & {\n readonly controller: DurableChatController;\n};\n\ntype Session = {\n activeRunId?: string;\n /** Durable sequence last applied for `activeRunId`. Interaction responses resume after it. */\n cursor: number;\n map: DurableChatMapState;\n};\n\n/**\n * Transport `useChat` can pass to talk to `@anvia/durable`.\n *\n * Only the last user message of a `messages` request is submitted; durable keeps the transcript,\n * so the rest of the client history is discarded. An `interaction_response` is delivered to the\n * remembered run and then the stream resumes from the last applied sequence. Abort detaches the\n * SSE subscription and does not cancel the run.\n */\nexport function createDurableChatTransport(\n options: CreateDurableChatTransportOptions,\n): DurableChatTransport {\n const session: Session = { cursor: 0, map: createDurableChatMapState() };\n\n const controller: DurableChatController = {\n get activeRunId() {\n return session.activeRunId;\n },\n reattach(runId, after = 0) {\n assertCursor(after);\n session.activeRunId = requireId(runId, \"runId\");\n session.cursor = after;\n session.map = createDurableChatMapState(after);\n },\n cancel(runId) {\n return options.client.cancel(resolveRun(session, runId));\n },\n retry(runId) {\n return options.client.retry(resolveRun(session, runId));\n },\n resolveTool(operationId, output, runId) {\n return options.client.resolveTool(resolveRun(session, runId), operationId, output);\n },\n };\n\n return {\n controller,\n async *send(send) {\n const target = await begin(options, session, send);\n // A new run, or a resume behind the applied cursor, needs a fresh projection. Reusing the\n // run's existing projection keeps `run_start` and open messages from being emitted twice.\n if (session.activeRunId !== target.runId || target.after < session.cursor) {\n session.map = createDurableChatMapState(target.after);\n }\n session.activeRunId = target.runId;\n session.cursor = target.after;\n yield* streamFrames(options.client, session, target.runId, send.abortSignal);\n },\n };\n}\n\nasync function begin(\n options: CreateDurableChatTransportOptions,\n session: Session,\n send: ClientTransportSendOptions<ClientStreamRequest>,\n): Promise<{ runId: string; after: number }> {\n const resume = send.resume ?? send.request.resume;\n if (resume !== undefined) {\n assertCursor(resume.after);\n return { runId: requireId(resume.streamId, \"streamId\"), after: resume.after };\n }\n if (send.request.type === \"interaction_response\") {\n if (session.activeRunId === undefined) {\n throw new Error(\"No active durable run to receive the interaction response.\");\n }\n await options.client.respond(\n session.activeRunId,\n send.request.interactionId,\n send.request.response,\n send.abortSignal === undefined ? {} : { abortSignal: send.abortSignal },\n );\n return { runId: session.activeRunId, after: session.cursor };\n }\n const snapshot = await submitPrompt(options, send);\n return { runId: snapshot, after: 0 };\n}\n\nasync function submitPrompt(\n options: CreateDurableChatTransportOptions,\n send: ClientTransportSendOptions<ClientStreamRequest>,\n): Promise<string> {\n if (send.request.type !== \"messages\") {\n throw new TypeError(\"Unsupported durable chat request.\");\n }\n const prompt = lastUserPrompt(send.request.messages);\n const requestId = options.requestId?.() ?? createClientId(\"durable\");\n const requestOptions: { enqueue: boolean; abortSignal?: AbortSignal } = {\n enqueue: options.enqueue ?? true,\n };\n if (send.abortSignal !== undefined) requestOptions.abortSignal = send.abortSignal;\n try {\n const snapshot = await options.client.submit(\n { agentId: options.agentId, sessionId: options.sessionId, requestId, prompt },\n requestOptions,\n );\n return snapshot.run.id;\n } catch (error) {\n if (!isSessionBusy(error)) throw error;\n throw new DurableBusyError(await findBusyRun(options, send.abortSignal), error.message);\n }\n}\n\nasync function* streamFrames(\n client: DurableChatClient,\n session: Session,\n runId: string,\n abortSignal: AbortSignal | undefined,\n): AsyncIterable<ClientStreamFrame> {\n // The event id is the durable sequence, which is not contiguous per stream. See the note in\n // durable-chat-map.ts for why validateFrameSequence must not wrap this generator.\n yield {\n type: \"stream_start\",\n protocol: CLIENT_STREAM_PROTOCOL,\n streamId: runId,\n eventId: 0,\n resumable: true,\n };\n let lastEventId = session.cursor;\n const streamOptions =\n abortSignal === undefined ? { after: session.cursor } : { after: session.cursor, abortSignal };\n try {\n for await (const event of client.stream(runId, streamOptions)) {\n const mapped = mapDurableChatEvent(event, session.map);\n session.map = mapped.state;\n session.cursor = mapped.state.sequence;\n lastEventId = mapped.state.sequence;\n for (const clientEvent of mapped.events) {\n yield {\n type: \"stream_event\",\n streamId: runId,\n eventId: event.sequence,\n event: clientEvent,\n };\n }\n }\n } catch (error) {\n if (!isAbort(error, abortSignal)) {\n yield { type: \"stream_end\", streamId: runId, eventId: lastEventId, status: \"error\" };\n }\n throw error;\n }\n yield { type: \"stream_end\", streamId: runId, eventId: lastEventId, status: \"completed\" };\n}\n\nfunction lastUserPrompt(messages: readonly Message[]): AgentPrompt {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message?.role === \"user\") return message;\n }\n throw new TypeError(\"Durable chat requires a user message to submit.\");\n}\n\nfunction isSessionBusy(error: unknown): error is DurableHttpError {\n // A submit conflict means this session already has an unfinished run.\n return error instanceof DurableHttpError && error.status === 409;\n}\n\nasync function findBusyRun(\n options: CreateDurableChatTransportOptions,\n abortSignal: AbortSignal | undefined,\n): Promise<string | undefined> {\n try {\n const page = await options.client.listRuns(\n { sessionId: options.sessionId, limit: 100 },\n abortSignal === undefined ? {} : { abortSignal },\n );\n return page.runs.find((run) => UNFINISHED.has(run.status))?.id;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveRun(session: Session, runId: string | undefined): string {\n return requireId(runId ?? session.activeRunId, \"run\");\n}\n\nfunction requireId(value: string | undefined, label: string): string {\n if (value === undefined || value.trim().length === 0) {\n throw new Error(label === \"run\" ? \"No active durable run.\" : `${label} must not be empty.`);\n }\n return value;\n}\n\nfunction assertCursor(after: number): void {\n if (!Number.isSafeInteger(after) || after < 0)\n throw new TypeError(\"Invalid durable resume cursor.\");\n}\n\nfunction isAbort(error: unknown, signal: AbortSignal | undefined): boolean {\n return signal?.aborted === true || (error instanceof Error && error.name === \"AbortError\");\n}\n\nexport type { ClientStreamCursor };\n"],"mappings":"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"}
package/dist/durable.d.ts CHANGED
@@ -1,70 +1,76 @@
1
- import { TaskSubmission, TaskSnapshot, TaskGraphSnapshot, TaskListOptions, TaskPage, TaskEvent, DurableGraphSubmission, DurableGraphSnapshot, DurableGraphListOptions, DurableGraphPage, DurableGraphEvent, DurableSubmission, DurableSubmitOptions, DurableSnapshot, DurableListOptions, DurableRunPage, DurableEvent, DurableSteerOptions } from '@anvia/durable/protocol';
2
- import { AgentSteerInput, AgentSteerReceipt } from '@anvia/core/agent';
3
- import { AgentInteractionResponse } from '@anvia/core/agent/interactions';
4
- import { JsonValue, ToolResultOutput } from '@anvia/core/completion';
5
-
6
- type DurableRequestOptions = {
7
- abortSignal?: AbortSignal;
1
+ import { JsonValue, ToolResultOutput } from "@anvia/core/completion";
2
+ import { AgentInteractionResponse } from "@anvia/core/agent/interactions";
3
+ import { DurableEvent, DurableGraphEvent, DurableGraphListOptions, DurableGraphPage, DurableGraphSnapshot, DurableGraphSubmission, DurableListOptions, DurableRunPage, DurableSnapshot, DurableSteerOptions, DurableSubmission, DurableSubmitOptions, TaskEvent, TaskGraphSnapshot, TaskListOptions, TaskPage, TaskSnapshot, TaskSubmission } from "@anvia/durable/protocol";
4
+ import { AgentSteerInput, AgentSteerReceipt } from "@anvia/core/agent";
5
+ export type DurableRequestOptions = {
6
+ abortSignal?: AbortSignal;
8
7
  };
9
- type DurableClientOptions = {
10
- /** Absolute HTTP(S) URL matching the server handler's basePath. */
11
- endpoint: string;
12
- fetch?: typeof fetch;
13
- headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
14
- credentials?: RequestCredentials;
8
+ export type DurableClientOptions = {
9
+ /** Absolute HTTP(S) URL matching the server handler's basePath. */
10
+ endpoint: string;
11
+ fetch?: typeof fetch;
12
+ headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
13
+ credentials?: RequestCredentials;
15
14
  };
16
- declare class DurableHttpError extends Error {
17
- readonly status: number;
18
- constructor(status: number);
15
+ export declare class DurableHttpError extends Error {
16
+ readonly status: number;
17
+ /** Server-provided machine-readable code, such as `payload_too_large`. */
18
+ readonly code?: string | undefined;
19
+ /** Server-provided field name that exceeded a limit. */
20
+ readonly field?: string | undefined;
21
+ constructor(status: number,
22
+ /** Server-provided machine-readable code, such as `payload_too_large`. */
23
+ code?: string | undefined,
24
+ /** Server-provided field name that exceeded a limit. */
25
+ field?: string | undefined, message?: string);
19
26
  }
20
27
  /** Browser-safe HTTP client. Reconnect explicitly using a snapshot or last applied event cursor. */
21
- declare class DurableClient {
22
- private readonly options;
23
- private readonly endpoint;
24
- constructor(options: DurableClientOptions);
25
- submitTask(
26
- /** Trace context is set by the server's `trace` hook. */
27
- submission: Omit<TaskSubmission, "trace">, options?: DurableRequestOptions): Promise<TaskSnapshot>;
28
- taskSnapshot(id: string, options?: DurableRequestOptions): Promise<TaskSnapshot>;
29
- taskGraph(id: string, options?: DurableRequestOptions): Promise<TaskGraphSnapshot>;
30
- listTasks(filter: TaskListOptions & {
31
- sessionId: string;
32
- }, options?: DurableRequestOptions): Promise<TaskPage>;
33
- signalTask(id: string, name: string, requestId: string, value: JsonValue, options?: DurableRequestOptions): Promise<void>;
34
- resolveEffect(id: string, key: string, value: JsonValue, options?: DurableRequestOptions): Promise<void>;
35
- retryTask(id: string, options?: DurableRequestOptions): Promise<void>;
36
- cancelTask(id: string, options?: DurableRequestOptions): Promise<void>;
37
- streamTask(id: string, options?: DurableRequestOptions & {
38
- after?: number;
39
- }): AsyncIterable<TaskEvent>;
40
- private taskPath;
41
- submitGraph(submission: DurableGraphSubmission, options?: DurableRequestOptions): Promise<DurableGraphSnapshot>;
42
- graphSnapshot(graphId: string, options?: DurableRequestOptions): Promise<DurableGraphSnapshot>;
43
- listGraphs(filter: DurableGraphListOptions & {
44
- sessionId: string;
45
- }, options?: DurableRequestOptions): Promise<DurableGraphPage>;
46
- cancelGraph(graphId: string, options?: DurableRequestOptions): Promise<void>;
47
- streamGraph(graphId: string, options?: DurableRequestOptions & {
48
- after?: number;
49
- }): AsyncIterable<DurableGraphEvent>;
50
- submit(
51
- /** Trace context is set by the server's `trace` hook. */
52
- submission: Omit<DurableSubmission, "trace">, options?: DurableSubmitOptions & DurableRequestOptions): Promise<DurableSnapshot>;
53
- listRuns(filter: DurableListOptions & {
54
- sessionId: string;
55
- }, options?: DurableRequestOptions): Promise<DurableRunPage>;
56
- snapshot(runId: string, options?: DurableRequestOptions): Promise<DurableSnapshot>;
57
- stream(runId: string, options?: DurableRequestOptions & {
58
- after?: number;
59
- }): AsyncIterable<DurableEvent>;
60
- steer(runId: string, input: AgentSteerInput, options?: DurableSteerOptions & DurableRequestOptions): Promise<AgentSteerReceipt>;
61
- respond(runId: string, interactionId: string, response: AgentInteractionResponse, options?: DurableRequestOptions): Promise<void>;
62
- resolveTool(runId: string, operationId: string, output: ToolResultOutput, options?: DurableRequestOptions): Promise<void>;
63
- retry(runId: string, options?: DurableRequestOptions): Promise<void>;
64
- cancel(runId: string, options?: DurableRequestOptions): Promise<void>;
65
- private graphPath;
66
- private path;
67
- private request;
28
+ export declare class DurableClient {
29
+ private readonly options;
30
+ private readonly endpoint;
31
+ constructor(options: DurableClientOptions);
32
+ submitTask(
33
+ /** Trace context is set by the server's `trace` hook. */
34
+ submission: Omit<TaskSubmission, "trace">, options?: DurableRequestOptions): Promise<TaskSnapshot>;
35
+ taskSnapshot(id: string, options?: DurableRequestOptions): Promise<TaskSnapshot>;
36
+ taskGraph(id: string, options?: DurableRequestOptions): Promise<TaskGraphSnapshot>;
37
+ listTasks(filter: TaskListOptions & {
38
+ sessionId: string;
39
+ }, options?: DurableRequestOptions): Promise<TaskPage>;
40
+ signalTask(id: string, name: string, requestId: string, value: JsonValue, options?: DurableRequestOptions): Promise<void>;
41
+ resolveEffect(id: string, key: string, value: JsonValue, options?: DurableRequestOptions): Promise<void>;
42
+ retryTask(id: string, options?: DurableRequestOptions): Promise<void>;
43
+ cancelTask(id: string, options?: DurableRequestOptions): Promise<void>;
44
+ streamTask(id: string, options?: DurableRequestOptions & {
45
+ after?: number;
46
+ }): AsyncIterable<TaskEvent>;
47
+ private taskPath;
48
+ submitGraph(submission: DurableGraphSubmission, options?: DurableRequestOptions): Promise<DurableGraphSnapshot>;
49
+ graphSnapshot(graphId: string, options?: DurableRequestOptions): Promise<DurableGraphSnapshot>;
50
+ listGraphs(filter: DurableGraphListOptions & {
51
+ sessionId: string;
52
+ }, options?: DurableRequestOptions): Promise<DurableGraphPage>;
53
+ cancelGraph(graphId: string, options?: DurableRequestOptions): Promise<void>;
54
+ streamGraph(graphId: string, options?: DurableRequestOptions & {
55
+ after?: number;
56
+ }): AsyncIterable<DurableGraphEvent>;
57
+ submit(
58
+ /** Trace context is set by the server's `trace` hook. */
59
+ submission: Omit<DurableSubmission, "trace">, options?: DurableSubmitOptions & DurableRequestOptions): Promise<DurableSnapshot>;
60
+ listRuns(filter: DurableListOptions & {
61
+ sessionId: string;
62
+ }, options?: DurableRequestOptions): Promise<DurableRunPage>;
63
+ snapshot(runId: string, options?: DurableRequestOptions): Promise<DurableSnapshot>;
64
+ stream(runId: string, options?: DurableRequestOptions & {
65
+ after?: number;
66
+ }): AsyncIterable<DurableEvent>;
67
+ steer(runId: string, input: AgentSteerInput, options?: DurableSteerOptions & DurableRequestOptions): Promise<AgentSteerReceipt>;
68
+ respond(runId: string, interactionId: string, response: AgentInteractionResponse, options?: DurableRequestOptions): Promise<void>;
69
+ resolveTool(runId: string, operationId: string, output: ToolResultOutput, options?: DurableRequestOptions): Promise<void>;
70
+ retry(runId: string, options?: DurableRequestOptions): Promise<void>;
71
+ cancel(runId: string, options?: DurableRequestOptions): Promise<void>;
72
+ private graphPath;
73
+ private path;
74
+ private request;
68
75
  }
69
-
70
- export { DurableClient, type DurableClientOptions, DurableHttpError, type DurableRequestOptions };
76
+ //# sourceMappingURL=durable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable.d.ts","names":[],"sources":["../src/durable.ts"],"mappings":";;;;YAsCY;EAA0B,cAAc;;YACxC;;EAEV;EACA,eAAe;EACf,UAAU,qBAAqB,cAAc,QAAQ;EACrD,cAAc;;qBAEH,yBAAyB;WAEzB;;WAEA;;WAEA;EAJA,YAAA;;EAEA;;EAEA,4BACT;;;qBAkCS;mBAEkB;mBADZ;EACY,YAAA,SAAS;EAehC;;EAEJ,YAAY,KAAK,0BACjB,UAAS,wBACR,QAAQ;EAKL,aAAa,YAAY,UAAS,wBAA6B,QAAQ;EAOvE,UAAU,YAAY,UAAS,wBAA6B,QAAQ;EAQpE,UACJ,QAAQ;IAAoB;KAC5B,UAAS,wBACR,QAAQ;EAQL,WACJ,YACA,cACA,mBACA,OAAO,WACP,UAAS,wBACR;EAGG,cACJ,YACA,aACA,OAAO,WACP,UAAS,wBACR;EAGG,UAAU,YAAY,UAAS,wBAA6B;EAG5D,WAAW,YAAY,UAAS,wBAA6B;EAG5D,WACL,YACA,UAAS;IAA0B;MAClC,cAAc;UAwBT;EAKF,YACJ,YAAY,wBACZ,UAAS,wBACR,QAAQ;EAKL,cACJ,iBACA,UAAS,wBACR,QAAQ;EAOL,WACJ,QAAQ;IAA4B;KACpC,UAAS,wBACR,QAAQ;EAQL,YAAY,iBAAiB,UAAS,wBAA6B;EAGlE,YACL,iBACA,UAAS;IAA0B;MAClC,cAAc;EAwBX;;EAEJ,YAAY,KAAK,6BACjB,UAAS,uBAAuB,wBAC/B,QAAQ;EAYL,SACJ,QAAQ;IAAuB;KAC/B,UAAS,wBACR,QAAQ;EAQL,SAAS,eAAe,UAAS,wBAA6B,QAAQ;EAOrE,OACL,eACA,UAAS;IAA0B;MAClC,cAAc;EAuBX,MACJ,eACA,OAAO,iBACP,UAAS,sBAAsB,wBAC9B,QAAQ;EAaL,QACJ,eACA,uBACA,UAAU,0BACV,UAAS,wBACR;EAGG,YACJ,eACA,qBACA,QAAQ,kBACR,UAAS,wBACR;EAQG,MAAM,eAAe,UAAS,wBAA6B;EAG3D,OAAO,eAAe,UAAS,wBAA6B;UAI1D;UAKA;UAIM"}