@tanstack/ai-devtools-core 0.4.24 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { delegateEvents, createComponent, insert, effect, className, setStyleProperty, addEventListener, memo, setAttribute, use, spread, mergeProps, template, Portal } from 'solid-js/web';
1
+ import { delegateEvents, createComponent, insert, effect, className, setStyleProperty, addEventListener, setAttribute, use, memo, spread, mergeProps, template, Portal } from 'solid-js/web';
2
2
  import { createContext, createSignal, onMount, onCleanup, createEffect, createMemo, Show, For, useContext, batch, Index, Switch, Match } from 'solid-js';
3
3
  import { ThemeContextProvider, MainPanel, Header, HeaderLogo, useTheme, JsonTree } from '@tanstack/devtools-ui';
4
4
  import { emitAIDevtoolsEvent, createAIDevtoolsEventEnvelope, aiEventClient } from '@tanstack/ai-event-client';
@@ -2202,6 +2202,118 @@ var stylesFactory = (theme) => {
2202
2202
  padding: 0 ${size[3]};
2203
2203
  `
2204
2204
  },
2205
+ // MemoryPanel component styles
2206
+ memoryPanel: {
2207
+ container: css2`
2208
+ display: flex;
2209
+ flex: 1;
2210
+ min-height: 0;
2211
+ flex-direction: column;
2212
+ gap: ${size[4]};
2213
+ overflow-y: auto;
2214
+ padding: ${size[4]};
2215
+ `,
2216
+ toolbar: css2`
2217
+ display: flex;
2218
+ align-items: center;
2219
+ justify-content: space-between;
2220
+ gap: ${size[3]};
2221
+ `,
2222
+ scopeControls: css2`
2223
+ display: flex;
2224
+ align-items: center;
2225
+ gap: ${size[2]};
2226
+ min-width: 0;
2227
+ `,
2228
+ scopeSelect: css2`
2229
+ max-width: 220px;
2230
+ border: 1px solid ${t(colors.gray[200], colors.darkGray[700])};
2231
+ border-radius: ${border.radius.sm};
2232
+ background: ${t(colors.white, colors.darkGray[800])};
2233
+ color: ${t(colors.gray[900], colors.gray[100])};
2234
+ font-family: ${fontFamily.mono};
2235
+ font-size: ${fontSize.xs};
2236
+ padding: ${size[1]} ${size[2]};
2237
+ `,
2238
+ clearButton: css2`
2239
+ border: 1px solid ${t(colors.gray[200], colors.darkGray[700])};
2240
+ border-radius: ${border.radius.sm};
2241
+ background: ${t(colors.gray[50], colors.darkGray[700])};
2242
+ color: ${t(colors.gray[700], colors.gray[200])};
2243
+ cursor: pointer;
2244
+ font-size: ${fontSize.xs};
2245
+ padding: ${size[1]} ${size[2]};
2246
+ &:hover {
2247
+ border-color: ${t(colors.blue[300], colors.blue[700])};
2248
+ }
2249
+ `,
2250
+ empty: css2`
2251
+ color: ${t(colors.gray[500], colors.gray[500])};
2252
+ font-size: ${fontSize.sm};
2253
+ padding: ${size[4]};
2254
+ text-align: center;
2255
+ `,
2256
+ section: css2`
2257
+ display: flex;
2258
+ flex-direction: column;
2259
+ gap: ${size[2]};
2260
+ `,
2261
+ sectionTitle: css2`
2262
+ color: ${t(colors.gray[600], colors.gray[300])};
2263
+ font-size: ${fontSize.xs};
2264
+ font-weight: ${font.weight.semibold};
2265
+ text-transform: uppercase;
2266
+ letter-spacing: 0.04em;
2267
+ `,
2268
+ sectionEmpty: css2`
2269
+ color: ${t(colors.gray[500], colors.gray[500])};
2270
+ font-size: ${fontSize.xs};
2271
+ `,
2272
+ list: css2`
2273
+ display: flex;
2274
+ flex-direction: column;
2275
+ gap: ${size[1]};
2276
+ `,
2277
+ row: css2`
2278
+ display: flex;
2279
+ flex-direction: column;
2280
+ gap: 2px;
2281
+ border: 1px solid ${t(colors.gray[200], colors.darkGray[700])};
2282
+ border-radius: ${border.radius.sm};
2283
+ background: ${t(colors.white, colors.darkGray[800])};
2284
+ padding: ${size[2]};
2285
+ `,
2286
+ rowError: css2`
2287
+ border-color: ${t(colors.red[300], colors.red[700])};
2288
+ background: ${t(colors.red[50], colors.red[900] + "20")};
2289
+ `,
2290
+ rowHeader: css2`
2291
+ display: flex;
2292
+ align-items: center;
2293
+ gap: ${size[2]};
2294
+ font-size: ${fontSize.xs};
2295
+ color: ${t(colors.gray[500], colors.gray[400])};
2296
+ `,
2297
+ badge: css2`
2298
+ border-radius: ${border.radius.xs};
2299
+ background: ${t(colors.blue[50], colors.blue[900] + "30")};
2300
+ color: ${t(colors.blue[700], colors.blue[300])};
2301
+ font-family: ${fontFamily.mono};
2302
+ font-size: 10px;
2303
+ padding: 1px 6px;
2304
+ `,
2305
+ time: css2`
2306
+ margin-left: auto;
2307
+ font-family: ${fontFamily.mono};
2308
+ font-size: 10px;
2309
+ `,
2310
+ rowText: css2`
2311
+ color: ${t(colors.gray[900], colors.gray[100])};
2312
+ font-size: ${fontSize.sm};
2313
+ white-space: pre-wrap;
2314
+ word-break: break-word;
2315
+ `
2316
+ },
2205
2317
  // ConversationDetails component styles
2206
2318
  conversationDetails: {
2207
2319
  emptyState: css2`
@@ -4399,8 +4511,8 @@ function removeHookRecord(state, hookId) {
4399
4511
  delete state.runs[runId];
4400
4512
  }
4401
4513
  }
4402
- for (const eventId of hookEventIds) {
4403
- delete state.events[eventId];
4514
+ for (const eventId2 of hookEventIds) {
4515
+ delete state.events[eventId2];
4404
4516
  }
4405
4517
  delete state.hooks[hookId];
4406
4518
  delete state.seenHookActivityCounts[hookId];
@@ -4408,7 +4520,7 @@ function removeHookRecord(state, hookId) {
4408
4520
  state.activeHookId = null;
4409
4521
  }
4410
4522
  }
