@assistant-ui/react-devtools 1.2.10 → 1.2.12
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/data/projectApi.d.ts.map +1 -1
- package/dist/data/projectApi.js +1 -1
- package/dist/data/projectApi.js.map +1 -1
- package/dist/shell/tabs/ActivityTab.js +1 -0
- package/dist/shell/tabs/ActivityTab.js.map +1 -1
- package/dist/shell/tabs/ContextTab.js +1 -0
- package/dist/shell/tabs/ContextTab.js.map +1 -1
- package/dist/shell/tabs/RawTab.js +1 -0
- package/dist/shell/tabs/RawTab.js.map +1 -1
- package/dist/views/attachments/formatBytes.js +1 -1
- package/dist/views/attachments/formatBytes.js.map +1 -1
- package/dist/views/attachments/parseAttachment.js +1 -1
- package/dist/views/attachments/parseAttachment.js.map +1 -1
- package/dist/views/message/MessageTimeline.js +1 -0
- package/dist/views/message/MessageTimeline.js.map +1 -1
- package/dist/views/message/parse.d.ts.map +1 -1
- package/dist/views/message/parse.js +1 -1
- package/dist/views/message/parse.js.map +1 -1
- package/package.json +5 -5
- package/src/data/projectApi.ts +8 -2
- package/src/views/attachments/formatBytes.ts +1 -3
- package/src/views/attachments/parseAttachment.test.ts +25 -0
- package/src/views/attachments/parseAttachment.ts +1 -1
- package/src/views/message/parse.test.ts +15 -0
- package/src/views/message/parse.ts +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectApi.d.ts","names":[],"sources":["../../src/data/projectApi.ts"],"mappings":";;;UASU;EACR,KAAK,QAAQ;EACb,MAAM,cAAc;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"projectApi.d.ts","names":[],"sources":["../../src/data/projectApi.ts"],"mappings":";;;UASU;EACR,KAAK,QAAQ;EACb,MAAM,cAAc;;;;;;;;;;;;cAyGT,aAAc,eAAe,OAAO,qBAAmB"}
|
package/dist/data/projectApi.js
CHANGED
|
@@ -7,7 +7,7 @@ import { sanitizeAndRedact, sanitizeForMessage, serializeModelContext } from "..
|
|
|
7
7
|
* from state extraction.
|
|
8
8
|
*/
|
|
9
9
|
const readMethods = (scopeValue) => {
|
|
10
|
-
if (!scopeValue || typeof scopeValue !== "object") return [];
|
|
10
|
+
if (!scopeValue || typeof scopeValue !== "object" && typeof scopeValue !== "function") return [];
|
|
11
11
|
try {
|
|
12
12
|
return Object.keys(scopeValue).filter((key) => typeof scopeValue[key] === "function");
|
|
13
13
|
} catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectApi.js","names":["AssistantClient","isRecord","isStringArray","sanitizeAndRedact","sanitizeForMessage","serializeModelContext","ApiInfo","EventLogEntry","DevToolsApiEntry","api","Partial","logs","ReadonlyArray","readMethods","scopeValue","Object","keys","filter","key","Record","ThreadsClientMethods","__internal_getAssistantRuntime","threads","getById","threadId","getState","messages","isRunning","isLoading","isDisabled","suggestions","capabilities","composer","collectThreadSnapshots","entry","state","threadsState","undefined","threadsScope","threadsClient","assistantRuntime","threadIds","archivedThreadIds","length","snapshots","threadRuntime","threadState","projectApi","apiId","scopes","Array","name","source","query","methods","scope","entries","push","modelContext","thread","getModelContext","sanitizedState","threadSnapshots","id","map","log","time","event","data"],"sources":["../../src/data/projectApi.ts"],"sourcesContent":["import type { AssistantClient } from \"@assistant-ui/react\";\nimport { isRecord, isStringArray } from \"../utils/common\";\nimport {\n sanitizeAndRedact,\n sanitizeForMessage,\n serializeModelContext,\n} from \"../utils/serialization\";\nimport type { ApiInfo, EventLogEntry } from \"./types\";\n\ninterface DevToolsApiEntry {\n api: Partial<AssistantClient>;\n logs: ReadonlyArray<EventLogEntry>;\n}\n\n/**\n * Lists the method names of a client proxy. The client proxy throws from its\n * `getOwnPropertyDescriptor` trap, so `Object.keys` is best-effort and isolated\n * from state extraction.\n */\nconst readMethods = (scopeValue: unknown): string[] => {\n if (!scopeValue
|
|
1
|
+
{"version":3,"file":"projectApi.js","names":["AssistantClient","isRecord","isStringArray","sanitizeAndRedact","sanitizeForMessage","serializeModelContext","ApiInfo","EventLogEntry","DevToolsApiEntry","api","Partial","logs","ReadonlyArray","readMethods","scopeValue","Object","keys","filter","key","Record","ThreadsClientMethods","__internal_getAssistantRuntime","threads","getById","threadId","getState","messages","isRunning","isLoading","isDisabled","suggestions","capabilities","composer","collectThreadSnapshots","entry","state","threadsState","undefined","threadsScope","threadsClient","assistantRuntime","threadIds","archivedThreadIds","length","snapshots","threadRuntime","threadState","projectApi","apiId","scopes","Array","name","source","query","methods","scope","entries","push","modelContext","thread","getModelContext","sanitizedState","threadSnapshots","id","map","log","time","event","data"],"sources":["../../src/data/projectApi.ts"],"sourcesContent":["import type { AssistantClient } from \"@assistant-ui/react\";\nimport { isRecord, isStringArray } from \"../utils/common\";\nimport {\n sanitizeAndRedact,\n sanitizeForMessage,\n serializeModelContext,\n} from \"../utils/serialization\";\nimport type { ApiInfo, EventLogEntry } from \"./types\";\n\ninterface DevToolsApiEntry {\n api: Partial<AssistantClient>;\n logs: ReadonlyArray<EventLogEntry>;\n}\n\n/**\n * Lists the method names of a client proxy. The client proxy throws from its\n * `getOwnPropertyDescriptor` trap, so `Object.keys` is best-effort and isolated\n * from state extraction.\n */\nconst readMethods = (scopeValue: unknown): string[] => {\n if (\n !scopeValue ||\n (typeof scopeValue !== \"object\" && typeof scopeValue !== \"function\")\n )\n return [];\n try {\n return Object.keys(scopeValue).filter(\n (key) =>\n typeof (scopeValue as Record<string, unknown>)[key] === \"function\",\n );\n } catch {\n return [];\n }\n};\n\ntype ThreadsClientMethods = {\n __internal_getAssistantRuntime?: () => {\n threads: {\n getById: (threadId: string) => {\n getState: () => {\n messages: unknown;\n isRunning?: boolean;\n isLoading?: boolean;\n isDisabled?: boolean;\n suggestions: unknown;\n capabilities: unknown;\n };\n composer: { getState: () => unknown };\n };\n };\n };\n};\n\n/**\n * Reads cached thread states for every id in the thread list. Only threads whose\n * runtime has been mounted (visited in the app) return data; unvisited threads\n * are omitted so DevTools can still list them from `state.threads.threadItems`.\n */\nconst collectThreadSnapshots = (\n entry: DevToolsApiEntry,\n state: Record<string, unknown>,\n): Record<string, unknown> | undefined => {\n const threadsState = state.threads;\n if (!isRecord(threadsState)) return undefined;\n\n const threadsScope = entry.api.threads;\n if (typeof threadsScope !== \"function\") return undefined;\n\n let threadsClient: ThreadsClientMethods;\n try {\n threadsClient = threadsScope() as ThreadsClientMethods;\n } catch {\n return undefined;\n }\n\n const assistantRuntime = threadsClient.__internal_getAssistantRuntime?.();\n if (!assistantRuntime) return undefined;\n\n const threadIds = [\n ...isStringArray(threadsState.threadIds),\n ...isStringArray(threadsState.archivedThreadIds),\n ];\n if (threadIds.length === 0) return undefined;\n\n const snapshots: Record<string, unknown> = {};\n for (const threadId of threadIds) {\n try {\n const threadRuntime = assistantRuntime.threads.getById(threadId);\n const threadState = threadRuntime.getState();\n snapshots[threadId] = sanitizeForMessage({\n messages: threadState.messages,\n isRunning: threadState.isRunning,\n isLoading: threadState.isLoading,\n isDisabled: threadState.isDisabled,\n suggestions: threadState.suggestions,\n capabilities: threadState.capabilities,\n composer: threadRuntime.composer.getState(),\n });\n } catch {\n // Thread runtime not mounted yet (never opened in the app).\n }\n }\n\n return Object.keys(snapshots).length > 0 ? snapshots : undefined;\n};\n\n/**\n * Projects a live DevToolsHooks api entry into the plain, render-ready shape the\n * views consume. This is the in-process equivalent of the old\n * DevToolsHost.sendUpdate(): it walks the scope accessors for root-scope state\n * and the scope graph, normalizes the model context, and redacts credentials.\n *\n * `state` and each `log.data` are passed through sanitizeForMessage so the JSON\n * renderers cannot crash on circular references or non-serializable values;\n * `log.time` is kept as a Date for the clock formatter.\n */\nexport const projectApi = (apiId: number, entry: DevToolsApiEntry): ApiInfo => {\n const state: Record<string, unknown> = {};\n const scopes: Array<{\n name: string;\n source: string | null;\n query: Record<string, unknown> | null;\n methods: string[];\n }> = [];\n\n for (const [name, scope] of Object.entries(entry.api)) {\n if (typeof scope !== \"function\" || !(\"source\" in scope)) continue;\n\n let methods: string[] = [];\n try {\n const scopeValue = scope();\n if (scope.source === \"root\") {\n state[name] =\n (scopeValue as { getState?: () => unknown })?.getState?.() ??\n scopeValue;\n }\n methods = readMethods(scopeValue);\n } catch {\n // scope() may throw for derived scopes before the client is mounted.\n }\n\n scopes.push({\n name,\n source: scope.source,\n query: scope.query,\n methods,\n });\n }\n\n let modelContext: ApiInfo[\"modelContext\"];\n try {\n modelContext = serializeModelContext(\n entry.api.thread?.().getModelContext(),\n );\n } catch {\n // A throwing thread()/getModelContext() should not drop the whole api;\n // show partial data (state, scopes, logs) without the model context.\n }\n\n const sanitizedState = sanitizeForMessage(state) as Record<string, unknown>;\n const threadSnapshots = collectThreadSnapshots(entry, sanitizedState);\n\n return {\n id: apiId,\n state: sanitizedState,\n logs: entry.logs.map((log) => ({\n time: log.time,\n event: log.event,\n data: sanitizeForMessage(log.data),\n })),\n modelContext,\n scopes: sanitizeAndRedact(scopes),\n ...(threadSnapshots ? { threadSnapshots } : {}),\n };\n};\n"],"mappings":";;;;;;;;AAmBA,MAAMa,eAAeC,eAAkC;CACrD,IACE,CAACA,cACA,OAAOA,eAAe,YAAY,OAAOA,eAAe,YAEzD,OAAO,CAAA;CACT,IAAI;EACF,OAAOC,OAAOC,KAAKF,UAAU,CAAC,CAACG,QAC5BC,QACC,OAAQJ,WAAuCI,SAAS,UAC5D;CACF,QAAQ;EACN,OAAO,CAAA;CACT;AACF;;;;;;AAyBA,MAAMe,0BACJC,OACAC,UACwC;CACxC,MAAMC,eAAeD,MAAMb;CAC3B,IAAI,CAACrB,SAASmC,YAAY,GAAG,OAAOC,KAAAA;CAEpC,MAAMC,eAAeJ,MAAMzB,IAAIa;CAC/B,IAAI,OAAOgB,iBAAiB,YAAY,OAAOD,KAAAA;CAE/C,IAAIE;CACJ,IAAI;EACFA,gBAAgBD,aAAa;CAC/B,QAAQ;EACN;CACF;CAEA,MAAME,mBAAmBD,cAAclB,iCAAiC;CACxE,IAAI,CAACmB,kBAAkB,OAAOH,KAAAA;CAE9B,MAAMI,YAAY,CAChB,GAAGvC,cAAckC,aAAaK,SAAS,GACvC,GAAGvC,cAAckC,aAAaM,iBAAiB,CAAC;CAElD,IAAID,UAAUE,WAAW,GAAG,OAAON,KAAAA;CAEnC,MAAMO,YAAqC,CAAC;CAC5C,KAAK,MAAMpB,YAAYiB,WACrB,IAAI;EACF,MAAMI,gBAAgBL,iBAAiBlB,QAAQC,QAAQC,QAAQ;EAC/D,MAAMsB,cAAcD,cAAcpB,SAAS;EAC3CmB,UAAUpB,YAAYpB,mBAAmB;GACvCsB,UAAUoB,YAAYpB;GACtBC,WAAWmB,YAAYnB;GACvBC,WAAWkB,YAAYlB;GACvBC,YAAYiB,YAAYjB;GACxBC,aAAagB,YAAYhB;GACzBC,cAAce,YAAYf;GAC1BC,UAAUa,cAAcb,SAASP,SAAS;EAC5C,CAAC;CACH,QAAQ,CACN;CAIJ,OAAOV,OAAOC,KAAK4B,SAAS,CAAC,CAACD,SAAS,IAAIC,YAAYP,KAAAA;AACzD;;;;;;;;;;;AAYA,MAAaU,cAAcC,OAAed,UAAqC;CAC7E,MAAMC,QAAiC,CAAC;CACxC,MAAMc,SAKD,CAAA;CAEL,KAAK,MAAM,CAACE,MAAMI,UAAUxC,OAAOyC,QAAQtB,MAAMzB,GAAG,GAAG;EACrD,IAAI,OAAO8C,UAAU,cAAc,EAAE,YAAYA,QAAQ;EAEzD,IAAID,UAAoB,CAAA;EACxB,IAAI;GACF,MAAMxC,aAAayC,MAAM;GACzB,IAAIA,MAAMH,WAAW,QACnBjB,MAAMgB,QACHrC,YAA6CW,WAAW,KACzDX;GAEJwC,UAAUzC,YAAYC,UAAU;EAClC,QAAQ,CACN;EAGFmC,OAAOQ,KAAK;GACVN;GACAC,QAAQG,MAAMH;GACdC,OAAOE,MAAMF;GACbC;EACF,CAAC;CACH;CAEA,IAAII;CACJ,IAAI;EACFA,eAAerD,sBACb6B,MAAMzB,IAAIkD,SAAS,CAAC,CAACC,gBAAgB,CACvC;CACF,QAAQ,CAEN;CAGF,MAAMC,iBAAiBzD,mBAAmB+B,KAAK;CAC/C,MAAM2B,kBAAkB7B,uBAAuBC,OAAO2B,cAAc;CAEpE,OAAO;EACLE,IAAIf;EACJb,OAAO0B;EACPlD,MAAMuB,MAAMvB,KAAKqD,KAAKC,SAAS;GAC7BC,MAAMD,IAAIC;GACVC,OAAOF,IAAIE;GACXC,MAAMhE,mBAAmB6D,IAAIG,IAAI;EACnC,EAAE;EACFV;EACAT,QAAQ9C,kBAAkB8C,MAAM;EAChC,GAAIa,kBAAkB,EAAEA,gBAAgB,IAAI,CAAC;CAC/C;AACF"}
|
|
@@ -10,6 +10,7 @@ import { RunDetailPane } from "../../views/activity/RunDetailPane.js";
|
|
|
10
10
|
import { NAV_COL, SplitLayout } from "../SplitLayout.js";
|
|
11
11
|
import { useNavSelectionSync } from "./navSelection.js";
|
|
12
12
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
13
|
+
import "@assistant-ui/tap/react-shim";
|
|
13
14
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
14
15
|
//#region src/shell/tabs/ActivityTab.tsx
|
|
15
16
|
const detailTitle = (node) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActivityTab.js","names":["useMemo","formatClockTime","formatMs","buildActivityNav","defaultActivitySelection","EventStreamPane","findActivityNode","OrphansPane","RunDetailPane","Chip","PaneHeader","SelectableRow","ToneBadge","NAV_COL","SplitLayout","useNavSelectionSync","DevToolsTabContext","detailTitle","node","ReturnType","kind","run","index","ActivityTab","t0","$","_c","apiId","data","clearEvents","selection","setSelection","logs","t1","nodes","runs","t2","bb0","t3","selectedId","T0","T1","active","t4","t5","t6","t7","t8","length","Symbol","for","bb1","t9","t10","t11","id","endTime","undefined","durationMs","startTime","events","map","key","header","children","t12","t13"],"sources":["../../../src/shell/tabs/ActivityTab.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { formatClockTime, formatMs } from \"../../utils/common\";\nimport {\n buildActivityNav,\n defaultActivitySelection,\n EventStreamPane,\n findActivityNode,\n OrphansPane,\n RunDetailPane,\n} from \"../../views/activity\";\nimport { Chip, PaneHeader, SelectableRow, ToneBadge } from \"../../views/ui\";\nimport { NAV_COL, SplitLayout } from \"../SplitLayout\";\nimport { useNavSelectionSync } from \"./navSelection\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst detailTitle = (node: ReturnType<typeof findActivityNode>) => {\n if (!node) return \"Activity\";\n switch (node.kind) {\n case \"stream\":\n return \"Event stream\";\n case \"run\":\n return `Run #${node.run.index}`;\n case \"orphans\":\n return \"Outside runs\";\n default:\n return \"Activity\";\n }\n};\n\nexport const ActivityTab = ({\n apiId,\n data,\n clearEvents,\n selection,\n setSelection,\n}: DevToolsTabContext) => {\n const logs = data.logs;\n const { nodes, runs } = useMemo(() => buildActivityNav(logs), [logs]);\n\n const selectedId = useMemo(() => {\n if (selection && findActivityNode(nodes, selection)) return selection;\n return defaultActivitySelection(nodes);\n }, [nodes, selection]);\n\n useNavSelectionSync(selectedId, selection, setSelection);\n\n const active = findActivityNode(nodes, selectedId);\n\n if (!logs.length) {\n return (\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-3 text-[12px]\">\n No events logged for this assistant instance.\n </div>\n );\n }\n\n return (\n <SplitLayout\n sizes={NAV_COL}\n columns={[\n {\n key: \"nav\",\n header: (\n <PaneHeader\n trailing={\n <span>\n {runs.length} runs · {logs.length} events\n </span>\n }\n >\n Activity\n </PaneHeader>\n ),\n children: nodes.map((node) => (\n <SelectableRow\n key={node.id}\n selected={selectedId === node.id}\n dense\n onSelect={() => setSelection(node.id)}\n >\n {node.kind === \"stream\" ? (\n <span className=\"text-foreground block py-1.5 font-medium\">\n All events\n <span className=\"text-muted-foreground font-normal\">\n {\" \"}\n · {logs.length}\n </span>\n </span>\n ) : node.kind === \"run\" ? (\n <div className=\"flex min-w-0 items-center justify-between gap-2 py-1.5\">\n <span className=\"text-foreground font-medium\">\n Run #{node.run.index}\n </span>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {node.run.endTime === undefined ? (\n <ToneBadge tone=\"blue\" size=\"sm\">\n running\n </ToneBadge>\n ) : (\n <Chip>{formatMs(node.run.durationMs ?? 0)}</Chip>\n )}\n <span className=\"text-muted-foreground font-mono text-[10px] tabular-nums\">\n {formatClockTime(node.run.startTime)}\n </span>\n </div>\n </div>\n ) : (\n <span className=\"text-foreground block py-1.5 font-medium\">\n Outside runs\n <span className=\"text-muted-foreground font-normal\">\n {\" \"}\n · {node.events.length}\n </span>\n </span>\n )}\n </SelectableRow>\n )),\n },\n {\n key: \"detail\",\n header: (\n <PaneHeader\n trailing={\n active?.kind === \"stream\" && logs.length ? (\n <button\n type=\"button\"\n onClick={() => clearEvents(apiId)}\n className=\"text-muted-foreground hover:text-foreground text-[11px] leading-none\"\n >\n clear\n </button>\n ) : active?.kind === \"run\" &&\n active.run.endTime === undefined ? (\n <ToneBadge tone=\"blue\" size=\"sm\">\n running\n </ToneBadge>\n ) : active?.kind === \"run\" &&\n active.run.durationMs !== undefined ? (\n <Chip>{formatMs(active.run.durationMs)}</Chip>\n ) : undefined\n }\n >\n {detailTitle(active)}\n </PaneHeader>\n ),\n children: active ? (\n active.kind === \"stream\" ? (\n <EventStreamPane logs={logs} />\n ) : active.kind === \"run\" ? (\n <div className=\"p-3\">\n <RunDetailPane run={active.run} />\n </div>\n ) : (\n <OrphansPane events={active.events} />\n )\n ) : null,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActivityTab.js","names":["useMemo","formatClockTime","formatMs","buildActivityNav","defaultActivitySelection","EventStreamPane","findActivityNode","OrphansPane","RunDetailPane","Chip","PaneHeader","SelectableRow","ToneBadge","NAV_COL","SplitLayout","useNavSelectionSync","DevToolsTabContext","detailTitle","node","ReturnType","kind","run","index","ActivityTab","t0","$","_c","apiId","data","clearEvents","selection","setSelection","logs","t1","nodes","runs","t2","bb0","t3","selectedId","T0","T1","active","t4","t5","t6","t7","t8","length","Symbol","for","bb1","t9","t10","t11","id","endTime","undefined","durationMs","startTime","events","map","key","header","children","t12","t13"],"sources":["../../../src/shell/tabs/ActivityTab.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { formatClockTime, formatMs } from \"../../utils/common\";\nimport {\n buildActivityNav,\n defaultActivitySelection,\n EventStreamPane,\n findActivityNode,\n OrphansPane,\n RunDetailPane,\n} from \"../../views/activity\";\nimport { Chip, PaneHeader, SelectableRow, ToneBadge } from \"../../views/ui\";\nimport { NAV_COL, SplitLayout } from \"../SplitLayout\";\nimport { useNavSelectionSync } from \"./navSelection\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst detailTitle = (node: ReturnType<typeof findActivityNode>) => {\n if (!node) return \"Activity\";\n switch (node.kind) {\n case \"stream\":\n return \"Event stream\";\n case \"run\":\n return `Run #${node.run.index}`;\n case \"orphans\":\n return \"Outside runs\";\n default:\n return \"Activity\";\n }\n};\n\nexport const ActivityTab = ({\n apiId,\n data,\n clearEvents,\n selection,\n setSelection,\n}: DevToolsTabContext) => {\n const logs = data.logs;\n const { nodes, runs } = useMemo(() => buildActivityNav(logs), [logs]);\n\n const selectedId = useMemo(() => {\n if (selection && findActivityNode(nodes, selection)) return selection;\n return defaultActivitySelection(nodes);\n }, [nodes, selection]);\n\n useNavSelectionSync(selectedId, selection, setSelection);\n\n const active = findActivityNode(nodes, selectedId);\n\n if (!logs.length) {\n return (\n <div className=\"text-muted-foreground flex h-full items-center justify-center p-3 text-[12px]\">\n No events logged for this assistant instance.\n </div>\n );\n }\n\n return (\n <SplitLayout\n sizes={NAV_COL}\n columns={[\n {\n key: \"nav\",\n header: (\n <PaneHeader\n trailing={\n <span>\n {runs.length} runs · {logs.length} events\n </span>\n }\n >\n Activity\n </PaneHeader>\n ),\n children: nodes.map((node) => (\n <SelectableRow\n key={node.id}\n selected={selectedId === node.id}\n dense\n onSelect={() => setSelection(node.id)}\n >\n {node.kind === \"stream\" ? (\n <span className=\"text-foreground block py-1.5 font-medium\">\n All events\n <span className=\"text-muted-foreground font-normal\">\n {\" \"}\n · {logs.length}\n </span>\n </span>\n ) : node.kind === \"run\" ? (\n <div className=\"flex min-w-0 items-center justify-between gap-2 py-1.5\">\n <span className=\"text-foreground font-medium\">\n Run #{node.run.index}\n </span>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {node.run.endTime === undefined ? (\n <ToneBadge tone=\"blue\" size=\"sm\">\n running\n </ToneBadge>\n ) : (\n <Chip>{formatMs(node.run.durationMs ?? 0)}</Chip>\n )}\n <span className=\"text-muted-foreground font-mono text-[10px] tabular-nums\">\n {formatClockTime(node.run.startTime)}\n </span>\n </div>\n </div>\n ) : (\n <span className=\"text-foreground block py-1.5 font-medium\">\n Outside runs\n <span className=\"text-muted-foreground font-normal\">\n {\" \"}\n · {node.events.length}\n </span>\n </span>\n )}\n </SelectableRow>\n )),\n },\n {\n key: \"detail\",\n header: (\n <PaneHeader\n trailing={\n active?.kind === \"stream\" && logs.length ? (\n <button\n type=\"button\"\n onClick={() => clearEvents(apiId)}\n className=\"text-muted-foreground hover:text-foreground text-[11px] leading-none\"\n >\n clear\n </button>\n ) : active?.kind === \"run\" &&\n active.run.endTime === undefined ? (\n <ToneBadge tone=\"blue\" size=\"sm\">\n running\n </ToneBadge>\n ) : active?.kind === \"run\" &&\n active.run.durationMs !== undefined ? (\n <Chip>{formatMs(active.run.durationMs)}</Chip>\n ) : undefined\n }\n >\n {detailTitle(active)}\n </PaneHeader>\n ),\n children: active ? (\n active.kind === \"stream\" ? (\n <EventStreamPane logs={logs} />\n ) : active.kind === \"run\" ? (\n <div className=\"p-3\">\n <RunDetailPane run={active.run} />\n </div>\n ) : (\n <OrphansPane events={active.events} />\n )\n ) : null,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { ContextDetail } from "../../views/context/ContextDetail.js";
|
|
|
9
9
|
import { buildContextNav, toolUiCount } from "../../views/context/contextNodes.js";
|
|
10
10
|
import { findNavNode, flattenNav } from "../../views/nav.js";
|
|
11
11
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
12
|
+
import "@assistant-ui/tap/react-shim";
|
|
12
13
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
13
14
|
//#region src/shell/tabs/ContextTab.tsx
|
|
14
15
|
const detailTitle = (node, toolUiCountValue) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextTab.js","names":["useMemo","truncate","ContextDetail","buildContextNav","toolUiCount","ContextNode","findNavNode","flattenNav","Chip","EmptyState","PaneHeader","SelectableRow","NAV_COL","SplitLayout","useNavSelectionSync","DevToolsTabContext","detailTitle","node","toolUiCountValue","kind","tool","name","ContextTab","t0","$","_c","data","selection","setSelection","t1","groups","t2","nodes","state","tools","t3","bb0","id","selectedNode","length","t4","Symbol","for","active","T0","t5","t6","t7","group","label","map","preview","type","key","header","children","t8","T1","t9","undefined","t10","t11","t12","t13","t14","t15"],"sources":["../../../src/shell/tabs/ContextTab.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { truncate } from \"../../utils/common\";\nimport {\n ContextDetail,\n buildContextNav,\n toolUiCount,\n type ContextNode,\n} from \"../../views/context\";\nimport { findNavNode, flattenNav } from \"../../views/nav\";\nimport { Chip, EmptyState, PaneHeader, SelectableRow } from \"../../views/ui\";\nimport { NAV_COL, SplitLayout } from \"../SplitLayout\";\nimport { useNavSelectionSync } from \"./navSelection\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst detailTitle = (\n node: ContextNode | undefined,\n toolUiCountValue: number,\n) => {\n if (!node) return \"Context\";\n switch (node.kind) {\n case \"system\":\n return \"System prompt\";\n case \"tool\":\n return node.tool.name;\n case \"callSettings\":\n return \"Call settings\";\n case \"config\":\n return \"Config\";\n case \"mcp\":\n return \"MCP\";\n case \"toolUIs\":\n return toolUiCountValue\n ? `Tool UI mappings · ${toolUiCountValue}`\n : \"Tool UI mappings\";\n default:\n return \"Context\";\n }\n};\n\nexport const ContextTab = ({\n data,\n selection,\n setSelection,\n}: DevToolsTabContext) => {\n const groups = useMemo(() => buildContextNav(data), [data]);\n const nodes = useMemo(() => flattenNav(groups), [groups]);\n const toolUiCountValue = toolUiCount(data.state.tools);\n\n const selectedNode = useMemo(() => {\n if (selection && findNavNode(groups, selection)) {\n return selection;\n }\n return nodes[0]?.id ?? null;\n }, [groups, nodes, selection]);\n\n useNavSelectionSync(selectedNode, selection, setSelection);\n\n if (!nodes.length) {\n return (\n <div className=\"flex h-full items-center justify-center p-3\">\n <EmptyState>\n No model context, MCP, or tool UI data for this instance.\n </EmptyState>\n </div>\n );\n }\n\n const active = findNavNode(groups, selectedNode);\n\n return (\n <SplitLayout\n sizes={NAV_COL}\n columns={[\n {\n key: \"nav\",\n header: <PaneHeader>Context</PaneHeader>,\n children: groups.map((group) => (\n <div key={group.label} className=\"flex flex-col\">\n <div className=\"text-muted-foreground px-3 pt-2 pb-0.5 text-[10px] font-medium tracking-wide uppercase\">\n {group.label}\n </div>\n {group.nodes.map((node) => (\n <SelectableRow\n key={node.id}\n selected={selectedNode === node.id}\n dense\n onSelect={() => setSelection(node.id)}\n >\n {node.kind === \"system\" ? (\n <div className=\"flex min-w-0 flex-col gap-0.5 py-1.5\">\n <span className=\"text-foreground font-medium\">\n System prompt\n </span>\n <span className=\"text-muted-foreground truncate text-[10px]\">\n {truncate(node.preview, 48)}\n </span>\n </div>\n ) : node.kind === \"tool\" ? (\n <div className=\"flex min-w-0 items-center justify-between gap-2 py-1.5\">\n <span className=\"text-foreground truncate font-medium\">\n {node.tool.name}\n </span>\n {node.tool.type ? (\n <Chip className=\"shrink-0\">{node.tool.type}</Chip>\n ) : null}\n </div>\n ) : node.kind === \"callSettings\" ? (\n <span className=\"text-foreground block py-1.5 font-medium\">\n Call settings\n </span>\n ) : node.kind === \"config\" ? (\n <span className=\"text-foreground block py-1.5 font-medium\">\n Config\n </span>\n ) : node.kind === \"mcp\" ? (\n <span className=\"text-foreground block py-1.5 font-medium\">\n MCP servers\n </span>\n ) : (\n <span className=\"text-foreground block py-1.5 font-medium\">\n Tool UI mappings\n {toolUiCountValue > 0 ? (\n <span className=\"text-muted-foreground font-normal\">\n {\" \"}\n · {toolUiCountValue}\n </span>\n ) : null}\n </span>\n )}\n </SelectableRow>\n ))}\n </div>\n )),\n },\n {\n key: \"detail\",\n header: (\n <PaneHeader\n trailing={\n active?.kind === \"tool\" && active.tool.type ? (\n <Chip>{active.tool.type}</Chip>\n ) : undefined\n }\n >\n {detailTitle(active, toolUiCountValue)}\n </PaneHeader>\n ),\n children: active ? (\n <div className=\"p-3\">\n <ContextDetail node={active} data={data} />\n </div>\n ) : null,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContextTab.js","names":["useMemo","truncate","ContextDetail","buildContextNav","toolUiCount","ContextNode","findNavNode","flattenNav","Chip","EmptyState","PaneHeader","SelectableRow","NAV_COL","SplitLayout","useNavSelectionSync","DevToolsTabContext","detailTitle","node","toolUiCountValue","kind","tool","name","ContextTab","t0","$","_c","data","selection","setSelection","t1","groups","t2","nodes","state","tools","t3","bb0","id","selectedNode","length","t4","Symbol","for","active","T0","t5","t6","t7","group","label","map","preview","type","key","header","children","t8","T1","t9","undefined","t10","t11","t12","t13","t14","t15"],"sources":["../../../src/shell/tabs/ContextTab.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { truncate } from \"../../utils/common\";\nimport {\n ContextDetail,\n buildContextNav,\n toolUiCount,\n type ContextNode,\n} from \"../../views/context\";\nimport { findNavNode, flattenNav } from \"../../views/nav\";\nimport { Chip, EmptyState, PaneHeader, SelectableRow } from \"../../views/ui\";\nimport { NAV_COL, SplitLayout } from \"../SplitLayout\";\nimport { useNavSelectionSync } from \"./navSelection\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst detailTitle = (\n node: ContextNode | undefined,\n toolUiCountValue: number,\n) => {\n if (!node) return \"Context\";\n switch (node.kind) {\n case \"system\":\n return \"System prompt\";\n case \"tool\":\n return node.tool.name;\n case \"callSettings\":\n return \"Call settings\";\n case \"config\":\n return \"Config\";\n case \"mcp\":\n return \"MCP\";\n case \"toolUIs\":\n return toolUiCountValue\n ? `Tool UI mappings · ${toolUiCountValue}`\n : \"Tool UI mappings\";\n default:\n return \"Context\";\n }\n};\n\nexport const ContextTab = ({\n data,\n selection,\n setSelection,\n}: DevToolsTabContext) => {\n const groups = useMemo(() => buildContextNav(data), [data]);\n const nodes = useMemo(() => flattenNav(groups), [groups]);\n const toolUiCountValue = toolUiCount(data.state.tools);\n\n const selectedNode = useMemo(() => {\n if (selection && findNavNode(groups, selection)) {\n return selection;\n }\n return nodes[0]?.id ?? null;\n }, [groups, nodes, selection]);\n\n useNavSelectionSync(selectedNode, selection, setSelection);\n\n if (!nodes.length) {\n return (\n <div className=\"flex h-full items-center justify-center p-3\">\n <EmptyState>\n No model context, MCP, or tool UI data for this instance.\n </EmptyState>\n </div>\n );\n }\n\n const active = findNavNode(groups, selectedNode);\n\n return (\n <SplitLayout\n sizes={NAV_COL}\n columns={[\n {\n key: \"nav\",\n header: <PaneHeader>Context</PaneHeader>,\n children: groups.map((group) => (\n <div key={group.label} className=\"flex flex-col\">\n <div className=\"text-muted-foreground px-3 pt-2 pb-0.5 text-[10px] font-medium tracking-wide uppercase\">\n {group.label}\n </div>\n {group.nodes.map((node) => (\n <SelectableRow\n key={node.id}\n selected={selectedNode === node.id}\n dense\n onSelect={() => setSelection(node.id)}\n >\n {node.kind === \"system\" ? (\n <div className=\"flex min-w-0 flex-col gap-0.5 py-1.5\">\n <span className=\"text-foreground font-medium\">\n System prompt\n </span>\n <span className=\"text-muted-foreground truncate text-[10px]\">\n {truncate(node.preview, 48)}\n </span>\n </div>\n ) : node.kind === \"tool\" ? (\n <div className=\"flex min-w-0 items-center justify-between gap-2 py-1.5\">\n <span className=\"text-foreground truncate font-medium\">\n {node.tool.name}\n </span>\n {node.tool.type ? (\n <Chip className=\"shrink-0\">{node.tool.type}</Chip>\n ) : null}\n </div>\n ) : node.kind === \"callSettings\" ? (\n <span className=\"text-foreground block py-1.5 font-medium\">\n Call settings\n </span>\n ) : node.kind === \"config\" ? (\n <span className=\"text-foreground block py-1.5 font-medium\">\n Config\n </span>\n ) : node.kind === \"mcp\" ? (\n <span className=\"text-foreground block py-1.5 font-medium\">\n MCP servers\n </span>\n ) : (\n <span className=\"text-foreground block py-1.5 font-medium\">\n Tool UI mappings\n {toolUiCountValue > 0 ? (\n <span className=\"text-muted-foreground font-normal\">\n {\" \"}\n · {toolUiCountValue}\n </span>\n ) : null}\n </span>\n )}\n </SelectableRow>\n ))}\n </div>\n )),\n },\n {\n key: \"detail\",\n header: (\n <PaneHeader\n trailing={\n active?.kind === \"tool\" && active.tool.type ? (\n <Chip>{active.tool.type}</Chip>\n ) : undefined\n }\n >\n {detailTitle(active, toolUiCountValue)}\n </PaneHeader>\n ),\n children: active ? (\n <div className=\"p-3\">\n <ContextDetail node={active} data={data} />\n </div>\n ) : null,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { findNavNode, firstNavId } from "../../views/nav.js";
|
|
|
8
8
|
import { RawDetail } from "../../views/raw/RawDetail.js";
|
|
9
9
|
import { buildRawNav } from "../../views/raw/rawNodes.js";
|
|
10
10
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
11
|
+
import "@assistant-ui/tap/react-shim";
|
|
11
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
13
|
//#region src/shell/tabs/RawTab.tsx
|
|
13
14
|
const detailTitle = (node) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RawTab.js","names":["useMemo","buildRawNav","RawDetail","RawNode","findNavNode","firstNavId","Chip","EmptyState","PaneHeader","SelectableRow","NAV_COL","SplitLayout","useNavSelectionSync","DevToolsTabContext","detailTitle","node","kind","key","RawTab","t0","$","_c","data","selection","setSelection","t1","groups","t2","state","Object","keys","sliceCount","length","t3","bb0","t4","selectedId","T0","T1","active","t5","t6","t7","t8","t9","Symbol","for","bb1","t10","t11","t12","t13","group","label","nodes","map","id","hint","count","header","children","undefined","scopes","t14"],"sources":["../../../src/shell/tabs/RawTab.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { buildRawNav, RawDetail, type RawNode } from \"../../views/raw\";\nimport { findNavNode, firstNavId } from \"../../views/nav\";\nimport { Chip, EmptyState, PaneHeader, SelectableRow } from \"../../views/ui\";\nimport { NAV_COL, SplitLayout } from \"../SplitLayout\";\nimport { useNavSelectionSync } from \"./navSelection\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst detailTitle = (node: RawNode | undefined) => {\n if (!node) return \"Raw\";\n if (node.kind === \"scopes\") return \"Scopes\";\n return node.key;\n};\n\nexport const RawTab = ({\n data,\n selection,\n setSelection,\n}: DevToolsTabContext) => {\n const groups = useMemo(() => buildRawNav(data), [data]);\n const sliceCount = Object.keys(data.state).length;\n\n const selectedId = useMemo(() => {\n if (selection && findNavNode(groups, selection)) return selection;\n return firstNavId(groups);\n }, [groups, selection]);\n\n useNavSelectionSync(selectedId, selection, setSelection);\n\n const active = findNavNode(groups, selectedId);\n\n if (!groups.length) {\n return (\n <div className=\"flex h-full items-center justify-center p-3\">\n <EmptyState>No runtime state reported for this instance.</EmptyState>\n </div>\n );\n }\n\n return (\n <SplitLayout\n sizes={NAV_COL}\n columns={[\n {\n key: \"nav\",\n header: (\n <PaneHeader\n trailing={\n <span>\n {sliceCount} slice{sliceCount === 1 ? \"\" : \"s\"}\n </span>\n }\n >\n Raw\n </PaneHeader>\n ),\n children: groups.map((group) => (\n <div key={group.label} className=\"flex flex-col\">\n <div className=\"text-muted-foreground px-3 pt-2 pb-0.5 text-[10px] font-medium tracking-wide uppercase\">\n {group.label}\n </div>\n {group.nodes.map((node) => (\n <SelectableRow\n key={node.id}\n selected={selectedId === node.id}\n dense\n onSelect={() => setSelection(node.id)}\n >\n {node.kind === \"slice\" ? (\n <div className=\"flex min-w-0 items-center justify-between gap-2 py-1.5\">\n <span className=\"text-foreground truncate font-medium\">\n {node.key}\n </span>\n {node.hint ? (\n <span className=\"text-muted-foreground shrink-0 text-[10px]\">\n {node.hint}\n </span>\n ) : null}\n </div>\n ) : (\n <div className=\"flex min-w-0 items-center justify-between gap-2 py-1.5\">\n <span className=\"text-foreground font-medium\">\n scopes\n </span>\n {node.count ? (\n <Chip className=\"shrink-0\">{node.count}</Chip>\n ) : null}\n </div>\n )}\n </SelectableRow>\n ))}\n </div>\n )),\n },\n {\n key: \"detail\",\n header: (\n <PaneHeader\n trailing={\n active?.kind === \"slice\" && active.hint ? (\n <span>{active.hint}</span>\n ) : active?.kind === \"scopes\" && active.count ? (\n <Chip>{active.count}</Chip>\n ) : undefined\n }\n >\n {detailTitle(active)}\n </PaneHeader>\n ),\n children: active ? (\n <div className=\"p-3\">\n <RawDetail\n node={active}\n state={data.state}\n scopes={data.scopes}\n />\n </div>\n ) : null,\n },\n ]}\n />\n );\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"RawTab.js","names":["useMemo","buildRawNav","RawDetail","RawNode","findNavNode","firstNavId","Chip","EmptyState","PaneHeader","SelectableRow","NAV_COL","SplitLayout","useNavSelectionSync","DevToolsTabContext","detailTitle","node","kind","key","RawTab","t0","$","_c","data","selection","setSelection","t1","groups","t2","state","Object","keys","sliceCount","length","t3","bb0","t4","selectedId","T0","T1","active","t5","t6","t7","t8","t9","Symbol","for","bb1","t10","t11","t12","t13","group","label","nodes","map","id","hint","count","header","children","undefined","scopes","t14"],"sources":["../../../src/shell/tabs/RawTab.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { buildRawNav, RawDetail, type RawNode } from \"../../views/raw\";\nimport { findNavNode, firstNavId } from \"../../views/nav\";\nimport { Chip, EmptyState, PaneHeader, SelectableRow } from \"../../views/ui\";\nimport { NAV_COL, SplitLayout } from \"../SplitLayout\";\nimport { useNavSelectionSync } from \"./navSelection\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst detailTitle = (node: RawNode | undefined) => {\n if (!node) return \"Raw\";\n if (node.kind === \"scopes\") return \"Scopes\";\n return node.key;\n};\n\nexport const RawTab = ({\n data,\n selection,\n setSelection,\n}: DevToolsTabContext) => {\n const groups = useMemo(() => buildRawNav(data), [data]);\n const sliceCount = Object.keys(data.state).length;\n\n const selectedId = useMemo(() => {\n if (selection && findNavNode(groups, selection)) return selection;\n return firstNavId(groups);\n }, [groups, selection]);\n\n useNavSelectionSync(selectedId, selection, setSelection);\n\n const active = findNavNode(groups, selectedId);\n\n if (!groups.length) {\n return (\n <div className=\"flex h-full items-center justify-center p-3\">\n <EmptyState>No runtime state reported for this instance.</EmptyState>\n </div>\n );\n }\n\n return (\n <SplitLayout\n sizes={NAV_COL}\n columns={[\n {\n key: \"nav\",\n header: (\n <PaneHeader\n trailing={\n <span>\n {sliceCount} slice{sliceCount === 1 ? \"\" : \"s\"}\n </span>\n }\n >\n Raw\n </PaneHeader>\n ),\n children: groups.map((group) => (\n <div key={group.label} className=\"flex flex-col\">\n <div className=\"text-muted-foreground px-3 pt-2 pb-0.5 text-[10px] font-medium tracking-wide uppercase\">\n {group.label}\n </div>\n {group.nodes.map((node) => (\n <SelectableRow\n key={node.id}\n selected={selectedId === node.id}\n dense\n onSelect={() => setSelection(node.id)}\n >\n {node.kind === \"slice\" ? (\n <div className=\"flex min-w-0 items-center justify-between gap-2 py-1.5\">\n <span className=\"text-foreground truncate font-medium\">\n {node.key}\n </span>\n {node.hint ? (\n <span className=\"text-muted-foreground shrink-0 text-[10px]\">\n {node.hint}\n </span>\n ) : null}\n </div>\n ) : (\n <div className=\"flex min-w-0 items-center justify-between gap-2 py-1.5\">\n <span className=\"text-foreground font-medium\">\n scopes\n </span>\n {node.count ? (\n <Chip className=\"shrink-0\">{node.count}</Chip>\n ) : null}\n </div>\n )}\n </SelectableRow>\n ))}\n </div>\n )),\n },\n {\n key: \"detail\",\n header: (\n <PaneHeader\n trailing={\n active?.kind === \"slice\" && active.hint ? (\n <span>{active.hint}</span>\n ) : active?.kind === \"scopes\" && active.count ? (\n <Chip>{active.count}</Chip>\n ) : undefined\n }\n >\n {detailTitle(active)}\n </PaneHeader>\n ),\n children: active ? (\n <div className=\"p-3\">\n <RawDetail\n node={active}\n state={data.state}\n scopes={data.scopes}\n />\n </div>\n ) : null,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ const formatBytes = (bytes) => {
|
|
|
7
7
|
};
|
|
8
8
|
/** Rough size from base64 payload (no decoding). */
|
|
9
9
|
const estimateBase64Bytes = (data) => Math.max(0, Math.floor(data.length * 3 / 4));
|
|
10
|
-
const isSafeImagePreviewUrl = (url) =>
|
|
10
|
+
const isSafeImagePreviewUrl = (url) => /^data:image\//i.test(url) || /^https?:\/\//i.test(url);
|
|
11
11
|
//#endregion
|
|
12
12
|
export { estimateBase64Bytes, formatBytes, isSafeImagePreviewUrl };
|
|
13
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatBytes.js","names":["formatBytes","bytes","undefined","toFixed","estimateBase64Bytes","data","Math","max","floor","length","isSafeImagePreviewUrl","url","
|
|
1
|
+
{"version":3,"file":"formatBytes.js","names":["formatBytes","bytes","undefined","toFixed","estimateBase64Bytes","data","Math","max","floor","length","isSafeImagePreviewUrl","url","test"],"sources":["../../../src/views/attachments/formatBytes.ts"],"sourcesContent":["export const formatBytes = (bytes: number | undefined): string | undefined => {\n if (bytes === undefined || bytes <= 0) return undefined;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\n/** Rough size from base64 payload (no decoding). */\nexport const estimateBase64Bytes = (data: string): number =>\n Math.max(0, Math.floor((data.length * 3) / 4));\n\nexport const isSafeImagePreviewUrl = (url: string): boolean =>\n /^data:image\\//i.test(url) || /^https?:\\/\\//i.test(url);\n"],"mappings":";AAAA,MAAaA,eAAeC,UAAkD;CAC5E,IAAIA,UAAUC,KAAAA,KAAaD,SAAS,GAAG,OAAOC,KAAAA;CAC9C,IAAID,QAAQ,MAAM,OAAO,GAAGA,MAAK;CACjC,IAAIA,QAAQ,OAAO,MAAM,OAAO,IAAIA,QAAQ,KAAA,CAAME,QAAQ,CAAC,EAAC;CAC5D,OAAO,IAAIF,SAAS,OAAO,MAAA,CAAOE,QAAQ,CAAC,EAAC;AAC9C;;AAGA,MAAaC,uBAAuBC,SAClCC,KAAKC,IAAI,GAAGD,KAAKE,MAAOH,KAAKI,SAAS,IAAK,CAAC,CAAC;AAE/C,MAAaC,yBAAyBC,QACpC,iBAAiBC,KAAKD,GAAG,KAAK,gBAAgBC,KAAKD,GAAG"}
|
|
@@ -18,7 +18,7 @@ const mediaFromContent = (content) => {
|
|
|
18
18
|
if (type === "image") {
|
|
19
19
|
const image = asString(part.image);
|
|
20
20
|
if (image && isSafeImagePreviewUrl(image)) {
|
|
21
|
-
const sizeBytes =
|
|
21
|
+
const sizeBytes = /^data:/i.test(image) ? estimateBase64Bytes(image.split(",", 2)[1] ?? image) : void 0;
|
|
22
22
|
return {
|
|
23
23
|
previewUrl: image,
|
|
24
24
|
...sizeBytes !== void 0 ? { sizeBytes } : {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseAttachment.js","names":["isRecord","estimateBase64Bytes","isSafeImagePreviewUrl","AttachmentPreview","AttachmentStatusPreview","asString","value","length","undefined","parseAttachmentStatus","type","reason","progress","mediaFromContent","content","previewUrl","sizeBytes","Array","isArray","part","image","
|
|
1
|
+
{"version":3,"file":"parseAttachment.js","names":["isRecord","estimateBase64Bytes","isSafeImagePreviewUrl","AttachmentPreview","AttachmentStatusPreview","asString","value","length","undefined","parseAttachmentStatus","type","reason","progress","mediaFromContent","content","previewUrl","sizeBytes","Array","isArray","part","image","test","split","data","parseAttachment","name","filename","id","status","fromContent","kind","contentType","parseAttachments","map","item","filter","Boolean"],"sources":["../../../src/views/attachments/parseAttachment.ts"],"sourcesContent":["import { isRecord } from \"../../utils/common\";\nimport { estimateBase64Bytes, isSafeImagePreviewUrl } from \"./formatBytes\";\nimport type { AttachmentPreview, AttachmentStatusPreview } from \"./types\";\n\nconst asString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\n\nconst parseAttachmentStatus = (\n value: unknown,\n): AttachmentStatusPreview | undefined => {\n if (!isRecord(value) || typeof value.type !== \"string\") return undefined;\n return {\n type: value.type,\n ...(typeof value.reason === \"string\" ? { reason: value.reason } : {}),\n ...(typeof value.progress === \"number\" ? { progress: value.progress } : {}),\n };\n};\n\nconst mediaFromContent = (\n content: unknown,\n): { previewUrl?: string; sizeBytes?: number } => {\n if (!Array.isArray(content)) return {};\n for (const part of content) {\n if (!isRecord(part)) continue;\n const type = asString(part.type);\n if (type === \"image\") {\n const image = asString(part.image);\n if (image && isSafeImagePreviewUrl(image)) {\n const sizeBytes = /^data:/i.test(image)\n ? estimateBase64Bytes(image.split(\",\", 2)[1] ?? image)\n : undefined;\n return {\n previewUrl: image,\n ...(sizeBytes !== undefined ? { sizeBytes } : {}),\n };\n }\n }\n if (type === \"file\") {\n const data = asString(part.data);\n if (data) return { sizeBytes: estimateBase64Bytes(data) };\n }\n }\n return {};\n};\n\nexport const parseAttachment = (value: unknown): AttachmentPreview | null => {\n if (!isRecord(value)) return null;\n\n const name =\n asString(value.name) ??\n asString(value.filename) ??\n asString(value.id) ??\n \"(attachment)\";\n\n const status = parseAttachmentStatus(value.status);\n const fromContent = mediaFromContent(value.content);\n\n const image = asString(value.image);\n const previewUrl =\n fromContent.previewUrl ??\n (image && isSafeImagePreviewUrl(image) ? image : undefined);\n\n const data = asString(value.data);\n const sizeBytes =\n fromContent.sizeBytes ?? (data ? estimateBase64Bytes(data) : undefined);\n\n return {\n name,\n ...(asString(value.id) ? { id: asString(value.id)! } : {}),\n ...(asString(value.type) ? { kind: asString(value.type)! } : {}),\n ...(asString(value.contentType)\n ? { contentType: asString(value.contentType)! }\n : {}),\n ...(status ? { status } : {}),\n ...(previewUrl ? { previewUrl } : {}),\n ...(sizeBytes !== undefined ? { sizeBytes } : {}),\n };\n};\n\nexport const parseAttachments = (value: unknown): AttachmentPreview[] =>\n Array.isArray(value)\n ? value\n .map((item) => parseAttachment(item))\n .filter((item): item is AttachmentPreview => Boolean(item))\n : [];\n"],"mappings":";;;AAIA,MAAMK,YAAYC,UAChB,OAAOA,UAAU,YAAYA,MAAMC,SAAS,IAAID,QAAQE,KAAAA;AAE1D,MAAMC,yBACJH,UACwC;CACxC,IAAI,CAACN,SAASM,KAAK,KAAK,OAAOA,MAAMI,SAAS,UAAU,OAAOF,KAAAA;CAC/D,OAAO;EACLE,MAAMJ,MAAMI;EACZ,GAAI,OAAOJ,MAAMK,WAAW,WAAW,EAAEA,QAAQL,MAAMK,OAAO,IAAI,CAAC;EACnE,GAAI,OAAOL,MAAMM,aAAa,WAAW,EAAEA,UAAUN,MAAMM,SAAS,IAAI,CAAC;CAC3E;AACF;AAEA,MAAMC,oBACJC,YACgD;CAChD,IAAI,CAACG,MAAMC,QAAQJ,OAAO,GAAG,OAAO,CAAC;CACrC,KAAK,MAAMK,QAAQL,SAAS;EAC1B,IAAI,CAACd,SAASmB,IAAI,GAAG;EACrB,MAAMT,OAAOL,SAASc,KAAKT,IAAI;EAC/B,IAAIA,SAAS,SAAS;GACpB,MAAMU,QAAQf,SAASc,KAAKC,KAAK;GACjC,IAAIA,SAASlB,sBAAsBkB,KAAK,GAAG;IACzC,MAAMJ,YAAY,UAAUK,KAAKD,KAAK,IAClCnB,oBAAoBmB,MAAME,MAAM,KAAK,CAAC,CAAC,CAAC,MAAMF,KAAK,IACnDZ,KAAAA;IACJ,OAAO;KACLO,YAAYK;KACZ,GAAIJ,cAAcR,KAAAA,IAAY,EAAEQ,UAAU,IAAI,CAAC;IACjD;GACF;EACF;EACA,IAAIN,SAAS,QAAQ;GACnB,MAAMa,OAAOlB,SAASc,KAAKI,IAAI;GAC/B,IAAIA,MAAM,OAAO,EAAEP,WAAWf,oBAAoBsB,IAAI,EAAE;EAC1D;CACF;CACA,OAAO,CAAC;AACV;AAEA,MAAaC,mBAAmBlB,UAA6C;CAC3E,IAAI,CAACN,SAASM,KAAK,GAAG,OAAO;CAE7B,MAAMmB,OACJpB,SAASC,MAAMmB,IAAI,KACnBpB,SAASC,MAAMoB,QAAQ,KACvBrB,SAASC,MAAMqB,EAAE,KACjB;CAEF,MAAMC,SAASnB,sBAAsBH,MAAMsB,MAAM;CACjD,MAAMC,cAAchB,iBAAiBP,MAAMQ,OAAO;CAElD,MAAMM,QAAQf,SAASC,MAAMc,KAAK;CAClC,MAAML,aACJc,YAAYd,eACXK,SAASlB,sBAAsBkB,KAAK,IAAIA,QAAQZ,KAAAA;CAEnD,MAAMe,OAAOlB,SAASC,MAAMiB,IAAI;CAChC,MAAMP,YACJa,YAAYb,cAAcO,OAAOtB,oBAAoBsB,IAAI,IAAIf,KAAAA;CAE/D,OAAO;EACLiB;EACA,GAAIpB,SAASC,MAAMqB,EAAE,IAAI,EAAEA,IAAItB,SAASC,MAAMqB,EAAE,EAAG,IAAI,CAAC;EACxD,GAAItB,SAASC,MAAMI,IAAI,IAAI,EAAEoB,MAAMzB,SAASC,MAAMI,IAAI,EAAG,IAAI,CAAC;EAC9D,GAAIL,SAASC,MAAMyB,WAAW,IAC1B,EAAEA,aAAa1B,SAASC,MAAMyB,WAAW,EAAG,IAC5C,CAAC;EACL,GAAIH,SAAS,EAAEA,OAAO,IAAI,CAAC;EAC3B,GAAIb,aAAa,EAAEA,WAAW,IAAI,CAAC;EACnC,GAAIC,cAAcR,KAAAA,IAAY,EAAEQ,UAAU,IAAI,CAAC;CACjD;AACF;AAEA,MAAagB,oBAAoB1B,UAC/BW,MAAMC,QAAQZ,KAAK,IACfA,MACG2B,KAAKC,SAASV,gBAAgBU,IAAI,CAAC,CAAC,CACpCC,QAAQD,SAAoCE,QAAQF,IAAI,CAAC,IAC5D,CAAA"}
|
|
@@ -2,6 +2,7 @@ import { partKey } from "./parse.js";
|
|
|
2
2
|
import { PartView } from "./PartView.js";
|
|
3
3
|
import { ChainOfThought } from "./ChainOfThought.js";
|
|
4
4
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
5
|
+
import "@assistant-ui/tap/react-shim";
|
|
5
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
7
|
//#region src/views/message/MessageTimeline.tsx
|
|
7
8
|
const isThoughtPart = (part) => part.type === "reasoning" || part.type === "tool-call";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageTimeline.js","names":["useMemo","ChainOfThought","partKey","PartView","PartPreview","isThoughtPart","part","type","MessageTimeline","t0","$","_c","parts","body","prefix","t1","firstTextIdx","findIndex","_temp","slice","length","every","some","_temp2","useCotPrefix","t2","prefix_0","body_0","useCotPrefix_0","items","t3","t4","t5","part_1","index","globalIndex","map","messageToolCount","filter","messageStepCount","tools","texts","part_0"],"sources":["../../../src/views/message/MessageTimeline.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { ChainOfThought } from \"./ChainOfThought\";\nimport { partKey } from \"./parse\";\nimport { PartView } from \"./PartView\";\nimport type { PartPreview } from \"./types\";\n\nconst isThoughtPart = (part: PartPreview) =>\n part.type === \"reasoning\" || part.type === \"tool-call\";\n\nexport const MessageTimeline = ({\n parts,\n}: {\n parts: readonly PartPreview[];\n}) => {\n const { prefix, body, useCotPrefix } = useMemo(() => {\n const firstTextIdx = parts.findIndex((part) => part.type === \"text\");\n const prefix = firstTextIdx > 0 ? parts.slice(0, firstTextIdx) : [];\n const body = firstTextIdx >= 0 ? parts.slice(firstTextIdx) : parts;\n const useCotPrefix =\n prefix.length >= 2 &&\n prefix.every(isThoughtPart) &&\n prefix.some((part) => part.type === \"reasoning\");\n\n return { prefix, body, useCotPrefix };\n }, [parts]);\n\n if (!parts.length) return null;\n\n const items = useCotPrefix ? body : parts;\n\n return (\n <div className=\"flex flex-col gap-1\">\n {useCotPrefix ? <ChainOfThought parts={prefix} /> : null}\n {items.map((part, index) => {\n const globalIndex = useCotPrefix ? prefix.length + index : index;\n return (\n <PartView key={partKey(part, globalIndex)} part={part} compact />\n );\n })}\n </div>\n );\n};\n\nexport const messageToolCount = (parts: readonly PartPreview[]) =>\n parts.filter((part) => part.type === \"tool-call\").length;\n\nexport const messageStepCount = (parts: readonly PartPreview[]) => {\n const tools = messageToolCount(parts);\n const texts = parts.filter((part) => part.type === \"text\").length;\n return { tools, texts };\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MessageTimeline.js","names":["useMemo","ChainOfThought","partKey","PartView","PartPreview","isThoughtPart","part","type","MessageTimeline","t0","$","_c","parts","body","prefix","t1","firstTextIdx","findIndex","_temp","slice","length","every","some","_temp2","useCotPrefix","t2","prefix_0","body_0","useCotPrefix_0","items","t3","t4","t5","part_1","index","globalIndex","map","messageToolCount","filter","messageStepCount","tools","texts","part_0"],"sources":["../../../src/views/message/MessageTimeline.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { ChainOfThought } from \"./ChainOfThought\";\nimport { partKey } from \"./parse\";\nimport { PartView } from \"./PartView\";\nimport type { PartPreview } from \"./types\";\n\nconst isThoughtPart = (part: PartPreview) =>\n part.type === \"reasoning\" || part.type === \"tool-call\";\n\nexport const MessageTimeline = ({\n parts,\n}: {\n parts: readonly PartPreview[];\n}) => {\n const { prefix, body, useCotPrefix } = useMemo(() => {\n const firstTextIdx = parts.findIndex((part) => part.type === \"text\");\n const prefix = firstTextIdx > 0 ? parts.slice(0, firstTextIdx) : [];\n const body = firstTextIdx >= 0 ? parts.slice(firstTextIdx) : parts;\n const useCotPrefix =\n prefix.length >= 2 &&\n prefix.every(isThoughtPart) &&\n prefix.some((part) => part.type === \"reasoning\");\n\n return { prefix, body, useCotPrefix };\n }, [parts]);\n\n if (!parts.length) return null;\n\n const items = useCotPrefix ? body : parts;\n\n return (\n <div className=\"flex flex-col gap-1\">\n {useCotPrefix ? <ChainOfThought parts={prefix} /> : null}\n {items.map((part, index) => {\n const globalIndex = useCotPrefix ? prefix.length + index : index;\n return (\n <PartView key={partKey(part, globalIndex)} part={part} compact />\n );\n })}\n </div>\n );\n};\n\nexport const messageToolCount = (parts: readonly PartPreview[]) =>\n parts.filter((part) => part.type === \"tool-call\").length;\n\nexport const messageStepCount = (parts: readonly PartPreview[]) => {\n const tools = messageToolCount(parts);\n const texts = parts.filter((part) => part.type === \"text\").length;\n return { tools, texts };\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","names":[],"sources":["../../../src/views/message/parse.ts"],"mappings":";;cAiBa,UAAW,MAAM,aAAa;cAK9B,kBACX,mBACC;cA2EU,YAAa,mBAAiB;
|
|
1
|
+
{"version":3,"file":"parse.d.ts","names":[],"sources":["../../../src/views/message/parse.ts"],"mappings":";;cAiBa,UAAW,MAAM,aAAa;cAK9B,kBACX,mBACC;cA2EU,YAAa,mBAAiB;cA2I9B,eACX,gBACA,kBACC"}
|
|
@@ -96,7 +96,7 @@ const parsePart = (value) => {
|
|
|
96
96
|
const filename = asString(value.filename);
|
|
97
97
|
const image = asString(value.image);
|
|
98
98
|
const previewUrl = image && isSafeImagePreviewUrl(image) ? image : void 0;
|
|
99
|
-
const sizeBytes = previewUrl
|
|
99
|
+
const sizeBytes = previewUrl && /^data:/i.test(previewUrl) ? estimateBase64Bytes(previewUrl.split(",", 2)[1] ?? previewUrl) : void 0;
|
|
100
100
|
return {
|
|
101
101
|
type: "image",
|
|
102
102
|
...filename ? { filename } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","names":["parseAttachments","estimateBase64Bytes","isSafeImagePreviewUrl","asBool","asNumber","asString","isRecord","MessagePreview","MessageTimingPreview","MessageUsagePreview","PartPreview","PartStatusPreview","ToolCallApprovalPreview","ToolCallInterruptPreview","ToolCallPartPreview","partKey","part","index","type","toolCallId","parsePartStatus","value","undefined","reason","error","parseInterrupt","result","payload","Object","keys","length","parseApproval","id","approved","isAutomatic","parseToolCall","Record","base","status","argsText","isError","interrupt","approval","subMessageCount","Array","isArray","messages","toolName","args","artifact","mcp","modelContent","parsePart","rawType","raw","text","sourceType","title","url","filename","image","previewUrl","sizeBytes","startsWith","split","mimeType","data","audio","format","audioData","name","spec","parseTiming","streamStartTime","firstTokenTime","totalStreamTime","tokenCount","tokensPerSecond","totalChunks","toolCallCount","parseUsage","inputTokens","outputTokens","sawUsage","step","usage","input","output","stepCount","parseMessage","role","rawParts","parts","content","map","metadata","timing","steps","submittedFeedback","isOptimistic","createdAt","branchNumber","branchCount","messageIndex","attachments"],"sources":["../../../src/views/message/parse.ts"],"sourcesContent":["import { parseAttachments } from \"../attachments/parseAttachment\";\nimport {\n estimateBase64Bytes,\n isSafeImagePreviewUrl,\n} from \"../attachments/formatBytes\";\nimport { asBool, asNumber, asString, isRecord } from \"../../utils/common\";\nimport type {\n MessagePreview,\n MessageTimingPreview,\n MessageUsagePreview,\n PartPreview,\n PartStatusPreview,\n ToolCallApprovalPreview,\n ToolCallInterruptPreview,\n ToolCallPartPreview,\n} from \"./types\";\n\nexport const partKey = (part: PartPreview, index: number) =>\n part.type === \"tool-call\" && part.toolCallId\n ? `tc:${part.toolCallId}`\n : `p:${index}`;\n\nexport const parsePartStatus = (\n value: unknown,\n): PartStatusPreview | undefined => {\n if (!isRecord(value)) return undefined;\n const type = asString(value.type);\n if (!type) return undefined;\n const reason = asString(value.reason);\n return {\n type,\n ...(reason ? { reason } : {}),\n ...(\"error\" in value && value.error !== undefined\n ? { error: value.error }\n : {}),\n };\n};\n\nconst parseInterrupt = (\n value: unknown,\n): ToolCallInterruptPreview | undefined => {\n if (!isRecord(value)) return undefined;\n const type = asString(value.type);\n const result: ToolCallInterruptPreview = {\n ...(type ? { type } : {}),\n ...(\"payload\" in value ? { payload: value.payload } : {}),\n };\n return Object.keys(result).length > 0 ? result : undefined;\n};\n\nconst parseApproval = (value: unknown): ToolCallApprovalPreview | undefined => {\n if (!isRecord(value)) return undefined;\n const id = asString(value.id);\n const approved = asBool(value.approved);\n const reason = asString(value.reason);\n const isAutomatic = asBool(value.isAutomatic);\n const result: ToolCallApprovalPreview = {\n ...(id ? { id } : {}),\n ...(approved !== undefined ? { approved } : {}),\n ...(reason ? { reason } : {}),\n ...(isAutomatic !== undefined ? { isAutomatic } : {}),\n };\n return Object.keys(result).length > 0 ? result : undefined;\n};\n\nconst parseToolCall = (\n value: Record<string, unknown>,\n base: { status?: PartStatusPreview },\n): ToolCallPartPreview => {\n const argsText = asString(value.argsText);\n const isError = asBool(value.isError);\n const interrupt = parseInterrupt(value.interrupt);\n const approval = parseApproval(value.approval);\n const subMessageCount = Array.isArray(value.messages)\n ? value.messages.length\n : 0;\n\n return {\n type: \"tool-call\",\n toolCallId: asString(value.toolCallId) ?? \"\",\n toolName: asString(value.toolName) ?? \"(unknown)\",\n args: value.args,\n subMessageCount,\n ...(argsText !== undefined ? { argsText } : {}),\n ...(\"result\" in value && value.result !== undefined\n ? { result: value.result }\n : {}),\n ...(isError !== undefined ? { isError } : {}),\n ...(value.artifact !== undefined ? { artifact: value.artifact } : {}),\n ...(value.mcp !== undefined ? { mcp: value.mcp } : {}),\n ...(value.modelContent !== undefined\n ? { modelContent: value.modelContent }\n : {}),\n ...(interrupt ? { interrupt } : {}),\n ...(approval ? { approval } : {}),\n ...base,\n };\n};\n\nexport const parsePart = (value: unknown): PartPreview => {\n if (!isRecord(value)) {\n return { type: \"unknown\", rawType: typeof value, raw: value };\n }\n\n const status = parsePartStatus(value.status);\n const base = status ? { status } : {};\n const type = asString(value.type);\n\n switch (type) {\n case \"text\":\n return { type: \"text\", text: asString(value.text) ?? \"\", ...base };\n case \"reasoning\":\n return { type: \"reasoning\", text: asString(value.text) ?? \"\", ...base };\n case \"source\": {\n const sourceType = asString(value.sourceType);\n const title = asString(value.title);\n const url = asString(value.url);\n return {\n type: \"source\",\n ...(sourceType ? { sourceType } : {}),\n ...(title ? { title } : {}),\n ...(url ? { url } : {}),\n ...base,\n };\n }\n case \"image\": {\n const filename = asString(value.filename);\n const image = asString(value.image);\n const previewUrl =\n image && isSafeImagePreviewUrl(image) ? image : undefined;\n const sizeBytes = previewUrl?.startsWith(\"data:\")\n ? estimateBase64Bytes(previewUrl.split(\",\", 2)[1] ?? previewUrl)\n : undefined;\n return {\n type: \"image\",\n ...(filename ? { filename } : {}),\n ...(previewUrl ? { previewUrl } : {}),\n ...(sizeBytes !== undefined ? { sizeBytes } : {}),\n ...base,\n };\n }\n case \"file\": {\n const filename = asString(value.filename);\n const mimeType = asString(value.mimeType);\n const data = asString(value.data);\n const sizeBytes = data ? estimateBase64Bytes(data) : undefined;\n return {\n type: \"file\",\n ...(filename ? { filename } : {}),\n ...(mimeType ? { mimeType } : {}),\n ...(sizeBytes !== undefined ? { sizeBytes } : {}),\n ...base,\n };\n }\n case \"audio\": {\n const audio = isRecord(value.audio) ? value.audio : undefined;\n const format = asString(audio?.format);\n const audioData = asString(audio?.data);\n const sizeBytes = audioData ? estimateBase64Bytes(audioData) : undefined;\n return {\n type: \"audio\",\n ...(format ? { format } : {}),\n ...(sizeBytes !== undefined ? { sizeBytes } : {}),\n ...base,\n };\n }\n case \"data\": {\n const name = asString(value.name);\n return {\n type: \"data\",\n data: value.data,\n ...(name ? { name } : {}),\n ...base,\n };\n }\n case \"generative-ui\":\n return { type: \"generative-ui\", spec: value.spec, ...base };\n case \"tool-call\":\n return parseToolCall(value, base);\n default:\n return {\n type: \"unknown\",\n rawType: type ?? typeof value,\n raw: value,\n ...base,\n };\n }\n};\n\nconst parseTiming = (value: unknown): MessageTimingPreview | undefined => {\n if (!isRecord(value)) return undefined;\n\n const streamStartTime = asNumber(value.streamStartTime);\n const firstTokenTime = asNumber(value.firstTokenTime);\n const totalStreamTime = asNumber(value.totalStreamTime);\n const tokenCount = asNumber(value.tokenCount);\n const tokensPerSecond = asNumber(value.tokensPerSecond);\n const totalChunks = asNumber(value.totalChunks);\n const toolCallCount = asNumber(value.toolCallCount);\n\n const result: MessageTimingPreview = {\n ...(streamStartTime !== undefined ? { streamStartTime } : {}),\n ...(firstTokenTime !== undefined ? { firstTokenTime } : {}),\n ...(totalStreamTime !== undefined ? { totalStreamTime } : {}),\n ...(tokenCount !== undefined ? { tokenCount } : {}),\n ...(tokensPerSecond !== undefined ? { tokensPerSecond } : {}),\n ...(totalChunks !== undefined ? { totalChunks } : {}),\n ...(toolCallCount !== undefined ? { toolCallCount } : {}),\n };\n return Object.keys(result).length > 0 ? result : undefined;\n};\n\nconst parseUsage = (value: unknown): MessageUsagePreview | undefined => {\n if (!Array.isArray(value) || value.length === 0) return undefined;\n\n let inputTokens = 0;\n let outputTokens = 0;\n let sawUsage = false;\n\n for (const step of value) {\n if (!isRecord(step) || !isRecord(step.usage)) continue;\n const input = asNumber(step.usage.inputTokens);\n const output = asNumber(step.usage.outputTokens);\n if (input !== undefined) {\n inputTokens += input;\n sawUsage = true;\n }\n if (output !== undefined) {\n outputTokens += output;\n sawUsage = true;\n }\n }\n\n if (!sawUsage) return undefined;\n return { inputTokens, outputTokens, stepCount: value.length };\n};\n\nexport const parseMessage = (\n value: unknown,\n index: number,\n): MessagePreview | null => {\n if (!isRecord(value)) return null;\n\n const id = asString(value.id) ?? `message-${index}`;\n const role = asString(value.role) ?? \"unknown\";\n\n const rawParts = Array.isArray(value.parts)\n ? value.parts\n : Array.isArray(value.content)\n ? value.content\n : [];\n const parts = rawParts.map((part) => parsePart(part));\n\n const status = parsePartStatus(value.status);\n const metadata = isRecord(value.metadata) ? value.metadata : undefined;\n const timing = parseTiming(metadata?.timing);\n const usage = parseUsage(metadata?.steps);\n const submittedFeedback = isRecord(metadata?.submittedFeedback)\n ? asString(metadata.submittedFeedback.type)\n : undefined;\n const isOptimistic = asBool(metadata?.isOptimistic);\n const createdAt = asString(value.createdAt);\n const branchNumber = asNumber(value.branchNumber);\n const branchCount = asNumber(value.branchCount);\n const messageIndex = asNumber(value.index);\n\n return {\n id,\n role,\n parts,\n attachments: parseAttachments(value.attachments),\n ...(createdAt ? { createdAt } : {}),\n ...(status ? { status } : {}),\n ...(timing ? { timing } : {}),\n ...(usage ? { usage } : {}),\n ...(branchNumber !== undefined ? { branchNumber } : {}),\n ...(branchCount !== undefined ? { branchCount } : {}),\n ...(messageIndex !== undefined ? { index: messageIndex } : {}),\n ...(isOptimistic !== undefined ? { isOptimistic } : {}),\n ...(submittedFeedback ? { submittedFeedback } : {}),\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse.js","names":["parseAttachments","estimateBase64Bytes","isSafeImagePreviewUrl","asBool","asNumber","asString","isRecord","MessagePreview","MessageTimingPreview","MessageUsagePreview","PartPreview","PartStatusPreview","ToolCallApprovalPreview","ToolCallInterruptPreview","ToolCallPartPreview","partKey","part","index","type","toolCallId","parsePartStatus","value","undefined","reason","error","parseInterrupt","result","payload","Object","keys","length","parseApproval","id","approved","isAutomatic","parseToolCall","Record","base","status","argsText","isError","interrupt","approval","subMessageCount","Array","isArray","messages","toolName","args","artifact","mcp","modelContent","parsePart","rawType","raw","text","sourceType","title","url","filename","image","previewUrl","sizeBytes","test","split","mimeType","data","audio","format","audioData","name","spec","parseTiming","streamStartTime","firstTokenTime","totalStreamTime","tokenCount","tokensPerSecond","totalChunks","toolCallCount","parseUsage","inputTokens","outputTokens","sawUsage","step","usage","input","output","stepCount","parseMessage","role","rawParts","parts","content","map","metadata","timing","steps","submittedFeedback","isOptimistic","createdAt","branchNumber","branchCount","messageIndex","attachments"],"sources":["../../../src/views/message/parse.ts"],"sourcesContent":["import { parseAttachments } from \"../attachments/parseAttachment\";\nimport {\n estimateBase64Bytes,\n isSafeImagePreviewUrl,\n} from \"../attachments/formatBytes\";\nimport { asBool, asNumber, asString, isRecord } from \"../../utils/common\";\nimport type {\n MessagePreview,\n MessageTimingPreview,\n MessageUsagePreview,\n PartPreview,\n PartStatusPreview,\n ToolCallApprovalPreview,\n ToolCallInterruptPreview,\n ToolCallPartPreview,\n} from \"./types\";\n\nexport const partKey = (part: PartPreview, index: number) =>\n part.type === \"tool-call\" && part.toolCallId\n ? `tc:${part.toolCallId}`\n : `p:${index}`;\n\nexport const parsePartStatus = (\n value: unknown,\n): PartStatusPreview | undefined => {\n if (!isRecord(value)) return undefined;\n const type = asString(value.type);\n if (!type) return undefined;\n const reason = asString(value.reason);\n return {\n type,\n ...(reason ? { reason } : {}),\n ...(\"error\" in value && value.error !== undefined\n ? { error: value.error }\n : {}),\n };\n};\n\nconst parseInterrupt = (\n value: unknown,\n): ToolCallInterruptPreview | undefined => {\n if (!isRecord(value)) return undefined;\n const type = asString(value.type);\n const result: ToolCallInterruptPreview = {\n ...(type ? { type } : {}),\n ...(\"payload\" in value ? { payload: value.payload } : {}),\n };\n return Object.keys(result).length > 0 ? result : undefined;\n};\n\nconst parseApproval = (value: unknown): ToolCallApprovalPreview | undefined => {\n if (!isRecord(value)) return undefined;\n const id = asString(value.id);\n const approved = asBool(value.approved);\n const reason = asString(value.reason);\n const isAutomatic = asBool(value.isAutomatic);\n const result: ToolCallApprovalPreview = {\n ...(id ? { id } : {}),\n ...(approved !== undefined ? { approved } : {}),\n ...(reason ? { reason } : {}),\n ...(isAutomatic !== undefined ? { isAutomatic } : {}),\n };\n return Object.keys(result).length > 0 ? result : undefined;\n};\n\nconst parseToolCall = (\n value: Record<string, unknown>,\n base: { status?: PartStatusPreview },\n): ToolCallPartPreview => {\n const argsText = asString(value.argsText);\n const isError = asBool(value.isError);\n const interrupt = parseInterrupt(value.interrupt);\n const approval = parseApproval(value.approval);\n const subMessageCount = Array.isArray(value.messages)\n ? value.messages.length\n : 0;\n\n return {\n type: \"tool-call\",\n toolCallId: asString(value.toolCallId) ?? \"\",\n toolName: asString(value.toolName) ?? \"(unknown)\",\n args: value.args,\n subMessageCount,\n ...(argsText !== undefined ? { argsText } : {}),\n ...(\"result\" in value && value.result !== undefined\n ? { result: value.result }\n : {}),\n ...(isError !== undefined ? { isError } : {}),\n ...(value.artifact !== undefined ? { artifact: value.artifact } : {}),\n ...(value.mcp !== undefined ? { mcp: value.mcp } : {}),\n ...(value.modelContent !== undefined\n ? { modelContent: value.modelContent }\n : {}),\n ...(interrupt ? { interrupt } : {}),\n ...(approval ? { approval } : {}),\n ...base,\n };\n};\n\nexport const parsePart = (value: unknown): PartPreview => {\n if (!isRecord(value)) {\n return { type: \"unknown\", rawType: typeof value, raw: value };\n }\n\n const status = parsePartStatus(value.status);\n const base = status ? { status } : {};\n const type = asString(value.type);\n\n switch (type) {\n case \"text\":\n return { type: \"text\", text: asString(value.text) ?? \"\", ...base };\n case \"reasoning\":\n return { type: \"reasoning\", text: asString(value.text) ?? \"\", ...base };\n case \"source\": {\n const sourceType = asString(value.sourceType);\n const title = asString(value.title);\n const url = asString(value.url);\n return {\n type: \"source\",\n ...(sourceType ? { sourceType } : {}),\n ...(title ? { title } : {}),\n ...(url ? { url } : {}),\n ...base,\n };\n }\n case \"image\": {\n const filename = asString(value.filename);\n const image = asString(value.image);\n const previewUrl =\n image && isSafeImagePreviewUrl(image) ? image : undefined;\n const sizeBytes =\n previewUrl && /^data:/i.test(previewUrl)\n ? estimateBase64Bytes(previewUrl.split(\",\", 2)[1] ?? previewUrl)\n : undefined;\n return {\n type: \"image\",\n ...(filename ? { filename } : {}),\n ...(previewUrl ? { previewUrl } : {}),\n ...(sizeBytes !== undefined ? { sizeBytes } : {}),\n ...base,\n };\n }\n case \"file\": {\n const filename = asString(value.filename);\n const mimeType = asString(value.mimeType);\n const data = asString(value.data);\n const sizeBytes = data ? estimateBase64Bytes(data) : undefined;\n return {\n type: \"file\",\n ...(filename ? { filename } : {}),\n ...(mimeType ? { mimeType } : {}),\n ...(sizeBytes !== undefined ? { sizeBytes } : {}),\n ...base,\n };\n }\n case \"audio\": {\n const audio = isRecord(value.audio) ? value.audio : undefined;\n const format = asString(audio?.format);\n const audioData = asString(audio?.data);\n const sizeBytes = audioData ? estimateBase64Bytes(audioData) : undefined;\n return {\n type: \"audio\",\n ...(format ? { format } : {}),\n ...(sizeBytes !== undefined ? { sizeBytes } : {}),\n ...base,\n };\n }\n case \"data\": {\n const name = asString(value.name);\n return {\n type: \"data\",\n data: value.data,\n ...(name ? { name } : {}),\n ...base,\n };\n }\n case \"generative-ui\":\n return { type: \"generative-ui\", spec: value.spec, ...base };\n case \"tool-call\":\n return parseToolCall(value, base);\n default:\n return {\n type: \"unknown\",\n rawType: type ?? typeof value,\n raw: value,\n ...base,\n };\n }\n};\n\nconst parseTiming = (value: unknown): MessageTimingPreview | undefined => {\n if (!isRecord(value)) return undefined;\n\n const streamStartTime = asNumber(value.streamStartTime);\n const firstTokenTime = asNumber(value.firstTokenTime);\n const totalStreamTime = asNumber(value.totalStreamTime);\n const tokenCount = asNumber(value.tokenCount);\n const tokensPerSecond = asNumber(value.tokensPerSecond);\n const totalChunks = asNumber(value.totalChunks);\n const toolCallCount = asNumber(value.toolCallCount);\n\n const result: MessageTimingPreview = {\n ...(streamStartTime !== undefined ? { streamStartTime } : {}),\n ...(firstTokenTime !== undefined ? { firstTokenTime } : {}),\n ...(totalStreamTime !== undefined ? { totalStreamTime } : {}),\n ...(tokenCount !== undefined ? { tokenCount } : {}),\n ...(tokensPerSecond !== undefined ? { tokensPerSecond } : {}),\n ...(totalChunks !== undefined ? { totalChunks } : {}),\n ...(toolCallCount !== undefined ? { toolCallCount } : {}),\n };\n return Object.keys(result).length > 0 ? result : undefined;\n};\n\nconst parseUsage = (value: unknown): MessageUsagePreview | undefined => {\n if (!Array.isArray(value) || value.length === 0) return undefined;\n\n let inputTokens = 0;\n let outputTokens = 0;\n let sawUsage = false;\n\n for (const step of value) {\n if (!isRecord(step) || !isRecord(step.usage)) continue;\n const input = asNumber(step.usage.inputTokens);\n const output = asNumber(step.usage.outputTokens);\n if (input !== undefined) {\n inputTokens += input;\n sawUsage = true;\n }\n if (output !== undefined) {\n outputTokens += output;\n sawUsage = true;\n }\n }\n\n if (!sawUsage) return undefined;\n return { inputTokens, outputTokens, stepCount: value.length };\n};\n\nexport const parseMessage = (\n value: unknown,\n index: number,\n): MessagePreview | null => {\n if (!isRecord(value)) return null;\n\n const id = asString(value.id) ?? `message-${index}`;\n const role = asString(value.role) ?? \"unknown\";\n\n const rawParts = Array.isArray(value.parts)\n ? value.parts\n : Array.isArray(value.content)\n ? value.content\n : [];\n const parts = rawParts.map((part) => parsePart(part));\n\n const status = parsePartStatus(value.status);\n const metadata = isRecord(value.metadata) ? value.metadata : undefined;\n const timing = parseTiming(metadata?.timing);\n const usage = parseUsage(metadata?.steps);\n const submittedFeedback = isRecord(metadata?.submittedFeedback)\n ? asString(metadata.submittedFeedback.type)\n : undefined;\n const isOptimistic = asBool(metadata?.isOptimistic);\n const createdAt = asString(value.createdAt);\n const branchNumber = asNumber(value.branchNumber);\n const branchCount = asNumber(value.branchCount);\n const messageIndex = asNumber(value.index);\n\n return {\n id,\n role,\n parts,\n attachments: parseAttachments(value.attachments),\n ...(createdAt ? { createdAt } : {}),\n ...(status ? { status } : {}),\n ...(timing ? { timing } : {}),\n ...(usage ? { usage } : {}),\n ...(branchNumber !== undefined ? { branchNumber } : {}),\n ...(branchCount !== undefined ? { branchCount } : {}),\n ...(messageIndex !== undefined ? { index: messageIndex } : {}),\n ...(isOptimistic !== undefined ? { isOptimistic } : {}),\n ...(submittedFeedback ? { submittedFeedback } : {}),\n };\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-devtools",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.12",
|
|
4
4
|
"description": "React development tools for assistant-ui components",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"assistant-ui",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"zod": "^4.4.3"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@assistant-ui/react": "^0.
|
|
34
|
+
"@assistant-ui/react": "^0.15.0",
|
|
35
35
|
"@assistant-ui/tap": "^0.9.0",
|
|
36
36
|
"@types/react": "*",
|
|
37
37
|
"@types/react-dom": "*",
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"react-dom": "^19.2.8",
|
|
56
56
|
"tailwindcss": "^4.3.3",
|
|
57
57
|
"vitest": "^4.1.10",
|
|
58
|
-
"@assistant-ui/react": "0.
|
|
59
|
-
"@assistant-ui/tap": "0.9.
|
|
60
|
-
"@assistant-ui/x-buildutils": "0.0.
|
|
58
|
+
"@assistant-ui/react": "0.15.1",
|
|
59
|
+
"@assistant-ui/tap": "0.9.8",
|
|
60
|
+
"@assistant-ui/x-buildutils": "0.0.20"
|
|
61
61
|
},
|
|
62
62
|
"publishConfig": {
|
|
63
63
|
"access": "public",
|
package/src/data/projectApi.ts
CHANGED
|
@@ -18,7 +18,11 @@ interface DevToolsApiEntry {
|
|
|
18
18
|
* from state extraction.
|
|
19
19
|
*/
|
|
20
20
|
const readMethods = (scopeValue: unknown): string[] => {
|
|
21
|
-
if (
|
|
21
|
+
if (
|
|
22
|
+
!scopeValue ||
|
|
23
|
+
(typeof scopeValue !== "object" && typeof scopeValue !== "function")
|
|
24
|
+
)
|
|
25
|
+
return [];
|
|
22
26
|
try {
|
|
23
27
|
return Object.keys(scopeValue).filter(
|
|
24
28
|
(key) =>
|
|
@@ -126,7 +130,9 @@ export const projectApi = (apiId: number, entry: DevToolsApiEntry): ApiInfo => {
|
|
|
126
130
|
try {
|
|
127
131
|
const scopeValue = scope();
|
|
128
132
|
if (scope.source === "root") {
|
|
129
|
-
state[name] =
|
|
133
|
+
state[name] =
|
|
134
|
+
(scopeValue as { getState?: () => unknown })?.getState?.() ??
|
|
135
|
+
scopeValue;
|
|
130
136
|
}
|
|
131
137
|
methods = readMethods(scopeValue);
|
|
132
138
|
} catch {
|
|
@@ -10,6 +10,4 @@ export const estimateBase64Bytes = (data: string): number =>
|
|
|
10
10
|
Math.max(0, Math.floor((data.length * 3) / 4));
|
|
11
11
|
|
|
12
12
|
export const isSafeImagePreviewUrl = (url: string): boolean =>
|
|
13
|
-
|
|
14
|
-
url.startsWith("https://") ||
|
|
15
|
-
url.startsWith("http://");
|
|
13
|
+
/^data:image\//i.test(url) || /^https?:\/\//i.test(url);
|
|
@@ -34,4 +34,29 @@ describe("parseAttachment", () => {
|
|
|
34
34
|
expect(result?.previewUrl).toBe("data:image/png;base64,abcd");
|
|
35
35
|
expect(result?.sizeBytes).toBeGreaterThan(0);
|
|
36
36
|
});
|
|
37
|
+
|
|
38
|
+
it("extracts preview and size for an uppercase data: scheme", () => {
|
|
39
|
+
const result = parseAttachment({
|
|
40
|
+
name: "shot.png",
|
|
41
|
+
type: "image",
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: "image",
|
|
45
|
+
image: "DATA:IMAGE/PNG;base64,abcd",
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
expect(result?.previewUrl).toBe("DATA:IMAGE/PNG;base64,abcd");
|
|
50
|
+
expect(result?.sizeBytes).toBeGreaterThan(0);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("accepts an uppercase HTTPS preview URL without a size estimate", () => {
|
|
54
|
+
const result = parseAttachment({
|
|
55
|
+
name: "remote.png",
|
|
56
|
+
type: "image",
|
|
57
|
+
image: "HTTPS://example.com/pic.png",
|
|
58
|
+
});
|
|
59
|
+
expect(result?.previewUrl).toBe("HTTPS://example.com/pic.png");
|
|
60
|
+
expect(result?.sizeBytes).toBeUndefined();
|
|
61
|
+
});
|
|
37
62
|
});
|
|
@@ -26,7 +26,7 @@ const mediaFromContent = (
|
|
|
26
26
|
if (type === "image") {
|
|
27
27
|
const image = asString(part.image);
|
|
28
28
|
if (image && isSafeImagePreviewUrl(image)) {
|
|
29
|
-
const sizeBytes =
|
|
29
|
+
const sizeBytes = /^data:/i.test(image)
|
|
30
30
|
? estimateBase64Bytes(image.split(",", 2)[1] ?? image)
|
|
31
31
|
: undefined;
|
|
32
32
|
return {
|
|
@@ -99,6 +99,21 @@ describe("parsePart", () => {
|
|
|
99
99
|
expect(part.subMessageCount).toBe(2);
|
|
100
100
|
});
|
|
101
101
|
|
|
102
|
+
it("parses an image part with an uppercase data: scheme", () => {
|
|
103
|
+
const part = parsePart({
|
|
104
|
+
type: "image",
|
|
105
|
+
image: "DATA:IMAGE/PNG;base64,abcd",
|
|
106
|
+
filename: "shot.png",
|
|
107
|
+
});
|
|
108
|
+
expect(part).toMatchObject({
|
|
109
|
+
type: "image",
|
|
110
|
+
filename: "shot.png",
|
|
111
|
+
previewUrl: "DATA:IMAGE/PNG;base64,abcd",
|
|
112
|
+
});
|
|
113
|
+
if (part.type !== "image") return;
|
|
114
|
+
expect(part.sizeBytes).toBeGreaterThan(0);
|
|
115
|
+
});
|
|
116
|
+
|
|
102
117
|
it("falls back to unknown for unrecognized part types", () => {
|
|
103
118
|
const part = parsePart({ type: "mystery", foo: 1 });
|
|
104
119
|
expect(part.type).toBe("unknown");
|
|
@@ -128,9 +128,10 @@ export const parsePart = (value: unknown): PartPreview => {
|
|
|
128
128
|
const image = asString(value.image);
|
|
129
129
|
const previewUrl =
|
|
130
130
|
image && isSafeImagePreviewUrl(image) ? image : undefined;
|
|
131
|
-
const sizeBytes =
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
const sizeBytes =
|
|
132
|
+
previewUrl && /^data:/i.test(previewUrl)
|
|
133
|
+
? estimateBase64Bytes(previewUrl.split(",", 2)[1] ?? previewUrl)
|
|
134
|
+
: undefined;
|
|
134
135
|
return {
|
|
135
136
|
type: "image",
|
|
136
137
|
...(filename ? { filename } : {}),
|