@assistant-ui/react-devtools 1.2.10 → 1.2.11
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/message/MessageTimeline.js +1 -0
- package/dist/views/message/MessageTimeline.js.map +1 -1
- package/package.json +5 -5
- package/src/data/projectApi.ts +8 -2
|
@@ -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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"}
|
|
@@ -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":";;;;;;;AAMA,MAAMK,iBAAiBC,SACrBA,KAAKC,SAAS,eAAeD,KAAKC,SAAS;AAE7C,MAAaC,mBAAkBC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,UAAAH;CAI/B,IAAAI;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAL,EAAA,OAAAE,OAAA;EAEG,MAAAI,eAAqBJ,MAAKK,UAAWC,KAA8B;EACnEJ,SAAeE,eAAe,IAAIJ,MAAKO,MAAO,GAAGH,YAAiB,IAAnD,CAAA;EACfH,OAAaG,gBAAgB,IAAIJ,MAAKO,MAAOH,YAAoB,IAApDJ;EAEXG,KAAAD,OAAMM,UAAW,KACjBN,OAAMO,MAAOhB,aAAa,KAC1BS,OAAMQ,KAAMC,MAAmC;EAACb,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAA;EAAAF,OAAAH,EAAA;EAAAI,SAAAJ,EAAA;EAAAK,KAAAL,EAAA;CAAA;CAHlD,MAAAc,eACET;CAEiD,IAAAU;CAAA,IAAAf,EAAA,OAAAG,QAAAH,EAAA,OAAAI,UAAAJ,EAAA,OAAAc,cAAA;EAE5CC,KAAA;GAAAX;GAAAD;GAAAW;EAA6B;EAACd,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAc;EAAAd,EAAA,KAAAe;CAAA,OAAAA,KAAAf,EAAA;CATvC,MAAA,EAAAI,QAAAY,UAAAb,MAAAc,QAAAH,cAAAI,mBASEH;CAGF,IAAI,CAACb,MAAKQ,QAAO,OAAS;CAE1B,MAAAS,QAAcL,iBAAAG,SAAAf;CAA4B,IAAAkB;CAAA,IAAApB,EAAA,OAAAgB,YAAAhB,EAAA,OAAAkB,gBAAA;EAIrCE,KAAAN,iBAAe,oBAAC,gBAAD,EAAuBV,OAAAA,SAAM,CAAA,IAA5C;EAAuDJ,EAAA,KAAAgB;EAAAhB,EAAA,KAAAkB;EAAAlB,EAAA,MAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAAA,IAAAqB;CAAA,IAAArB,EAAA,QAAAmB,SAAAnB,EAAA,QAAAgB,YAAAhB,EAAA,QAAAkB,gBAAA;EAAA,IAAAI;EAAA,IAAAtB,EAAA,QAAAgB,YAAAhB,EAAA,QAAAkB,gBAAA;GAC7CI,MAAAC,QAAAC,UAAA;IACT,MAAAC,cAAoBX,iBAAeV,SAAMM,SAAUc,QAA/BA;IAA6C,OAE/D,oBAAC,UAAD;KAAiD5B,MAAAA;KAAM,SAAA;IAAO,GAA/CJ,QAAQI,QAAM6B,WAAW,CAAsB;GAAG;GAEpEzB,EAAA,MAAAgB;GAAAhB,EAAA,MAAAkB;GAAAlB,EAAA,MAAAsB;EAAA,OAAAA,KAAAtB,EAAA;EALAqB,KAAAF,MAAKO,IAAKJ,EAKV;EAACtB,EAAA,MAAAmB;EAAAnB,EAAA,MAAAgB;EAAAhB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAAA,IAAAsB;CAAA,IAAAtB,EAAA,QAAAoB,MAAApB,EAAA,QAAAqB,IAAA;EAPJC,KAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACGF,IACAC,EAMG;;EAAArB,EAAA,MAAAoB;EAAApB,EAAA,MAAAqB;EAAArB,EAAA,MAAAsB;CAAA,OAAAA,KAAAtB,EAAA;CAAA,OARNsB;AAQM;AAIV,MAAaK,oBAAoBzB,UAC/BA,MAAM0B,QAAQhC,SAASA,KAAKC,SAAS,WAAW,CAAC,CAACa;AAEpD,MAAamB,oBAAoB3B,UAAkC;CAGjE,OAAO;EAAE4B,OAFKH,iBAAiBzB,KAEtB4B;EAAOC,OADF7B,MAAM0B,QAAQhC,SAASA,KAAKC,SAAS,MAAM,CAAC,CAACa;CACrC;AACxB;AAzC+B,SAAAF,MAAAZ,MAAA;CAAA,OAMoBA,KAAIC,SAAU;AAAM;AANxC,SAAAgB,OAAAmB,QAAA;CAAA,OAYHpC,OAAIC,SAAU;AAAW"}
|
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.11",
|
|
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/
|
|
59
|
-
"@assistant-ui/
|
|
60
|
-
"@assistant-ui/x-buildutils": "0.0.
|
|
58
|
+
"@assistant-ui/tap": "0.9.7",
|
|
59
|
+
"@assistant-ui/react": "0.15.0",
|
|
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 {
|