langchain_agentx_stream_ui 0.4.2 → 0.6.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.
- package/dist/{chunk-7X7IF2A4.js → chunk-32H5OCBB.js} +5 -5
- package/dist/chunk-32H5OCBB.js.map +1 -0
- package/dist/{chunk-DP7V33X7.js → chunk-6Z4ZF36Z.js} +1 -1
- package/dist/chunk-6Z4ZF36Z.js.map +1 -0
- package/dist/{chunk-4RIOBLGB.js → chunk-GBY5DJ7L.js} +1 -1
- package/dist/chunk-GBY5DJ7L.js.map +1 -0
- package/dist/{chunk-MRGHYRSV.js → chunk-GGPYP2VK.js} +7 -5
- package/dist/chunk-GGPYP2VK.js.map +1 -0
- package/dist/{chunk-AY7QLXFB.js → chunk-RAOW6Z6R.js} +3 -3
- package/dist/chunk-RAOW6Z6R.js.map +1 -0
- package/dist/{chunk-QL3DIGFI.js → chunk-UFRVQZBD.js} +95 -46
- package/dist/chunk-UFRVQZBD.js.map +1 -0
- package/dist/default.css +16 -0
- package/dist/index.d.ts +113 -43
- package/dist/index.js +409 -240
- package/dist/index.js.map +1 -1
- package/dist/{multi-session--0z_-ut1.d.ts → multi-session-B7kIVfyG.d.ts} +16 -0
- package/dist/multi-session.d.ts +1 -1
- package/dist/multi-session.js +6 -6
- package/dist/tools-presentation.js +2 -2
- package/dist/tools.js +4 -4
- package/dist/virtual.js +3 -3
- package/package.json +4 -3
- package/dist/chunk-4RIOBLGB.js.map +0 -1
- package/dist/chunk-7X7IF2A4.js.map +0 -1
- package/dist/chunk-AY7QLXFB.js.map +0 -1
- package/dist/chunk-DP7V33X7.js.map +0 -1
- package/dist/chunk-MRGHYRSV.js.map +0 -1
- package/dist/chunk-QL3DIGFI.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/view/tools/ask_user_question/formatAskUserQuestionTitle.ts","../src/view/tools/glob/formatGlobTitle.ts","../src/view/tools/grep/formatGrepTitle.ts","../src/view/tools/read/formatReadTitle.ts","../src/view/tools/skill/formatSkillTitle.ts","../src/view/tools/webfetch/formatWebFetchTitle.ts","../src/view/tools/websearch/formatWebSearchTitle.ts","../src/view/tools/formatToolTitle.ts","../src/view/tools/DefaultToolBody.tsx","../src/view/tools/resolveToolBody.ts","../src/core/interaction/InteractionBus.ts","../src/core/context/InteractionContext.tsx","../src/view/tools/ToolPermissionWait.tsx","../src/view/tools/ToolCallShell.tsx"],"sourcesContent":["/**\r\n * formatAskUserQuestionTitle.ts — AskUserQuestion 工具标题\r\n *\r\n * 对齐参考:CLI widgets/tools/ask_user_question/widget.py format_title\r\n */\r\nimport { asDisplayRecord, asInputRecord, numField } from '../displayRecord';\r\nimport { formatAskUserQuestionsPreview } from '../presentation/askUserHelpers';\r\nimport { truncatePreview } from '../presentation/textHelpers';\r\n\r\nfunction firstQuestion(\r\n display: Record<string, unknown> | null,\r\n input: Record<string, unknown>,\r\n): { header: string; question: string } {\r\n const items = display?.questions;\r\n if (Array.isArray(items) && items.length > 0) {\r\n const first = items[0];\r\n if (first != null && typeof first === 'object') {\r\n const row = first as Record<string, unknown>;\r\n return {\r\n header: String(row.header ?? '').trim(),\r\n question: String(row.question ?? '').trim(),\r\n };\r\n }\r\n }\r\n\r\n const questions = input.questions;\r\n if (Array.isArray(questions) && questions.length > 0) {\r\n const first = questions[0];\r\n if (first != null && typeof first === 'object') {\r\n const row = first as Record<string, unknown>;\r\n return {\r\n header: String(row.header ?? '').trim(),\r\n question: String(row.question ?? '').trim(),\r\n };\r\n }\r\n }\r\n\r\n return { header: '', question: '' };\r\n}\r\n\r\nexport function formatAskUserQuestionTitle(\r\n input: unknown,\r\n display: unknown,\r\n _summary?: string | null,\r\n): string {\r\n const d = asDisplayRecord(display);\r\n const inp = asInputRecord(input);\r\n const { header, question } = firstQuestion(d, inp);\r\n\r\n if (question) {\r\n const label = header ? `[${header}] ${question}` : question;\r\n return truncatePreview(label, 100);\r\n }\r\n\r\n const answered = numField(d ?? {}, 'answered_count');\r\n if (answered != null) return `Ask user (${answered} answered)`;\r\n\r\n return 'Ask user';\r\n}\r\n\r\nexport { formatAskUserQuestionsPreview };\r\n","/**\r\n * formatGlobTitle.ts — glob 工具标题\r\n *\r\n * 对齐参考:CLI widgets/tools/glob/widget.py format_title\r\n */\r\nimport { formatPatternTitle } from '../presentation/searchHelpers';\r\nimport { asDisplayRecord, asInputRecord, numField, strField } from '../displayRecord';\r\n\r\nexport function formatGlobTitle(\r\n input: unknown,\r\n display: unknown,\r\n _summary?: string | null,\r\n): string {\r\n const d = asDisplayRecord(display);\r\n const inp = asInputRecord(input);\r\n const pattern = strField(d ?? {}, 'pattern') || strField(inp, 'pattern');\r\n\r\n if (!pattern) return 'Search';\r\n\r\n const path = strField(inp, 'path') || undefined;\r\n const suffix = formatPatternTitle(pattern, path);\r\n const numFiles = numField(d ?? {}, 'num_files');\r\n const countHint = numFiles != null ? ` · ${numFiles} files` : '';\r\n\r\n return `Search(${suffix}${countHint})`;\r\n}\r\n","/**\r\n * formatGrepTitle.ts — grep 工具标题\r\n *\r\n * 对齐参考:CLI widgets/tools/grep/widget.py format_title\r\n */\r\nimport { formatPatternTitle } from '../presentation/searchHelpers';\r\nimport { asDisplayRecord, asInputRecord, numField, strField } from '../displayRecord';\r\n\r\nexport function formatGrepTitle(\r\n input: unknown,\r\n display: unknown,\r\n _summary?: string | null,\r\n): string {\r\n const d = asDisplayRecord(display);\r\n const inp = asInputRecord(input);\r\n const pattern = strField(d ?? {}, 'pattern') || strField(inp, 'pattern');\r\n\r\n if (!pattern) return 'Search';\r\n\r\n const path = strField(inp, 'path') || undefined;\r\n const suffix = formatPatternTitle(pattern, path);\r\n const numMatches = numField(d ?? {}, 'num_matches');\r\n const countHint = numMatches != null ? ` · ${numMatches} matches` : '';\r\n\r\n return `Search(${suffix}${countHint})`;\r\n}\r\n","/**\r\n * formatReadTitle.ts — Read 工具标题\r\n *\r\n * 对齐参考:CLI widgets/tools/read/widget.py format_title\r\n */\r\nimport { displayPath } from '../presentation/paths';\r\nimport { asDisplayRecord, asInputRecord, numField, strField } from '../displayRecord';\r\n\r\nconst LINES_RANGE_RE = /lines (\\d+)-(\\d+) of (\\d+)/;\r\nconst READ_LINES_RE = /Read (\\d+) lines from/;\r\n\r\nfunction titleSuffixFromDisplay(display: unknown): string {\r\n const d = asDisplayRecord(display);\r\n if (!d) return '';\r\n\r\n if (d.type === 'text') {\r\n const start = numField(d, 'line_start');\r\n const end = numField(d, 'line_end');\r\n if (start != null && end != null) {\r\n return ` · lines ${start}-${end}`;\r\n }\r\n }\r\n\r\n if (d.type === 'pdf') {\r\n const ps = numField(d, 'page_start');\r\n const pe = numField(d, 'page_end');\r\n if (ps != null && pe != null) {\r\n return ` · pages ${ps}-${pe}`;\r\n }\r\n }\r\n\r\n return '';\r\n}\r\n\r\nfunction titleSuffixFromSummary(summary: string, input: unknown): string {\r\n const matchRange = summary.match(LINES_RANGE_RE);\r\n if (matchRange) {\r\n return ` · lines ${matchRange[1]}-${matchRange[2]}`;\r\n }\r\n\r\n const inp = asInputRecord(input);\r\n const offset = numField(inp, 'offset');\r\n const limit = numField(inp, 'limit');\r\n if (offset != null && limit != null) {\r\n return ` · lines ${offset}-${offset + limit - 1}`;\r\n }\r\n\r\n const matchLines = summary.match(READ_LINES_RE);\r\n if (matchLines) {\r\n return ` · ${matchLines[1]} lines`;\r\n }\r\n\r\n return '';\r\n}\r\n\r\nexport function formatReadTitle(input: unknown, display: unknown, summary?: string | null): string {\r\n const d = asDisplayRecord(display);\r\n const inp = asInputRecord(input);\r\n const path = displayPath(\r\n strField(d ?? {}, 'file_path') ||\r\n strField(inp, 'file_path') ||\r\n strField(inp, 'path'),\r\n );\r\n\r\n const suffix =\r\n titleSuffixFromDisplay(display) ||\r\n (summary ? titleSuffixFromSummary(summary, input) : '');\r\n\r\n if (!path) {\r\n return suffix ? `Read(${suffix.trim()})` : 'Read';\r\n }\r\n\r\n return `Read(${path}${suffix})`;\r\n}\r\n","/**\r\n * formatSkillTitle.ts — skill 工具标题\r\n *\r\n * 对齐参考:CLI widgets/tools/skill/widget.py format_title\r\n */\r\nimport { asDisplayRecord, asInputRecord, strField } from '../displayRecord';\r\n\r\nexport function formatSkillTitle(\r\n input: unknown,\r\n display: unknown,\r\n _summary?: string | null,\r\n): string {\r\n const d = asDisplayRecord(display);\r\n const inp = asInputRecord(input);\r\n const name = strField(d ?? {}, 'skill_name') || strField(inp, 'skill_name');\r\n if (!name) return 'Skill';\r\n\r\n if (d?.source === 'commands_DEPRECATED') {\r\n return `/${name}`;\r\n }\r\n return name;\r\n}\r\n","/**\r\n * formatWebFetchTitle.ts — WebFetch 工具标题\r\n *\r\n * 对齐参考:CLI widgets/tools/webfetch/widget.py format_title\r\n */\r\nimport { asDisplayRecord, asInputRecord, numField, strField } from '../displayRecord';\r\nimport { truncatePreview } from '../presentation/textHelpers';\r\n\r\nexport function formatWebFetchTitle(\r\n input: unknown,\r\n display: unknown,\r\n _summary?: string | null,\r\n): string {\r\n const d = asDisplayRecord(display);\r\n const inp = asInputRecord(input);\r\n const url = strField(d ?? {}, 'url') || strField(inp, 'url');\r\n if (!url) return 'Fetch';\r\n\r\n const code = numField(d ?? {}, 'http_code');\r\n const title =\r\n code != null ? `${url} · HTTP ${code}` : truncatePreview(url, 100);\r\n return `Fetch(${title})`;\r\n}\r\n","/**\r\n * formatWebSearchTitle.ts — WebSearch 工具标题\r\n *\r\n * 对齐参考:CLI widgets/tools/websearch/widget.py format_title\r\n */\r\nimport { asDisplayRecord, asInputRecord, numField, strField } from '../displayRecord';\r\nimport { truncatePreview } from '../presentation/textHelpers';\r\n\r\nexport function formatWebSearchTitle(\r\n input: unknown,\r\n display: unknown,\r\n _summary?: string | null,\r\n): string {\r\n const d = asDisplayRecord(display);\r\n const inp = asInputRecord(input);\r\n const query = strField(d ?? {}, 'query') || strField(inp, 'query');\r\n if (!query) return 'Web Search';\r\n\r\n let queryPart = `\"${truncatePreview(query, 100)}\"`;\r\n const hits = numField(d ?? {}, 'total_hits');\r\n if (hits != null) queryPart = `${queryPart} · ${hits} hits`;\r\n\r\n return `Web Search(${queryPart})`;\r\n}\r\n","/**\r\n * formatToolTitle.ts — 工具卡片标题格式化\r\n */\r\nimport { formatAgentTitle } from './presentation/agentHelpers';\r\nimport { formatAskUserQuestionTitle } from './ask_user_question/formatAskUserQuestionTitle';\r\nimport { formatBashTitle } from './presentation/bashHelpers';\r\nimport { formatEditTitle } from './edit/formatEditTitle';\r\nimport { formatGlobTitle } from './glob/formatGlobTitle';\r\nimport { formatGrepTitle } from './grep/formatGrepTitle';\r\nimport { formatReadTitle } from './read/formatReadTitle';\r\nimport { formatSkillTitle } from './skill/formatSkillTitle';\r\nimport { formatWebFetchTitle } from './webfetch/formatWebFetchTitle';\r\nimport { formatWebSearchTitle } from './websearch/formatWebSearchTitle';\r\nimport { formatWriteTitle } from './write/formatWriteTitle';\r\nimport {\r\n Agent,\r\n AskUserQuestion,\r\n Bash,\r\n Edit,\r\n Glob,\r\n Grep,\r\n Read,\r\n Skill,\r\n WebFetch,\r\n WebSearch,\r\n Write,\r\n} from './toolNames';\r\n\r\ntype TitleFormatter = (\r\n input: unknown,\r\n display: unknown,\r\n summary?: string | null,\r\n meta?: unknown,\r\n) => string;\r\n\r\nconst TITLE_FORMATTERS: Record<string, TitleFormatter> = {\r\n [Read]: formatReadTitle,\r\n [Grep]: formatGrepTitle,\r\n [Glob]: formatGlobTitle,\r\n [Edit]: formatEditTitle,\r\n [Write]: formatWriteTitle,\r\n [Bash]: formatBashTitle,\r\n [Agent]: formatAgentTitle,\r\n [Skill]: formatSkillTitle,\r\n [WebSearch]: formatWebSearchTitle,\r\n [WebFetch]: formatWebFetchTitle,\r\n [AskUserQuestion]: formatAskUserQuestionTitle,\r\n};\r\n\r\nexport function formatToolTitle(\r\n toolName: string,\r\n input: unknown,\r\n display: unknown,\r\n summary?: string | null,\r\n meta?: unknown,\r\n): string {\r\n const formatter = TITLE_FORMATTERS[toolName];\r\n if (formatter) {\r\n return formatter(input, display, summary, meta);\r\n }\r\n return toolName;\r\n}\r\n","/**\r\n * DefaultToolBody.tsx — 未注册工具回退 Body\r\n *\r\n * 职责:\r\n * summary + display JSON 预览(≥ V2);markdown/text 走 TruncatedContent。\r\n *\r\n * 链路位置:\r\n * resolveToolBody 最终回退。\r\n *\r\n * 当前裁剪范围:\r\n * 不渲染 blocks 主视图(折叠区保留在 ToolCallCard details)。\r\n *\r\n * 对齐参考:\r\n * CLI widgets/tools/base.py BaseToolWidget · V2 ToolCallCard JSON pre\r\n */\r\nimport { ToolResultHints } from './presentation/ToolResultHints';\r\nimport { TruncatedContent } from './presentation/TruncatedContent';\r\nimport type { ToolDisplayProps } from './types';\r\n\r\nfunction formatDisplayJson(display: unknown): string {\r\n if (display == null) return '';\r\n if (typeof display === 'string') return display;\r\n try {\r\n return JSON.stringify(display, null, 2);\r\n } catch {\r\n return String(display);\r\n }\r\n}\r\n\r\nfunction extractTextContent(display: unknown): string | null {\r\n if (display == null) return null;\r\n if (typeof display === 'string') return display;\r\n if (typeof display === 'object') {\r\n const record = display as { content?: unknown; text?: unknown };\r\n if (typeof record.content === 'string') return record.content;\r\n if (typeof record.text === 'string') return record.text;\r\n }\r\n return null;\r\n}\r\n\r\nexport function DefaultToolBody({\r\n result,\r\n bodyMode,\r\n onBodyModeChange,\r\n}: ToolDisplayProps) {\r\n const summary = result?.summary;\r\n const displayBody = result?.display ?? null;\r\n const textContent = extractTextContent(displayBody);\r\n const jsonBody = textContent ?? formatDisplayJson(displayBody);\r\n\r\n return (\r\n <div className=\"lax-tool-body lax-tool-body--default\">\r\n {summary ? (\r\n <div className=\"lax-tool-card__summary\">{summary}</div>\r\n ) : null}\r\n\r\n {displayBody != null && displayBody !== '' && jsonBody ? (\r\n <div className=\"lax-tool-card__display\">\r\n {textContent != null ? (\r\n <TruncatedContent\r\n text={textContent}\r\n mode={bodyMode}\r\n onExpand={() => onBodyModeChange?.('full')}\r\n />\r\n ) : (\r\n <pre className=\"lax-tool-card__display-body\">{jsonBody}</pre>\r\n )}\r\n </div>\r\n ) : null}\r\n\r\n {result?.truncated ? (\r\n <div className=\"lax-tool-card__truncated\">结果已截断</div>\r\n ) : null}\r\n\r\n {result?.overflow_file ? (\r\n <div className=\"lax-tool-card__overflow\">\r\n 完整输出:\r\n <code>{result.overflow_file}</code>\r\n </div>\r\n ) : null}\r\n\r\n <ToolResultHints hints={result?.hints} />\r\n </div>\r\n );\r\n}\r\n","/**\r\n * resolveToolBody.ts — 工具 Body 路由纯函数\r\n *\r\n * 职责:\r\n * registry → display.type → DefaultToolBody(精确 tool_name 匹配,无 alias)。\r\n *\r\n * 链路位置:\r\n * ToolCallCard render。\r\n *\r\n * 当前裁剪范围:\r\n * T0 display.type 二级路由表为空;T1+ 注册专用 Widget 与 kind router。\r\n *\r\n * 对齐参考:\r\n * CLI widgets/tools/__init__.py resolve_tool_widget\r\n */\r\nimport { DefaultToolBody } from './DefaultToolBody';\r\nimport type { ToolDisplayRegistry } from './registry';\r\nimport type { ToolBodyComponent } from './types';\r\n\r\n/** display.type → Body;T0 空表,T1+ 填充。 */\r\nconst DISPLAY_KIND_ROUTER = new Map<string, ToolBodyComponent>();\r\n\r\nfunction getDisplayType(display: unknown): string | undefined {\r\n if (display == null || typeof display !== 'object') return undefined;\r\n const type = (display as { type?: unknown }).type;\r\n return typeof type === 'string' ? type : undefined;\r\n}\r\n\r\nexport function resolveToolBody(\r\n toolName: string,\r\n display: unknown,\r\n registry: ToolDisplayRegistry,\r\n): ToolBodyComponent {\r\n const byName = registry.resolve(toolName);\r\n if (byName) return byName;\r\n\r\n const displayType = getDisplayType(display);\r\n if (displayType) {\r\n const byKind = DISPLAY_KIND_ROUTER.get(displayType);\r\n if (byKind) return byKind;\r\n }\r\n\r\n return DefaultToolBody;\r\n}\r\n\r\n/** 测试 / 扩展用:注册 display.type 路由。 */\r\nexport function registerDisplayKind(\r\n displayType: string,\r\n body: ToolBodyComponent,\r\n): void {\r\n DISPLAY_KIND_ROUTER.set(displayType, body);\r\n}\r\n\r\n/** 测试用:清空 display kind 路由。 */\r\nexport function clearDisplayKindRouter(): void {\r\n DISPLAY_KIND_ROUTER.clear();\r\n}\r\n","/**\r\n * 职责:人类回写薄层 API;PermissionNode 触发,业务实现 HTTP 回写。\r\n * 链路位置:AgentSession interactionBus prop → PermissionNode 按钮。\r\n * 当前裁剪范围:permission resolve;不含 HITL 表单协议。\r\n */\r\n\r\nexport interface PermissionResolvePayload {\r\n requestId: string;\r\n allow: boolean;\r\n message?: string;\r\n}\r\n\r\nexport interface InteractionBus {\r\n resolvePermission: (payload: PermissionResolvePayload) => void | Promise<void>;\r\n}\r\n\r\nexport interface InteractionBusHandlers {\r\n onPermissionResolve?: (payload: PermissionResolvePayload) => void | Promise<void>;\r\n}\r\n\r\nconst noopBus: InteractionBus = {\r\n resolvePermission() {\r\n if (import.meta.env?.DEV) {\r\n console.warn('[langchain_agentx_stream_ui] resolvePermission without InteractionBus');\r\n }\r\n },\r\n};\r\n\r\nexport function createInteractionBus(handlers: InteractionBusHandlers = {}): InteractionBus {\r\n return {\r\n resolvePermission(payload) {\r\n return handlers.onPermissionResolve?.(payload);\r\n },\r\n };\r\n}\r\n\r\nexport function getNoopInteractionBus(): InteractionBus {\r\n return noopBus;\r\n}\r\n","/**\r\n * 职责:向 PermissionNode 注入 InteractionBus。\r\n * 链路位置:AgentSession / MultiAgentSession Provider。\r\n * 当前裁剪范围:单 bus;多会话共用同一 bus(业务按 requestId 路由)。\r\n */\r\nimport { createContext, useContext } from 'react';\r\n\r\nimport type { InteractionBus } from '../interaction/InteractionBus';\r\nimport { getNoopInteractionBus } from '../interaction/InteractionBus';\r\n\r\nexport const InteractionBusContext = createContext<InteractionBus>(getNoopInteractionBus());\r\n\r\nexport function useInteractionBus(): InteractionBus {\r\n return useContext(InteractionBusContext);\r\n}\r\n","/**\r\n * ToolPermissionWait.tsx — ToolCallShell 内嵌 permission 等待态(T4.6)\r\n *\r\n * 对齐参考:CC AssistantToolUseMessage「Waiting for permission…」分支\r\n */\r\nimport { useState } from 'react';\r\n\r\nimport { useInteractionBus } from '../../core/context/InteractionContext';\r\nimport type { PermissionNode } from '../../types/nodes';\r\nimport type { PermissionUiMode } from '../sessionViewOptions';\r\n\r\nexport interface ToolPermissionWaitProps {\r\n permission: PermissionNode;\r\n mode: PermissionUiMode;\r\n}\r\n\r\nexport function ToolPermissionWait({ permission, mode }: ToolPermissionWaitProps) {\r\n const bus = useInteractionBus();\r\n const [resolvedLocally, setResolvedLocally] = useState(false);\r\n\r\n if (permission.status !== 'pending' || resolvedLocally) return null;\r\n\r\n const showActions = mode === 'inline' || mode === 'both';\r\n\r\n const onAllow = () => {\r\n void bus.resolvePermission({ requestId: permission.requestId, allow: true });\r\n setResolvedLocally(true);\r\n };\r\n\r\n const onDeny = () => {\r\n void bus.resolvePermission({ requestId: permission.requestId, allow: false });\r\n setResolvedLocally(true);\r\n };\r\n\r\n return (\r\n <div className=\"lax-tool-shell__permission-wait\" role=\"status\">\r\n <div className=\"lax-tool-shell__permission-wait-text\">\r\n Waiting for permission…\r\n </div>\r\n {permission.message ? (\r\n <div className=\"lax-tool-shell__permission-wait-detail\">{permission.message}</div>\r\n ) : null}\r\n {showActions ? (\r\n <div className=\"lax-tool-shell__permission-actions\">\r\n <button type=\"button\" className=\"lax-permission-card__allow\" onClick={onAllow}>\r\n Allow\r\n </button>\r\n <button type=\"button\" className=\"lax-permission-card__deny\" onClick={onDeny}>\r\n Deny\r\n </button>\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","/**\r\n * ToolCallShell.tsx — 工具卡片外壳\r\n *\r\n * 职责:\r\n * 状态圆点、标题、progress、error 边框;不含工具语义。\r\n *\r\n * 链路位置:\r\n * ToolCallCard 外层布局。\r\n *\r\n * 当前裁剪范围:\r\n * T4.6 内嵌 permission 等待态;Grouped 紧凑布局 variant。\r\n *\r\n * 对齐参考:\r\n * CLI base.py 状态圆点 · CC AssistantToolUseMessage.tsx 外层 Box\r\n */\r\nimport type { ReactNode } from 'react';\r\n\r\nimport type { ToolCallNode } from '../../types/nodes';\r\nimport type { PermissionNode } from '../../types/nodes';\r\nimport type { PermissionUiMode } from '../sessionViewOptions';\r\nimport { ToolPermissionWait } from './ToolPermissionWait';\r\n\r\nexport interface ToolCallShellProps {\r\n status: ToolCallNode['status'];\r\n title: string;\r\n progress?: ToolCallNode['progress'];\r\n errorMessage?: string | null;\r\n layout?: 'default' | 'grouped';\r\n permissionWait?: PermissionNode;\r\n permissionUiMode?: PermissionUiMode;\r\n children?: ReactNode;\r\n}\r\n\r\nexport function ToolCallShell({\r\n status,\r\n title,\r\n progress,\r\n errorMessage,\r\n layout = 'default',\r\n permissionWait,\r\n permissionUiMode = 'standalone',\r\n children,\r\n}: ToolCallShellProps) {\r\n const bare = !title.trim();\r\n const waitingForPermission =\r\n permissionWait &&\r\n permissionUiMode !== 'standalone' &&\r\n (status === 'running' || status === 'failed');\r\n\r\n return (\r\n <div\r\n className={[\r\n 'lax-tool-card',\r\n 'lax-tool-shell',\r\n bare ? 'lax-tool-shell--bare' : '',\r\n layout === 'grouped' ? 'lax-tool-shell--grouped' : '',\r\n waitingForPermission ? 'lax-tool-shell--permission-wait' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n data-status={status}\r\n data-error-kind={\r\n errorMessage ? 'error' : waitingForPermission ? 'permission' : undefined\r\n }\r\n >\r\n {!bare ? (\r\n <div className=\"lax-tool-shell__header lax-tool-card__header\">\r\n <span\r\n className=\"lax-tool-shell__status-dot lax-tool-card__status-dot\"\r\n data-status={status}\r\n aria-hidden\r\n >\r\n ●{' '}\r\n </span>\r\n <span className=\"lax-tool-shell__title lax-tool-card__name\">{title}</span>\r\n </div>\r\n ) : null}\r\n\r\n {progress ? (\r\n <div className=\"lax-tool-shell__progress lax-tool-card__progress\">\r\n {progress.message ?? `${progress.current}/${progress.total}`}\r\n </div>\r\n ) : null}\r\n\r\n {waitingForPermission && permissionWait ? (\r\n <ToolPermissionWait permission={permissionWait} mode={permissionUiMode} />\r\n ) : null}\r\n\r\n {children}\r\n\r\n {errorMessage && status === 'failed' ? (\r\n <div className=\"lax-tool-card__error\" role=\"alert\">\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs"]}
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
extractLastToolInfoFromProgress,
|
|
16
16
|
formatExploreSummaryText,
|
|
17
17
|
formatThoughtDurationPrefix
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-UFRVQZBD.js";
|
|
19
19
|
|
|
20
20
|
// src/types/tree.ts
|
|
21
21
|
function createEmptyTree() {
|
|
@@ -1829,7 +1829,7 @@ function resolveWorkflowBanner(state) {
|
|
|
1829
1829
|
const suffix = dropped != null && dropped > 0 ? `\uFF08\u7EA6 ${dropped} \u6761\u4E8B\u4EF6\u672A\u5B8C\u6574\u5C55\u793A\uFF09` : "";
|
|
1830
1830
|
return {
|
|
1831
1831
|
kind: "projection_degraded",
|
|
1832
|
-
message: `\u5C55\u793A\u53EF\u80FD\u4E0D\u5B8C\u6574${suffix}`
|
|
1832
|
+
message: `\u4F20\u8F93\u5F02\u5E38\uFF0C\u5C55\u793A\u53EF\u80FD\u4E0D\u5B8C\u6574${suffix}`
|
|
1833
1833
|
};
|
|
1834
1834
|
}
|
|
1835
1835
|
if (state.display.terminalKind === "forced_closeout" && auth === "done") {
|
|
@@ -5715,4 +5715,4 @@ export {
|
|
|
5715
5715
|
VirtualTimeline,
|
|
5716
5716
|
SessionTimeline
|
|
5717
5717
|
};
|
|
5718
|
-
//# sourceMappingURL=chunk-
|
|
5718
|
+
//# sourceMappingURL=chunk-RAOW6Z6R.js.map
|