@assistant-ui/react-devtools 1.2.9 → 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.
Files changed (62) hide show
  1. package/dist/DevToolsModal.js.map +1 -1
  2. package/dist/DevToolsModalImpl.js.map +1 -1
  3. package/dist/data/projectApi.d.ts.map +1 -1
  4. package/dist/data/projectApi.js +1 -1
  5. package/dist/data/projectApi.js.map +1 -1
  6. package/dist/shell/DevToolsOverlay.js.map +1 -1
  7. package/dist/shell/DevToolsPanel.js.map +1 -1
  8. package/dist/shell/SplitLayout.js.map +1 -1
  9. package/dist/shell/tabs/ActivityTab.js +1 -0
  10. package/dist/shell/tabs/ActivityTab.js.map +1 -1
  11. package/dist/shell/tabs/ContextTab.js +1 -0
  12. package/dist/shell/tabs/ContextTab.js.map +1 -1
  13. package/dist/shell/tabs/RawTab.js +1 -0
  14. package/dist/shell/tabs/RawTab.js.map +1 -1
  15. package/dist/shell/tabs/ThreadTab.js.map +1 -1
  16. package/dist/styles/panel.generated.d.ts +1 -1
  17. package/dist/styles/panel.generated.js +1 -1
  18. package/dist/styles/panel.generated.js.map +1 -1
  19. package/dist/views/activity/EventLogRow.js.map +1 -1
  20. package/dist/views/activity/EventStreamPane.js.map +1 -1
  21. package/dist/views/activity/OrphansPane.js.map +1 -1
  22. package/dist/views/activity/RunDetailPane.js.map +1 -1
  23. package/dist/views/activity/activityNodes.d.ts.map +1 -1
  24. package/dist/views/attachments/AttachmentList.js.map +1 -1
  25. package/dist/views/attachments/MediaPartView.js.map +1 -1
  26. package/dist/views/context/ToolUIsView.js.map +1 -1
  27. package/dist/views/mcp/McpView.js.map +1 -1
  28. package/dist/views/message/ChainOfThought.js.map +1 -1
  29. package/dist/views/message/MessageDetailPane.js.map +1 -1
  30. package/dist/views/message/MessageItem.js.map +1 -1
  31. package/dist/views/message/MessageList.js.map +1 -1
  32. package/dist/views/message/MessageMetrics.js.map +1 -1
  33. package/dist/views/message/MessageTimeline.js +1 -0
  34. package/dist/views/message/MessageTimeline.js.map +1 -1
  35. package/dist/views/message/PartDisclosure.js.map +1 -1
  36. package/dist/views/message/PartView.js.map +1 -1
  37. package/dist/views/message/RoleLabel.js.map +1 -1
  38. package/dist/views/message/StatusBadge.js.map +1 -1
  39. package/dist/views/message/ToolCallView.js.map +1 -1
  40. package/dist/views/message/TtftBar.js.map +1 -1
  41. package/dist/views/model-context/ModelContextView.js.map +1 -1
  42. package/dist/views/raw/RawDetail.js.map +1 -1
  43. package/dist/views/raw/statePreview.js.map +1 -1
  44. package/dist/views/runs/PayloadDiff.js.map +1 -1
  45. package/dist/views/scopes/ScopesView.js.map +1 -1
  46. package/dist/views/thread/ComposerFlags.js.map +1 -1
  47. package/dist/views/thread/ComposerQueue.js.map +1 -1
  48. package/dist/views/thread/ConversationList.js.map +1 -1
  49. package/dist/views/thread/ThreadDetails.js.map +1 -1
  50. package/dist/views/thread/Transcript.js.map +1 -1
  51. package/dist/views/ui/CopyButton.js.map +1 -1
  52. package/dist/views/ui/InfoCard.js.map +1 -1
  53. package/dist/views/ui/JSONTree.js.map +1 -1
  54. package/dist/views/ui/PaneHeader.js.map +1 -1
  55. package/dist/views/ui/RailTime.js.map +1 -1
  56. package/dist/views/ui/SelectableRow.d.ts.map +1 -1
  57. package/dist/views/ui/Sparkline.js.map +1 -1
  58. package/dist/views/ui/SummaryItem.js.map +1 -1
  59. package/dist/views/ui/useCopyToClipboard.d.ts.map +1 -1
  60. package/package.json +9 -9
  61. package/src/data/projectApi.ts +8 -2
  62. package/src/styles/panel.generated.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsModal.js","names":["c","_c","lazy","Suspense","DevToolsPanelPlugin","DevToolsClient","DevToolsModalProps","plugins","theme","client","DevToolsModalImpl","DevToolsModal","t0","$","t1","undefined","props","process","env","NODE_ENV","t2"],"sources":["../src/DevToolsModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { lazy, Suspense } from \"react\";\nimport type { DevToolsPanelPlugin } from \"./shell/registry\";\nimport type { DevToolsClient } from \"./data/types\";\n\nexport interface DevToolsModalProps {\n /** Extra inspector tabs appended after the builtins. */\n plugins?: DevToolsPanelPlugin[];\n /** Force a theme. Defaults to \"system\", which follows the host `.dark` class. */\n theme?: \"light\" | \"dark\" | \"system\";\n /** Data source. Defaults to the in-process DevToolsHooks client. */\n client?: DevToolsClient;\n}\n\nconst DevToolsModalImpl = lazy(() => import(\"./DevToolsModalImpl\"));\n\n/**\n * Dev-only. In production the body returns null before the lazy panel chunk is\n * ever requested, so the panel and its compiled styles stay out of the\n * production bundle (the dynamic import is also code-split).\n */\nexport const DevToolsModal = (props: DevToolsModalProps = {}) => {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"production\"\n ) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <DevToolsModalImpl {...props} />\n </Suspense>\n );\n};\n"],"mappings":";;;;;AAeA,MAAMU,oBAAoBR,WAAW,OAAO,yBAAsB;;;;;;AAOlE,MAAaS,iBAAgBC,OAAA;CAAA,MAAAC,IAAAZ,EAAA,CAAA;CAAA,IAAAa;CAAA,IAAAD,EAAA,OAAAD,IAAA;EAACE,KAAAF,OAAAG,KAAAA,IAAA,CAA6B,IAA7BH;EAA8BC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;CAAA,OAAAA,KAAAD,EAAA;CAA9B,MAAAG,QAAAF;CAC5B,IACE,OAAOG,YAAY,eACnBA,QAAOC,KAAcC,aAAK,cAAY,OAE/B;CACR,IAAAC;CAAA,IAAAP,EAAA,OAAAG,OAAA;EAGCI,KAAA,oBAAC,UAAD;GAAoB,UAAA;aAClB,oBAAC,mBAAD,EAAkB,GAAKJ,MAAK,CAAA;EADrB,CAAA;EAEEH,EAAA,KAAAG;EAAAH,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,OAFXO;AAEW"}