4411
- function upsertRun(state, event, eventId) {
4523
+ function upsertRun(state, event, eventId2) {
4412
4524
  const existing = state.runs[event.runId];
4413
4525
  if (!existing) {
4414
4526
  state.runs[event.runId] = {
@@ -4422,7 +4534,7 @@ function upsertRun(state, event, eventId) {
4422
4534
  updatedAt: event.timestamp,
4423
4535
  ...isTerminalRunStatus(event.status) ? { completedAt: event.timestamp } : {},
4424
4536
  ...event.error ? { error: event.error } : {},
4425
- eventIds: [eventId]
4537
+ eventIds: [eventId2]
4426
4538
  };
4427
4539
  return;
4428
4540
  }
@@ -4438,8 +4550,8 @@ function upsertRun(state, event, eventId) {
4438
4550
  if (event.error) {
4439
4551
  existing.error = event.error;
4440
4552
  }
4441
- if (!existing.eventIds.includes(eventId)) {
4442
- existing.eventIds.push(eventId);
4553
+ if (!existing.eventIds.includes(eventId2)) {
4554
+ existing.eventIds.push(eventId2);
4443
4555
  }
4444
4556
  }
4445
4557
  function attachRunToHook(state, hookId, runId) {
@@ -4447,7 +4559,7 @@ function attachRunToHook(state, hookId, runId) {
4447
4559
  if (!hook || hook.runIds.includes(runId)) return;
4448
4560
  hook.runIds.push(runId);
4449
4561
  }
4450
- function syncRunsFromSnapshot(state, snapshot, eventId) {
4562
+ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4451
4563
  const rawRuns = snapshot.state.runs;
4452
4564
  if (!Array.isArray(rawRuns)) return;
4453
4565
  for (const candidate of rawRuns) {
@@ -4473,7 +4585,7 @@ function syncRunsFromSnapshot(state, snapshot, eventId) {
4473
4585
  updatedAt,
4474
4586
  ...typeof run.completedAt === "number" ? { completedAt: run.completedAt } : isTerminalRunStatus(status) ? { completedAt: updatedAt } : {},
4475
4587
  ...typeof run.error === "string" ? { error: run.error } : {},
4476
- eventIds: [eventId]
4588
+ eventIds: [eventId2]
4477
4589
  };
4478
4590
  } else {
4479
4591
  existing.hookId = snapshot.hookId;
@@ -4485,8 +4597,8 @@ function syncRunsFromSnapshot(state, snapshot, eventId) {
4485
4597
  existing.completedAt = updatedAt;
4486
4598
  }
4487
4599
  if (typeof run.error === "string") existing.error = run.error;
4488
- if (!existing.eventIds.includes(eventId)) {
4489
- existing.eventIds.push(eventId);
4600
+ if (!existing.eventIds.includes(eventId2)) {
4601
+ existing.eventIds.push(eventId2);
4490
4602
  }
4491
4603
  }
4492
4604
  attachRunToHook(state, snapshot.hookId, run.id);
@@ -4516,11 +4628,11 @@ function attachActivityRunToHook(state, hookId, runId) {
4516
4628
  if (!hook || hook.activityRunIds.includes(runId)) return;
4517
4629
  hook.activityRunIds.push(runId);
4518
4630
  }
4519
- function attachEventToHook(state, hookId, eventId) {
4631
+ function attachEventToHook(state, hookId, eventId2) {
4520
4632
  if (!hookId) return;
4521
4633
  const hook = state.hooks[hookId];
4522
- if (!hook || hook.eventIds.includes(eventId)) return;
4523
- hook.eventIds.push(eventId);
4634
+ if (!hook || hook.eventIds.includes(eventId2)) return;
4635
+ hook.eventIds.push(eventId2);
4524
4636
  }
4525
4637
  function inferLifecycleFromSnapshot(state) {
4526
4638
  if (state.status === "error" || state.error) {
@@ -4562,6 +4674,107 @@ function shouldSkipClientAssistantPlaceholder(message) {
4562
4674
  return message.role === "assistant" && message.source === "client" && !message.content && (!message.toolCalls || message.toolCalls.length === 0) && (!message.parts || message.parts.length === 0);
4563
4675
  }
4564
4676
 
4677
+ // src/store/memory-registry.ts
4678
+ function createMemoryRegistryState() {
4679
+ return { scopes: {} };
4680
+ }
4681
+ function escapeScopeDim(value) {
4682
+ return value.replace(/[\\:_]/g, "\\$&");
4683
+ }
4684
+ function scopeDim(value) {
4685
+ return value != null && value.length > 0 ? escapeScopeDim(value) : "_";
4686
+ }
4687
+ function memoryScopeKey(scope) {
4688
+ if (!scope) return "(unknown)";
4689
+ return `${scopeDim(scope.tenantId)}:${scopeDim(scope.userId)}:${escapeScopeDim(scope.threadId)}:${scopeDim(scope.namespace)}`;
4690
+ }
4691
+ function memoryScopeLabel(entry) {
4692
+ if (entry.key === "(unknown)" || !entry.threadId) return "(unknown)";
4693
+ const parts = [
4694
+ entry.tenantId,
4695
+ entry.userId,
4696
+ entry.threadId,
4697
+ entry.namespace
4698
+ ].filter((p) => p != null && p.length > 0);
4699
+ return parts.join(" \xB7 ");
4700
+ }
4701
+ var MAX_EVENTS_PER_SCOPE = 200;
4702
+ function ensureScope(state, scope) {
4703
+ const key = memoryScopeKey(scope);
4704
+ let entry = state.scopes[key];
4705
+ if (!entry) {
4706
+ entry = {
4707
+ key,
4708
+ threadId: scope?.threadId ?? "",
4709
+ userId: scope?.userId,
4710
+ tenantId: scope?.tenantId,
4711
+ namespace: scope?.namespace,
4712
+ events: [],
4713
+ lastActivity: 0
4714
+ };
4715
+ state.scopes[key] = entry;
4716
+ }
4717
+ if (scope) {
4718
+ if (scope.userId) entry.userId = scope.userId;
4719
+ if (scope.tenantId) entry.tenantId = scope.tenantId;
4720
+ if (scope.namespace) entry.namespace = scope.namespace;
4721
+ }
4722
+ return entry;
4723
+ }
4724
+ var fallbackCounter = 0;
4725
+ function eventId(payload, type, ts) {
4726
+ if (payload.eventId && payload.eventId.length > 0) return payload.eventId;
4727
+ return `${type}:${ts}:${fallbackCounter++}`;
4728
+ }
4729
+ function applyMemoryEvent(state, event) {
4730
+ const entry = ensureScope(state, event.scope);
4731
+ entry.adapter = event.adapter;
4732
+ entry.lastActivity = Math.max(entry.lastActivity, event.timestamp);
4733
+ const record = {
4734
+ id: eventId(event, event.type, event.timestamp),
4735
+ type: event.type,
4736
+ timestamp: event.timestamp,
4737
+ adapter: event.adapter
4738
+ };
4739
+ switch (event.type) {
4740
+ case "retrieve:started":
4741
+ record.query = event.query;
4742
+ break;
4743
+ case "retrieve:completed":
4744
+ record.fragmentCount = event.fragmentCount;
4745
+ record.hasTools = event.hasTools;
4746
+ record.systemPromptChars = event.systemPromptChars;
4747
+ record.durationMs = event.durationMs;
4748
+ break;
4749
+ case "persist:completed":
4750
+ record.receiptCount = event.receiptCount;
4751
+ record.okCount = event.okCount;
4752
+ record.durationMs = event.durationMs;
4753
+ break;
4754
+ case "error":
4755
+ record.phase = event.phase;
4756
+ record.error = event.error;
4757
+ break;
4758
+ }
4759
+ entry.events.push(record);
4760
+ if (entry.events.length > MAX_EVENTS_PER_SCOPE) {
4761
+ entry.events.splice(0, entry.events.length - MAX_EVENTS_PER_SCOPE);
4762
+ }
4763
+ }
4764
+ function applyMemorySnapshot(state, event) {
4765
+ const entry = ensureScope(state, event.scope);
4766
+ entry.adapter = event.adapter;
4767
+ entry.lastActivity = Math.max(entry.lastActivity, event.timestamp);
4768
+ entry.snapshot = {
4769
+ takenAt: event.takenAt,
4770
+ data: event.data,
4771
+ facts: event.facts
4772
+ };
4773
+ }
4774
+ function clearMemoryRegistry(state) {
4775
+ state.scopes = {};
4776
+ }
4777
+
4565
4778
  // src/store/ai-context.tsx
4566
4779
  var AIContext = createContext();
4567
4780
  function useAIStore() {
@@ -4575,7 +4788,8 @@ var AIProvider = (props) => {
4575
4788
  const [state, setState] = createStore({
4576
4789
  conversations: {},
4577
4790
  activeConversationId: null,
4578
- hooks: createHookRegistryState()
4791
+ hooks: createHookRegistryState(),
4792
+ memory: createMemoryRegistryState()
4579
4793
  });
4580
4794
  const streamToConversation = /* @__PURE__ */ new Map();
4581
4795
  const requestToConversation = /* @__PURE__ */ new Map();
@@ -4827,6 +5041,11 @@ var AIProvider = (props) => {
4827
5041
  clearHookRegistry(hooks);
4828
5042
  }));
4829
5043
  }
5044
+ function clearMemory() {
5045
+ setState("memory", produce((memory) => {
5046
+ clearMemoryRegistry(memory);
5047
+ }));
5048
+ }
4830
5049
  function selectHook(id) {
4831
5050
  setState("hooks", produce((hooks) => {
4832
5051
  setActiveHook(hooks, id);
@@ -5135,6 +5354,29 @@ var AIProvider = (props) => {
5135
5354
  applyHookEvent(hooks, "hook:state-snapshot", e.payload);
5136
5355
  }));
5137
5356
  }));
5357
+ const recordMemoryEvent = (type, payload) => {
5358
+ setState("memory", produce((memory) => {
5359
+ applyMemoryEvent(memory, {
5360
+ ...payload,
5361
+ type
5362
+ });
5363
+ }));
5364
+ };
5365
+ cleanupFns.push(aiEventClient.on("memory:retrieve:started", (e) => {
5366
+ recordMemoryEvent("retrieve:started", e.payload);
5367
+ }), aiEventClient.on("memory:retrieve:completed", (e) => {
5368
+ recordMemoryEvent("retrieve:completed", e.payload);
5369
+ }), aiEventClient.on("memory:persist:started", (e) => {
5370
+ recordMemoryEvent("persist:started", e.payload);
5371
+ }), aiEventClient.on("memory:persist:completed", (e) => {
5372
+ recordMemoryEvent("persist:completed", e.payload);
5373
+ }), aiEventClient.on("memory:error", (e) => {
5374
+ recordMemoryEvent("error", e.payload);
5375
+ }), aiEventClient.on("memory:snapshot", (e) => {
5376
+ setState("memory", produce((memory) => {
5377
+ applyMemorySnapshot(memory, e.payload);
5378
+ }));
5379
+ }));
5138
5380
  const recordRunEvent = (eventName, payload) => {
5139
5381
  setState("hooks", produce((hooks) => {
5140
5382
  applyHookEvent(hooks, eventName, payload);
@@ -6709,6 +6951,7 @@ var AIProvider = (props) => {
6709
6951
  clearAllConversations,
6710
6952
  selectConversation,
6711
6953
  clearHooks,
6954
+ clearMemory,
6712
6955
  selectHook,
6713
6956
  saveToolFixture,
6714
6957
  deleteToolFixture,
@@ -6753,6 +6996,16 @@ function visibleHooks(hooks) {
6753
6996
  function getHookDisplayName(hook) {
6754
6997
  return hook.displayName ?? hook.hookName;
6755
6998
  }
6999
+ function getHookIdentityLabel(hook) {
7000
+ return hook.threadId ?? hook.id;
7001
+ }
7002
+ function getHookIdentitySubtitle(hook) {
7003
+ const identity = getHookIdentityLabel(hook);
7004
+ if (hook.displayName) {
7005
+ return `${hook.hookName} - ${identity}`;
7006
+ }
7007
+ return identity;
7008
+ }
6756
7009
  function groupHooksByCategory(hooks) {
6757
7010
  const groups = /* @__PURE__ */ new Map();
6758
7011
  for (const hook of hooks) {
@@ -6906,17 +7159,7 @@ var HookDashboard = () => {
6906
7159
  return _el$45;
6907
7160
  }
6908
7161
  }), null);
6909
- insert(_el$47, createComponent(Show, {
6910
- get when() {
6911
- return hook.displayName;
6912
- },
6913
- get fallback() {
6914
- return hook.id;
6915
- },
6916
- get children() {
6917
- return [memo(() => hook.hookName), " - ", memo(() => hook.id)];
6918
- }
6919
- }));
7162
+ insert(_el$47, () => getHookIdentitySubtitle(hook));
6920
7163
  insert(_el$49, () => hook.lifecycle);
6921
7164
  insert(_el$48, createComponent(Show, {
6922
7165
  get when() {
@@ -10340,31 +10583,383 @@ function isRecord3(value) {
10340
10583
  return typeof value === "object" && value !== null && !Array.isArray(value);
10341
10584
  }
10342
10585
  delegateEvents(["click"]);
10586
+ var _tmpl$38 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-memory-panel>`);
10587
+ var _tmpl$213 = /* @__PURE__ */ template(`<div>No memory activity yet. Send a message through a chat wired with<code> memoryMiddleware</code> and recall/save events will appear here.`);
10588
+ var _tmpl$39 = /* @__PURE__ */ template(`<select data-testid=ai-devtools-memory-scope-select>`);
10589
+ var _tmpl$46 = /* @__PURE__ */ template(`<div><div></div><button type=button>Clear`);
10590
+ var _tmpl$56 = /* @__PURE__ */ template(`<div>`);
10591
+ var _tmpl$66 = /* @__PURE__ */ template(`<section><div>Stored records (<!>)`);
10592
+ var _tmpl$76 = /* @__PURE__ */ template(`<section><div>listFacts() (<!>)`);
10593
+ var _tmpl$86 = /* @__PURE__ */ template(`<section><div>Operations (<!>)`);
10594
+ var _tmpl$96 = /* @__PURE__ */ template(`<span>`);
10595
+ var _tmpl$05 = /* @__PURE__ */ template(`<option>`);
10596
+ var _tmpl$114 = /* @__PURE__ */ template(`<span>snapshot `);
10597
+ var _tmpl$105 = /* @__PURE__ */ template(`<span>importance `);
10598
+ var _tmpl$115 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-memory-record><div><span></span><span></span></div><div>`);
10599
+ var _tmpl$123 = /* @__PURE__ */ template(`<div>No facts.`);
10600
+ var _tmpl$133 = /* @__PURE__ */ template(`<span>: `);
10601
+ var _tmpl$143 = /* @__PURE__ */ template(`<div><div>`);
10602
+ var _tmpl$153 = /* @__PURE__ */ template(`<div>No operations recorded.`);
10603
+ var _tmpl$163 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-memory-event><div><span></span><span></span></div><div>`);
10604
+ function extractRecords(data) {
10605
+ if (!data || typeof data !== "object") return [];
10606
+ const records = data.records;
10607
+ if (!Array.isArray(records)) return [];
10608
+ return records.filter((r) => Boolean(r) && typeof r === "object" && typeof r.id === "string" && typeof r.text === "string");
10609
+ }
10610
+ function formatTime2(value) {
10611
+ if (value === void 0) return "";
10612
+ const date = new Date(value);
10613
+ if (Number.isNaN(date.getTime())) return "";
10614
+ return date.toLocaleTimeString();
10615
+ }
10616
+ function eventSummary(event) {
10617
+ switch (event.type) {
10618
+ case "retrieve:started":
10619
+ return `recall "${event.query ?? ""}"`;
10620
+ case "retrieve:completed":
10621
+ return `recalled ${event.fragmentCount ?? 0} fragment(s), ${event.systemPromptChars ?? 0} prompt chars${event.hasTools ? ", +tools" : ""} (${event.durationMs ?? 0}ms)`;
10622
+ case "persist:started":
10623
+ return "save started";
10624
+ case "persist:completed":
10625
+ return `saved ${event.okCount ?? 0}/${event.receiptCount ?? 0} receipt(s) (${event.durationMs ?? 0}ms)`;
10626
+ case "error":
10627
+ return `${event.phase ?? ""} error: ${event.error?.message ?? "unknown"}`;
10628
+ default:
10629
+ return event.type;
10630
+ }
10631
+ }
10632
+ var MemoryPanel = () => {
10633
+ const {
10634
+ state,
10635
+ clearMemory
10636
+ } = useAIStore();
10637
+ const styles = useStyles();
10638
+ const [override, setOverride] = createSignal(null);
10639
+ const scopeKeys = createMemo(() => Object.values(state.memory.scopes).slice().sort((a, b) => b.lastActivity - a.lastActivity).map((s) => s.key));
10640
+ const selectedKey = createMemo(() => {
10641
+ const chosen = override();
10642
+ if (chosen && state.memory.scopes[chosen]) return chosen;
10643
+ return scopeKeys()[0] ?? null;
10644
+ });
10645
+ const scope = createMemo(() => {
10646
+ const key = selectedKey();
10647
+ return key ? state.memory.scopes[key] : void 0;
10648
+ });
10649
+ const records = createMemo(() => extractRecords(scope()?.snapshot?.data));
10650
+ const facts = createMemo(() => scope()?.snapshot?.facts ?? []);
10651
+ const events = createMemo(() => (scope()?.events ?? []).slice().sort((a, b) => b.timestamp - a.timestamp));
10652
+ return (() => {
10653
+ var _el$ = _tmpl$38();
10654
+ insert(_el$, createComponent(Show, {
10655
+ get when() {
10656
+ return scope();
10657
+ },
10658
+ get fallback() {
10659
+ return (() => {
10660
+ var _el$2 = _tmpl$213();
10661
+ effect(() => className(_el$2, styles().memoryPanel.empty));
10662
+ return _el$2;
10663
+ })();
10664
+ },
10665
+ children: (activeScope) => [(() => {
10666
+ var _el$3 = _tmpl$46(), _el$4 = _el$3.firstChild, _el$6 = _el$4.nextSibling;
10667
+ insert(_el$4, createComponent(Show, {
10668
+ get when() {
10669
+ return scopeKeys().length > 1;
10670
+ },
10671
+ get fallback() {
10672
+ return (() => {
10673
+ var _el$23 = _tmpl$96();
10674
+ insert(_el$23, () => activeScope().adapter ?? "memory");
10675
+ effect(() => className(_el$23, styles().memoryPanel.badge));
10676
+ return _el$23;
10677
+ })();
10678
+ },
10679
+ get children() {
10680
+ var _el$5 = _tmpl$39();
10681
+ _el$5.addEventListener("change", (e) => setOverride(e.currentTarget.value));
10682
+ insert(_el$5, createComponent(For, {
10683
+ get each() {
10684
+ return scopeKeys();
10685
+ },
10686
+ children: (key) => {
10687
+ const entry = state.memory.scopes[key];
10688
+ const label = entry ? memoryScopeLabel(entry) : key;
10689
+ return (() => {
10690
+ var _el$24 = _tmpl$05();
10691
+ _el$24.value = key;
10692
+ insert(_el$24, (() => {
10693
+ var _c$ = memo(() => !!entry?.adapter);
10694
+ return () => _c$() ? `${entry.adapter} \xB7 ` : "";
10695
+ })(), null);
10696
+ insert(_el$24, (() => {
10697
+ var _c$2 = memo(() => label.length > 40);
10698
+ return () => _c$2() ? `${label.slice(0, 40)}\u2026` : label;
10699
+ })(), null);
10700
+ return _el$24;
10701
+ })();
10702
+ }
10703
+ }));
10704
+ effect(() => className(_el$5, styles().memoryPanel.scopeSelect));
10705
+ effect(() => _el$5.value = selectedKey() ?? "");
10706
+ return _el$5;
10707
+ }
10708
+ }));
10709
+ _el$6.$$click = () => {
10710
+ setOverride(null);
10711
+ clearMemory();
10712
+ };
10713
+ effect((_p$) => {
10714
+ var _v$ = styles().memoryPanel.toolbar, _v$2 = styles().memoryPanel.scopeControls, _v$3 = styles().memoryPanel.clearButton;
10715
+ _v$ !== _p$.e && className(_el$3, _p$.e = _v$);
10716
+ _v$2 !== _p$.t && className(_el$4, _p$.t = _v$2);
10717
+ _v$3 !== _p$.a && className(_el$6, _p$.a = _v$3);
10718
+ return _p$;
10719
+ }, {
10720
+ e: void 0,
10721
+ t: void 0,
10722
+ a: void 0
10723
+ });
10724
+ return _el$3;
10725
+ })(), (() => {
10726
+ var _el$7 = _tmpl$66(), _el$8 = _el$7.firstChild, _el$9 = _el$8.firstChild, _el$1 = _el$9.nextSibling; _el$1.nextSibling;
10727
+ insert(_el$8, () => records().length, _el$1);
10728
+ insert(_el$8, createComponent(Show, {
10729
+ get when() {
10730
+ return activeScope().snapshot;
10731
+ },
10732
+ children: (snap) => (() => {
10733
+ var _el$25 = _tmpl$114(); _el$25.firstChild;
10734
+ insert(_el$25, () => formatTime2(snap().takenAt), null);
10735
+ effect(() => className(_el$25, styles().memoryPanel.time));
10736
+ return _el$25;
10737
+ })()
10738
+ }), null);
10739
+ insert(_el$7, createComponent(Show, {
10740
+ get when() {
10741
+ return records().length > 0;
10742
+ },
10743
+ get fallback() {
10744
+ return (() => {
10745
+ var _el$27 = _tmpl$56();
10746
+ insert(_el$27, () => activeScope().snapshot ? "Snapshot is empty." : "This adapter does not expose inspect() \u2014 see the timeline below for activity.");
10747
+ effect(() => className(_el$27, styles().memoryPanel.sectionEmpty));
10748
+ return _el$27;
10749
+ })();
10750
+ },
10751
+ get children() {
10752
+ var _el$10 = _tmpl$56();
10753
+ insert(_el$10, createComponent(For, {
10754
+ get each() {
10755
+ return records();
10756
+ },
10757
+ children: (rec) => (() => {
10758
+ var _el$28 = _tmpl$115(), _el$29 = _el$28.firstChild, _el$30 = _el$29.firstChild, _el$34 = _el$30.nextSibling, _el$35 = _el$29.nextSibling;
10759
+ insert(_el$30, () => rec.kind);
10760
+ insert(_el$29, createComponent(Show, {
10761
+ get when() {
10762
+ return rec.role;
10763
+ },
10764
+ get children() {
10765
+ var _el$31 = _tmpl$96();
10766
+ insert(_el$31, () => rec.role);
10767
+ return _el$31;
10768
+ }
10769
+ }), _el$34);
10770
+ insert(_el$29, createComponent(Show, {
10771
+ get when() {
10772
+ return rec.importance !== void 0;
10773
+ },
10774
+ get children() {
10775
+ var _el$32 = _tmpl$105(); _el$32.firstChild;
10776
+ insert(_el$32, () => rec.importance?.toFixed(2), null);
10777
+ return _el$32;
10778
+ }
10779
+ }), _el$34);
10780
+ insert(_el$34, () => formatTime2(rec.createdAt));
10781
+ insert(_el$35, () => rec.text);
10782
+ effect((_p$) => {
10783
+ var _v$0 = styles().memoryPanel.row, _v$1 = styles().memoryPanel.rowHeader, _v$10 = styles().memoryPanel.badge, _v$11 = styles().memoryPanel.time, _v$12 = styles().memoryPanel.rowText;
10784
+ _v$0 !== _p$.e && className(_el$28, _p$.e = _v$0);
10785
+ _v$1 !== _p$.t && className(_el$29, _p$.t = _v$1);
10786
+ _v$10 !== _p$.a && className(_el$30, _p$.a = _v$10);
10787
+ _v$11 !== _p$.o && className(_el$34, _p$.o = _v$11);
10788
+ _v$12 !== _p$.i && className(_el$35, _p$.i = _v$12);
10789
+ return _p$;
10790
+ }, {
10791
+ e: void 0,
10792
+ t: void 0,
10793
+ a: void 0,
10794
+ o: void 0,
10795
+ i: void 0
10796
+ });
10797
+ return _el$28;
10798
+ })()
10799
+ }));
10800
+ effect(() => className(_el$10, styles().memoryPanel.list));
10801
+ return _el$10;
10802
+ }
10803
+ }), null);
10804
+ effect((_p$) => {
10805
+ var _v$4 = styles().memoryPanel.section, _v$5 = styles().memoryPanel.sectionTitle;
10806
+ _v$4 !== _p$.e && className(_el$7, _p$.e = _v$4);
10807
+ _v$5 !== _p$.t && className(_el$8, _p$.t = _v$5);
10808
+ return _p$;
10809
+ }, {
10810
+ e: void 0,
10811
+ t: void 0
10812
+ });
10813
+ return _el$7;
10814
+ })(), (() => {
10815
+ var _el$11 = _tmpl$76(), _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild, _el$15 = _el$13.nextSibling; _el$15.nextSibling;
10816
+ insert(_el$12, () => facts().length, _el$15);
10817
+ insert(_el$11, createComponent(Show, {
10818
+ get when() {
10819
+ return facts().length > 0;
10820
+ },
10821
+ get fallback() {
10822
+ return (() => {
10823
+ var _el$36 = _tmpl$123();
10824
+ effect(() => className(_el$36, styles().memoryPanel.sectionEmpty));
10825
+ return _el$36;
10826
+ })();
10827
+ },
10828
+ get children() {
10829
+ var _el$16 = _tmpl$56();
10830
+ insert(_el$16, createComponent(For, {
10831
+ get each() {
10832
+ return facts();
10833
+ },
10834
+ children: (fact) => (() => {
10835
+ var _el$37 = _tmpl$143(), _el$38 = _el$37.firstChild;
10836
+ insert(_el$38, createComponent(Show, {
10837
+ get when() {
10838
+ return fact.source;
10839
+ },
10840
+ get children() {
10841
+ var _el$39 = _tmpl$133(), _el$40 = _el$39.firstChild;
10842
+ insert(_el$39, () => fact.source, _el$40);
10843
+ effect(() => className(_el$39, styles().memoryPanel.rowHeader));
10844
+ return _el$39;
10845
+ }
10846
+ }), null);
10847
+ insert(_el$38, () => fact.text, null);
10848
+ effect((_p$) => {
10849
+ var _v$13 = styles().memoryPanel.row, _v$14 = styles().memoryPanel.rowText;
10850
+ _v$13 !== _p$.e && className(_el$37, _p$.e = _v$13);
10851
+ _v$14 !== _p$.t && className(_el$38, _p$.t = _v$14);
10852
+ return _p$;
10853
+ }, {
10854
+ e: void 0,
10855
+ t: void 0
10856
+ });
10857
+ return _el$37;
10858
+ })()
10859
+ }));
10860
+ effect(() => className(_el$16, styles().memoryPanel.list));
10861
+ return _el$16;
10862
+ }
10863
+ }), null);
10864
+ effect((_p$) => {
10865
+ var _v$6 = styles().memoryPanel.section, _v$7 = styles().memoryPanel.sectionTitle;
10866
+ _v$6 !== _p$.e && className(_el$11, _p$.e = _v$6);
10867
+ _v$7 !== _p$.t && className(_el$12, _p$.t = _v$7);
10868
+ return _p$;
10869
+ }, {
10870
+ e: void 0,
10871
+ t: void 0
10872
+ });
10873
+ return _el$11;
10874
+ })(), (() => {
10875
+ var _el$17 = _tmpl$86(), _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$21 = _el$19.nextSibling; _el$21.nextSibling;
10876
+ insert(_el$18, () => events().length, _el$21);
10877
+ insert(_el$17, createComponent(Show, {
10878
+ get when() {
10879
+ return events().length > 0;
10880
+ },
10881
+ get fallback() {
10882
+ return (() => {
10883
+ var _el$41 = _tmpl$153();
10884
+ effect(() => className(_el$41, styles().memoryPanel.sectionEmpty));
10885
+ return _el$41;
10886
+ })();
10887
+ },
10888
+ get children() {
10889
+ var _el$22 = _tmpl$56();
10890
+ insert(_el$22, createComponent(For, {
10891
+ get each() {
10892
+ return events();
10893
+ },
10894
+ children: (event) => (() => {
10895
+ var _el$42 = _tmpl$163(), _el$43 = _el$42.firstChild, _el$44 = _el$43.firstChild, _el$45 = _el$44.nextSibling, _el$46 = _el$43.nextSibling;
10896
+ insert(_el$44, () => event.type);
10897
+ insert(_el$45, () => formatTime2(event.timestamp));
10898
+ insert(_el$46, () => eventSummary(event));
10899
+ effect((_p$) => {
10900
+ var _v$15 = `${styles().memoryPanel.row} ${event.type === "error" ? styles().memoryPanel.rowError : ""}`, _v$16 = styles().memoryPanel.rowHeader, _v$17 = styles().memoryPanel.badge, _v$18 = styles().memoryPanel.time, _v$19 = styles().memoryPanel.rowText;
10901
+ _v$15 !== _p$.e && className(_el$42, _p$.e = _v$15);
10902
+ _v$16 !== _p$.t && className(_el$43, _p$.t = _v$16);
10903
+ _v$17 !== _p$.a && className(_el$44, _p$.a = _v$17);
10904
+ _v$18 !== _p$.o && className(_el$45, _p$.o = _v$18);
10905
+ _v$19 !== _p$.i && className(_el$46, _p$.i = _v$19);
10906
+ return _p$;
10907
+ }, {
10908
+ e: void 0,
10909
+ t: void 0,
10910
+ a: void 0,
10911
+ o: void 0,
10912
+ i: void 0
10913
+ });
10914
+ return _el$42;
10915
+ })()
10916
+ }));
10917
+ effect(() => className(_el$22, styles().memoryPanel.list));
10918
+ return _el$22;
10919
+ }
10920
+ }), null);
10921
+ effect((_p$) => {
10922
+ var _v$8 = styles().memoryPanel.section, _v$9 = styles().memoryPanel.sectionTitle;
10923
+ _v$8 !== _p$.e && className(_el$17, _p$.e = _v$8);
10924
+ _v$9 !== _p$.t && className(_el$18, _p$.t = _v$9);
10925
+ return _p$;
10926
+ }, {
10927
+ e: void 0,
10928
+ t: void 0
10929
+ });
10930
+ return _el$17;
10931
+ })()]
10932
+ }));
10933
+ effect(() => className(_el$, styles().memoryPanel.container));
10934
+ return _el$;
10935
+ })();
10936
+ };
10937
+ delegateEvents(["click"]);
10343
10938
 
10344
10939
  // src/components/hooks/HookDetails.tsx
10345
- var _tmpl$38 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
10346
- var _tmpl$213 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-hook-detail><nav data-testid=ai-devtools-hook-tabs></nav><div><main data-testid=ai-devtools-primary-pane>`);
10347
- var _tmpl$39 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-dashboard-overview><header><div><div>Hooks Dashboard</div><div>Select a hook from the left or open one of the active hooks below.</div></div></header><div></div><div>`);
10348
- var _tmpl$46 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
10349
- var _tmpl$56 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
10350
- var _tmpl$66 = /* @__PURE__ */ template(`<span>running`);
10351
- var _tmpl$76 = /* @__PURE__ */ template(`<span> new`);
10352
- var _tmpl$86 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
10353
- var _tmpl$96 = /* @__PURE__ */ template(`<div><span></span><span>`);
10354
- var _tmpl$05 = /* @__PURE__ */ template(`<span>`);
10355
- var _tmpl$114 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-technical-name>`);
10356
- var _tmpl$105 = /* @__PURE__ */ template(`<span>thread `);
10357
- var _tmpl$115 = /* @__PURE__ */ template(`<header data-testid=ai-devtools-hook-header><div><div><span data-testid=ai-devtools-hook-title></span><span></span></div><div><span></span></div></div><div>`);
10358
- var _tmpl$123 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-hook-tab>`);
10359
- var _tmpl$133 = /* @__PURE__ */ template(`<div><section><div>Current State`);
10360
- var _tmpl$143 = /* @__PURE__ */ template(`<div>`);
10361
- var _tmpl$153 = /* @__PURE__ */ template(`<div>No messages.`);
10362
- var _tmpl$163 = /* @__PURE__ */ template(`<div><div>`);
10940
+ var _tmpl$40 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
10941
+ var _tmpl$214 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-hook-detail><nav data-testid=ai-devtools-hook-tabs></nav><div><main data-testid=ai-devtools-primary-pane>`);
10942
+ var _tmpl$310 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-dashboard-overview><header><div><div>Hooks Dashboard</div><div>Select a hook from the left or open one of the active hooks below.</div></div></header><div></div><div>`);
10943
+ var _tmpl$47 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
10944
+ var _tmpl$57 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
10945
+ var _tmpl$67 = /* @__PURE__ */ template(`<span>running`);
10946
+ var _tmpl$77 = /* @__PURE__ */ template(`<span> new`);
10947
+ var _tmpl$87 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
10948
+ var _tmpl$97 = /* @__PURE__ */ template(`<div><span></span><span>`);
10949
+ var _tmpl$06 = /* @__PURE__ */ template(`<span>`);
10950
+ var _tmpl$116 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-technical-name>`);
10951
+ var _tmpl$106 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-registry-id>id `);
10952
+ var _tmpl$117 = /* @__PURE__ */ template(`<header data-testid=ai-devtools-hook-header><div><div><span data-testid=ai-devtools-hook-title></span><span></span></div><div><span data-testid=ai-devtools-hook-identity></span></div></div><div>`);
10953
+ var _tmpl$124 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-hook-tab>`);
10954
+ var _tmpl$134 = /* @__PURE__ */ template(`<div><section><div>Current State`);
10955
+ var _tmpl$144 = /* @__PURE__ */ template(`<div>`);
10956
+ var _tmpl$154 = /* @__PURE__ */ template(`<div>No messages.`);
10957
+ var _tmpl$164 = /* @__PURE__ */ template(`<div><div>`);
10363
10958
  var _tmpl$173 = /* @__PURE__ */ template(`<div><button type=button data-testid=ai-devtools-preview-save-tool-call>Save</button><button type=button data-testid=ai-devtools-preview-replay-tool-call>Replay`);
10364
10959
  var _tmpl$182 = /* @__PURE__ */ template(`<div><span>`);
10365
10960
  var _tmpl$192 = /* @__PURE__ */ template(`<div><span></span><div>`);
10366
10961
  var _tmpl$202 = /* @__PURE__ */ template(`<div>No messages yet. Start a conversation to see messages here.`);
10367
- var _tmpl$214 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-tools><div></div><div>`);
10962
+ var _tmpl$215 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-tools><div></div><div>`);
10368
10963
  var _tmpl$223 = /* @__PURE__ */ template(`<div>No tools.`);
10369
10964
  var _tmpl$232 = /* @__PURE__ */ template(`<span>approval`);
10370
10965
  var _tmpl$242 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-tool-row><span>`);
@@ -10403,7 +10998,7 @@ var HookDetails = () => {
10403
10998
  return Boolean(outputKind && outputKind !== "chat" && outputKind !== "structured");
10404
10999
  });
10405
11000
  createEffect(() => {
10406
- if (isGenerationHook() && activeTab() === "tools") {
11001
+ if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory")) {
10407
11002
  setActiveTab("conversation");
10408
11003
  }
10409
11004
  });
@@ -10448,7 +11043,7 @@ var HookDetails = () => {
10448
11043
  });
10449
11044
  },
10450
11045
  children: (activeHook) => (() => {
10451
- var _el$ = _tmpl$213(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
11046
+ var _el$ = _tmpl$214(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
10452
11047
  insert(_el$, createComponent(HookHeader, {
10453
11048
  get hook() {
10454
11049
  return activeHook();
@@ -10499,6 +11094,21 @@ var HookDetails = () => {
10499
11094
  },
10500
11095
  onSelect: setActiveTab
10501
11096
  }), null);
11097
+ insert(_el$2, createComponent(Show, {
11098
+ get when() {
11099
+ return !isGenerationHook();
11100
+ },
11101
+ get children() {
11102
+ return createComponent(TabButton, {
11103
+ label: "Memory",
11104
+ tab: "memory",
11105
+ get activeTab() {
11106
+ return activeTab();
11107
+ },
11108
+ onSelect: setActiveTab
11109
+ });
11110
+ }
11111
+ }), null);
10502
11112
  _el$4.addEventListener("mouseleave", () => setHoverTarget(null));
10503
11113
  _el$4.$$mouseover = (event) => setHoverTargetFromEvent(event, "timeline", setHoverTarget);
10504
11114
  use((el) => {
@@ -10567,12 +11177,20 @@ var HookDetails = () => {
10567
11177
  });
10568
11178
  }
10569
11179
  }), null);
11180
+ insert(_el$4, createComponent(Show, {
11181
+ get when() {
11182
+ return activeTab() === "memory";
11183
+ },
11184
+ get children() {
11185
+ return createComponent(MemoryPanel, {});
11186
+ }
11187
+ }), null);
10570
11188
  insert(_el$3, createComponent(Show, {
10571
11189
  get when() {
10572
11190
  return showSecondaryPane();
10573
11191
  },
10574
11192
  get children() {
10575
- var _el$5 = _tmpl$38(), _el$6 = _el$5.firstChild;
11193
+ var _el$5 = _tmpl$40(), _el$6 = _el$5.firstChild;
10576
11194
  _el$5.addEventListener("mouseleave", () => setHoverTarget(null));
10577
11195
  _el$5.$$mouseover = (event) => setHoverTargetFromEvent(event, "preview", setHoverTarget);
10578
11196
  use((el) => {
@@ -10653,13 +11271,13 @@ var HookOverview = (props) => {
10653
11271
  },
10654
11272
  get fallback() {
10655
11273
  return (() => {
10656
- var _el$12 = _tmpl$46();
11274
+ var _el$12 = _tmpl$47();
10657
11275
  effect(() => className(_el$12, styles().hookDetails.empty));
10658
11276
  return _el$12;
10659
11277
  })();
10660
11278
  },
10661
11279
  get children() {
10662
- var _el$7 = _tmpl$39(), _el$8 = _el$7.firstChild, _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$8.nextSibling, _el$11 = _el$10.nextSibling;
11280
+ var _el$7 = _tmpl$310(), _el$8 = _el$7.firstChild, _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$8.nextSibling, _el$11 = _el$10.nextSibling;
10663
11281
  insert(_el$10, createComponent(OverviewMetric, {
10664
11282
  label: "active hooks",
10665
11283
  get value() {
@@ -10713,7 +11331,7 @@ var HookOverview = (props) => {
10713
11331
  return groups();
10714
11332
  },
10715
11333
  children: (group) => (() => {
10716
- var _el$13 = _tmpl$56(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
11334
+ var _el$13 = _tmpl$57(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
10717
11335
  insert(_el$15, () => group.label);
10718
11336
  insert(_el$16, () => group.hooks.length);
10719
11337
  insert(_el$13, createComponent(For, {
@@ -10724,27 +11342,17 @@ var HookOverview = (props) => {
10724
11342
  const running = createMemo(() => isHookRunning(hook, state.hooks.runs));
10725
11343
  const unseenCount = createMemo(() => getHookUnseenEventCount(state.hooks, hook.id));
10726
11344
  return (() => {
10727
- var _el$17 = _tmpl$86(), _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild;
11345
+ var _el$17 = _tmpl$87(), _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild;
10728
11346
  _el$17.$$click = () => props.onSelectHook(hook);
10729
11347
  insert(_el$19, () => getHookDisplayName(hook));
10730
- insert(_el$20, createComponent(Show, {
10731
- get when() {
10732
- return hook.displayName;
10733
- },
10734
- get fallback() {
10735
- return hook.id;
10736
- },
10737
- get children() {
10738
- return [memo(() => hook.hookName), " - ", memo(() => hook.id)];
10739
- }
10740
- }));
11348
+ insert(_el$20, () => getHookIdentitySubtitle(hook));
10741
11349
  insert(_el$22, () => hook.outputKind ?? "hook");
10742
11350
  insert(_el$21, createComponent(Show, {
10743
11351
  get when() {
10744
11352
  return running();
10745
11353
  },
10746
11354
  get children() {
10747
- var _el$23 = _tmpl$66();
11355
+ var _el$23 = _tmpl$67();
10748
11356
  effect(() => className(_el$23, styles().hookDetails.lifecycle));
10749
11357
  return _el$23;
10750
11358
  }
@@ -10754,7 +11362,7 @@ var HookOverview = (props) => {
10754
11362
  return unseenCount() > 0;
10755
11363
  },
10756
11364
  get children() {
10757
- var _el$24 = _tmpl$76(), _el$25 = _el$24.firstChild;
11365
+ var _el$24 = _tmpl$77(), _el$25 = _el$24.firstChild;
10758
11366
  insert(_el$24, unseenCount, _el$25);
10759
11367
  effect(() => className(_el$24, styles().hookDetails.kind));
10760
11368
  return _el$24;
@@ -10825,7 +11433,7 @@ var HookOverview = (props) => {
10825
11433
  var OverviewMetric = (props) => {
10826
11434
  const styles = useStyles();
10827
11435
  return (() => {
10828
- var _el$26 = _tmpl$96(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling;
11436
+ var _el$26 = _tmpl$97(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling;
10829
11437
  insert(_el$27, () => props.value);
10830
11438
  insert(_el$28, () => props.label);
10831
11439
  effect((_p$) => {
@@ -10845,7 +11453,7 @@ var OverviewMetric = (props) => {
10845
11453
  var HookHeader = (props) => {
10846
11454
  const styles = useStyles();
10847
11455
  return (() => {
10848
- var _el$29 = _tmpl$115(), _el$30 = _el$29.firstChild, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$35 = _el$31.nextSibling, _el$37 = _el$35.firstChild, _el$41 = _el$30.nextSibling;
11456
+ var _el$29 = _tmpl$117(), _el$30 = _el$29.firstChild, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$35 = _el$31.nextSibling, _el$37 = _el$35.firstChild, _el$41 = _el$30.nextSibling;
10849
11457
  insert(_el$32, () => getHookDisplayName(props.hook));
10850
11458
  insert(_el$33, () => props.hook.lifecycle);
10851
11459
  insert(_el$31, createComponent(Show, {
@@ -10853,7 +11461,7 @@ var HookHeader = (props) => {
10853
11461
  return props.hook.outputKind;
10854
11462
  },
10855
11463
  get children() {
10856
- var _el$34 = _tmpl$05();
11464
+ var _el$34 = _tmpl$06();
10857
11465
  insert(_el$34, () => props.hook.outputKind);
10858
11466
  effect(() => className(_el$34, styles().hookDetails.kind));
10859
11467
  return _el$34;
@@ -10864,19 +11472,22 @@ var HookHeader = (props) => {
10864
11472
  return props.hook.displayName;
10865
11473
  },
10866
11474
  get children() {
10867
- var _el$36 = _tmpl$114();
11475
+ var _el$36 = _tmpl$116();
10868
11476
  insert(_el$36, () => props.hook.hookName);
10869
11477
  return _el$36;
10870
11478
  }
10871
11479
  }), _el$37);
10872
- insert(_el$37, () => props.hook.id);
11480
+ insert(_el$37, (() => {
11481
+ var _c$ = memo(() => !!props.hook.threadId);
11482
+ return () => _c$() ? `thread ${props.hook.threadId}` : getHookIdentityLabel(props.hook);
11483
+ })());
10873
11484
  insert(_el$35, createComponent(Show, {
10874
11485
  get when() {
10875
- return props.hook.threadId;
11486
+ return memo(() => !!props.hook.threadId)() && props.hook.threadId !== props.hook.id;
10876
11487
  },
10877
11488
  get children() {
10878
- var _el$38 = _tmpl$105(); _el$38.firstChild;
10879
- insert(_el$38, () => props.hook.threadId, null);
11489
+ var _el$38 = _tmpl$106(); _el$38.firstChild;
11490
+ insert(_el$38, () => props.hook.id, null);
10880
11491
  return _el$38;
10881
11492
  }
10882
11493
  }), null);
@@ -10885,7 +11496,7 @@ var HookHeader = (props) => {
10885
11496
  return props.hook.framework;
10886
11497
  },
10887
11498
  get children() {
10888
- var _el$40 = _tmpl$05();
11499
+ var _el$40 = _tmpl$06();
10889
11500
  insert(_el$40, () => props.hook.framework);
10890
11501
  return _el$40;
10891
11502
  }
@@ -10954,7 +11565,7 @@ var HookHeader = (props) => {
10954
11565
  var Metric = (props) => {
10955
11566
  const styles = useStyles();
10956
11567
  return (() => {
10957
- var _el$42 = _tmpl$96(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
11568
+ var _el$42 = _tmpl$97(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
10958
11569
  insert(_el$43, () => props.value);
10959
11570
  insert(_el$44, () => props.label);
10960
11571
  effect((_p$) => {
@@ -10981,7 +11592,7 @@ function formatMetricValue(value) {
10981
11592
  var TabButton = (props) => {
10982
11593
  const styles = useStyles();
10983
11594
  return (() => {
10984
- var _el$45 = _tmpl$123();
11595
+ var _el$45 = _tmpl$124();
10985
11596
  _el$45.$$click = () => props.onSelect(props.tab);
10986
11597
  insert(_el$45, () => props.label);
10987
11598
  effect((_p$) => {
@@ -11009,7 +11620,7 @@ var ConversationPanel = (props) => {
11009
11620
  },
11010
11621
  get fallback() {
11011
11622
  return (() => {
11012
- var _el$46 = _tmpl$133(), _el$47 = _el$46.firstChild, _el$48 = _el$47.firstChild;
11623
+ var _el$46 = _tmpl$134(), _el$47 = _el$46.firstChild, _el$48 = _el$47.firstChild;
11013
11624
  insert(_el$47, createComponent(JsonPanel, {
11014
11625
  get value() {
11015
11626
  return props.hook.state;
@@ -11122,13 +11733,13 @@ var MessagesPreview = (props) => {
11122
11733
  },
11123
11734
  get fallback() {
11124
11735
  return (() => {
11125
- var _el$50 = _tmpl$153();
11736
+ var _el$50 = _tmpl$154();
11126
11737
  effect(() => className(_el$50, styles().hookDetails.emptySmall));
11127
11738
  return _el$50;
11128
11739
  })();
11129
11740
  },
11130
11741
  get children() {
11131
- var _el$49 = _tmpl$143();
11742
+ var _el$49 = _tmpl$144();
11132
11743
  insert(_el$49, createComponent(Show, {
11133
11744
  get when() {
11134
11745
  return pendingFixture();
@@ -11148,7 +11759,7 @@ var MessagesPreview = (props) => {
11148
11759
  children: (message) => {
11149
11760
  const visibleParts = () => visiblePreviewPartsForMessage(message);
11150
11761
  return (() => {
11151
- var _el$51 = _tmpl$163(), _el$52 = _el$51.firstChild;
11762
+ var _el$51 = _tmpl$164(), _el$52 = _el$51.firstChild;
11152
11763
  spread(_el$51, mergeProps(() => getHoverDataAttributes({
11153
11764
  messageIds: [message.id],
11154
11765
  partIds: visibleParts().map((part) => part.id)
@@ -11175,7 +11786,7 @@ var MessagesPreview = (props) => {
11175
11786
  return message.content;
11176
11787
  },
11177
11788
  get children() {
11178
- var _el$53 = _tmpl$143();
11789
+ var _el$53 = _tmpl$144();
11179
11790
  insert(_el$53, () => message.content);
11180
11791
  effect(() => className(_el$53, styles().hookDetails.messageContent));
11181
11792
  return _el$53;
@@ -11246,14 +11857,14 @@ var MessagesPreview = (props) => {
11246
11857
  },
11247
11858
  get fallback() {
11248
11859
  return (() => {
11249
- var _el$60 = _tmpl$05();
11860
+ var _el$60 = _tmpl$06();
11250
11861
  insert(_el$60, () => part.content);
11251
11862
  effect(() => className(_el$60, styles().hookDetails.previewPartContent));
11252
11863
  return _el$60;
11253
11864
  })();
11254
11865
  },
11255
11866
  get children() {
11256
- var _el$59 = _tmpl$143();
11867
+ var _el$59 = _tmpl$144();
11257
11868
  insert(_el$59, createComponent(For, {
11258
11869
  get each() {
11259
11870
  return part.jsonItems;
@@ -11314,13 +11925,13 @@ var HookMessageTimeline = (props) => {
11314
11925
  })();
11315
11926
  },
11316
11927
  get children() {
11317
- var _el$64 = _tmpl$143();
11928
+ var _el$64 = _tmpl$144();
11318
11929
  insert(_el$64, createComponent(For, {
11319
11930
  get each() {
11320
11931
  return props.messages;
11321
11932
  },
11322
11933
  children: (message) => (() => {
11323
- var _el$66 = _tmpl$163(), _el$67 = _el$66.firstChild;
11934
+ var _el$66 = _tmpl$164(), _el$67 = _el$66.firstChild;
11324
11935
  spread(_el$66, mergeProps(() => getHoverDataAttributes({
11325
11936
  messageIds: [message.id]
11326
11937
  }), {
@@ -11346,7 +11957,7 @@ var HookMessageTimeline = (props) => {
11346
11957
  return message.content;
11347
11958
  },
11348
11959
  get children() {
11349
- var _el$68 = _tmpl$143();
11960
+ var _el$68 = _tmpl$144();
11350
11961
  insert(_el$68, () => message.content);
11351
11962
  effect(() => className(_el$68, styles().hookDetails.messageContent));
11352
11963
  return _el$68;
@@ -11380,14 +11991,14 @@ var HookMessageTimeline = (props) => {
11380
11991
  },
11381
11992
  get fallback() {
11382
11993
  return (() => {
11383
- var _el$72 = _tmpl$05();
11994
+ var _el$72 = _tmpl$06();
11384
11995
  insert(_el$72, () => part.content);
11385
11996
  effect(() => className(_el$72, styles().hookDetails.previewPartContent));
11386
11997
  return _el$72;
11387
11998
  })();
11388
11999
  },
11389
12000
  get children() {
11390
- var _el$71 = _tmpl$143();
12001
+ var _el$71 = _tmpl$144();
11391
12002
  insert(_el$71, createComponent(For, {
11392
12003
  get each() {
11393
12004
  return part.jsonItems;
@@ -11444,7 +12055,7 @@ var ToolsView = (props) => {
11444
12055
  const selectedTool = createMemo(() => props.hook.tools.find((tool) => tool.name === selectedToolName()));
11445
12056
  const savedFixtures = createMemo(() => state.hooks.fixtures.filter((fixture) => fixture.hookId === props.hook.id || !!props.hook.threadId && fixture.threadId === props.hook.threadId).sort((a, b) => b.createdAt - a.createdAt));
11446
12057
  return (() => {
11447
- var _el$76 = _tmpl$214(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
12058
+ var _el$76 = _tmpl$215(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
11448
12059
  insert(_el$77, createComponent(Show, {
11449
12060
  get when() {
11450
12061
  return props.hook.tools.length > 0;
@@ -11526,7 +12137,7 @@ var ToolsView = (props) => {
11526
12137
  })();
11527
12138
  },
11528
12139
  get children() {
11529
- var _el$85 = _tmpl$143();
12140
+ var _el$85 = _tmpl$144();
11530
12141
  insert(_el$85, createComponent(For, {
11531
12142
  get each() {
11532
12143
  return savedFixtures();
@@ -11535,7 +12146,7 @@ var ToolsView = (props) => {
11535
12146
  var _el$87 = _tmpl$282(), _el$88 = _el$87.firstChild, _el$89 = _el$88.firstChild, _el$90 = _el$89.nextSibling, _el$91 = _el$90.firstChild, _el$92 = _el$88.nextSibling, _el$93 = _el$92.firstChild, _el$94 = _el$93.nextSibling;
11536
12147
  insert(_el$89, () => fixture.name ?? fixture.toolName);
11537
12148
  insert(_el$90, () => fixture.toolName, _el$91);
11538
- insert(_el$90, () => formatTime2(fixture.createdAt), null);
12149
+ insert(_el$90, () => formatTime3(fixture.createdAt), null);
11539
12150
  _el$93.$$click = () => applyToolFixture(fixture);
11540
12151
  _el$94.$$click = () => deleteToolFixture(fixture.id);
11541
12152
  effect((_p$) => {
@@ -11586,7 +12197,7 @@ var ToolsView = (props) => {
11586
12197
  var JsonPanel = (props) => {
11587
12198
  const styles = useStyles();
11588
12199
  return (() => {
11589
- var _el$95 = _tmpl$143();
12200
+ var _el$95 = _tmpl$144();
11590
12201
  insert(_el$95, createComponent(JsonTree, {
11591
12202
  get value() {
11592
12203
  return props.value;
@@ -12035,13 +12646,13 @@ function jsonSafeValue(value) {
12035
12646
  return `[ai-devtools] unserializable value: ${error instanceof Error ? error.message : String(error)}`;
12036
12647
  }
12037
12648
  }
12038
- function formatTime2(timestamp) {
12649
+ function formatTime3(timestamp) {
12039
12650
  return new Date(timestamp).toLocaleTimeString();
12040
12651
  }
12041
12652
  delegateEvents(["mouseover", "click"]);
12042
12653
 
12043
12654
  // src/components/Shell.tsx
12044
- var _tmpl$40 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-panel><div><div data-testid=ai-devtools-left-panel style=min-width:150px;max-width:800px><div>AI Hooks</div></div><div></div><div data-testid=ai-devtools-right-panel style=flex:1>`);
12655
+ var _tmpl$41 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-panel><div><div data-testid=ai-devtools-left-panel style=min-width:150px;max-width:800px><div>AI Hooks</div></div><div></div><div data-testid=ai-devtools-right-panel style=flex:1>`);
12045
12656
  function Devtools(props) {
12046
12657
  return createComponent(ThemeContextProvider, {
12047
12658
  get theme() {
@@ -12123,7 +12734,7 @@ function DevtoolsContent() {
12123
12734
  });
12124
12735
  return createComponent(MainPanel, {
12125
12736
  get children() {
12126
- var _el$ = _tmpl$40(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.nextSibling;
12737
+ var _el$ = _tmpl$41(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.nextSibling;
12127
12738
  insert(_el$, createComponent(Header, {
12128
12739
  get children() {
12129
12740
  return createComponent(HeaderLogo, {