@letta-ai/letta-code 0.28.8 → 0.28.9
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/channels-public.js +1053 -0
- package/dist/channels-public.js.map +13 -0
- package/dist/channels-slack.js +534 -0
- package/dist/channels-slack.js.map +15 -0
- package/dist/types/channels/core-stream.d.ts +35 -0
- package/dist/types/channels/core-stream.d.ts.map +1 -0
- package/dist/types/channels/plugin-types.d.ts +226 -0
- package/dist/types/channels/plugin-types.d.ts.map +1 -0
- package/dist/types/channels/processor.d.ts +27 -0
- package/dist/types/channels/processor.d.ts.map +1 -0
- package/dist/types/channels/progress-builder.d.ts +13 -0
- package/dist/types/channels/progress-builder.d.ts.map +1 -0
- package/dist/types/channels/progress-formatting.d.ts +34 -0
- package/dist/types/channels/progress-formatting.d.ts.map +1 -0
- package/dist/types/channels/slack/ingress-policy.d.ts +72 -0
- package/dist/types/channels/slack/ingress-policy.d.ts.map +1 -0
- package/dist/types/channels/slack/progress.d.ts +7 -0
- package/dist/types/channels/slack/progress.d.ts.map +1 -0
- package/dist/types/channels/slack/public-utils.d.ts +11 -0
- package/dist/types/channels/slack/public-utils.d.ts.map +1 -0
- package/dist/types/channels/slack/sender.d.ts +39 -0
- package/dist/types/channels/slack/sender.d.ts.map +1 -0
- package/dist/types/channels/slack/status-controller.d.ts +35 -0
- package/dist/types/channels/slack/status-controller.d.ts.map +1 -0
- package/dist/types/channels/types.d.ts +766 -0
- package/dist/types/channels/types.d.ts.map +1 -0
- package/dist/types/channels-public.d.ts +8 -0
- package/dist/types/channels-public.d.ts.map +1 -0
- package/dist/types/channels-slack.d.ts +9 -0
- package/dist/types/channels-slack.d.ts.map +1 -0
- package/dist/types/permissions/mode.d.ts +52 -0
- package/dist/types/permissions/mode.d.ts.map +1 -0
- package/dist/types/types/protocol_v2.d.ts +4 -0
- package/dist/types/types/protocol_v2.d.ts.map +1 -1
- package/letta.js +2423 -1788
- package/package.json +33 -2
- package/scripts/isolated-unit-tests.json +12 -0
- package/scripts/run-unit-tests.cjs +5 -2
- package/scripts/source-file-size-baseline.json +4 -4
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/channels/core-stream.ts", "../src/channels/processor.ts", "../src/channels/progress-formatting.ts", "../src/channels/progress-builder.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { ChannelTurnProgressUpdate } from \"./types\";\n\nexport interface LettaStreamErrorParams {\n errorType?: string;\n message: string;\n detail?: string;\n runId?: string;\n}\n\nexport interface CollectLettaSseAssistantTextResult {\n text: string;\n chunkCount: number;\n stopReason?: string;\n}\n\nexport interface CollectLettaSseAssistantTextOptions {\n onDelta?: (delta: unknown) => void | Promise<void>;\n onProgressUpdate?: (\n update: ChannelTurnProgressUpdate,\n ) => void | Promise<void>;\n progressBuilder?: {\n buildUpdates(delta: unknown): ChannelTurnProgressUpdate[];\n };\n}\n\nexport interface FormatLettaStreamCoreErrorOptions {\n includeDetail?: boolean;\n}\n\ninterface LettaSseTextContentPart {\n type: \"text\";\n text: string;\n signature?: string;\n}\n\ninterface LettaSseAssistantMessage {\n message_type: \"assistant_message\";\n content?: string | LettaSseTextContentPart[];\n}\n\ninterface LettaSseErrorMessage {\n message_type: \"error_message\";\n error_type?: string;\n message?: string;\n detail?: string;\n run_id?: string;\n}\n\ninterface LettaSseStopReasonMessage {\n message_type: \"stop_reason\";\n stop_reason?: string;\n}\n\nexport const LETTA_STREAM_NO_ASSISTANT_MESSAGE_ERROR =\n \"No assistant message received in stream\";\n\nexport class LettaStreamCoreError extends Error {\n readonly errorType?: string;\n readonly detail?: string;\n readonly runId?: string;\n\n constructor(params: LettaStreamErrorParams) {\n super(params.message);\n this.name = \"LettaStreamCoreError\";\n this.errorType = params.errorType;\n this.detail = params.detail;\n this.runId = params.runId;\n }\n}\n\nexport class LettaStreamNoAssistantMessageError extends Error {\n constructor() {\n super(LETTA_STREAM_NO_ASSISTANT_MESSAGE_ERROR);\n this.name = \"LettaStreamNoAssistantMessageError\";\n }\n}\n\nfunction normalizeErrorLine(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nexport function formatLettaStreamCoreErrorForChannel(\n error: LettaStreamCoreError,\n options: FormatLettaStreamCoreErrorOptions = {},\n): string {\n const message =\n normalizeErrorLine(error.message) ?? \"Core failed to generate a response.\";\n const detail = normalizeErrorLine(error.detail);\n\n if (options.includeDetail === false || !detail || detail === message) {\n return message;\n }\n\n return `${message}\\n${detail}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nfunction isOptionalString(value: unknown): value is string | undefined {\n return typeof value === \"undefined\" || typeof value === \"string\";\n}\n\nfunction isLettaSseTextContentPart(\n value: unknown,\n): value is LettaSseTextContentPart {\n if (!isRecord(value)) {\n return false;\n }\n return (\n value.type === \"text\" &&\n typeof value.text === \"string\" &&\n isOptionalString(value.signature)\n );\n}\n\nfunction isLettaSseAssistantMessage(\n value: unknown,\n): value is LettaSseAssistantMessage {\n if (!isRecord(value) || value.message_type !== \"assistant_message\") {\n return false;\n }\n const content = value.content;\n return (\n typeof content === \"undefined\" ||\n typeof content === \"string\" ||\n (Array.isArray(content) && content.every(isLettaSseTextContentPart))\n );\n}\n\nfunction isLettaSseErrorMessage(value: unknown): value is LettaSseErrorMessage {\n if (!isRecord(value) || value.message_type !== \"error_message\") {\n return false;\n }\n return (\n isOptionalString(value.error_type) &&\n isOptionalString(value.message) &&\n isOptionalString(value.detail) &&\n isOptionalString(value.run_id)\n );\n}\n\nfunction isLettaSseStopReasonMessage(\n value: unknown,\n): value is LettaSseStopReasonMessage {\n if (!isRecord(value) || value.message_type !== \"stop_reason\") {\n return false;\n }\n return isOptionalString(value.stop_reason);\n}\n\nfunction coreErrorFromMessage(\n message: LettaSseErrorMessage,\n): LettaStreamCoreError {\n return new LettaStreamCoreError({\n errorType: message.error_type,\n message: message.message ?? \"Core failed to generate a response.\",\n detail: message.detail,\n runId: message.run_id,\n });\n}\n\nfunction collectAssistantContent(message: LettaSseAssistantMessage): string[] {\n if (typeof message.content === \"string\") {\n return [message.content];\n }\n if (Array.isArray(message.content)) {\n return message.content.map((part) => part.text);\n }\n return [];\n}\n\nexport async function collectLettaSseAssistantText(\n body: ReadableStream<Uint8Array>,\n options: CollectLettaSseAssistantTextOptions = {},\n): Promise<CollectLettaSseAssistantTextResult> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n const assistantMessages: string[] = [];\n let stopReason: string | undefined;\n\n async function processData(data: string): Promise<void> {\n if (data === \"[DONE]\") {\n return;\n }\n\n const parsed: unknown = JSON.parse(data);\n await options.onDelta?.(parsed);\n const progressUpdates = options.progressBuilder?.buildUpdates(parsed) ?? [];\n for (const update of progressUpdates) {\n await options.onProgressUpdate?.(update);\n }\n\n if (isLettaSseErrorMessage(parsed)) {\n throw coreErrorFromMessage(parsed);\n }\n if (isLettaSseAssistantMessage(parsed)) {\n assistantMessages.push(...collectAssistantContent(parsed));\n return;\n }\n if (isLettaSseStopReasonMessage(parsed)) {\n stopReason = parsed.stop_reason;\n }\n }\n\n async function processLine(line: string): Promise<void> {\n if (!line.trim() || !line.startsWith(\"data: \")) {\n return;\n }\n await processData(line.slice(6));\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n await processLine(line);\n }\n }\n\n const flushed = decoder.decode();\n if (flushed) {\n buffer += flushed;\n }\n if (buffer) {\n await processLine(buffer);\n }\n } finally {\n reader.releaseLock();\n }\n\n const text = assistantMessages.join(\" \").trim();\n if (!text) {\n throw new LettaStreamNoAssistantMessageError();\n }\n\n return {\n text,\n chunkCount: assistantMessages.length,\n stopReason,\n };\n}\n",
|
|
6
|
+
"import type {\n ChannelRoute,\n ChannelThreadContext,\n ChannelThreadContextEntry,\n ChannelTurnSource,\n InboundChannelMessage,\n OutboundChannelMessage,\n} from \"./types\";\n\nexport interface BuildChannelTurnSourceParams {\n message: InboundChannelMessage;\n route: ChannelRoute;\n}\n\nexport interface FormatInboundChannelMessageParams {\n message: InboundChannelMessage;\n}\n\nexport interface ChannelBatchMessage {\n text: string;\n senderId?: string;\n senderName?: string;\n timestamp?: string | number;\n channelTurnSource?: ChannelTurnSource;\n}\n\nexport interface FormatBatchedChannelMessagesParams {\n messages: ChannelBatchMessage[];\n}\n\nexport interface BuildOutboundChannelMessageFromTurnSourceParams {\n turnSource: ChannelTurnSource;\n text: string;\n}\n\nfunction formatSenderLabel(entry: ChannelThreadContextEntry): string {\n const senderName = entry.senderName?.trim();\n const senderId = entry.senderId?.trim();\n if (senderName && senderId && senderName !== senderId) {\n return `${senderName}:${senderId}`;\n }\n if (senderName) {\n return senderName;\n }\n if (senderId) {\n return senderId;\n }\n return \"unknown\";\n}\n\nfunction formatThreadContextEntry(entry: ChannelThreadContextEntry): string {\n const messageId = entry.messageId ? `<${entry.messageId}>` : \"\";\n return `[${formatSenderLabel(entry)}]${messageId}:${entry.text}`;\n}\n\nfunction formatThreadContext(context: ChannelThreadContext): string {\n const lines: string[] = [];\n const label = context.label?.trim();\n lines.push(label ? `--- ${label} ---` : \"--- Thread Context ---\");\n if (context.starter) {\n lines.push(`starter: ${formatThreadContextEntry(context.starter)}`);\n }\n for (const entry of context.history ?? []) {\n lines.push(formatThreadContextEntry(entry));\n }\n lines.push(\"--- End Thread Context ---\");\n return `${lines.join(\"\\n\")}\\n\\n`;\n}\n\nfunction formatInboundSender(message: InboundChannelMessage): string {\n const senderName = message.senderName?.trim();\n if (senderName && senderName !== message.senderId) {\n return `${senderName}:${message.senderId}`;\n }\n return message.senderId;\n}\n\nexport function buildChannelTurnSource(\n params: BuildChannelTurnSourceParams,\n): ChannelTurnSource {\n const { message, route } = params;\n return {\n channel: message.channel,\n accountId: message.accountId ?? route.accountId,\n chatId: message.chatId,\n chatType: message.chatType ?? route.chatType,\n senderId: message.senderId,\n senderTeamId: message.senderTeamId,\n messageId: message.messageId,\n threadId: message.threadId ?? route.threadId ?? null,\n agentId: route.agentId,\n conversationId: route.conversationId,\n };\n}\n\nexport function formatInboundChannelMessageForAgent(\n params: FormatInboundChannelMessageParams,\n): string {\n const { message } = params;\n const context = message.threadContext\n ? formatThreadContext(message.threadContext)\n : \"\";\n const chatLabel = message.chatLabel?.trim() || message.chatId;\n const timestamp = new Date(message.timestamp).toISOString();\n const prefix = `[${message.channel}:${chatLabel}][${formatInboundSender(\n message,\n )}]<${timestamp}>:`;\n return `${context}${prefix}${message.text}`;\n}\n\nfunction formatLegacyBatchedSender(message: ChannelBatchMessage): string {\n const senderName = message.senderName?.trim();\n const senderId = message.senderId?.trim() ?? \"unknown\";\n if (senderName && senderName !== senderId) {\n return `${senderName}:${senderId}`;\n }\n return senderId;\n}\n\nexport function formatBatchedChannelMessagesForAgent(\n params: FormatBatchedChannelMessagesParams,\n): string {\n const { messages } = params;\n if (messages.length === 0) {\n return \"\";\n }\n const firstMessage = messages[0];\n if (messages.length === 1 && firstMessage) {\n return firstMessage.text;\n }\n\n if (messages.every((message) => message.channelTurnSource)) {\n const formatted = messages.map((message) => message.text).join(\"\\n\");\n return `--- Batched Channel Messages (${messages.length}) ---\\n${formatted}\\n--- End Batched Channel Messages ---`;\n }\n\n const formatted = messages\n .map((message) => {\n const timestamp = message.timestamp ?? \"unknown\";\n return `[user@${formatLegacyBatchedSender(message)}]<${timestamp}>:${message.text}`;\n })\n .join(\"\\n\");\n\n return `--- Batched Messages (${messages.length}) ---\\n${formatted}\\n--- End Batched Messages ---`;\n}\n\nexport function buildOutboundChannelMessageFromTurnSource(\n params: BuildOutboundChannelMessageFromTurnSourceParams,\n): OutboundChannelMessage {\n const { turnSource } = params;\n return {\n channel: turnSource.channel,\n accountId: turnSource.accountId,\n chatId: turnSource.chatId,\n threadId: turnSource.threadId,\n text: params.text,\n agentId: turnSource.agentId,\n conversationId: turnSource.conversationId,\n };\n}\n",
|
|
7
|
+
"const MAX_PROGRESS_TEXT_LENGTH = 140;\nexport const MAX_PROGRESS_DETAILS_LENGTH = 180;\nconst MAX_SHELL_PROGRESS_DETAILS_LENGTH = 64;\nconst MAX_SUBAGENT_PROGRESS_DETAILS_LENGTH = 180;\nconst ESCAPE_CODE = String.fromCharCode(27);\nconst ANSI_ESCAPE_RE = new RegExp(`${ESCAPE_CODE}\\\\[[0-9;?]*[ -/]*[@-~]`, \"g\");\nconst SECRET_ASSIGNMENT_RE =\n /\\b([A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|PASS|API[_-]?KEY|ACCESS[_-]?KEY)[A-Z0-9_]*)\\s*=\\s*(\"[^\"]*\"|'[^']*'|\\S+)/gi;\nconst SECRET_JSON_RE =\n /([\"']?(?:token|secret|password|api[_-]?key|access[_-]?key)[\"']?\\s*[:=]\\s*)(\"[^\"]*\"|'[^']*'|\\S+)/gi;\n\nfunction isTaskTool(name: string): boolean {\n return (\n name === \"Task\" || name === \"task\" || name === \"Agent\" || name === \"agent\"\n );\n}\n\nfunction isShellTool(name: string): boolean {\n const normalized = name.toLowerCase();\n return (\n normalized === \"bash\" ||\n normalized === \"exec_command\" ||\n normalized === \"shell_command\" ||\n normalized === \"shell\" ||\n normalized === \"runshellcommand\"\n );\n}\n\nfunction isWebSearchTool(name: string): boolean {\n const normalized = name.toLowerCase();\n return normalized === \"web_search\" || normalized === \"websearch\";\n}\n\nfunction isSearchTool(name: string): boolean {\n const normalized = name.toLowerCase();\n return (\n normalized === \"grep\" ||\n normalized === \"grep_files\" ||\n normalized === \"grepfiles\" ||\n normalized === \"search_file_content\" ||\n normalized === \"searchfilecontent\"\n );\n}\n\nfunction isGlobTool(name: string): boolean {\n const normalized = name.toLowerCase();\n return normalized === \"glob\" || normalized === \"glob_gemini\";\n}\n\nfunction isFileReadTool(name: string): boolean {\n const normalized = name.toLowerCase();\n return (\n normalized === \"read\" ||\n normalized === \"read_file\" ||\n normalized === \"readfile\" ||\n normalized === \"read_file_gemini\" ||\n normalized === \"readfilegemini\"\n );\n}\n\nfunction isFileWriteTool(name: string): boolean {\n const normalized = name.toLowerCase();\n return (\n normalized === \"write\" ||\n normalized === \"write_file\" ||\n normalized === \"writefile\" ||\n normalized === \"write_file_gemini\" ||\n normalized === \"writefilegemini\"\n );\n}\n\nfunction isFileEditTool(name: string): boolean {\n const normalized = name.toLowerCase();\n return (\n normalized === \"edit\" ||\n normalized === \"multi_edit\" ||\n normalized === \"multiedit\" ||\n normalized === \"replace\" ||\n normalized === \"apply_patch\" ||\n normalized === \"applypatch\"\n );\n}\n\nfunction getPathBaseName(filePath: string): string {\n return filePath.split(/[\\\\/]/).filter(Boolean).pop() ?? filePath;\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function firstNonEmptyString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nexport function truncateChannelProgressText(\n value: string,\n maxLength: number,\n marker = \"...\",\n): string {\n if (value.length <= maxLength) {\n return value;\n }\n if (maxLength <= marker.length) {\n return marker.slice(0, Math.max(0, maxLength));\n }\n return `${value.slice(0, maxLength - marker.length).trimEnd()}${marker}`;\n}\n\nfunction replaceControlCharacters(value: string): string {\n let result = \"\";\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index] ?? \"\";\n const code = character.charCodeAt(0);\n result +=\n code <= 8 ||\n code === 11 ||\n code === 12 ||\n (code >= 14 && code <= 31) ||\n code === 127\n ? \" \"\n : character;\n }\n return result;\n}\n\n/**\n * Shared sanitization core for channel-facing progress text: strips ANSI\n * escapes and control characters, redacts secret-looking assignments, and\n * neutralizes platform mentions. Platform adapters layer their own escaping\n * (and truncation marker) on top of this instead of maintaining parallel\n * redaction rules.\n */\nexport function sanitizeChannelProgressCore(value: unknown): string {\n const raw = typeof value === \"string\" ? value : String(value ?? \"\");\n const redacted = raw\n .replace(ANSI_ESCAPE_RE, \"\")\n .replace(SECRET_ASSIGNMENT_RE, \"$1=[redacted]\")\n .replace(SECRET_JSON_RE, \"$1[redacted]\");\n return replaceControlCharacters(redacted)\n .replace(/[\\r\\n\\t]+/g, \" \")\n .replace(/@(?=channel|here|everyone|[A-Za-z0-9._-]+)/gi, \"@\\u200b\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function sanitizeChannelProgressText(\n value: unknown,\n maxLength: number = MAX_PROGRESS_TEXT_LENGTH,\n): string {\n return truncateChannelProgressText(\n sanitizeChannelProgressCore(value),\n maxLength,\n );\n}\n\nexport function sanitizeChannelProgressIdentifier(\n value: unknown,\n fallback: string,\n): string {\n const text = sanitizeChannelProgressText(value, 64);\n if (!text) {\n return fallback;\n }\n const cleaned = text.replace(/[^A-Za-z0-9_.:/ -]/g, \"\").trim();\n return cleaned || fallback;\n}\n\nfunction summarizeShellCommand(command: string): string {\n const normalized = sanitizeChannelProgressText(command, 10_000);\n if (!normalized) {\n return \"\";\n }\n\n // Preview the first command segment (or two short ones) and drop pipelines\n // so multi-step shell invocations stay readable at Slack-row lengths.\n const segments = normalized\n .split(/\\s*;\\s*/)\n .map((segment) => segment.trim())\n .filter(Boolean);\n const firstTwoSegments = segments.slice(0, 2).join(\"; \");\n const previewSource =\n firstTwoSegments.length > 0 && firstTwoSegments.length <= 70\n ? firstTwoSegments\n : (segments[0] ?? normalized);\n const withoutPipeline = previewSource.split(/\\s*\\|\\s*/)[0] ?? previewSource;\n\n return sanitizeChannelProgressText(\n withoutPipeline.trim() || normalized,\n MAX_SHELL_PROGRESS_DETAILS_LENGTH,\n );\n}\n\ntype SkillDescriptionLookup =\n | ReadonlyMap<string, string>\n | Readonly<Record<string, string | undefined>>;\n\nexport type ChannelTurnProgressBuilderOptions = {\n skillDescriptionsByName?: SkillDescriptionLookup;\n};\n\nexport type ToolCallSummary = {\n id?: string;\n name?: string;\n argumentsText?: string;\n};\n\nfunction getSkillNameFromArguments(\n parsedArguments: Record<string, unknown>,\n): string | undefined {\n return firstNonEmptyString(parsedArguments.skill, parsedArguments.skillName);\n}\n\nfunction getFragmentedSkillName(summary: ToolCallSummary): string | undefined {\n const skillMatch = summary.argumentsText?.match(\n /\"(?:skill|skillName)\"\\s*:\\s*\"([^\"]+)\"/,\n );\n return skillMatch?.[1];\n}\n\nfunction resolveSkillDescription(\n skillName: string | undefined,\n options: ChannelTurnProgressBuilderOptions | undefined,\n): string | undefined {\n const lookup = options?.skillDescriptionsByName;\n if (!skillName || !lookup) {\n return undefined;\n }\n if (\"get\" in lookup && typeof lookup.get === \"function\") {\n return firstNonEmptyString(lookup.get(skillName));\n }\n return firstNonEmptyString(\n (lookup as Readonly<Record<string, string | undefined>>)[skillName],\n );\n}\n\nfunction formatSkillProgressTitleFromName(\n skillName: string | undefined,\n): string | undefined {\n const sanitized = sanitizeChannelProgressText(\n skillName,\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized ? `Skill: ${sanitized}` : undefined;\n}\n\nfunction formatShellProgressDetailsFromArguments(\n parsedArguments: Record<string, unknown>,\n): string | undefined {\n const description = firstNonEmptyString(parsedArguments.description);\n if (description) {\n return (\n sanitizeChannelProgressText(description, MAX_PROGRESS_DETAILS_LENGTH) ||\n undefined\n );\n }\n\n const commandPreview = firstNonEmptyString(\n parsedArguments.command,\n parsedArguments.cmd,\n );\n return summarizeShellCommand(commandPreview ?? \"\") || undefined;\n}\n\nfunction formatFragmentedShellProgressDetails(\n summary: ToolCallSummary,\n): string | undefined {\n const descriptionMatch = summary.argumentsText?.match(\n /\"description\"\\s*:\\s*\"([^\"]+)\"/,\n );\n if (descriptionMatch?.[1]) {\n return (\n sanitizeChannelProgressText(\n descriptionMatch[1],\n MAX_PROGRESS_DETAILS_LENGTH,\n ) || undefined\n );\n }\n\n // Do not expose command previews from incomplete shell-tool JSON. Slack's\n // task stream appends, rather than replaces, changed details for the same\n // task id; sending a provisional command before the streamed description\n // arrives leaves both strings glued together in the preview.\n return undefined;\n}\n\nfunction formatSubagentProgressDetailsFromArguments(\n parsedArguments: Record<string, unknown>,\n): string | undefined {\n const preview = firstNonEmptyString(\n parsedArguments.prompt,\n parsedArguments.description,\n parsedArguments.subject,\n );\n const sanitized = sanitizeChannelProgressText(\n preview,\n MAX_SUBAGENT_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n}\n\nfunction formatFragmentedSubagentProgressDetails(\n summary: ToolCallSummary,\n): string | undefined {\n const previewMatch = summary.argumentsText?.match(\n /\"(?:prompt|description|subject)\"\\s*:\\s*\"([^\"]+)\"/,\n );\n if (!previewMatch?.[1]) {\n return undefined;\n }\n const sanitized = sanitizeChannelProgressText(\n previewMatch[1],\n MAX_SUBAGENT_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n}\n\nexport type ToolReturnSummary = {\n summary: ToolCallSummary;\n status: \"completed\" | \"error\";\n errorDetails?: string;\n};\n\nexport function parseToolArguments(\n value: string | undefined,\n): Record<string, unknown> | null {\n if (!value) {\n return null;\n }\n try {\n return asRecord(JSON.parse(value));\n } catch {\n return null;\n }\n}\n\nfunction isFetchWebpageToolName(name: string | undefined): boolean {\n return (\n name === \"fetch_webpage\" ||\n name === \"FetchWebpage\" ||\n name === \"fetchWebpage\"\n );\n}\n\nexport function isSkillToolName(name: string | undefined): boolean {\n if (!name) {\n return false;\n }\n const normalized = name.includes(\".\")\n ? name.slice(name.lastIndexOf(\".\") + 1)\n : name;\n return normalized === \"Skill\" || normalized === \"skill\";\n}\n\nfunction isFilePathToolName(name: string): boolean {\n return isFileReadTool(name) || isFileWriteTool(name) || isFileEditTool(name);\n}\n\nfunction getFileToolKind(name: string): \"read\" | \"write\" | \"update\" | null {\n if (isFileReadTool(name)) {\n return \"read\";\n }\n if (isFileWriteTool(name)) {\n return \"write\";\n }\n if (isFileEditTool(name)) {\n return \"update\";\n }\n return null;\n}\n\nfunction countProgressLines(value: string | undefined): number {\n return value ? value.split(\"\\n\").length : 0;\n}\n\ntype LineChangeSummary = {\n additions?: number;\n deletions?: number;\n};\n\nfunction formatLineChangeSummary(summary: LineChangeSummary | null): string {\n if (!summary) {\n return \"\";\n }\n const parts: string[] = [];\n if (summary.additions !== undefined) {\n parts.push(`+${summary.additions}`);\n }\n if (summary.deletions !== undefined) {\n parts.push(`-${summary.deletions}`);\n }\n return parts.length > 0 ? ` ${parts.join(\" \")}` : \"\";\n}\n\nfunction extractFilePathFromArguments(\n parsedArguments: Record<string, unknown>,\n): string | undefined {\n return firstNonEmptyString(\n parsedArguments.file_path,\n parsedArguments.filePath,\n parsedArguments.path,\n );\n}\n\nfunction formatProgressFileName(\n filePath: string | undefined,\n): string | undefined {\n if (!filePath) {\n return undefined;\n }\n const fileName = getPathBaseName(filePath) || filePath;\n return (\n sanitizeChannelProgressText(fileName, MAX_PROGRESS_DETAILS_LENGTH) ||\n undefined\n );\n}\n\nfunction getEditLineChangeSummary(\n parsedArguments: Record<string, unknown>,\n): LineChangeSummary | null {\n const oldString = firstNonEmptyString(parsedArguments.old_string);\n const newString = firstNonEmptyString(parsedArguments.new_string);\n if (oldString === undefined || newString === undefined) {\n return null;\n }\n return {\n additions: countProgressLines(newString),\n deletions: countProgressLines(oldString),\n };\n}\n\nfunction getMultiEditLineChangeSummary(\n parsedArguments: Record<string, unknown>,\n): LineChangeSummary | null {\n if (!Array.isArray(parsedArguments.edits)) {\n return null;\n }\n let additions = 0;\n let deletions = 0;\n let counted = false;\n for (const edit of parsedArguments.edits) {\n const record = asRecord(edit);\n if (!record) {\n continue;\n }\n const oldString = firstNonEmptyString(record.old_string);\n const newString = firstNonEmptyString(record.new_string);\n if (oldString === undefined || newString === undefined) {\n continue;\n }\n additions += countProgressLines(newString);\n deletions += countProgressLines(oldString);\n counted = true;\n }\n return counted ? { additions, deletions } : null;\n}\n\nfunction getWriteLineChangeSummary(\n parsedArguments: Record<string, unknown>,\n): LineChangeSummary | null {\n const content = firstNonEmptyString(parsedArguments.content);\n if (content === undefined) {\n return null;\n }\n return {\n additions: countProgressLines(content),\n };\n}\n\nfunction getFileLineChangeSummary(\n name: string,\n parsedArguments: Record<string, unknown>,\n): LineChangeSummary | null {\n if (isFileWriteTool(name)) {\n return getWriteLineChangeSummary(parsedArguments);\n }\n if (name === \"MultiEdit\" || name === \"multi_edit\") {\n return getMultiEditLineChangeSummary(parsedArguments);\n }\n if (isFileEditTool(name)) {\n return getEditLineChangeSummary(parsedArguments);\n }\n return null;\n}\n\nfunction getFileToolVerb(\n kind: \"read\" | \"write\" | \"update\",\n status: \"started\" | \"completed\" | \"error\",\n): string {\n if (status === \"error\") {\n if (kind === \"read\") {\n return \"Tried to read\";\n }\n if (kind === \"write\") {\n return \"Tried to write\";\n }\n return \"Tried to update\";\n }\n if (status === \"started\") {\n if (kind === \"read\") {\n return \"Reading\";\n }\n if (kind === \"write\") {\n return \"Writing\";\n }\n return \"Updating\";\n }\n if (kind === \"read\") {\n return \"Read\";\n }\n if (kind === \"write\") {\n return \"Wrote\";\n }\n return \"Updated\";\n}\n\nfunction formatFileToolProgressTitle(\n name: string,\n parsedArguments: Record<string, unknown>,\n status: \"started\" | \"completed\" | \"error\",\n): string | undefined {\n const kind = getFileToolKind(name);\n if (!kind) {\n return undefined;\n }\n const fileName = formatProgressFileName(\n extractFilePathFromArguments(parsedArguments),\n );\n if (!fileName) {\n return undefined;\n }\n const stats =\n status === \"completed\"\n ? formatLineChangeSummary(getFileLineChangeSummary(name, parsedArguments))\n : \"\";\n return `${getFileToolVerb(kind, status)} ${fileName}${stats}`;\n}\n\nfunction formatFragmentedFileToolProgressTitle(\n summary: ToolCallSummary,\n status: \"started\" | \"completed\" | \"error\",\n): string | undefined {\n if (!summary.name || !summary.argumentsText) {\n return undefined;\n }\n const kind = getFileToolKind(summary.name);\n if (!kind) {\n return undefined;\n }\n const filePathMatch = summary.argumentsText.match(\n /\"(?:file_path|filePath|path)\"\\s*:\\s*\"([^\"]+)\"/,\n );\n const fileName = formatProgressFileName(filePathMatch?.[1]);\n if (!fileName) {\n return undefined;\n }\n return `${getFileToolVerb(kind, status)} ${fileName}`;\n}\n\nexport function formatToolProgressTitle(\n summary: ToolCallSummary,\n status: \"started\" | \"completed\" | \"error\",\n): string | undefined {\n if (!summary.name || !summary.argumentsText) {\n return undefined;\n }\n\n const parsedArguments = parseToolArguments(summary.argumentsText);\n if (parsedArguments) {\n if (isSkillToolName(summary.name)) {\n return formatSkillProgressTitleFromName(\n getSkillNameFromArguments(parsedArguments),\n );\n }\n if (isFilePathToolName(summary.name)) {\n return formatFileToolProgressTitle(summary.name, parsedArguments, status);\n }\n return undefined;\n }\n\n if (isSkillToolName(summary.name)) {\n return formatSkillProgressTitleFromName(getFragmentedSkillName(summary));\n }\n if (isFilePathToolName(summary.name)) {\n return formatFragmentedFileToolProgressTitle(summary, status);\n }\n return undefined;\n}\n\nfunction formatSkillProgressDetailsFromArguments(\n parsedArguments: Record<string, unknown>,\n options: ChannelTurnProgressBuilderOptions | undefined,\n): string | undefined {\n const skillName = getSkillNameFromArguments(parsedArguments);\n const detail = resolveSkillDescription(skillName, options) ?? skillName;\n const sanitized = sanitizeChannelProgressText(\n detail,\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n}\n\nfunction formatFragmentedSkillProgressDetails(\n summary: ToolCallSummary,\n options: ChannelTurnProgressBuilderOptions | undefined,\n): string | undefined {\n const skillName = getFragmentedSkillName(summary);\n const detail = resolveSkillDescription(skillName, options) ?? skillName;\n const sanitized = sanitizeChannelProgressText(\n detail,\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n}\n\nexport function formatToolProgressDetails(\n summary: ToolCallSummary,\n options?: ChannelTurnProgressBuilderOptions,\n): string | undefined {\n if (!summary.name || !summary.argumentsText) {\n return undefined;\n }\n\n // Try JSON parse first (complete arguments)\n const parsedArguments = parseToolArguments(summary.argumentsText);\n if (parsedArguments) {\n if (isWebSearchTool(summary.name)) {\n const query = firstNonEmptyString(parsedArguments.query);\n const sanitized = sanitizeChannelProgressText(\n query,\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n }\n\n if (isFetchWebpageToolName(summary.name)) {\n const url = firstNonEmptyString(parsedArguments.url);\n const sanitized = sanitizeChannelProgressText(\n url,\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n }\n\n if (isSkillToolName(summary.name)) {\n return formatSkillProgressDetailsFromArguments(parsedArguments, options);\n }\n\n if (isTaskTool(summary.name)) {\n return formatSubagentProgressDetailsFromArguments(parsedArguments);\n }\n\n if (isShellTool(summary.name)) {\n return formatShellProgressDetailsFromArguments(parsedArguments);\n }\n\n if (isFilePathToolName(summary.name)) {\n const filePath = firstNonEmptyString(\n parsedArguments.file_path,\n parsedArguments.filePath,\n parsedArguments.path,\n );\n const sanitized = sanitizeChannelProgressText(\n filePath,\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n }\n\n if (isGlobTool(summary.name) || isSearchTool(summary.name)) {\n const pattern = firstNonEmptyString(parsedArguments.pattern);\n const sanitized = sanitizeChannelProgressText(\n pattern,\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n }\n\n return undefined;\n }\n\n // Fallback: extract known preview fields from fragmented/incomplete JSON.\n if (isShellTool(summary.name)) {\n return formatFragmentedShellProgressDetails(summary);\n }\n\n if (isSkillToolName(summary.name)) {\n return formatFragmentedSkillProgressDetails(summary, options);\n }\n\n if (isTaskTool(summary.name)) {\n return formatFragmentedSubagentProgressDetails(summary);\n }\n\n if (isFilePathToolName(summary.name)) {\n const filePathMatch = summary.argumentsText.match(\n /\"file_path\"\\s*:\\s*\"([^\"]+)\"/,\n );\n if (filePathMatch?.[1]) {\n const sanitized = sanitizeChannelProgressText(\n filePathMatch[1],\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n }\n }\n\n return undefined;\n}\n",
|
|
8
|
+
"import {\n asRecord,\n type ChannelTurnProgressBuilderOptions,\n firstNonEmptyString,\n formatToolProgressDetails,\n formatToolProgressTitle,\n MAX_PROGRESS_DETAILS_LENGTH,\n parseToolArguments,\n sanitizeChannelProgressIdentifier,\n sanitizeChannelProgressText,\n type ToolCallSummary,\n type ToolReturnSummary,\n} from \"./progress-formatting\";\nimport type { ChannelTurnProgressUpdate } from \"./types\";\n\nfunction getMessageType(delta: Record<string, unknown>): string | null {\n return firstNonEmptyString(delta.message_type, delta.messageType) ?? null;\n}\n\nfunction getRunId(delta: Record<string, unknown>): string | undefined {\n return firstNonEmptyString(delta.run_id, delta.runId);\n}\n\nfunction withRunId(\n update: Omit<ChannelTurnProgressUpdate, \"runId\">,\n runId?: string,\n): ChannelTurnProgressUpdate {\n return {\n ...update,\n ...(runId ? { runId } : {}),\n };\n}\n\nfunction getCommandId(delta: Record<string, unknown>): string {\n const command = firstNonEmptyString(delta.command_id, delta.commandId);\n return sanitizeChannelProgressIdentifier(command, \"command\");\n}\n\nfunction getSlashCommand(delta: Record<string, unknown>): string {\n const commandId = firstNonEmptyString(delta.command_id, delta.commandId);\n const command = commandId ? `/${commandId.replace(/^\\/+/, \"\")}` : \"command\";\n return sanitizeChannelProgressIdentifier(command, \"command\");\n}\n\nfunction getToolStatus(delta: Record<string, unknown>): \"completed\" | \"error\" {\n const status = firstNonEmptyString(delta.status)?.toLowerCase();\n return status === \"error\" || status === \"failed\" ? \"error\" : \"completed\";\n}\n\nfunction stringifyProgressValue(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === undefined || value === null) {\n return undefined;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction formatToolErrorDetails(\n record: Record<string, unknown>,\n): string | undefined {\n const toolReturn = record.tool_return ?? record.toolReturn;\n const toolReturnRecord = asRecord(toolReturn);\n const preview = firstNonEmptyString(\n record.stderr,\n record.error,\n record.message,\n toolReturnRecord?.stderr,\n toolReturnRecord?.error,\n toolReturnRecord?.message,\n toolReturnRecord?.output,\n stringifyProgressValue(toolReturn),\n );\n const sanitized = sanitizeChannelProgressText(\n preview,\n MAX_PROGRESS_DETAILS_LENGTH,\n );\n return sanitized || undefined;\n}\n\nfunction toolNameForMessage(summary: ToolCallSummary | undefined): string {\n return summary?.name ? `: ${summary.name}` : \"\";\n}\n\n/**\n * Builds sanitized channel progress updates from stream deltas for a single\n * turn. Instances accumulate fragmented tool-call arguments across deltas,\n * so they must be scoped to one conversation turn (create one per turn and\n * drop it when the turn finishes) rather than shared across conversations.\n */\nexport type ChannelTurnProgressBuilder = {\n buildUpdates(delta: unknown): ChannelTurnProgressUpdate[];\n};\n\nexport function createChannelTurnProgressBuilder(\n options: ChannelTurnProgressBuilderOptions = {},\n): ChannelTurnProgressBuilder {\n // Fragmented tool arguments and names accumulated across stream deltas,\n // keyed by tool_call_id. Entries are dropped when the tool return arrives;\n // the whole builder is dropped with the turn.\n const argumentsByToolCallId = new Map<string, string>();\n const namesByToolCallId = new Map<string, string>();\n\n // Wire shapes (see ToolCall / ToolCallDelta in @letta-ai/letta-client and\n // the local backend projections): flat `tool_call_id` / `name` /\n // `arguments` fields, delivered either as `tool_calls` (array or single\n // delta object) or the deprecated `tool_call`.\n function extractToolCallSummary(value: unknown): ToolCallSummary | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n const id = firstNonEmptyString(record.tool_call_id);\n const cacheId = id\n ? sanitizeChannelProgressIdentifier(id, \"tool-call\")\n : undefined;\n const extractedName = firstNonEmptyString(record.name);\n if (cacheId && extractedName) {\n namesByToolCallId.set(cacheId, extractedName);\n }\n const resolvedName =\n extractedName ?? (cacheId ? namesByToolCallId.get(cacheId) : undefined);\n const rawArguments =\n typeof record.arguments === \"string\" && record.arguments.length > 0\n ? record.arguments\n : asRecord(record.arguments)\n ? JSON.stringify(record.arguments)\n : undefined;\n\n // Accumulate fragmented arguments across stream deltas for the same tool\n // call. A fragment that already parses as complete JSON replaces earlier\n // partial state (some streams first expose only command content, then\n // later re-send full arguments including the description).\n let argumentsText: string | undefined;\n if (cacheId && rawArguments !== undefined) {\n const existing = argumentsByToolCallId.get(cacheId);\n if (parseToolArguments(rawArguments)) {\n argumentsByToolCallId.set(cacheId, rawArguments);\n argumentsText = rawArguments;\n } else if (existing) {\n if (parseToolArguments(existing)) {\n argumentsText = existing;\n } else {\n const accumulated = existing + rawArguments;\n argumentsByToolCallId.set(cacheId, accumulated);\n argumentsText = accumulated;\n }\n } else {\n argumentsByToolCallId.set(cacheId, rawArguments);\n argumentsText = rawArguments;\n }\n } else if (!id && rawArguments !== undefined) {\n argumentsText = rawArguments;\n }\n\n if (!id && !resolvedName) {\n return null;\n }\n return {\n ...(cacheId ? { id: cacheId } : {}),\n ...(resolvedName\n ? { name: sanitizeChannelProgressIdentifier(resolvedName, \"tool\") }\n : {}),\n ...(argumentsText ? { argumentsText } : {}),\n };\n }\n\n function extractClientToolSummary(\n record: Record<string, unknown>,\n ): ToolCallSummary | null {\n const id = firstNonEmptyString(record.tool_call_id, record.toolCallId);\n const cacheId = id\n ? sanitizeChannelProgressIdentifier(id, \"tool-call\")\n : undefined;\n const extractedName = firstNonEmptyString(\n record.tool_name,\n record.toolName,\n record.name,\n );\n if (cacheId && extractedName) {\n namesByToolCallId.set(cacheId, extractedName);\n }\n const resolvedName =\n extractedName ?? (cacheId ? namesByToolCallId.get(cacheId) : undefined);\n const rawArguments = firstNonEmptyString(\n record.tool_args,\n record.toolArgs,\n record.arguments,\n );\n if (cacheId && rawArguments) {\n argumentsByToolCallId.set(cacheId, rawArguments);\n }\n const argumentsText =\n rawArguments ??\n (cacheId ? argumentsByToolCallId.get(cacheId) : undefined);\n if (!cacheId && !resolvedName) {\n return null;\n }\n return {\n ...(cacheId ? { id: cacheId } : {}),\n ...(resolvedName\n ? { name: sanitizeChannelProgressIdentifier(resolvedName, \"tool\") }\n : {}),\n ...(argumentsText ? { argumentsText } : {}),\n };\n }\n\n function extractToolCalls(delta: Record<string, unknown>): ToolCallSummary[] {\n const candidates: unknown[] = Array.isArray(delta.tool_calls)\n ? delta.tool_calls\n : delta.tool_calls\n ? [delta.tool_calls]\n : delta.tool_call\n ? [delta.tool_call]\n : [];\n\n const summaries: ToolCallSummary[] = [];\n const seen = new Set<string>();\n for (const candidate of candidates) {\n const summary = extractToolCallSummary(candidate);\n if (!summary) {\n continue;\n }\n const key = `${summary.id ?? \"\"}:${summary.name ?? \"\"}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n summaries.push(summary);\n }\n return summaries;\n }\n\n function extractToolReturns(\n delta: Record<string, unknown>,\n ): ToolReturnSummary[] {\n const candidates: unknown[] = Array.isArray(delta.tool_returns)\n ? delta.tool_returns\n : [delta];\n\n const summaries: ToolReturnSummary[] = [];\n const seen = new Set<string>();\n for (const candidate of candidates) {\n const record = asRecord(candidate);\n if (!record) {\n continue;\n }\n const summary = extractToolCallSummary(record);\n if (!summary) {\n continue;\n }\n const key = `${summary.id ?? \"\"}:${summary.name ?? \"\"}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n const status = getToolStatus(record);\n summaries.push({\n summary,\n status,\n ...(status === \"error\"\n ? { errorDetails: formatToolErrorDetails(record) }\n : {}),\n });\n }\n return summaries;\n }\n\n function buildToolCallUpdates(\n record: Record<string, unknown>,\n runId: string | undefined,\n ): ChannelTurnProgressUpdate[] {\n const tools = extractToolCalls(record);\n const updates: ChannelTurnProgressUpdate[] = [];\n for (const tool of tools) {\n const toolDetails = formatToolProgressDetails(tool, options);\n const toolTitle = formatToolProgressTitle(tool, \"started\");\n updates.push(\n withRunId(\n {\n kind: \"tool\",\n state: \"started\",\n message: `Preparing tool${toolNameForMessage(tool)}`,\n ...(tool.id ? { toolCallId: tool.id } : {}),\n ...(tool.name ? { toolName: tool.name } : {}),\n ...(toolDetails ? { toolDetails } : {}),\n ...(toolTitle ? { toolTitle } : {}),\n },\n runId,\n ),\n );\n }\n return updates;\n }\n\n function buildUpdates(delta: unknown): ChannelTurnProgressUpdate[] {\n const record = asRecord(delta);\n if (!record) {\n return [];\n }\n\n const messageType = getMessageType(record);\n const runId = getRunId(record);\n\n switch (messageType) {\n case \"reasoning_message\":\n return [\n withRunId(\n {\n kind: \"thinking\",\n state: \"updated\",\n message: \"Thinking\",\n },\n runId,\n ),\n ];\n\n case \"assistant_message\":\n return [\n withRunId(\n {\n kind: \"responding\",\n state: \"updated\",\n message: \"Writing reply\",\n },\n runId,\n ),\n ];\n\n case \"approval_request_message\":\n return buildToolCallUpdates(record, runId);\n\n case \"tool_call_message\": {\n const updates = buildToolCallUpdates(record, runId);\n if (updates.length === 0) {\n return [\n withRunId(\n {\n kind: \"tool\",\n state: \"started\",\n message: \"Preparing tool call\",\n },\n runId,\n ),\n ];\n }\n return updates;\n }\n\n case \"tool_return_message\": {\n const toolReturns = extractToolReturns(record);\n const updates: ChannelTurnProgressUpdate[] = [];\n for (const { summary, status, errorDetails } of toolReturns) {\n // Resolve details from the accumulated arguments for this call,\n // then drop the per-call caches.\n const accumulatedArgs = summary.id\n ? argumentsByToolCallId.get(summary.id)\n : undefined;\n if (summary.id) {\n argumentsByToolCallId.delete(summary.id);\n namesByToolCallId.delete(summary.id);\n }\n const toolWithAccumulatedArgs = accumulatedArgs\n ? { ...summary, argumentsText: accumulatedArgs }\n : summary;\n // toolDetails stays argument-derived even on errors: surfaces use it\n // for row titles (e.g. shell rows), so tool output must never leak\n // into it. Error-output previews travel in errorDetails (LET-9509).\n const toolDetails = formatToolProgressDetails(\n toolWithAccumulatedArgs,\n options,\n );\n const toolTitle = formatToolProgressTitle(\n toolWithAccumulatedArgs,\n status,\n );\n updates.push(\n withRunId(\n {\n kind: \"tool\",\n state: status,\n message: status === \"error\" ? \"Tool failed\" : \"Tool finished\",\n ...(summary.id ? { toolCallId: summary.id } : {}),\n ...(summary.name ? { toolName: summary.name } : {}),\n ...(toolDetails ? { toolDetails } : {}),\n ...(status === \"error\" && errorDetails ? { errorDetails } : {}),\n ...(toolTitle ? { toolTitle } : {}),\n },\n runId,\n ),\n );\n }\n return updates;\n }\n\n case \"client_tool_start\": {\n const tool = extractClientToolSummary(record);\n const toolDetails = tool\n ? formatToolProgressDetails(tool, options)\n : undefined;\n const toolTitle = tool\n ? formatToolProgressTitle(tool, \"started\")\n : undefined;\n return [\n withRunId(\n {\n kind: \"tool\",\n state: \"started\",\n message: \"Running tool\",\n ...(tool?.id ? { toolCallId: tool.id } : {}),\n ...(tool?.name ? { toolName: tool.name } : {}),\n ...(toolDetails ? { toolDetails } : {}),\n ...(toolTitle ? { toolTitle } : {}),\n },\n runId,\n ),\n ];\n }\n\n case \"client_tool_end\": {\n const state = getToolStatus(record);\n const tool = extractClientToolSummary(record);\n const accumulatedArgs = tool?.id\n ? argumentsByToolCallId.get(tool.id)\n : undefined;\n if (tool?.id) {\n argumentsByToolCallId.delete(tool.id);\n namesByToolCallId.delete(tool.id);\n }\n const toolWithAccumulatedArgs =\n tool && accumulatedArgs\n ? { ...tool, argumentsText: accumulatedArgs }\n : tool;\n // toolDetails stays argument-derived even on errors (see the\n // tool_return_message handler); error previews go to errorDetails.\n const toolDetails = toolWithAccumulatedArgs\n ? formatToolProgressDetails(toolWithAccumulatedArgs, options)\n : undefined;\n const errorDetails =\n state === \"error\" ? formatToolErrorDetails(record) : undefined;\n const toolTitle = toolWithAccumulatedArgs\n ? formatToolProgressTitle(toolWithAccumulatedArgs, state)\n : undefined;\n return [\n withRunId(\n {\n kind: \"tool\",\n state,\n message: state === \"error\" ? \"Tool failed\" : \"Tool finished\",\n ...(tool?.id ? { toolCallId: tool.id } : {}),\n ...(tool?.name ? { toolName: tool.name } : {}),\n ...(toolDetails ? { toolDetails } : {}),\n ...(errorDetails ? { errorDetails } : {}),\n ...(toolTitle ? { toolTitle } : {}),\n },\n runId,\n ),\n ];\n }\n\n case \"slash_command_start\": {\n const command = getSlashCommand(record);\n return [\n withRunId(\n {\n kind: \"command\",\n state: \"started\",\n message: `Running ${command}`,\n command,\n },\n runId,\n ),\n ];\n }\n\n case \"slash_command_end\": {\n const command = getSlashCommand(record);\n const success = record.success !== false;\n return [\n withRunId(\n {\n kind: \"command\",\n state: success ? \"completed\" : \"error\",\n message: success ? `${command} finished` : `${command} failed`,\n command,\n },\n runId,\n ),\n ];\n }\n\n case \"command_start\": {\n const command = getCommandId(record);\n return [\n withRunId(\n {\n kind: \"command\",\n state: \"started\",\n message: \"Running command\",\n command,\n },\n runId,\n ),\n ];\n }\n\n case \"command_end\": {\n const command = getCommandId(record);\n const success = record.success !== false;\n return [\n withRunId(\n {\n kind: \"command\",\n state: success ? \"completed\" : \"error\",\n message: success ? \"Command finished\" : \"Command failed\",\n command,\n },\n runId,\n ),\n ];\n }\n\n case \"status\": {\n const message = sanitizeChannelProgressText(record.message);\n if (!message) {\n return [];\n }\n return [\n withRunId(\n {\n kind: \"status\",\n state: \"updated\",\n message,\n },\n runId,\n ),\n ];\n }\n\n case \"retry\": {\n const attempt = Number(record.attempt);\n const maxAttempts = Number(record.max_attempts ?? record.maxAttempts);\n const suffix =\n Number.isFinite(attempt) && Number.isFinite(maxAttempts)\n ? ` (${attempt}/${maxAttempts})`\n : \"\";\n return [\n withRunId(\n {\n kind: \"retry\",\n state: \"updated\",\n message: `Retrying request${suffix}`,\n },\n runId,\n ),\n ];\n }\n\n case \"loop_error\":\n return [\n withRunId(\n {\n kind: \"error\",\n state: \"error\",\n message: \"Encountered an error\",\n },\n runId,\n ),\n ];\n\n default:\n return [];\n }\n }\n\n return { buildUpdates };\n}\n"
|
|
9
|
+
],
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "54152C3E895D639864756E2164756E21",
|
|
12
|
+
"names": []
|
|
13
|
+
}
|