1
+ {"version":3,"file":"DevToolsModal.js","names":["c","_c","lazy","Suspense","DevToolsPanelPlugin","DevToolsClient","DevToolsModalProps","plugins","theme","client","DevToolsModalImpl","DevToolsModal","t0","$","t1","undefined","props","process","env","NODE_ENV","t2"],"sources":["../src/DevToolsModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { lazy, Suspense } from \"react\";\nimport type { DevToolsPanelPlugin } from \"./shell/registry\";\nimport type { DevToolsClient } from \"./data/types\";\n\nexport interface DevToolsModalProps {\n /** Extra inspector tabs appended after the builtins. */\n plugins?: DevToolsPanelPlugin[];\n /** Force a theme. Defaults to \"system\", which follows the host `.dark` class. */\n theme?: \"light\" | \"dark\" | \"system\";\n /** Data source. Defaults to the in-process DevToolsHooks client. */\n client?: DevToolsClient;\n}\n\nconst DevToolsModalImpl = lazy(() => import(\"./DevToolsModalImpl\"));\n\n/**\n * Dev-only. In production the body returns null before the lazy panel chunk is\n * ever requested, so the panel and its compiled styles stay out of the\n * production bundle (the dynamic import is also code-split).\n */\nexport const DevToolsModal = (props: DevToolsModalProps = {}) => {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"production\"\n ) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <DevToolsModalImpl {...props} />\n </Suspense>\n );\n};\n"],"mappings":";;;;;AAeA,MAAMU,oBAAoBR,WAAW,OAAO,yBAAsB;;;;;;AAOlE,MAAaS,iBAAgBC,OAAA;CAAA,MAAAC,IAAAZ,EAAA,CAAA;CAAA,IAAAa;CAAA,IAAAD,EAAA,OAAAD,IAAA;EAACE,KAAAF,OAAAG,KAAAA,IAAA,CAA6B,IAA7BH;EAA8BC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;CAAA,OAAAA,KAAAD,EAAA;CAA9B,MAAAG,QAAAF;CAC5B,IACE,OAAOG,YAAY,eACnBA,QAAOC,KAAcC,aAAK,cAAY,OAE/B;CACR,IAAAC;CAAA,IAAAP,EAAA,OAAAG,OAAA;EAGCI,KAAA,oBAAC,UAAD;GAAoB,UAAA;GAClB,UAAA,oBAAC,mBAAD,EAAkB,GAAKJ,MAAK,CAAA;EADrB,CAAA;EAEEH,EAAA,KAAAG;EAAAH,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,OAFXO;AAEW"}
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsModalImpl.js","names":["c","_c","useMemo","useSyncExternalStore","DevToolsOverlay","ShadowRoot","DevToolsModalProps","isDarkMode","document","documentElement","classList","contains","body","subscribeToThemeChanges","callback","MutationObserver","observer","observe","attributes","attributeFilter","disconnect","DevToolsModalImpl","t0","$","plugins","theme","t1","client","undefined","darkMode","_temp","resolved","t2","overlay","t3"],"sources":["../src/DevToolsModalImpl.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useSyncExternalStore } from \"react\";\nimport { DevToolsOverlay } from \"./shell/DevToolsOverlay\";\nimport { ShadowRoot } from \"./shell/ShadowRoot\";\nimport type { DevToolsModalProps } from \"./DevToolsModal\";\n\nconst isDarkMode = (): boolean => {\n if (typeof document === \"undefined\") return false;\n return (\n document.documentElement.classList.contains(\"dark\") ||\n document.body.classList.contains(\"dark\")\n );\n};\n\nconst subscribeToThemeChanges = (callback: () => void) => {\n if (typeof MutationObserver === \"undefined\") {\n return () => {};\n }\n\n const observer = new MutationObserver(callback);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n if (document.body !== document.documentElement) {\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n }\n\n return () => observer.disconnect();\n};\n\nconst DevToolsModalImpl = ({\n plugins,\n theme = \"system\",\n client,\n}: DevToolsModalProps) => {\n const darkMode = useSyncExternalStore(\n subscribeToThemeChanges,\n isDarkMode,\n () => false,\n );\n const resolved = theme === \"system\" ? (darkMode ? \"dark\" : \"light\") : theme;\n\n // Stable element identity so the shadow root only re-renders on real changes,\n // not on every render of the host tree.\n const overlay = useMemo(\n () => (\n <DevToolsOverlay theme={resolved} plugins={plugins} client={client} />\n ),\n [resolved, plugins, client],\n );\n\n return <ShadowRoot theme={resolved}>{overlay}</ShadowRoot>;\n};\n\nexport default DevToolsModalImpl;\n"],"mappings":";;;;;;;AAOA,MAAMO,mBAA4B;CAChC,IAAI,OAAOC,aAAa,aAAa,OAAO;CAC5C,OACEA,SAASC,gBAAgBC,UAAUC,SAAS,MAAM,KAClDH,SAASI,KAAKF,UAAUC,SAAS,MAAM;AAE3C;AAEA,MAAME,2BAA2BC,aAAyB;CACxD,IAAI,OAAOC,qBAAqB,aAC9B,aAAa,CAAC;CAGhB,MAAMC,WAAW,IAAID,iBAAiBD,QAAQ;CAC9CE,SAASC,QAAQT,SAASC,iBAAiB;EACzCS,YAAY;EACZC,iBAAiB,CAAC,OAAO;CAC3B,CAAC;CACD,IAAIX,SAASI,SAASJ,SAASC,iBAC7BO,SAASC,QAAQT,SAASI,MAAM;EAC9BM,YAAY;EACZC,iBAAiB,CAAC,OAAO;CAC3B,CAAC;CAGH,aAAaH,SAASI,WAAW;AACnC;AAEA,MAAMC,qBAAoBC,OAAA;CAAA,MAAAC,IAAAtB,EAAA,CAAA;CAAC,MAAA,EAAAuB,SAAAC,OAAAC,IAAAC,WAAAL;CAEzB,MAAAG,QAAAC,OAAAE,KAAAA,IAAA,WAAAF;CAGA,MAAAG,WAAiB1B,qBACfU,yBACAN,YACAuB,KACF;CACA,MAAAC,WAAiBN,UAAU,WAAYI,WAAA,SAAA,UAAtBJ;CAA2D,IAAAO;CAAA,IAAAT,EAAA,OAAAI,UAAAJ,EAAA,OAAAC,WAAAD,EAAA,OAAAQ,UAAA;EAMxEC,KAAA,oBAAC,iBAAD;GAAwBD,OAAAA;GAAmBP;GAAiBG;EAAM,CAAA;EAAIJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAC;EAAAD,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAF1E,MAAAU,UAEID;CAGF,IAAAE;CAAA,IAAAX,EAAA,OAAAU,WAAAV,EAAA,OAAAQ,UAAA;EAEKG,KAAA,oBAAC,YAAD;GAAmBH,OAAAA;aAAWE;EAAnB,CAAA;EAAwCV,EAAA,KAAAU;EAAAV,EAAA,KAAAQ;EAAAR,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OAAnDW;AAAmD;AArBlC,SAAAJ,QAAA;CAAA,OAQhB;AAAK"}
1
+ {"version":3,"file":"DevToolsModalImpl.js","names":["c","_c","useMemo","useSyncExternalStore","DevToolsOverlay","ShadowRoot","DevToolsModalProps","isDarkMode","document","documentElement","classList","contains","body","subscribeToThemeChanges","callback","MutationObserver","observer","observe","attributes","attributeFilter","disconnect","DevToolsModalImpl","t0","$","plugins","theme","t1","client","undefined","darkMode","_temp","resolved","t2","overlay","t3"],"sources":["../src/DevToolsModalImpl.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useSyncExternalStore } from \"react\";\nimport { DevToolsOverlay } from \"./shell/DevToolsOverlay\";\nimport { ShadowRoot } from \"./shell/ShadowRoot\";\nimport type { DevToolsModalProps } from \"./DevToolsModal\";\n\nconst isDarkMode = (): boolean => {\n if (typeof document === \"undefined\") return false;\n return (\n document.documentElement.classList.contains(\"dark\") ||\n document.body.classList.contains(\"dark\")\n );\n};\n\nconst subscribeToThemeChanges = (callback: () => void) => {\n if (typeof MutationObserver === \"undefined\") {\n return () => {};\n }\n\n const observer = new MutationObserver(callback);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n if (document.body !== document.documentElement) {\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n }\n\n return () => observer.disconnect();\n};\n\nconst DevToolsModalImpl = ({\n plugins,\n theme = \"system\",\n client,\n}: DevToolsModalProps) => {\n const darkMode = useSyncExternalStore(\n subscribeToThemeChanges,\n isDarkMode,\n () => false,\n );\n const resolved = theme === \"system\" ? (darkMode ? \"dark\" : \"light\") : theme;\n\n // Stable element identity so the shadow root only re-renders on real changes,\n // not on every render of the host tree.\n const overlay = useMemo(\n () => (\n <DevToolsOverlay theme={resolved} plugins={plugins} client={client} />\n ),\n [resolved, plugins, client],\n );\n\n return <ShadowRoot theme={resolved}>{overlay}</ShadowRoot>;\n};\n\nexport default DevToolsModalImpl;\n"],"mappings":";;;;;;;AAOA,MAAMO,mBAA4B;CAChC,IAAI,OAAOC,aAAa,aAAa,OAAO;CAC5C,OACEA,SAASC,gBAAgBC,UAAUC,SAAS,MAAM,KAClDH,SAASI,KAAKF,UAAUC,SAAS,MAAM;AAE3C;AAEA,MAAME,2BAA2BC,aAAyB;CACxD,IAAI,OAAOC,qBAAqB,aAC9B,aAAa,CAAC;CAGhB,MAAMC,WAAW,IAAID,iBAAiBD,QAAQ;CAC9CE,SAASC,QAAQT,SAASC,iBAAiB;EACzCS,YAAY;EACZC,iBAAiB,CAAC,OAAO;CAC3B,CAAC;CACD,IAAIX,SAASI,SAASJ,SAASC,iBAC7BO,SAASC,QAAQT,SAASI,MAAM;EAC9BM,YAAY;EACZC,iBAAiB,CAAC,OAAO;CAC3B,CAAC;CAGH,aAAaH,SAASI,WAAW;AACnC;AAEA,MAAMC,qBAAoBC,OAAA;CAAA,MAAAC,IAAAtB,EAAA,CAAA;CAAC,MAAA,EAAAuB,SAAAC,OAAAC,IAAAC,WAAAL;CAEzB,MAAAG,QAAAC,OAAAE,KAAAA,IAAA,WAAAF;CAGA,MAAAG,WAAiB1B,qBACfU,yBACAN,YACAuB,KACF;CACA,MAAAC,WAAiBN,UAAU,WAAYI,WAAA,SAAA,UAAtBJ;CAA2D,IAAAO;CAAA,IAAAT,EAAA,OAAAI,UAAAJ,EAAA,OAAAC,WAAAD,EAAA,OAAAQ,UAAA;EAMxEC,KAAA,oBAAC,iBAAD;GAAwBD,OAAAA;GAAmBP;GAAiBG;EAAM,CAAA;EAAIJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAC;EAAAD,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAF1E,MAAAU,UAEID;CAGF,IAAAE;CAAA,IAAAX,EAAA,OAAAU,WAAAV,EAAA,OAAAQ,UAAA;EAEKG,KAAA,oBAAC,YAAD;GAAmBH,OAAAA;GAAWE,UAAAA;EAAnB,CAAA;EAAwCV,EAAA,KAAAU;EAAAV,EAAA,KAAAQ;EAAAR,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OAAnDW;AAAmD;AArBlC,SAAAJ,QAAA;CAAA,OAQhB;AAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"projectApi.d.ts","names":[],"sources":["../../src/data/projectApi.ts"],"mappings":";;;UASU;EACR,KAAK,QAAQ;EACb,MAAM,cAAc;;;;;;;;;;;;cAqGT,aAAc,eAAe,OAAO,qBAAmB"}
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"}
@@ -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 || typeof scopeValue !== \"object\") 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] = scopeValue?.getState?.() ?? 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,IAAI,CAACA,cAAc,OAAOA,eAAe,UAAU,OAAO,CAAA;CAC1D,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,QAAQrC,YAAYW,WAAW,KAAKX;GAE5CwC,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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsOverlay.js","names":["c","_c","useEffect","useState","DevToolsPanel","DevToolsPanelPlugin","DevToolsClient","DevToolsOverlayProps","plugins","theme","client","DevToolsOverlay","t0","$","isOpen","setIsOpen","t1","t2","handleEscape","event","key","document","addEventListener","removeEventListener","t3","Symbol","for","t4","t5"],"sources":["../../src/shell/DevToolsOverlay.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { DevToolsPanel } from \"./DevToolsPanel\";\nimport type { DevToolsPanelPlugin } from \"./registry\";\nimport type { DevToolsClient } from \"../data/types\";\n\nexport interface DevToolsOverlayProps {\n plugins?: DevToolsPanelPlugin[] | undefined;\n theme: \"light\" | \"dark\";\n client?: DevToolsClient | undefined;\n}\n\n/**\n * The full devtools surface (floating launcher + window), rendered inside the\n * shadow root so every element is styled with the package's own Tailwind tokens\n * and isolated from the host page. The window floats over the live app with no\n * backdrop; close with the × or Escape.\n */\nexport const DevToolsOverlay = ({\n plugins,\n theme,\n client,\n}: DevToolsOverlayProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen]);\n\n if (!isOpen) {\n return (\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n aria-label=\"Open assistant-ui DevTools\"\n title=\"Open assistant-ui DevTools\"\n className=\"bg-foreground text-background fixed end-5 bottom-5 z-[2147483646] flex size-9 [animation:aui-dt-launcher-in_200ms_cubic-bezier(0.175,0.885,0.32,1.1)] items-center justify-center rounded-full shadow-[var(--shadow-launcher)] backdrop-blur-2xl transition-transform duration-150 ease-out hover:scale-105 active:scale-95\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n );\n }\n\n return (\n <>\n <div\n onClick={() => setIsOpen(false)}\n className=\"fixed inset-0 z-[2147483646] [animation:aui-dt-fade-in_150ms_ease-out] bg-black/20 backdrop-blur-[3px]\"\n />\n <div\n role=\"dialog\"\n aria-label=\"assistant-ui DevTools\"\n className=\"bg-background text-foreground border-border fixed top-1/2 left-1/2 z-[2147483647] flex h-[min(560px,80vh)] w-[min(960px,92vw)] -translate-x-1/2 -translate-y-1/2 [animation:aui-dt-window-in_200ms_cubic-bezier(0.175,0.885,0.32,1.1)] flex-col overflow-hidden rounded-xl border shadow-[var(--shadow-window)]\"\n >\n <DevToolsPanel\n theme={theme}\n plugins={plugins}\n client={client}\n onClose={() => setIsOpen(false)}\n />\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAmBA,MAAaW,mBAAkBC,OAAA;CAAA,MAAAC,IAAAZ,EAAA,EAAA;CAAC,MAAA,EAAAO,SAAAC,OAAAC,WAAAE;CAK9B,MAAA,CAAAE,QAAAC,aAA4BZ,SAAS,KAAK;CAAE,IAAAa;CAAA,IAAAC;CAAA,IAAAJ,EAAA,OAAAC,QAAA;EAElCE,WAAA;GACR,IAAI,CAACF,QAAM;GACX,MAAAI,gBAAqBC,UAAA;IACnB,IAAIA,MAAKC,QAAS,UAAUL,UAAU,KAAK;GAAE;GAE/CM,SAAQC,iBAAkB,WAAWJ,YAAY;GAAC,aACrCG,SAAQE,oBAAqB,WAAWL,YAAY;EAAC;EACjED,KAAA,CAACH,MAAM;EAACD,EAAA,KAAAC;EAAAD,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAA;EAAAD,KAAAH,EAAA;EAAAI,KAAAJ,EAAA;CAAA;CAPXX,UAAUc,IAOPC,EAAQ;CAEX,IAAI,CAACH,QAAM;EAAA,IAAAU;EAAA,IAAAX,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;GAIIF,WAAMT,UAAU,IAAI;GAACF,EAAA,KAAAW;EAAA,OAAAA,KAAAX,EAAA;EAAA,IAAAc;EAAA,IAAAd,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;GAFhCC,KAAA,oBAAA,UAAA;IACO,MAAA;IACI,SAAAH;IACE,cAAA;IACL,OAAA;IACI,WAAA;cAEV,oBAAA,OAAA;KACQ,OAAA;KACC,QAAA;KACC,SAAA;KACH,MAAA;KACO,eAAA;eAEZ,oBAAA,QAAA;MACI,GAAA;MACK,QAAA;MACK,aAAA;MACE,eAAA;MACC,gBAAA;KAAO,CAAA;IAEpB,CAAA;GACC,CAAA;GAAAX,EAAA,KAAAc;EAAA,OAAAA,KAAAd,EAAA;EAAA,OAtBTc;CAsBS;CAEZ,IAAAH;CAAA,IAAAX,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;EAIGF,KAAA,oBAAA,OAAA;GACW,eAAMT,UAAU,KAAK;GACpB,WAAA;EAAwG,CAAA;EAClHF,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;EAUWC,WAAMZ,UAAU,KAAK;EAACF,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAAe;CAAA,IAAAf,EAAA,OAAAH,UAAAG,EAAA,OAAAL,WAAAK,EAAA,OAAAJ,OAAA;EAdrCmB,KAAA,qBAAA,YAAA,EAAA,UAAA,CACEJ,IAIA,oBAAA,OAAA;GACO,MAAA;GACM,cAAA;GACD,WAAA;aAEV,oBAAC,eAAD;IACSf;IACED;IACDE;IACC,SAAAiB;GAAsB,CAAA;EAE7B,CAAA,CAAA,EAAA,CAAA;EACLd,EAAA,KAAAH;EAAAG,EAAA,KAAAL;EAAAK,EAAA,KAAAJ;EAAAI,EAAA,MAAAe;CAAA,OAAAA,KAAAf,EAAA;CAAA,OAjBHe;AAiBG"}
1
+ {"version":3,"file":"DevToolsOverlay.js","names":["c","_c","useEffect","useState","DevToolsPanel","DevToolsPanelPlugin","DevToolsClient","DevToolsOverlayProps","plugins","theme","client","DevToolsOverlay","t0","$","isOpen","setIsOpen","t1","t2","handleEscape","event","key","document","addEventListener","removeEventListener","t3","Symbol","for","t4","t5"],"sources":["../../src/shell/DevToolsOverlay.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { DevToolsPanel } from \"./DevToolsPanel\";\nimport type { DevToolsPanelPlugin } from \"./registry\";\nimport type { DevToolsClient } from \"../data/types\";\n\nexport interface DevToolsOverlayProps {\n plugins?: DevToolsPanelPlugin[] | undefined;\n theme: \"light\" | \"dark\";\n client?: DevToolsClient | undefined;\n}\n\n/**\n * The full devtools surface (floating launcher + window), rendered inside the\n * shadow root so every element is styled with the package's own Tailwind tokens\n * and isolated from the host page. The window floats over the live app with no\n * backdrop; close with the × or Escape.\n */\nexport const DevToolsOverlay = ({\n plugins,\n theme,\n client,\n}: DevToolsOverlayProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen]);\n\n if (!isOpen) {\n return (\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n aria-label=\"Open assistant-ui DevTools\"\n title=\"Open assistant-ui DevTools\"\n className=\"bg-foreground text-background fixed end-5 bottom-5 z-[2147483646] flex size-9 [animation:aui-dt-launcher-in_200ms_cubic-bezier(0.175,0.885,0.32,1.1)] items-center justify-center rounded-full shadow-[var(--shadow-launcher)] backdrop-blur-2xl transition-transform duration-150 ease-out hover:scale-105 active:scale-95\"\n >\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n );\n }\n\n return (\n <>\n <div\n onClick={() => setIsOpen(false)}\n className=\"fixed inset-0 z-[2147483646] [animation:aui-dt-fade-in_150ms_ease-out] bg-black/20 backdrop-blur-[3px]\"\n />\n <div\n role=\"dialog\"\n aria-label=\"assistant-ui DevTools\"\n className=\"bg-background text-foreground border-border fixed top-1/2 left-1/2 z-[2147483647] flex h-[min(560px,80vh)] w-[min(960px,92vw)] -translate-x-1/2 -translate-y-1/2 [animation:aui-dt-window-in_200ms_cubic-bezier(0.175,0.885,0.32,1.1)] flex-col overflow-hidden rounded-xl border shadow-[var(--shadow-window)]\"\n >\n <DevToolsPanel\n theme={theme}\n plugins={plugins}\n client={client}\n onClose={() => setIsOpen(false)}\n />\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAmBA,MAAaW,mBAAkBC,OAAA;CAAA,MAAAC,IAAAZ,EAAA,EAAA;CAAC,MAAA,EAAAO,SAAAC,OAAAC,WAAAE;CAK9B,MAAA,CAAAE,QAAAC,aAA4BZ,SAAS,KAAK;CAAE,IAAAa;CAAA,IAAAC;CAAA,IAAAJ,EAAA,OAAAC,QAAA;EAElCE,WAAA;GACR,IAAI,CAACF,QAAM;GACX,MAAAI,gBAAqBC,UAAA;IACnB,IAAIA,MAAKC,QAAS,UAAUL,UAAU,KAAK;GAAE;GAE/CM,SAAQC,iBAAkB,WAAWJ,YAAY;GAAC,aACrCG,SAAQE,oBAAqB,WAAWL,YAAY;EAAC;EACjED,KAAA,CAACH,MAAM;EAACD,EAAA,KAAAC;EAAAD,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAA;EAAAD,KAAAH,EAAA;EAAAI,KAAAJ,EAAA;CAAA;CAPXX,UAAUc,IAOPC,EAAQ;CAEX,IAAI,CAACH,QAAM;EAAA,IAAAU;EAAA,IAAAX,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;GAIIF,WAAMT,UAAU,IAAI;GAACF,EAAA,KAAAW;EAAA,OAAAA,KAAAX,EAAA;EAAA,IAAAc;EAAA,IAAAd,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;GAFhCC,KAAA,oBAAA,UAAA;IACO,MAAA;IACI,SAAAH;IACE,cAAA;IACL,OAAA;IACI,WAAA;IAEV,UAAA,oBAAA,OAAA;KACQ,OAAA;KACC,QAAA;KACC,SAAA;KACH,MAAA;KACO,eAAA;KAEZ,UAAA,oBAAA,QAAA;MACI,GAAA;MACK,QAAA;MACK,aAAA;MACE,eAAA;MACC,gBAAA;KAAO,CAAA;IAEpB,CAAA;GACC,CAAA;GAAAX,EAAA,KAAAc;EAAA,OAAAA,KAAAd,EAAA;EAAA,OAtBTc;CAsBS;CAEZ,IAAAH;CAAA,IAAAX,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;EAIGF,KAAA,oBAAA,OAAA;GACW,eAAMT,UAAU,KAAK;GACpB,WAAA;EAAwG,CAAA;EAClHF,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;EAUWC,WAAMZ,UAAU,KAAK;EAACF,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAAe;CAAA,IAAAf,EAAA,OAAAH,UAAAG,EAAA,OAAAL,WAAAK,EAAA,OAAAJ,OAAA;EAdrCmB,KAAA,qBAAA,YAAA,EAAA,UAAA,CACEJ,IAIA,oBAAA,OAAA;GACO,MAAA;GACM,cAAA;GACD,WAAA;GAEV,UAAA,oBAAC,eAAD;IACSf;IACED;IACDE;IACC,SAAAiB;GAAsB,CAAA;EAE7B,CAAA,CAAA,EAAA,CAAA;EACLd,EAAA,KAAAH;EAAAG,EAAA,KAAAL;EAAAK,EAAA,KAAAJ;EAAAI,EAAA,MAAAe;CAAA,OAAAA,KAAAf,EAAA;CAAA,OAjBHe;AAiBG"}
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsPanel.js","names":["c","_c","useCallback","useEffect","useMemo","useState","clsx","useDevToolsClient","inProcessClient","DevToolsClient","CenteredMessage","builtinPlugins","DevToolsPanelPlugin","DevToolsTabContext","DevToolsPanelProps","plugins","theme","onClose","client","DevToolsPanel","t0","$","t1","undefined","resolvedClient","selectedApiId","setSelectedApiId","activeTabId","setActiveTabId","t2","Symbol","for","selectionByApi","setSelectionByApi","apiIds","selected","clearEvents","switchToThread","t3","t4","includes","t5","sort","_temp","allPlugins","t6","apiId","tabId","nodeId","prev","setSelectionFor","t7","filter","plugin","isAvailable","data","selection","setSelection","_temp2","visiblePlugins","t8","find","plugin_0","id","activePlugin","t9","nodeId_0","threadId","ctx","t10","t11","plugin_1","active","label","map","t12","length","event","value","Number","target","isNaN","_temp3","t13","t14","t15","t16","t17","t18","t19","t20","a","b","order"],"sources":["../../src/shell/DevToolsPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { useDevToolsClient } from \"../data/useDevToolsClient\";\nimport { inProcessClient } from \"../data/createInProcessClient\";\nimport type { DevToolsClient } from \"../data/types\";\nimport { CenteredMessage } from \"../views/ui\";\nimport {\n builtinPlugins,\n type DevToolsPanelPlugin,\n type DevToolsTabContext,\n} from \"./registry\";\n\nexport interface DevToolsPanelProps {\n /** Additional inspector tabs appended after the builtins. */\n plugins?: DevToolsPanelPlugin[] | undefined;\n /** Resolved theme, used to style plugin content and the dark variant. */\n theme?: \"light\" | \"dark\";\n /** When provided, a close control is rendered at the end of the tab bar. */\n onClose?: (() => void) | undefined;\n /** Data source. Defaults to the in-process DevToolsHooks client. */\n client?: DevToolsClient | undefined;\n}\n\nexport const DevToolsPanel = ({\n plugins,\n theme = \"light\",\n onClose,\n client,\n}: DevToolsPanelProps) => {\n const resolvedClient = client ?? inProcessClient;\n const [selectedApiId, setSelectedApiId] = useState<number | null>(null);\n const [activeTabId, setActiveTabId] = useState<string>(\"thread\");\n const [selectionByApi, setSelectionByApi] = useState<\n Record<number, Record<string, string | null>>\n >({});\n const { apiIds, selected, clearEvents, switchToThread } = useDevToolsClient(\n selectedApiId,\n resolvedClient,\n );\n\n useEffect(() => {\n if (selectedApiId !== null && apiIds.includes(selectedApiId)) return;\n setSelectedApiId(apiIds[0] ?? null);\n }, [apiIds, selectedApiId]);\n\n const allPlugins = useMemo(\n () =>\n [...builtinPlugins, ...(plugins ?? [])].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0),\n ),\n [plugins],\n );\n\n const setSelectionFor = useCallback(\n (apiId: number, tabId: string, nodeId: string | null) => {\n setSelectionByApi((prev) => ({\n ...prev,\n [apiId]: { ...prev[apiId], [tabId]: nodeId },\n }));\n },\n [],\n );\n\n const visiblePlugins =\n selected && selectedApiId !== null\n ? allPlugins.filter((plugin) =>\n plugin.isAvailable\n ? plugin.isAvailable({\n apiId: selectedApiId,\n data: selected,\n clearEvents,\n theme,\n selection: null,\n setSelection: () => {},\n })\n : true,\n )\n : allPlugins;\n\n const activePlugin =\n visiblePlugins.find((plugin) => plugin.id === activeTabId) ??\n visiblePlugins[0];\n\n const ctx: DevToolsTabContext | null =\n selected && selectedApiId !== null && activePlugin\n ? {\n apiId: selectedApiId,\n data: selected,\n clearEvents,\n theme,\n selection: selectionByApi[selectedApiId]?.[activePlugin.id] ?? null,\n setSelection: (nodeId) =>\n setSelectionFor(selectedApiId, activePlugin.id, nodeId),\n switchToThread: resolvedClient.switchToThread\n ? (threadId) => switchToThread(selectedApiId, threadId)\n : undefined,\n }\n : null;\n\n return (\n <div className=\"text-foreground flex h-full flex-col text-[13px]\">\n <nav className=\"border-border flex h-10 shrink-0 items-center justify-between gap-2 border-b px-2 select-none\">\n <div className=\"flex h-full items-center\">\n {visiblePlugins.map((plugin) => {\n const active = activePlugin?.id === plugin.id;\n return (\n <button\n type=\"button\"\n key={plugin.id}\n onClick={() => setActiveTabId(plugin.id)}\n className={clsx(\n \"relative flex h-full items-center px-3 font-medium transition-colors\",\n active\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {plugin.label}\n {active ? (\n <span className=\"bg-foreground absolute inset-x-2 -bottom-px h-0.5 rounded-full\" />\n ) : null}\n </button>\n );\n })}\n </div>\n\n <div className=\"flex items-center gap-2 pe-1\">\n {apiIds.length > 1 ? (\n <select\n value={selectedApiId ?? \"\"}\n onChange={(event) => {\n const value = Number(event.target.value);\n setSelectedApiId(Number.isNaN(value) ? null : value);\n }}\n className=\"border-border text-muted-foreground hover:text-foreground h-7 rounded-md border bg-transparent px-2 text-[12px] transition-colors\"\n >\n {apiIds.map((id) => (\n <option key={id} value={id}>\n API #{id}\n </option>\n ))}\n </select>\n ) : null}\n\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-[11px]\">\n <span className=\"size-1.5 rounded-full bg-emerald-500\" />\n {apiIds.length > 0\n ? `${apiIds.length} instance${apiIds.length > 1 ? \"s\" : \"\"}`\n : \"Waiting\"}\n </span>\n\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close DevTools\"\n className=\"text-muted-foreground hover:bg-accent hover:text-foreground flex size-7 items-center justify-center rounded-md transition-colors\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M18 6 6 18M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </div>\n </nav>\n\n <section className=\"bg-background min-h-0 flex-1 overflow-hidden\">\n {ctx && activePlugin ? (\n <activePlugin.Component {...ctx} />\n ) : (\n <CenteredMessage>\n Waiting for assistant-ui instance...\n </CenteredMessage>\n )}\n </section>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DevToolsPanel.js","names":["c","_c","useCallback","useEffect","useMemo","useState","clsx","useDevToolsClient","inProcessClient","DevToolsClient","CenteredMessage","builtinPlugins","DevToolsPanelPlugin","DevToolsTabContext","DevToolsPanelProps","plugins","theme","onClose","client","DevToolsPanel","t0","$","t1","undefined","resolvedClient","selectedApiId","setSelectedApiId","activeTabId","setActiveTabId","t2","Symbol","for","selectionByApi","setSelectionByApi","apiIds","selected","clearEvents","switchToThread","t3","t4","includes","t5","sort","_temp","allPlugins","t6","apiId","tabId","nodeId","prev","setSelectionFor","t7","filter","plugin","isAvailable","data","selection","setSelection","_temp2","visiblePlugins","t8","find","plugin_0","id","activePlugin","t9","nodeId_0","threadId","ctx","t10","t11","plugin_1","active","label","map","t12","length","event","value","Number","target","isNaN","_temp3","t13","t14","t15","t16","t17","t18","t19","t20","a","b","order"],"sources":["../../src/shell/DevToolsPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { useDevToolsClient } from \"../data/useDevToolsClient\";\nimport { inProcessClient } from \"../data/createInProcessClient\";\nimport type { DevToolsClient } from \"../data/types\";\nimport { CenteredMessage } from \"../views/ui\";\nimport {\n builtinPlugins,\n type DevToolsPanelPlugin,\n type DevToolsTabContext,\n} from \"./registry\";\n\nexport interface DevToolsPanelProps {\n /** Additional inspector tabs appended after the builtins. */\n plugins?: DevToolsPanelPlugin[] | undefined;\n /** Resolved theme, used to style plugin content and the dark variant. */\n theme?: \"light\" | \"dark\";\n /** When provided, a close control is rendered at the end of the tab bar. */\n onClose?: (() => void) | undefined;\n /** Data source. Defaults to the in-process DevToolsHooks client. */\n client?: DevToolsClient | undefined;\n}\n\nexport const DevToolsPanel = ({\n plugins,\n theme = \"light\",\n onClose,\n client,\n}: DevToolsPanelProps) => {\n const resolvedClient = client ?? inProcessClient;\n const [selectedApiId, setSelectedApiId] = useState<number | null>(null);\n const [activeTabId, setActiveTabId] = useState<string>(\"thread\");\n const [selectionByApi, setSelectionByApi] = useState<\n Record<number, Record<string, string | null>>\n >({});\n const { apiIds, selected, clearEvents, switchToThread } = useDevToolsClient(\n selectedApiId,\n resolvedClient,\n );\n\n useEffect(() => {\n if (selectedApiId !== null && apiIds.includes(selectedApiId)) return;\n setSelectedApiId(apiIds[0] ?? null);\n }, [apiIds, selectedApiId]);\n\n const allPlugins = useMemo(\n () =>\n [...builtinPlugins, ...(plugins ?? [])].sort(\n (a, b) => (a.order ?? 0) - (b.order ?? 0),\n ),\n [plugins],\n );\n\n const setSelectionFor = useCallback(\n (apiId: number, tabId: string, nodeId: string | null) => {\n setSelectionByApi((prev) => ({\n ...prev,\n [apiId]: { ...prev[apiId], [tabId]: nodeId },\n }));\n },\n [],\n );\n\n const visiblePlugins =\n selected && selectedApiId !== null\n ? allPlugins.filter((plugin) =>\n plugin.isAvailable\n ? plugin.isAvailable({\n apiId: selectedApiId,\n data: selected,\n clearEvents,\n theme,\n selection: null,\n setSelection: () => {},\n })\n : true,\n )\n : allPlugins;\n\n const activePlugin =\n visiblePlugins.find((plugin) => plugin.id === activeTabId) ??\n visiblePlugins[0];\n\n const ctx: DevToolsTabContext | null =\n selected && selectedApiId !== null && activePlugin\n ? {\n apiId: selectedApiId,\n data: selected,\n clearEvents,\n theme,\n selection: selectionByApi[selectedApiId]?.[activePlugin.id] ?? null,\n setSelection: (nodeId) =>\n setSelectionFor(selectedApiId, activePlugin.id, nodeId),\n switchToThread: resolvedClient.switchToThread\n ? (threadId) => switchToThread(selectedApiId, threadId)\n : undefined,\n }\n : null;\n\n return (\n <div className=\"text-foreground flex h-full flex-col text-[13px]\">\n <nav className=\"border-border flex h-10 shrink-0 items-center justify-between gap-2 border-b px-2 select-none\">\n <div className=\"flex h-full items-center\">\n {visiblePlugins.map((plugin) => {\n const active = activePlugin?.id === plugin.id;\n return (\n <button\n type=\"button\"\n key={plugin.id}\n onClick={() => setActiveTabId(plugin.id)}\n className={clsx(\n \"relative flex h-full items-center px-3 font-medium transition-colors\",\n active\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {plugin.label}\n {active ? (\n <span className=\"bg-foreground absolute inset-x-2 -bottom-px h-0.5 rounded-full\" />\n ) : null}\n </button>\n );\n })}\n </div>\n\n <div className=\"flex items-center gap-2 pe-1\">\n {apiIds.length > 1 ? (\n <select\n value={selectedApiId ?? \"\"}\n onChange={(event) => {\n const value = Number(event.target.value);\n setSelectedApiId(Number.isNaN(value) ? null : value);\n }}\n className=\"border-border text-muted-foreground hover:text-foreground h-7 rounded-md border bg-transparent px-2 text-[12px] transition-colors\"\n >\n {apiIds.map((id) => (\n <option key={id} value={id}>\n API #{id}\n </option>\n ))}\n </select>\n ) : null}\n\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-[11px]\">\n <span className=\"size-1.5 rounded-full bg-emerald-500\" />\n {apiIds.length > 0\n ? `${apiIds.length} instance${apiIds.length > 1 ? \"s\" : \"\"}`\n : \"Waiting\"}\n </span>\n\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close DevTools\"\n className=\"text-muted-foreground hover:bg-accent hover:text-foreground flex size-7 items-center justify-center rounded-md transition-colors\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M18 6 6 18M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </div>\n </nav>\n\n <section className=\"bg-background min-h-0 flex-1 overflow-hidden\">\n {ctx && activePlugin ? (\n <activePlugin.Component {...ctx} />\n ) : (\n <CenteredMessage>\n Waiting for assistant-ui instance...\n </CenteredMessage>\n )}\n </section>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;AAyBA,MAAamB,iBAAgBC,OAAA;CAAA,MAAAC,IAAApB,EAAA,EAAA;CAAC,MAAA,EAAAc,SAAAC,OAAAM,IAAAL,SAAAC,WAAAE;CAE5B,MAAAJ,QAAAM,OAAAC,KAAAA,IAAA,UAAAD;CAIA,MAAAE,iBAAuBN,UAAAV;CACvB,MAAA,CAAAiB,eAAAC,oBAA0CrB,SAAwB,IAAI;CACtE,MAAA,CAAAsB,aAAAC,kBAAsCvB,SAAiB,QAAQ;CAAE,IAAAwB;CAAA,IAAAR,EAAA,OAAAS,OAAAC,IAAA,2BAAA,GAAA;EAG/DF,KAAA,CAAC;EAACR,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAFJ,MAAA,CAAAW,gBAAAC,qBAA4C5B,SAE1CwB,EAAE;CACJ,MAAA,EAAAK,QAAAC,UAAAC,aAAAC,mBAA0D9B,kBACxDkB,eACAD,cACF;CAAE,IAAAc;CAAA,IAAAC;CAAA,IAAAlB,EAAA,OAAAa,UAAAb,EAAA,OAAAI,eAAA;EAEQa,WAAA;GACR,IAAIb,kBAAkB,QAAQS,OAAMM,SAAUf,aAAa,GAAC;GAC5DC,iBAAiBQ,OAAM,MAAN,IAAiB;EAAC;EAClCK,KAAA,CAACL,QAAQT,aAAa;EAACJ,EAAA,KAAAa;EAAAb,EAAA,KAAAI;EAAAJ,EAAA,KAAAiB;EAAAjB,EAAA,KAAAkB;CAAA,OAAA;EAAAD,KAAAjB,EAAA;EAAAkB,KAAAlB,EAAA;CAAA;CAH1BlB,UAAUmC,IAGPC,EAAuB;CAAC,IAAAE;CAAA,IAAApB,EAAA,OAAAN,SAAA;EAIvB0B,KAAA,CAAA,GAAI9B,gBAAc,GAAMI,WAAA,CAAA,CAAa,CAAE,CAAA2B,KACrCC,KACF;EAACtB,EAAA,KAAAN;EAAAM,EAAA,KAAAoB;CAAA,OAAAA,KAAApB,EAAA;CAJL,MAAAuB,aAEIH;CAIF,IAAAI;CAAA,IAAAxB,EAAA,OAAAS,OAAAC,IAAA,2BAAA,GAAA;EAGAc,MAAAC,OAAAC,OAAAC,WAAA;GACEf,mBAAkBgB,UAAW;IAAA,GACxBA;KACFH,QAAQ;KAAA,GAAKG,KAAKH;MAASC,QAAQC;IAAO;GAC7C,EAAE;EAAC;EACJ3B,EAAA,KAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CANH,MAAA6B,kBAAwBL;CAQtB,IAAAM;CAAA,IAAA9B,EAAA,OAAAuB,cAAAvB,EAAA,OAAAe,eAAAf,EAAA,QAAAc,YAAAd,EAAA,QAAAI,iBAAAJ,EAAA,QAAAL,OAAA;EAGAmC,KAAAhB,YAAYV,kBAAkB,OAC1BmB,WAAUQ,QAAQC,WAChBA,OAAMC,cACFD,OAAMC,YAAa;GAAAR,OACVrB;GAAa8B,MACdpB;GAAQC;GAAApB;GAAAwC,WAGH;GAAIC,cACDC;EAChB,CACG,IATP,IAWO,IAbbd;EAacvB,EAAA,KAAAuB;EAAAvB,EAAA,KAAAe;EAAAf,EAAA,MAAAc;EAAAd,EAAA,MAAAI;EAAAJ,EAAA,MAAAL;EAAAK,EAAA,MAAA8B;CAAA,OAAAA,KAAA9B,EAAA;CAdhB,MAAAsC,iBACER;CAae,IAAAS;CAAA,IAAAvC,EAAA,QAAAM,eAAAN,EAAA,QAAAsC,gBAAA;EAGfC,KAAAD,eAAcE,MAAMC,aAAYT,SAAMU,OAAQpC,WAC9B,KAAhBgC,eAAc;EAAGtC,EAAA,MAAAM;EAAAN,EAAA,MAAAsC;EAAAtC,EAAA,MAAAuC;CAAA,OAAAA,KAAAvC,EAAA;CAFnB,MAAA2C,eACEJ;CACkB,IAAAK;CAAA,IAAA5C,EAAA,QAAA2C,gBAAA3C,EAAA,QAAAe,eAAAf,EAAA,QAAAG,kBAAAH,EAAA,QAAAc,YAAAd,EAAA,QAAAI,iBAAAJ,EAAA,QAAAW,kBAAAX,EAAA,QAAAgB,kBAAAhB,EAAA,QAAAL,OAAA;EAGlBiD,KAAA9B,YAAYV,kBAAkB,QAA9BuC,eAAA;GAAAlB,OAEarB;GAAa8B,MACdpB;GAAQC;GAAApB;GAAAwC,WAGHxB,eAAeP,cAAiC,GAAhBuC,aAAYD,OAA5C;GAAwDN,eACrDS,aACZhB,gBAAgBzB,eAAeuC,aAAYD,IAAKf,QAAM;GAACX,gBACzCb,eAAca,kBAAd8B,aACE9B,eAAeZ,eAAe0C,QAAQ,IADxC5C,KAAAA;EAIf,IAbP;EAaQF,EAAA,MAAA2C;EAAA3C,EAAA,MAAAe;EAAAf,EAAA,MAAAG;EAAAH,EAAA,MAAAc;EAAAd,EAAA,MAAAI;EAAAJ,EAAA,MAAAW;EAAAX,EAAA,MAAAgB;EAAAhB,EAAA,MAAAL;EAAAK,EAAA,MAAA4C;CAAA,OAAAA,KAAA5C,EAAA;CAdV,MAAA+C,MACEH;CAaS,IAAAI;CAAA,IAAAhD,EAAA,QAAA2C,cAAAD,MAAA1C,EAAA,QAAAsC,gBAAA;EAAA,IAAAW;EAAA,IAAAjD,EAAA,QAAA2C,cAAAD,IAAA;GAMiBO,OAAAC,aAAA;IAClB,MAAAC,SAAeR,cAAYD,OAASV,SAAMU;IAAI,OAE5C,qBAAA,UAAA;KACO,MAAA;KAEI,eAAMnC,eAAeyB,SAAMU,EAAG;KAC5B,WAAAzD,KACT,wEACAkE,SAAA,oBAAA,6CAGF;KATF,UAAA,CAWGnB,SAAMoB,OACND,SACC,oBAAA,QAAA,EAAgB,WAAA,iEAAgE,CAAA,IADjF,IAGM;IAbFnB,GAAAA,SAAMU,EAaJ;GAAA;GAEZ1C,EAAA,MAAA2C,cAAAD;GAAA1C,EAAA,MAAAiD;EAAA,OAAAA,MAAAjD,EAAA;EApBAgD,MAAAV,eAAce,IAAKJ,GAoBnB;EAACjD,EAAA,MAAA2C,cAAAD;EAAA1C,EAAA,MAAAsC;EAAAtC,EAAA,MAAAgD;CAAA,OAAAA,MAAAhD,EAAA;CAAA,IAAAiD;CAAA,IAAAjD,EAAA,QAAAgD,KAAA;EArBJC,MAAA,oBAAA,OAAA;GAAe,WAAA;GACZD,UAAAA;EAqBG,CAAA;EAAAhD,EAAA,MAAAgD;EAAAhD,EAAA,MAAAiD;CAAA,OAAAA,MAAAjD,EAAA;CAAA,IAAAsD;CAAA,IAAAtD,EAAA,QAAAa,UAAAb,EAAA,QAAAI,eAAA;EAGHkD,MAAAzC,OAAM0C,SAAU,IACf,oBAAA,UAAA;GACS,OAAAnD,iBAAA;GACG,WAAAoD,UAAA;IACR,MAAAC,QAAcC,OAAOF,MAAKG,OAAOF,KAAM;IACvCpD,iBAAiBqD,OAAME,MAAOH,KAAoB,IAAjC,OAAAA,KAAkC;GAAC;GAE5C,WAAA;GAET5C,UAAAA,OAAMwC,IAAKQ,MAIX;EACM,CAAA,IAdV;EAeO7D,EAAA,MAAAa;EAAAb,EAAA,MAAAI;EAAAJ,EAAA,MAAAsD;CAAA,OAAAA,MAAAtD,EAAA;CAAA,IAAA8D;CAAA,IAAA9D,EAAA,QAAAS,OAAAC,IAAA,2BAAA,GAAA;EAGNoD,MAAA,oBAAA,QAAA,EAAgB,WAAA,uCAAsC,CAAA;EAAG9D,EAAA,MAAA8D;CAAA,OAAAA,MAAA9D,EAAA;CACxD,MAAA+D,MAAAlD,OAAM0C,SAAU,IAAhB,GACM1C,OAAM0C,OAAO,WAAY1C,OAAM0C,SAAU,IAAhB,MAAA,OAD/B;CAEY,IAAAS;CAAA,IAAAhE,EAAA,QAAA+D,KAAA;EAJfC,MAAA,qBAAA,QAAA;GAAgB,WAAA;GAAhB,UAAA,CACEF,KACCC,GAGI;;EAAA/D,EAAA,MAAA+D;EAAA/D,EAAA,MAAAgE;CAAA,OAAAA,MAAAhE,EAAA;CAAA,IAAAiE;CAAA,IAAAjE,EAAA,QAAAJ,SAAA;EAENqE,MAAArE,UACC,oBAAA,UAAA;GACO,MAAA;GACIA,SAAAA;GACE,cAAA;GACD,WAAA;GAEV,UAAA,oBAAA,OAAA;IACQ,OAAA;IACC,QAAA;IACC,SAAA;IACH,MAAA;IACO,eAAA;IAEZ,UAAA,oBAAA,QAAA;KACI,GAAA;KACK,QAAA;KACK,aAAA;KACE,eAAA;KACC,gBAAA;IAAO,CAAA;GAEpB,CAAA;EACC,CAAA,IAtBV;EAuBOI,EAAA,MAAAJ;EAAAI,EAAA,MAAAiE;CAAA,OAAAA,MAAAjE,EAAA;CAAA,IAAAkE;CAAA,IAAAlE,EAAA,QAAAsD,OAAAtD,EAAA,QAAAgE,OAAAhE,EAAA,QAAAiE,KAAA;EAhDVC,MAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA;IACGZ;IAiBDU;IAOCC;GAwBG;;EAAAjE,EAAA,MAAAsD;EAAAtD,EAAA,MAAAgE;EAAAhE,EAAA,MAAAiE;EAAAjE,EAAA,MAAAkE;CAAA,OAAAA,MAAAlE,EAAA;CAAA,IAAAmE;CAAA,IAAAnE,EAAA,QAAAiD,OAAAjD,EAAA,QAAAkE,KAAA;EA1ERC,MAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACElB,KAwBAiB,GAkDI;;EAAAlE,EAAA,MAAAiD;EAAAjD,EAAA,MAAAkE;EAAAlE,EAAA,MAAAmE;CAAA,OAAAA,MAAAnE,EAAA;CAAA,IAAAoE;CAAA,IAAApE,EAAA,QAAA2C,gBAAA3C,EAAA,QAAA+C,KAAA;EAENqB,MAAA,oBAAA,WAAA;GAAmB,WAAA;GAChBrB,UAAAA,OAAAJ,eACC,oBAAA,aAAA,WAAA,EAAA,GAA4BI,IAAG,CAAA,IAE/B,oBAAC,iBAAD,EAAA,UAAiB,uCAAD,CAAA;EAIV,CAAA;EAAA/C,EAAA,MAAA2C;EAAA3C,EAAA,MAAA+C;EAAA/C,EAAA,MAAAoE;CAAA,OAAAA,MAAApE,EAAA;CAAA,IAAAqE;CAAA,IAAArE,EAAA,QAAAmE,OAAAnE,EAAA,QAAAoE,KAAA;EAtFZC,MAAA,qBAAA,OAAA;GAAe,WAAA;GAAf,UAAA,CACEF,KA6EAC,GASI;;EAAApE,EAAA,MAAAmE;EAAAnE,EAAA,MAAAoE;EAAApE,EAAA,MAAAqE;CAAA,OAAAA,MAAArE,EAAA;CAAA,OAvFNqE;AAuFM;AApKmB,SAAA/C,MAAAgD,GAAAC,GAAA;CAAA,QAyBVD,EAACE,SAAD,MAAiBD,EAACC,SAAD;AAAa;AAzBpB,SAAAnC,SAAA,CAAA;AAAA,SAAAwB,OAAAnB,IAAA;CAAA,OAkHb,qBAAA,UAAA;EAAwBA,OAAAA;EAAxB,UAAA,CAA4B,SACpBA,EACC;CAFIA,GAAAA,EAEJ;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"SplitLayout.js","names":["clsx","ReactNode","NAV_COL","SplitColumn","key","header","children","SplitLayout","t0","$","_c","sizes","columns","className","t1","t2","split","join","t3","gridTemplateColumns","t4","t5","length","column","index","map"],"sources":["../../src/shell/SplitLayout.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type { ReactNode } from \"react\";\n\n/** Shared nav rail + detail track sizing for the master/detail tabs. */\nexport const NAV_COL = \"clamp(14rem,28%,18rem)_minmax(0,1fr)\";\n\nexport interface SplitColumn {\n key: string;\n /** Fixed rail header; stays aligned across columns. */\n header?: ReactNode | undefined;\n /** Scrollable pane body. */\n children: ReactNode;\n}\n\n/**\n * Multi-column split surface. Each column keeps its header fixed and only the\n * body scrolls, so rail titles and divider lines stay aligned across columns.\n */\nexport const SplitLayout = ({\n sizes,\n columns,\n className,\n}: {\n /** Underscore-separated CSS grid track list, e.g. `12rem_minmax(0,1fr)`. */\n sizes: string;\n columns: SplitColumn[];\n className?: string | undefined;\n}) => (\n <div\n className={clsx(\"grid h-full min-h-0\", className)}\n style={{ gridTemplateColumns: sizes.split(\"_\").join(\" \") }}\n >\n {columns.map((column, index) => (\n <div\n key={column.key}\n className={clsx(\n \"flex min-h-0 flex-col overflow-hidden\",\n index < columns.length - 1 && \"border-border border-e\",\n )}\n >\n {column.header}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{column.children}</div>\n </div>\n ))}\n </div>\n);\n"],"mappings":";;;;;AAIA,MAAaE,UAAU;;;;;AAcvB,MAAaK,eAAcC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,OAAAC,SAAAC,cAAAL;CAS3B,IAAAM;CAAA,IAAAL,EAAA,OAAAI,WAAA;EAEcC,KAAAd,KAAK,uBAAuBa,SAAS;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAE,OAAA;EACnBI,KAAAJ,MAAKK,MAAO,GAAG,CAAC,CAAAC,KAAM,GAAG;EAACR,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAM,IAAA;EAAjDG,KAAA,EAAAC,qBAAuBJ,GAA2B;EAACN,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,OAAAG,SAAA;EAAA,IAAAS;EAAA,IAAAZ,EAAA,OAAAG,QAAAU,QAAA;GAE7CD,MAAAE,QAAAC,UACX,qBAAA,OAAA;IAEa,WAAAxB,KACT,yCACAwB,QAAQZ,QAAOU,SAAU,KAAzB,wBACF;cALF,CAOGC,OAAMlB,QACP,oBAAA,OAAA;KAAe,WAAA;eAAkCkB,OAAMjB;IAAgB,CAAA,CACnE;MARCiB,OAAMnB,GAQP;GACPK,EAAA,KAAAG,QAAAU;GAAAb,EAAA,KAAAY;EAAA,OAAAA,KAAAZ,EAAA;EAXAW,KAAAR,QAAOa,IAAKJ,EAWZ;EAACZ,EAAA,KAAAG;EAAAH,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,QAAAK,MAAAL,EAAA,QAAAS,MAAAT,EAAA,QAAAW,IAAA;EAfJC,KAAA,oBAAA,OAAA;GACa,WAAAP;GACJ,OAAAI;aAENE;EAYG,CAAA;EAAAX,EAAA,MAAAK;EAAAL,EAAA,MAAAS;EAAAT,EAAA,MAAAW;EAAAX,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,OAhBNY;AAgBM"}
1
+ {"version":3,"file":"SplitLayout.js","names":["clsx","ReactNode","NAV_COL","SplitColumn","key","header","children","SplitLayout","t0","$","_c","sizes","columns","className","t1","t2","split","join","t3","gridTemplateColumns","t4","t5","length","column","index","map"],"sources":["../../src/shell/SplitLayout.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type { ReactNode } from \"react\";\n\n/** Shared nav rail + detail track sizing for the master/detail tabs. */\nexport const NAV_COL = \"clamp(14rem,28%,18rem)_minmax(0,1fr)\";\n\nexport interface SplitColumn {\n key: string;\n /** Fixed rail header; stays aligned across columns. */\n header?: ReactNode | undefined;\n /** Scrollable pane body. */\n children: ReactNode;\n}\n\n/**\n * Multi-column split surface. Each column keeps its header fixed and only the\n * body scrolls, so rail titles and divider lines stay aligned across columns.\n */\nexport const SplitLayout = ({\n sizes,\n columns,\n className,\n}: {\n /** Underscore-separated CSS grid track list, e.g. `12rem_minmax(0,1fr)`. */\n sizes: string;\n columns: SplitColumn[];\n className?: string | undefined;\n}) => (\n <div\n className={clsx(\"grid h-full min-h-0\", className)}\n style={{ gridTemplateColumns: sizes.split(\"_\").join(\" \") }}\n >\n {columns.map((column, index) => (\n <div\n key={column.key}\n className={clsx(\n \"flex min-h-0 flex-col overflow-hidden\",\n index < columns.length - 1 && \"border-border border-e\",\n )}\n >\n {column.header}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{column.children}</div>\n </div>\n ))}\n </div>\n);\n"],"mappings":";;;;;AAIA,MAAaE,UAAU;;;;;AAcvB,MAAaK,eAAcC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,OAAAC,SAAAC,cAAAL;CAS3B,IAAAM;CAAA,IAAAL,EAAA,OAAAI,WAAA;EAEcC,KAAAd,KAAK,uBAAuBa,SAAS;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAE,OAAA;EACnBI,KAAAJ,MAAKK,MAAO,GAAG,CAAC,CAAAC,KAAM,GAAG;EAACR,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAM,IAAA;EAAjDG,KAAA,EAAAC,qBAAuBJ,GAA2B;EAACN,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,OAAAG,SAAA;EAAA,IAAAS;EAAA,IAAAZ,EAAA,OAAAG,QAAAU,QAAA;GAE7CD,MAAAE,QAAAC,UACX,qBAAA,OAAA;IAEa,WAAAxB,KACT,yCACAwB,QAAQZ,QAAOU,SAAU,KAAzB,wBACF;IALF,UAAA,CAOGC,OAAMlB,QACP,oBAAA,OAAA;KAAe,WAAA;KAAkCkB,UAAAA,OAAMjB;IAAgB,CAAA,CACnE;GARCiB,GAAAA,OAAMnB,GAQP;GACPK,EAAA,KAAAG,QAAAU;GAAAb,EAAA,KAAAY;EAAA,OAAAA,KAAAZ,EAAA;EAXAW,KAAAR,QAAOa,IAAKJ,EAWZ;EAACZ,EAAA,KAAAG;EAAAH,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,QAAAK,MAAAL,EAAA,QAAAS,MAAAT,EAAA,QAAAW,IAAA;EAfJC,KAAA,oBAAA,OAAA;GACa,WAAAP;GACJ,OAAAI;GAENE,UAAAA;EAYG,CAAA;EAAAX,EAAA,MAAAK;EAAAL,EAAA,MAAAS;EAAAT,EAAA,MAAAW;EAAAX,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,OAhBNY;AAgBM"}
@@ -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":"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"}
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadTab.js","names":["useEffect","useMemo","useRef","useState","MessageDetailBody","messageDetailHeader","ConversationList","Transcript","TranscriptHeader","conversationListHeader","messageNodeId","parseThreadListPreview","resolveSingleThread","resolveThreadForId","ThreadPreview","CenteredMessage","ControlButton","EmptyState","SplitLayout","DevToolsTabContext","TWO_COL","THREE_COL","useSelectedMessage","thread","selection","setSelection","$","_c","t0","bb0","messages","length","t1","t2","message","id","find","match","selectedMessage","last","UnloadedConversation","switchToThread","threadId","Symbol","for","t3","ThreadTab","data","state","threads","threadList","snapshots","threadSnapshots","hasConversationList","threadIds","mainThreadId","activeThreadId","setActiveThreadId","t4","ids","archivedThreadIds","includes","prevThreadIdRef","t5","t6","current","t7","t8","activeThread","activeNodeId","t9","t10","t11","key","header","children","t12","t13","t14","t15","loaded","activeNodeId_0","t16","t17","t18"],"sources":["../../../src/shell/tabs/ThreadTab.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { MessageDetailBody, messageDetailHeader } from \"../../views/message\";\nimport {\n ConversationList,\n Transcript,\n TranscriptHeader,\n conversationListHeader,\n messageNodeId,\n parseThreadListPreview,\n resolveSingleThread,\n resolveThreadForId,\n} from \"../../views/thread\";\nimport type { ThreadPreview } from \"../../views/thread\";\nimport { CenteredMessage, ControlButton, EmptyState } from \"../../views/ui\";\nimport { SplitLayout } from \"../SplitLayout\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst TWO_COL = \"clamp(16rem,32%,22rem)_minmax(0,1fr)\";\nconst THREE_COL = \"clamp(12rem,26%,15rem)_clamp(14rem,32%,20rem)_minmax(0,1fr)\";\n\nconst useSelectedMessage = (\n thread: ThreadPreview | null,\n selection: string | null,\n setSelection: (nodeId: string | null) => void,\n) => {\n const selectedMessage = useMemo(() => {\n if (!thread || thread.messages.length === 0) return null;\n const match = thread.messages.find(\n (message) => messageNodeId(message.id) === selection,\n );\n return match ?? thread.messages[thread.messages.length - 1]!;\n }, [thread, selection]);\n\n useEffect(() => {\n if (!thread || thread.messages.length === 0 || selection !== null) return;\n const last = thread.messages[thread.messages.length - 1]!;\n setSelection(messageNodeId(last.id));\n }, [thread, selection, setSelection]);\n\n return selectedMessage;\n};\n\nconst UnloadedConversation = ({\n switchToThread,\n threadId,\n}: {\n switchToThread?: ((threadId: string) => void | Promise<void>) | undefined;\n threadId: string;\n}) => (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 p-6\">\n <EmptyState>\n This conversation has not been opened in the app yet, so its messages are\n not cached in DevTools.\n </EmptyState>\n {switchToThread ? (\n <ControlButton onClick={() => switchToThread(threadId)}>\n Load conversation\n </ControlButton>\n ) : null}\n </div>\n);\n\nexport const ThreadTab = ({\n data,\n selection,\n setSelection,\n switchToThread,\n}: DevToolsTabContext) => {\n const threadList = useMemo(\n () => parseThreadListPreview(data.state.threads),\n [data.state.threads],\n );\n const snapshots = data.threadSnapshots;\n\n const hasConversationList =\n threadList !== null && threadList.threadIds.length > 0;\n\n const [activeThreadId, setActiveThreadId] = useState<string>(\n () => threadList?.mainThreadId ?? threadList?.threadIds[0] ?? \"\",\n );\n\n useEffect(() => {\n if (!hasConversationList || !threadList) return;\n const ids = [...threadList.threadIds, ...threadList.archivedThreadIds];\n if (ids.includes(activeThreadId)) return;\n setActiveThreadId(threadList.mainThreadId ?? threadList.threadIds[0] ?? \"\");\n }, [hasConversationList, threadList, activeThreadId]);\n\n const prevThreadIdRef = useRef(activeThreadId);\n useEffect(() => {\n if (prevThreadIdRef.current === activeThreadId) return;\n prevThreadIdRef.current = activeThreadId;\n setSelection(null);\n }, [activeThreadId, setSelection]);\n\n const activeThread = useMemo(() => {\n if (!hasConversationList) {\n return resolveSingleThread(data.state);\n }\n return resolveThreadForId(\n data.state,\n snapshots,\n activeThreadId,\n threadList,\n );\n }, [hasConversationList, data.state, snapshots, activeThreadId, threadList]);\n\n const selectedMessage = useSelectedMessage(\n activeThread,\n selection,\n setSelection,\n );\n\n if (!hasConversationList) {\n if (!activeThread || activeThread.messages.length === 0) {\n return (\n <CenteredMessage>\n No thread messages for this assistant instance.\n </CenteredMessage>\n );\n }\n\n const activeNodeId = messageNodeId(selectedMessage!.id);\n\n return (\n <SplitLayout\n sizes={TWO_COL}\n columns={[\n {\n key: \"transcript\",\n header: <TranscriptHeader thread={activeThread} />,\n children: (\n <Transcript\n thread={activeThread}\n selection={activeNodeId}\n onSelect={setSelection}\n />\n ),\n },\n {\n key: \"detail\",\n header: messageDetailHeader(selectedMessage!),\n children: <MessageDetailBody message={selectedMessage!} />,\n },\n ]}\n />\n );\n }\n\n const loaded = activeThread !== null && activeThread.messages.length > 0;\n\n if (!loaded) {\n return (\n <SplitLayout\n sizes=\"clamp(12rem,26%,15rem)_minmax(0,1fr)\"\n columns={[\n {\n key: \"conversations\",\n header: conversationListHeader(threadList!),\n children: (\n <ConversationList\n threadList={threadList!}\n snapshots={snapshots}\n selectedId={activeThreadId}\n onSelect={setActiveThreadId}\n />\n ),\n },\n {\n key: \"empty\",\n children: (\n <UnloadedConversation\n threadId={activeThreadId}\n switchToThread={switchToThread}\n />\n ),\n },\n ]}\n />\n );\n }\n\n const activeNodeId = messageNodeId(selectedMessage!.id);\n\n return (\n <SplitLayout\n sizes={THREE_COL}\n columns={[\n {\n key: \"conversations\",\n header: conversationListHeader(threadList!),\n children: (\n <ConversationList\n threadList={threadList!}\n snapshots={snapshots}\n selectedId={activeThreadId}\n onSelect={setActiveThreadId}\n />\n ),\n },\n {\n key: \"transcript\",\n header: <TranscriptHeader thread={activeThread!} />,\n children: (\n <Transcript\n thread={activeThread!}\n selection={activeNodeId}\n onSelect={setSelection}\n />\n ),\n },\n {\n key: \"detail\",\n header: messageDetailHeader(selectedMessage!),\n children: <MessageDetailBody message={selectedMessage!} />,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadTab.js","names":["useEffect","useMemo","useRef","useState","MessageDetailBody","messageDetailHeader","ConversationList","Transcript","TranscriptHeader","conversationListHeader","messageNodeId","parseThreadListPreview","resolveSingleThread","resolveThreadForId","ThreadPreview","CenteredMessage","ControlButton","EmptyState","SplitLayout","DevToolsTabContext","TWO_COL","THREE_COL","useSelectedMessage","thread","selection","setSelection","$","_c","t0","bb0","messages","length","t1","t2","message","id","find","match","selectedMessage","last","UnloadedConversation","switchToThread","threadId","Symbol","for","t3","ThreadTab","data","state","threads","threadList","snapshots","threadSnapshots","hasConversationList","threadIds","mainThreadId","activeThreadId","setActiveThreadId","t4","ids","archivedThreadIds","includes","prevThreadIdRef","t5","t6","current","t7","t8","activeThread","activeNodeId","t9","t10","t11","key","header","children","t12","t13","t14","t15","loaded","activeNodeId_0","t16","t17","t18"],"sources":["../../../src/shell/tabs/ThreadTab.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { MessageDetailBody, messageDetailHeader } from \"../../views/message\";\nimport {\n ConversationList,\n Transcript,\n TranscriptHeader,\n conversationListHeader,\n messageNodeId,\n parseThreadListPreview,\n resolveSingleThread,\n resolveThreadForId,\n} from \"../../views/thread\";\nimport type { ThreadPreview } from \"../../views/thread\";\nimport { CenteredMessage, ControlButton, EmptyState } from \"../../views/ui\";\nimport { SplitLayout } from \"../SplitLayout\";\nimport type { DevToolsTabContext } from \"../registry\";\n\nconst TWO_COL = \"clamp(16rem,32%,22rem)_minmax(0,1fr)\";\nconst THREE_COL = \"clamp(12rem,26%,15rem)_clamp(14rem,32%,20rem)_minmax(0,1fr)\";\n\nconst useSelectedMessage = (\n thread: ThreadPreview | null,\n selection: string | null,\n setSelection: (nodeId: string | null) => void,\n) => {\n const selectedMessage = useMemo(() => {\n if (!thread || thread.messages.length === 0) return null;\n const match = thread.messages.find(\n (message) => messageNodeId(message.id) === selection,\n );\n return match ?? thread.messages[thread.messages.length - 1]!;\n }, [thread, selection]);\n\n useEffect(() => {\n if (!thread || thread.messages.length === 0 || selection !== null) return;\n const last = thread.messages[thread.messages.length - 1]!;\n setSelection(messageNodeId(last.id));\n }, [thread, selection, setSelection]);\n\n return selectedMessage;\n};\n\nconst UnloadedConversation = ({\n switchToThread,\n threadId,\n}: {\n switchToThread?: ((threadId: string) => void | Promise<void>) | undefined;\n threadId: string;\n}) => (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 p-6\">\n <EmptyState>\n This conversation has not been opened in the app yet, so its messages are\n not cached in DevTools.\n </EmptyState>\n {switchToThread ? (\n <ControlButton onClick={() => switchToThread(threadId)}>\n Load conversation\n </ControlButton>\n ) : null}\n </div>\n);\n\nexport const ThreadTab = ({\n data,\n selection,\n setSelection,\n switchToThread,\n}: DevToolsTabContext) => {\n const threadList = useMemo(\n () => parseThreadListPreview(data.state.threads),\n [data.state.threads],\n );\n const snapshots = data.threadSnapshots;\n\n const hasConversationList =\n threadList !== null && threadList.threadIds.length > 0;\n\n const [activeThreadId, setActiveThreadId] = useState<string>(\n () => threadList?.mainThreadId ?? threadList?.threadIds[0] ?? \"\",\n );\n\n useEffect(() => {\n if (!hasConversationList || !threadList) return;\n const ids = [...threadList.threadIds, ...threadList.archivedThreadIds];\n if (ids.includes(activeThreadId)) return;\n setActiveThreadId(threadList.mainThreadId ?? threadList.threadIds[0] ?? \"\");\n }, [hasConversationList, threadList, activeThreadId]);\n\n const prevThreadIdRef = useRef(activeThreadId);\n useEffect(() => {\n if (prevThreadIdRef.current === activeThreadId) return;\n prevThreadIdRef.current = activeThreadId;\n setSelection(null);\n }, [activeThreadId, setSelection]);\n\n const activeThread = useMemo(() => {\n if (!hasConversationList) {\n return resolveSingleThread(data.state);\n }\n return resolveThreadForId(\n data.state,\n snapshots,\n activeThreadId,\n threadList,\n );\n }, [hasConversationList, data.state, snapshots, activeThreadId, threadList]);\n\n const selectedMessage = useSelectedMessage(\n activeThread,\n selection,\n setSelection,\n );\n\n if (!hasConversationList) {\n if (!activeThread || activeThread.messages.length === 0) {\n return (\n <CenteredMessage>\n No thread messages for this assistant instance.\n </CenteredMessage>\n );\n }\n\n const activeNodeId = messageNodeId(selectedMessage!.id);\n\n return (\n <SplitLayout\n sizes={TWO_COL}\n columns={[\n {\n key: \"transcript\",\n header: <TranscriptHeader thread={activeThread} />,\n children: (\n <Transcript\n thread={activeThread}\n selection={activeNodeId}\n onSelect={setSelection}\n />\n ),\n },\n {\n key: \"detail\",\n header: messageDetailHeader(selectedMessage!),\n children: <MessageDetailBody message={selectedMessage!} />,\n },\n ]}\n />\n );\n }\n\n const loaded = activeThread !== null && activeThread.messages.length > 0;\n\n if (!loaded) {\n return (\n <SplitLayout\n sizes=\"clamp(12rem,26%,15rem)_minmax(0,1fr)\"\n columns={[\n {\n key: \"conversations\",\n header: conversationListHeader(threadList!),\n children: (\n <ConversationList\n threadList={threadList!}\n snapshots={snapshots}\n selectedId={activeThreadId}\n onSelect={setActiveThreadId}\n />\n ),\n },\n {\n key: \"empty\",\n children: (\n <UnloadedConversation\n threadId={activeThreadId}\n switchToThread={switchToThread}\n />\n ),\n },\n ]}\n />\n );\n }\n\n const activeNodeId = messageNodeId(selectedMessage!.id);\n\n return (\n <SplitLayout\n sizes={THREE_COL}\n columns={[\n {\n key: \"conversations\",\n header: conversationListHeader(threadList!),\n children: (\n <ConversationList\n threadList={threadList!}\n snapshots={snapshots}\n selectedId={activeThreadId}\n onSelect={setActiveThreadId}\n />\n ),\n },\n {\n key: \"transcript\",\n header: <TranscriptHeader thread={activeThread!} />,\n children: (\n <Transcript\n thread={activeThread!}\n selection={activeNodeId}\n onSelect={setSelection}\n />\n ),\n },\n {\n key: \"detail\",\n header: messageDetailHeader(selectedMessage!),\n children: <MessageDetailBody message={selectedMessage!} />,\n },\n ]}\n />\n );\n};\n"],"mappings":"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"}