@tanstack/ai-devtools-core 0.5.10 → 0.5.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.
@@ -1,4 +1,4 @@
1
- import { delegateEvents, createComponent, insert, effect, className, setStyleProperty, addEventListener, setAttribute, use, memo, spread, mergeProps, template, Portal } from 'solid-js/web';
1
+ import { delegateEvents, createComponent, insert, effect, className, setStyleProperty, addEventListener, setAttribute, use, memo, spread, mergeProps, template, Portal, style } 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';
@@ -3951,6 +3951,7 @@ var stylesFactory = (theme) => {
3951
3951
  grid-template-columns: repeat(2, minmax(320px, 1fr));
3952
3952
  gap: ${size[3]};
3953
3953
  align-items: start;
3954
+ padding-left: ${size[3]};
3954
3955
  padding-right: ${size[3]};
3955
3956
  @media (max-width: 760px) {
3956
3957
  grid-template-columns: 1fr;
@@ -4344,12 +4345,6 @@ function applyHookEvent(state, eventName, event) {
4344
4345
  markHookViewed(state, state.activeHookId);
4345
4346
  }
4346
4347
  }
4347
- function setActiveHook(state, hookId) {
4348
- state.activeHookId = hookId;
4349
- if (hookId) {
4350
- markHookViewed(state, hookId);
4351
- }
4352
- }
4353
4348
  function clearHookRegistry(state) {
4354
4349
  state.hooks = {};
4355
4350
  state.runs = {};
@@ -4501,8 +4496,8 @@ function removeHookRecord(state, hookId) {
4501
4496
  delete state.runs[runId];
4502
4497
  }
4503
4498
  }
4504
- for (const eventId2 of hookEventIds) {
4505
- delete state.events[eventId2];
4499
+ for (const eventId3 of hookEventIds) {
4500
+ delete state.events[eventId3];
4506
4501
  }
4507
4502
  delete state.hooks[hookId];
4508
4503
  delete state.seenHookActivityCounts[hookId];
@@ -4510,7 +4505,7 @@ function removeHookRecord(state, hookId) {
4510
4505
  state.activeHookId = null;
4511
4506
  }
4512
4507
  }
4513
- function upsertRun(state, event, eventId2) {
4508
+ function upsertRun(state, event, eventId3) {
4514
4509
  const existing = state.runs[event.runId];
4515
4510
  if (!existing) {
4516
4511
  state.runs[event.runId] = {
@@ -4524,7 +4519,7 @@ function upsertRun(state, event, eventId2) {
4524
4519
  updatedAt: event.timestamp,
4525
4520
  ...isTerminalRunStatus(event.status) ? { completedAt: event.timestamp } : {},
4526
4521
  ...event.error ? { error: event.error } : {},
4527
- eventIds: [eventId2]
4522
+ eventIds: [eventId3]
4528
4523
  };
4529
4524
  return;
4530
4525
  }
@@ -4540,8 +4535,8 @@ function upsertRun(state, event, eventId2) {
4540
4535
  if (event.error) {
4541
4536
  existing.error = event.error;
4542
4537
  }
4543
- if (!existing.eventIds.includes(eventId2)) {
4544
- existing.eventIds.push(eventId2);
4538
+ if (!existing.eventIds.includes(eventId3)) {
4539
+ existing.eventIds.push(eventId3);
4545
4540
  }
4546
4541
  }
4547
4542
  function attachRunToHook(state, hookId, runId) {
@@ -4549,7 +4544,7 @@ function attachRunToHook(state, hookId, runId) {
4549
4544
  if (!hook || hook.runIds.includes(runId)) return;
4550
4545
  hook.runIds.push(runId);
4551
4546
  }
4552
- function syncRunsFromSnapshot(state, snapshot, eventId2) {
4547
+ function syncRunsFromSnapshot(state, snapshot, eventId3) {
4553
4548
  const rawRuns = snapshot.state.runs;
4554
4549
  if (!Array.isArray(rawRuns)) return;
4555
4550
  for (const candidate of rawRuns) {
@@ -4572,7 +4567,7 @@ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4572
4567
  updatedAt,
4573
4568
  ...typeof run.completedAt === "number" ? { completedAt: run.completedAt } : isTerminalRunStatus(status) ? { completedAt: updatedAt } : {},
4574
4569
  ...typeof run.error === "string" ? { error: run.error } : {},
4575
- eventIds: [eventId2]
4570
+ eventIds: [eventId3]
4576
4571
  };
4577
4572
  } else {
4578
4573
  existing.hookId = snapshot.hookId;
@@ -4584,8 +4579,8 @@ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4584
4579
  existing.completedAt = updatedAt;
4585
4580
  }
4586
4581
  if (typeof run.error === "string") existing.error = run.error;
4587
- if (!existing.eventIds.includes(eventId2)) {
4588
- existing.eventIds.push(eventId2);
4582
+ if (!existing.eventIds.includes(eventId3)) {
4583
+ existing.eventIds.push(eventId3);
4589
4584
  }
4590
4585
  }
4591
4586
  attachRunToHook(state, snapshot.hookId, run.id);
@@ -4615,11 +4610,11 @@ function attachActivityRunToHook(state, hookId, runId) {
4615
4610
  if (!hook || hook.activityRunIds.includes(runId)) return;
4616
4611
  hook.activityRunIds.push(runId);
4617
4612
  }
4618
- function attachEventToHook(state, hookId, eventId2) {
4613
+ function attachEventToHook(state, hookId, eventId3) {
4619
4614
  if (!hookId) return;
4620
4615
  const hook = state.hooks[hookId];
4621
- if (!hook || hook.eventIds.includes(eventId2)) return;
4622
- hook.eventIds.push(eventId2);
4616
+ if (!hook || hook.eventIds.includes(eventId3)) return;
4617
+ hook.eventIds.push(eventId3);
4623
4618
  }
4624
4619
  function inferLifecycleFromSnapshot(state) {
4625
4620
  if (state.status === "error" || state.error) {
@@ -4762,6 +4757,62 @@ function clearMemoryRegistry(state) {
4762
4757
  state.scopes = {};
4763
4758
  }
4764
4759
 
4760
+ // src/store/compaction-registry.ts
4761
+ var MAX_EVENTS = 50;
4762
+ function createCompactionRegistryState() {
4763
+ return { events: [] };
4764
+ }
4765
+ function eventId2(kind, event) {
4766
+ return [
4767
+ "cmp",
4768
+ kind,
4769
+ String(event.timestamp),
4770
+ event.hookId ?? event.clientId ?? event.threadId ?? "unknown",
4771
+ String(event.before ?? event.after ?? "")
4772
+ ].join("-");
4773
+ }
4774
+ function applyCompactionEvent(state, kind, event) {
4775
+ state.events.push({
4776
+ id: event.eventId ?? eventId2(kind, event),
4777
+ kind,
4778
+ timestamp: event.timestamp,
4779
+ hookId: event.hookId,
4780
+ clientId: event.clientId,
4781
+ threadId: event.threadId,
4782
+ runId: event.runId,
4783
+ before: event.before,
4784
+ after: event.after,
4785
+ messagesBefore: event.messagesBefore,
4786
+ messagesAfter: event.messagesAfter,
4787
+ reusedCheckpoint: event.reusedCheckpoint,
4788
+ maxTokens: event.maxTokens,
4789
+ strategyKey: event.strategyKey,
4790
+ durationMs: event.durationMs,
4791
+ dropped: event.dropped,
4792
+ result: event.result
4793
+ });
4794
+ if (state.events.length > MAX_EVENTS) {
4795
+ state.events.splice(0, state.events.length - MAX_EVENTS);
4796
+ }
4797
+ }
4798
+ function clearCompactionRegistry(state) {
4799
+ state.events = [];
4800
+ }
4801
+ function compactionEventsForHook(state, hook) {
4802
+ const matched = state.events.filter((event) => {
4803
+ if (event.hookId && event.hookId === hook.id) return true;
4804
+ if (event.clientId && hook.clientId && event.clientId === hook.clientId) {
4805
+ return true;
4806
+ }
4807
+ if (event.threadId && hook.threadId && event.threadId === hook.threadId) {
4808
+ return true;
4809
+ }
4810
+ return false;
4811
+ });
4812
+ if (matched.length > 0) return matched;
4813
+ return state.events;
4814
+ }
4815
+
4765
4816
  // src/store/skills-registry.ts
4766
4817
  function createSkillsRegistryState() {
4767
4818
  return { snapshots: {} };
@@ -4795,6 +4846,7 @@ var AIProvider = (props) => {
4795
4846
  activeConversationId: null,
4796
4847
  hooks: createHookRegistryState(),
4797
4848
  memory: createMemoryRegistryState(),
4849
+ compaction: createCompactionRegistryState(),
4798
4850
  skills: createSkillsRegistryState()
4799
4851
  });
4800
4852
  const streamToConversation = /* @__PURE__ */ new Map();
@@ -5052,15 +5104,23 @@ var AIProvider = (props) => {
5052
5104
  clearMemoryRegistry(memory);
5053
5105
  }));
5054
5106
  }
5107
+ function clearCompaction() {
5108
+ setState("compaction", produce((compaction) => {
5109
+ clearCompactionRegistry(compaction);
5110
+ }));
5111
+ }
5055
5112
  function clearSkills() {
5056
5113
  setState("skills", produce((skills) => {
5057
5114
  clearSkillsRegistry(skills);
5058
5115
  }));
5059
5116
  }
5060
5117
  function selectHook(id) {
5061
- setState("hooks", produce((hooks) => {
5062
- setActiveHook(hooks, id);
5063
- }));
5118
+ setState("hooks", "activeHookId", id);
5119
+ if (id) {
5120
+ setState("hooks", produce((hooks) => {
5121
+ markHookViewed(hooks, id);
5122
+ }));
5123
+ }
5064
5124
  }
5065
5125
  function saveToolFixture(fixture) {
5066
5126
  const fixtures = mergeFixtures(fixture, state.hooks.fixtures);
@@ -6568,6 +6628,48 @@ var AIProvider = (props) => {
6568
6628
  arr.push(mwEvent);
6569
6629
  }));
6570
6630
  }));
6631
+ const recordCompactionLifecycle = (kind, hookName, payload) => {
6632
+ setState("compaction", produce((compaction) => {
6633
+ applyCompactionEvent(compaction, kind, payload);
6634
+ }));
6635
+ const {
6636
+ requestId,
6637
+ streamId,
6638
+ clientId
6639
+ } = payload;
6640
+ const conversationId = (clientId && state.conversations[clientId] ? clientId : void 0) || (streamId ? streamToConversation.get(streamId) : void 0) || (requestId ? requestToConversation.get(requestId) : void 0);
6641
+ if (!conversationId || !state.conversations[conversationId]) return;
6642
+ const conv = state.conversations[conversationId];
6643
+ const iterIndex = findLatestIterationIndex(conv, requestId);
6644
+ if (iterIndex < 0) return;
6645
+ const mwEvent = {
6646
+ id: `mw-cmp-${kind}-${Date.now()}-${Math.random()}`,
6647
+ middlewareName: "compaction",
6648
+ hookName,
6649
+ timestamp: payload.timestamp,
6650
+ hasTransform: kind === "state",
6651
+ configChanges: {
6652
+ before: payload.before,
6653
+ after: payload.after,
6654
+ messagesBefore: payload.messagesBefore,
6655
+ messagesAfter: payload.messagesAfter,
6656
+ reusedCheckpoint: payload.reusedCheckpoint,
6657
+ maxTokens: payload.maxTokens,
6658
+ strategyKey: payload.strategyKey,
6659
+ durationMs: payload.durationMs
6660
+ }
6661
+ };
6662
+ setState("conversations", conversationId, "iterations", iterIndex, "middlewareEvents", produce((arr) => {
6663
+ arr.push(mwEvent);
6664
+ }));
6665
+ };
6666
+ cleanupFns.push(aiEventClient.on("compaction:started", (e) => {
6667
+ recordCompactionLifecycle("started", "onCompactStart", e.payload);
6668
+ }), aiEventClient.on("compaction:state", (e) => {
6669
+ recordCompactionLifecycle("state", "onCompact", e.payload);
6670
+ }), aiEventClient.on("compaction:ended", (e) => {
6671
+ recordCompactionLifecycle("ended", "onCompactEnd", e.payload);
6672
+ }));
6571
6673
  cleanupFns.push(aiEventClient.on("summarize:request:started", (e) => {
6572
6674
  const {
6573
6675
  requestId,
@@ -6961,6 +7063,7 @@ var AIProvider = (props) => {
6961
7063
  selectConversation,
6962
7064
  clearHooks,
6963
7065
  clearMemory,
7066
+ clearCompaction,
6964
7067
  clearSkills,
6965
7068
  selectHook,
6966
7069
  saveToolFixture,
@@ -7096,8 +7199,9 @@ var HookDashboard = () => {
7096
7199
  const unseenUpdateCount = createMemo(() => hooks().reduce((count, hook) => count + getHookUnseenEventCount(state.hooks, hook.id), 0));
7097
7200
  const handleSelect = (hook) => {
7098
7201
  selectHook(hook.id);
7099
- if (state.conversations[hook.id]) {
7100
- selectConversation(hook.id);
7202
+ const conversationId = hook.id || hook.clientId || hook.threadId;
7203
+ if (conversationId && state.conversations[conversationId]) {
7204
+ selectConversation(conversationId);
7101
7205
  }
7102
7206
  };
7103
7207
  return (() => {
@@ -7573,6 +7677,9 @@ var MiddlewareStep = (props) => {
7573
7677
  if (ev().wasDropped) return "DROP";
7574
7678
  if (ev().hookName === "onChunk" && ev().hasTransform) return "TRANSFORM";
7575
7679
  if (ev().hookName === "onConfig" && ev().hasTransform) return "TRANSFORM";
7680
+ if (ev().hookName === "onCompactStart") return "START";
7681
+ if (ev().hookName === "onCompact") return "COMPACT";
7682
+ if (ev().hookName === "onCompactEnd") return "END";
7576
7683
  if (ev().hookName === "onBeforeToolCall" && ev().hasTransform) return "DECISION";
7577
7684
  return null;
7578
7685
  };
@@ -7582,6 +7689,9 @@ var MiddlewareStep = (props) => {
7582
7689
  };
7583
7690
  return [(() => {
7584
7691
  var _el$ = _tmpl$32(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.nextSibling;
7692
+ _el$.$$click = () => {
7693
+ if (hasChanges()) setExpanded(!expanded());
7694
+ };
7585
7695
  insert(_el$3, () => ev().middlewareName);
7586
7696
  insert(_el$4, () => ev().hookName);
7587
7697
  insert(_el$, createComponent(Show, {
@@ -7612,24 +7722,27 @@ var MiddlewareStep = (props) => {
7612
7722
  },
7613
7723
  get children() {
7614
7724
  var _el$8 = _tmpl$22();
7615
- _el$8.$$click = () => setExpanded(!expanded());
7616
7725
  insert(_el$8, () => expanded() ? "hide changes" : "show changes");
7617
7726
  effect(() => className(_el$8, s().stepExpandToggle));
7618
7727
  return _el$8;
7619
7728
  }
7620
7729
  }), null);
7621
7730
  effect((_p$) => {
7622
- var _v$ = s().step, _v$2 = `${s().stepPrefix} ${s().stepPrefixMiddleware}`, _v$3 = `${s().mwBadge} ${badgeClass()}`, _v$4 = s().mwHook;
7731
+ var _v$ = s().step, _v$2 = hasChanges() ? {
7732
+ cursor: "pointer"
7733
+ } : void 0, _v$3 = `${s().stepPrefix} ${s().stepPrefixMiddleware}`, _v$4 = `${s().mwBadge} ${badgeClass()}`, _v$5 = s().mwHook;
7623
7734
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
7624
- _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
7625
- _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
7626
- _v$4 !== _p$.o && className(_el$4, _p$.o = _v$4);
7735
+ _p$.t = style(_el$, _v$2, _p$.t);
7736
+ _v$3 !== _p$.a && className(_el$2, _p$.a = _v$3);
7737
+ _v$4 !== _p$.o && className(_el$3, _p$.o = _v$4);
7738
+ _v$5 !== _p$.i && className(_el$4, _p$.i = _v$5);
7627
7739
  return _p$;
7628
7740
  }, {
7629
7741
  e: void 0,
7630
7742
  t: void 0,
7631
7743
  a: void 0,
7632
- o: void 0
7744
+ o: void 0,
7745
+ i: void 0
7633
7746
  });
7634
7747
  return _el$;
7635
7748
  })(), createComponent(Show, {
@@ -7685,9 +7798,9 @@ var ThinkingStep = (props) => {
7685
7798
  }
7686
7799
  }), null);
7687
7800
  effect((_p$) => {
7688
- var _v$5 = `${s().stepPrefix} ${s().stepPrefixThinking}`, _v$6 = s().stepContent;
7689
- _v$5 !== _p$.e && className(_el$1, _p$.e = _v$5);
7690
- _v$6 !== _p$.t && className(_el$10, _p$.t = _v$6);
7801
+ var _v$6 = `${s().stepPrefix} ${s().stepPrefixThinking}`, _v$7 = s().stepContent;
7802
+ _v$6 !== _p$.e && className(_el$1, _p$.e = _v$6);
7803
+ _v$7 !== _p$.t && className(_el$10, _p$.t = _v$7);
7691
7804
  return _p$;
7692
7805
  }, {
7693
7806
  e: void 0,
@@ -7741,10 +7854,10 @@ var StructuredOutputStep = (props) => {
7741
7854
  }), false, true);
7742
7855
  insert(_el$15, () => part().status);
7743
7856
  effect((_p$) => {
7744
- var _v$7 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$8 = `${s().mwBadge} ${badgeClass()}`, _v$9 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
7745
- _v$7 !== _p$.e && className(_el$14, _p$.e = _v$7);
7746
- _v$8 !== _p$.t && className(_el$15, _p$.t = _v$8);
7747
- _v$9 !== _p$.a && className(_el$16, _p$.a = _v$9);
7857
+ var _v$8 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$9 = `${s().mwBadge} ${badgeClass()}`, _v$0 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
7858
+ _v$8 !== _p$.e && className(_el$14, _p$.e = _v$8);
7859
+ _v$9 !== _p$.t && className(_el$15, _p$.t = _v$9);
7860
+ _v$0 !== _p$.a && className(_el$16, _p$.a = _v$0);
7748
7861
  return _p$;
7749
7862
  }, {
7750
7863
  e: void 0,
@@ -7769,10 +7882,10 @@ var StructuredOutputStep = (props) => {
7769
7882
  copyable: true
7770
7883
  }));
7771
7884
  effect((_p$) => {
7772
- var _v$10 = s().stepJsonItem, _v$11 = s().stepJsonItemLabel, _v$12 = s().stepJsonPanel;
7773
- _v$10 !== _p$.e && className(_el$19, _p$.e = _v$10);
7774
- _v$11 !== _p$.t && className(_el$20, _p$.t = _v$11);
7775
- _v$12 !== _p$.a && className(_el$21, _p$.a = _v$12);
7885
+ var _v$11 = s().stepJsonItem, _v$12 = s().stepJsonItemLabel, _v$13 = s().stepJsonPanel;
7886
+ _v$11 !== _p$.e && className(_el$19, _p$.e = _v$11);
7887
+ _v$12 !== _p$.t && className(_el$20, _p$.t = _v$12);
7888
+ _v$13 !== _p$.a && className(_el$21, _p$.a = _v$13);
7776
7889
  return _p$;
7777
7890
  }, {
7778
7891
  e: void 0,
@@ -7783,9 +7896,9 @@ var StructuredOutputStep = (props) => {
7783
7896
  })()
7784
7897
  }));
7785
7898
  effect((_p$) => {
7786
- var _v$0 = `${s().cardBody} ${expanded() ? s().cardBodyOpen : ""}`, _v$1 = `${s().cardBodyInner} ${s().stepJsonItemsCompare}`;
7787
- _v$0 !== _p$.e && className(_el$17, _p$.e = _v$0);
7788
- _v$1 !== _p$.t && className(_el$18, _p$.t = _v$1);
7899
+ var _v$1 = `${s().cardBody} ${expanded() ? s().cardBodyOpen : ""}`, _v$10 = `${s().cardBodyInner} ${s().stepJsonItemsCompare}`;
7900
+ _v$1 !== _p$.e && className(_el$17, _p$.e = _v$1);
7901
+ _v$10 !== _p$.t && className(_el$18, _p$.t = _v$10);
7789
7902
  return _p$;
7790
7903
  }, {
7791
7904
  e: void 0,
@@ -7834,9 +7947,9 @@ var AssistantStep = (props) => {
7834
7947
  }
7835
7948
  }), null);
7836
7949
  effect((_p$) => {
7837
- var _v$13 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$14 = isLong() ? s().stepContentLong : s().stepContent;
7838
- _v$13 !== _p$.e && className(_el$23, _p$.e = _v$13);
7839
- _v$14 !== _p$.t && className(_el$24, _p$.t = _v$14);
7950
+ var _v$14 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$15 = isLong() ? s().stepContentLong : s().stepContent;
7951
+ _v$14 !== _p$.e && className(_el$23, _p$.e = _v$14);
7952
+ _v$15 !== _p$.t && className(_el$24, _p$.t = _v$15);
7840
7953
  return _p$;
7841
7954
  }, {
7842
7955
  e: void 0,
@@ -7927,10 +8040,10 @@ var ToolCallStep = (props) => {
7927
8040
  }
7928
8041
  }), _el$32);
7929
8042
  effect((_p$) => {
7930
- var _v$15 = `${s().stepPrefix} ${s().stepPrefixToolCall}`, _v$16 = `${s().mwBadge} ${s().mwBadgeToolCall}`, _v$17 = `${s().chevron} ${argsOpen() ? s().chevronOpen : ""}`;
7931
- _v$15 !== _p$.e && className(_el$28, _p$.e = _v$15);
7932
- _v$16 !== _p$.t && className(_el$29, _p$.t = _v$16);
7933
- _v$17 !== _p$.a && className(_el$32, _p$.a = _v$17);
8043
+ var _v$16 = `${s().stepPrefix} ${s().stepPrefixToolCall}`, _v$17 = `${s().mwBadge} ${s().mwBadgeToolCall}`, _v$18 = `${s().chevron} ${argsOpen() ? s().chevronOpen : ""}`;
8044
+ _v$16 !== _p$.e && className(_el$28, _p$.e = _v$16);
8045
+ _v$17 !== _p$.t && className(_el$29, _p$.t = _v$17);
8046
+ _v$18 !== _p$.a && className(_el$32, _p$.a = _v$18);
7934
8047
  return _p$;
7935
8048
  }, {
7936
8049
  e: void 0,
@@ -7948,10 +8061,10 @@ var ToolCallStep = (props) => {
7948
8061
  copyable: true
7949
8062
  }));
7950
8063
  effect((_p$) => {
7951
- var _v$18 = `${s().cardBody} ${argsOpen() ? s().cardBodyOpen : ""}`, _v$19 = s().cardBodyInner, _v$20 = s().stepJsonPanel;
7952
- _v$18 !== _p$.e && className(_el$33, _p$.e = _v$18);
7953
- _v$19 !== _p$.t && className(_el$34, _p$.t = _v$19);
7954
- _v$20 !== _p$.a && className(_el$35, _p$.a = _v$20);
8064
+ var _v$19 = `${s().cardBody} ${argsOpen() ? s().cardBodyOpen : ""}`, _v$20 = s().cardBodyInner, _v$21 = s().stepJsonPanel;
8065
+ _v$19 !== _p$.e && className(_el$33, _p$.e = _v$19);
8066
+ _v$20 !== _p$.t && className(_el$34, _p$.t = _v$20);
8067
+ _v$21 !== _p$.a && className(_el$35, _p$.a = _v$21);
7955
8068
  return _p$;
7956
8069
  }, {
7957
8070
  e: void 0,
@@ -7997,10 +8110,10 @@ var ToolCallStep = (props) => {
7997
8110
  }
7998
8111
  }), _el$41);
7999
8112
  effect((_p$) => {
8000
- var _v$21 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$22 = `${s().mwBadge} ${s().mwBadgeToolResult}`, _v$23 = `${s().chevron} ${resultOpen() ? s().chevronOpen : ""}`;
8001
- _v$21 !== _p$.e && className(_el$37, _p$.e = _v$21);
8002
- _v$22 !== _p$.t && className(_el$38, _p$.t = _v$22);
8003
- _v$23 !== _p$.a && className(_el$41, _p$.a = _v$23);
8113
+ var _v$22 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$23 = `${s().mwBadge} ${s().mwBadgeToolResult}`, _v$24 = `${s().chevron} ${resultOpen() ? s().chevronOpen : ""}`;
8114
+ _v$22 !== _p$.e && className(_el$37, _p$.e = _v$22);
8115
+ _v$23 !== _p$.t && className(_el$38, _p$.t = _v$23);
8116
+ _v$24 !== _p$.a && className(_el$41, _p$.a = _v$24);
8004
8117
  return _p$;
8005
8118
  }, {
8006
8119
  e: void 0,
@@ -8018,10 +8131,10 @@ var ToolCallStep = (props) => {
8018
8131
  copyable: true
8019
8132
  }));
8020
8133
  effect((_p$) => {
8021
- var _v$24 = `${s().cardBody} ${resultOpen() ? s().cardBodyOpen : ""}`, _v$25 = s().cardBodyInner, _v$26 = s().stepJsonPanel;
8022
- _v$24 !== _p$.e && className(_el$42, _p$.e = _v$24);
8023
- _v$25 !== _p$.t && className(_el$43, _p$.t = _v$25);
8024
- _v$26 !== _p$.a && className(_el$44, _p$.a = _v$26);
8134
+ var _v$25 = `${s().cardBody} ${resultOpen() ? s().cardBodyOpen : ""}`, _v$26 = s().cardBodyInner, _v$27 = s().stepJsonPanel;
8135
+ _v$25 !== _p$.e && className(_el$42, _p$.e = _v$25);
8136
+ _v$26 !== _p$.t && className(_el$43, _p$.t = _v$26);
8137
+ _v$27 !== _p$.a && className(_el$44, _p$.a = _v$27);
8025
8138
  return _p$;
8026
8139
  }, {
8027
8140
  e: void 0,
@@ -8061,9 +8174,9 @@ var ToolResultStep = (props) => {
8061
8174
  }
8062
8175
  }), false, true);
8063
8176
  effect((_p$) => {
8064
- var _v$27 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$28 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`;
8065
- _v$27 !== _p$.e && className(_el$47, _p$.e = _v$27);
8066
- _v$28 !== _p$.t && className(_el$48, _p$.t = _v$28);
8177
+ var _v$28 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$29 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`;
8178
+ _v$28 !== _p$.e && className(_el$47, _p$.e = _v$28);
8179
+ _v$29 !== _p$.t && className(_el$48, _p$.t = _v$29);
8067
8180
  return _p$;
8068
8181
  }, {
8069
8182
  e: void 0,
@@ -8080,10 +8193,10 @@ var ToolResultStep = (props) => {
8080
8193
  copyable: true
8081
8194
  }));
8082
8195
  effect((_p$) => {
8083
- var _v$29 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$30 = s().cardBodyInner, _v$31 = s().stepJsonPanel;
8084
- _v$29 !== _p$.e && className(_el$49, _p$.e = _v$29);
8085
- _v$30 !== _p$.t && className(_el$50, _p$.t = _v$30);
8086
- _v$31 !== _p$.a && className(_el$51, _p$.a = _v$31);
8196
+ var _v$30 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$31 = s().cardBodyInner, _v$32 = s().stepJsonPanel;
8197
+ _v$30 !== _p$.e && className(_el$49, _p$.e = _v$30);
8198
+ _v$31 !== _p$.t && className(_el$50, _p$.t = _v$31);
8199
+ _v$32 !== _p$.a && className(_el$51, _p$.a = _v$32);
8087
8200
  return _p$;
8088
8201
  }, {
8089
8202
  e: void 0,
@@ -8356,9 +8469,9 @@ var IterationCard = (props) => {
8356
8469
  var _el$69 = _tmpl$17(); _el$69.firstChild;
8357
8470
  insert(_el$69, totalToolCalls, null);
8358
8471
  effect((_p$) => {
8359
- var _v$32 = `${s().badge} ${s().badgeFinishReasonToolCalls}`, _v$33 = `${totalToolCalls()} tool ${totalToolCalls() === 1 ? "call" : "calls"}`;
8360
- _v$32 !== _p$.e && className(_el$69, _p$.e = _v$32);
8361
- _v$33 !== _p$.t && setAttribute(_el$69, "title", _p$.t = _v$33);
8472
+ var _v$33 = `${s().badge} ${s().badgeFinishReasonToolCalls}`, _v$34 = `${totalToolCalls()} tool ${totalToolCalls() === 1 ? "call" : "calls"}`;
8473
+ _v$33 !== _p$.e && className(_el$69, _p$.e = _v$33);
8474
+ _v$34 !== _p$.t && setAttribute(_el$69, "title", _p$.t = _v$34);
8362
8475
  return _p$;
8363
8476
  }, {
8364
8477
  e: void 0,
@@ -8375,9 +8488,9 @@ var IterationCard = (props) => {
8375
8488
  var _el$71 = _tmpl$18(); _el$71.firstChild;
8376
8489
  insert(_el$71, () => formatDuration(duration()), null);
8377
8490
  effect((_p$) => {
8378
- var _v$34 = `${s().badge} ${s().badgeDuration}`, _v$35 = formatDuration(duration());
8379
- _v$34 !== _p$.e && className(_el$71, _p$.e = _v$34);
8380
- _v$35 !== _p$.t && setAttribute(_el$71, "title", _p$.t = _v$35);
8491
+ var _v$35 = `${s().badge} ${s().badgeDuration}`, _v$36 = formatDuration(duration());
8492
+ _v$35 !== _p$.e && className(_el$71, _p$.e = _v$35);
8493
+ _v$36 !== _p$.t && setAttribute(_el$71, "title", _p$.t = _v$36);
8381
8494
  return _p$;
8382
8495
  }, {
8383
8496
  e: void 0,
@@ -8394,9 +8507,9 @@ var IterationCard = (props) => {
8394
8507
  var _el$94 = _tmpl$25(); _el$94.firstChild;
8395
8508
  insert(_el$94, () => usage().totalTokens.toLocaleString(), null);
8396
8509
  effect((_p$) => {
8397
- var _v$56 = `${s().badge} ${s().badgeUsage}`, _v$57 = `Prompt: ${usage().promptTokens.toLocaleString()} | Completion: ${usage().completionTokens.toLocaleString()}`;
8398
- _v$56 !== _p$.e && className(_el$94, _p$.e = _v$56);
8399
- _v$57 !== _p$.t && setAttribute(_el$94, "title", _p$.t = _v$57);
8510
+ var _v$57 = `${s().badge} ${s().badgeUsage}`, _v$58 = `Prompt: ${usage().promptTokens.toLocaleString()} | Completion: ${usage().completionTokens.toLocaleString()}`;
8511
+ _v$57 !== _p$.e && className(_el$94, _p$.e = _v$57);
8512
+ _v$58 !== _p$.t && setAttribute(_el$94, "title", _p$.t = _v$58);
8400
8513
  return _p$;
8401
8514
  }, {
8402
8515
  e: void 0,
@@ -8453,12 +8566,12 @@ var IterationCard = (props) => {
8453
8566
  insert(_el$103, () => diff.from);
8454
8567
  insert(_el$105, () => diff.to);
8455
8568
  effect((_p$) => {
8456
- var _v$58 = s().configDiffRow, _v$59 = s().configDiffKey, _v$60 = s().configDiffFrom, _v$61 = s().configDiffArrow, _v$62 = s().configDiffTo;
8457
- _v$58 !== _p$.e && className(_el$100, _p$.e = _v$58);
8458
- _v$59 !== _p$.t && className(_el$101, _p$.t = _v$59);
8459
- _v$60 !== _p$.a && className(_el$103, _p$.a = _v$60);
8460
- _v$61 !== _p$.o && className(_el$104, _p$.o = _v$61);
8461
- _v$62 !== _p$.i && className(_el$105, _p$.i = _v$62);
8569
+ var _v$59 = s().configDiffRow, _v$60 = s().configDiffKey, _v$61 = s().configDiffFrom, _v$62 = s().configDiffArrow, _v$63 = s().configDiffTo;
8570
+ _v$59 !== _p$.e && className(_el$100, _p$.e = _v$59);
8571
+ _v$60 !== _p$.t && className(_el$101, _p$.t = _v$60);
8572
+ _v$61 !== _p$.a && className(_el$103, _p$.a = _v$61);
8573
+ _v$62 !== _p$.o && className(_el$104, _p$.o = _v$62);
8574
+ _v$63 !== _p$.i && className(_el$105, _p$.i = _v$63);
8462
8575
  return _p$;
8463
8576
  }, {
8464
8577
  e: void 0,
@@ -8471,10 +8584,10 @@ var IterationCard = (props) => {
8471
8584
  })()
8472
8585
  }));
8473
8586
  effect((_p$) => {
8474
- var _v$36 = s().configPanelSection, _v$37 = s().configPanelLabel, _v$38 = s().configDiffSection;
8475
- _v$36 !== _p$.e && className(_el$78, _p$.e = _v$36);
8476
- _v$37 !== _p$.t && className(_el$79, _p$.t = _v$37);
8477
- _v$38 !== _p$.a && className(_el$80, _p$.a = _v$38);
8587
+ var _v$37 = s().configPanelSection, _v$38 = s().configPanelLabel, _v$39 = s().configDiffSection;
8588
+ _v$37 !== _p$.e && className(_el$78, _p$.e = _v$37);
8589
+ _v$38 !== _p$.t && className(_el$79, _p$.t = _v$38);
8590
+ _v$39 !== _p$.a && className(_el$80, _p$.a = _v$39);
8478
8591
  return _p$;
8479
8592
  }, {
8480
8593
  e: void 0,
@@ -8499,9 +8612,9 @@ var IterationCard = (props) => {
8499
8612
  insert(_el$106, name, _el$107);
8500
8613
  insert(_el$107, () => toolInvocationCounts().get(name) || 0);
8501
8614
  effect((_p$) => {
8502
- var _v$63 = s().configToolChip, _v$64 = s().configToolChipCount;
8503
- _v$63 !== _p$.e && className(_el$106, _p$.e = _v$63);
8504
- _v$64 !== _p$.t && className(_el$107, _p$.t = _v$64);
8615
+ var _v$64 = s().configToolChip, _v$65 = s().configToolChipCount;
8616
+ _v$64 !== _p$.e && className(_el$106, _p$.e = _v$64);
8617
+ _v$65 !== _p$.t && className(_el$107, _p$.t = _v$65);
8505
8618
  return _p$;
8506
8619
  }, {
8507
8620
  e: void 0,
@@ -8511,10 +8624,10 @@ var IterationCard = (props) => {
8511
8624
  })()
8512
8625
  }));
8513
8626
  effect((_p$) => {
8514
- var _v$39 = s().configPanelSection, _v$40 = s().configPanelLabel, _v$41 = s().configToolsList;
8515
- _v$39 !== _p$.e && className(_el$81, _p$.e = _v$39);
8516
- _v$40 !== _p$.t && className(_el$82, _p$.t = _v$40);
8517
- _v$41 !== _p$.a && className(_el$83, _p$.a = _v$41);
8627
+ var _v$40 = s().configPanelSection, _v$41 = s().configPanelLabel, _v$42 = s().configToolsList;
8628
+ _v$40 !== _p$.e && className(_el$81, _p$.e = _v$40);
8629
+ _v$41 !== _p$.t && className(_el$82, _p$.t = _v$41);
8630
+ _v$42 !== _p$.a && className(_el$83, _p$.a = _v$42);
8518
8631
  return _p$;
8519
8632
  }, {
8520
8633
  e: void 0,
@@ -8543,9 +8656,9 @@ var IterationCard = (props) => {
8543
8656
  })
8544
8657
  }), null);
8545
8658
  effect((_p$) => {
8546
- var _v$42 = s().configPanelSection, _v$43 = s().configPanelLabel;
8547
- _v$42 !== _p$.e && className(_el$84, _p$.e = _v$42);
8548
- _v$43 !== _p$.t && className(_el$85, _p$.t = _v$43);
8659
+ var _v$43 = s().configPanelSection, _v$44 = s().configPanelLabel;
8660
+ _v$43 !== _p$.e && className(_el$84, _p$.e = _v$43);
8661
+ _v$44 !== _p$.t && className(_el$85, _p$.t = _v$44);
8549
8662
  return _p$;
8550
8663
  }, {
8551
8664
  e: void 0,
@@ -8568,10 +8681,10 @@ var IterationCard = (props) => {
8568
8681
  copyable: true
8569
8682
  }));
8570
8683
  effect((_p$) => {
8571
- var _v$44 = s().configPanelSection, _v$45 = s().configPanelLabel, _v$46 = s().configJsonTreeContainer;
8572
- _v$44 !== _p$.e && className(_el$89, _p$.e = _v$44);
8573
- _v$45 !== _p$.t && className(_el$90, _p$.t = _v$45);
8574
- _v$46 !== _p$.a && className(_el$91, _p$.a = _v$46);
8684
+ var _v$45 = s().configPanelSection, _v$46 = s().configPanelLabel, _v$47 = s().configJsonTreeContainer;
8685
+ _v$45 !== _p$.e && className(_el$89, _p$.e = _v$45);
8686
+ _v$46 !== _p$.t && className(_el$90, _p$.t = _v$46);
8687
+ _v$47 !== _p$.a && className(_el$91, _p$.a = _v$47);
8575
8688
  return _p$;
8576
8689
  }, {
8577
8690
  e: void 0,
@@ -8673,16 +8786,16 @@ var IterationCard = (props) => {
8673
8786
  })
8674
8787
  }));
8675
8788
  effect((_p$) => {
8676
- var _v$47 = s().cardHeaderContent, _v$48 = s().iterCardTitle, _v$49 = s().cardSubtitle, _v$50 = s().cardHeaderBadges, _v$51 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`, _v$52 = `${s().configPanelWrapper} ${configExpanded() ? s().configPanelWrapperOpen : ""}`, _v$53 = s().configPanel, _v$54 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$55 = s().cardBodyInner;
8677
- _v$47 !== _p$.e && className(_el$54, _p$.e = _v$47);
8678
- _v$48 !== _p$.t && className(_el$55, _p$.t = _v$48);
8679
- _v$49 !== _p$.a && className(_el$56, _p$.a = _v$49);
8680
- _v$50 !== _p$.o && className(_el$67, _p$.o = _v$50);
8681
- _v$51 !== _p$.i && className(_el$74, _p$.i = _v$51);
8682
- _v$52 !== _p$.n && className(_el$75, _p$.n = _v$52);
8683
- _v$53 !== _p$.s && className(_el$76, _p$.s = _v$53);
8684
- _v$54 !== _p$.h && className(_el$92, _p$.h = _v$54);
8685
- _v$55 !== _p$.r && className(_el$93, _p$.r = _v$55);
8789
+ var _v$48 = s().cardHeaderContent, _v$49 = s().iterCardTitle, _v$50 = s().cardSubtitle, _v$51 = s().cardHeaderBadges, _v$52 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`, _v$53 = `${s().configPanelWrapper} ${configExpanded() ? s().configPanelWrapperOpen : ""}`, _v$54 = s().configPanel, _v$55 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$56 = s().cardBodyInner;
8790
+ _v$48 !== _p$.e && className(_el$54, _p$.e = _v$48);
8791
+ _v$49 !== _p$.t && className(_el$55, _p$.t = _v$49);
8792
+ _v$50 !== _p$.a && className(_el$56, _p$.a = _v$50);
8793
+ _v$51 !== _p$.o && className(_el$67, _p$.o = _v$51);
8794
+ _v$52 !== _p$.i && className(_el$74, _p$.i = _v$52);
8795
+ _v$53 !== _p$.n && className(_el$75, _p$.n = _v$53);
8796
+ _v$54 !== _p$.s && className(_el$76, _p$.s = _v$54);
8797
+ _v$55 !== _p$.h && className(_el$92, _p$.h = _v$55);
8798
+ _v$56 !== _p$.r && className(_el$93, _p$.r = _v$56);
8686
8799
  return _p$;
8687
8800
  }, {
8688
8801
  e: void 0,
@@ -10945,13 +11058,310 @@ var MemoryPanel = () => {
10945
11058
  })();
10946
11059
  };
10947
11060
  delegateEvents(["click"]);
10948
- var _tmpl$40 = /* @__PURE__ */ template(`<ul>`);
10949
- var _tmpl$214 = /* @__PURE__ */ template(`<div><div>Catalog`);
10950
- var _tmpl$310 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-skills-panel>`);
10951
- var _tmpl$47 = /* @__PURE__ */ template(`<div>No skills on this run. Add \`withSkills(...)\` to \`chat()\` and the catalog will appear here. A skill lights up when the model calls \`load_skill\`.`);
10952
- var _tmpl$57 = /* @__PURE__ */ template(`<div>Loaded via \`load_skill\`, but the catalog snapshot has not arrived yet.`);
10953
- var _tmpl$67 = /* @__PURE__ */ template(`<span>loaded`);
10954
- var _tmpl$77 = /* @__PURE__ */ template(`<li><span></span><span>`);
11061
+ var _tmpl$40 = /* @__PURE__ */ template(`<div><div></div><div>`);
11062
+ var _tmpl$214 = /* @__PURE__ */ template(`<div>`);
11063
+ var _tmpl$310 = /* @__PURE__ */ template(`<div><div> (<!>)`);
11064
+ var _tmpl$47 = /* @__PURE__ */ template(`<span> \u2192 <!> tok`);
11065
+ var _tmpl$57 = /* @__PURE__ */ template(`<span>ms`);
11066
+ var _tmpl$67 = /* @__PURE__ */ template(`<span>checkpoint`);
11067
+ var _tmpl$77 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-compaction-event style=cursor:pointer><span></span><span></span><span></span><span></span><span>\u25B6`);
11068
+ var _tmpl$87 = /* @__PURE__ */ template(`<div><span> event</span><button type=button>Clear`);
11069
+ var _tmpl$97 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-compaction-panel>`);
11070
+ var _tmpl$06 = /* @__PURE__ */ template(`<div>No compaction yet. When the transcript passes maxTokens, each compact appears here.`);
11071
+ function formatTime3(value) {
11072
+ const date = new Date(value);
11073
+ if (Number.isNaN(date.getTime())) return "";
11074
+ return date.toLocaleTimeString();
11075
+ }
11076
+ function shortStrategy(event) {
11077
+ const key = event.strategyKey;
11078
+ if (!key) return event.reusedCheckpoint ? "checkpoint" : "compaction";
11079
+ const cut = key.indexOf(":maxTokens=");
11080
+ return cut === -1 ? key : key.slice(0, cut);
11081
+ }
11082
+ var PreviewMessage = (props) => {
11083
+ const styles = useStyles();
11084
+ return (() => {
11085
+ var _el$ = _tmpl$40(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
11086
+ insert(_el$2, () => props.preview.role, null);
11087
+ insert(_el$2, createComponent(Show, {
11088
+ get when() {
11089
+ return props.preview.tokens > 0;
11090
+ },
11091
+ get children() {
11092
+ return ` \xB7 ${props.preview.tokens} tok`;
11093
+ }
11094
+ }), null);
11095
+ insert(_el$3, () => props.preview.text);
11096
+ effect((_p$) => {
11097
+ var _v$ = styles().hookDetails.message, _v$2 = styles().hookDetails.messageRole, _v$3 = styles().hookDetails.messageContent;
11098
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
11099
+ _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
11100
+ _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
11101
+ return _p$;
11102
+ }, {
11103
+ e: void 0,
11104
+ t: void 0,
11105
+ a: void 0
11106
+ });
11107
+ return _el$;
11108
+ })();
11109
+ };
11110
+ var PreviewColumn = (props) => {
11111
+ const styles = useStyles();
11112
+ const s = () => styles().iterationTimeline;
11113
+ return (() => {
11114
+ var _el$4 = _tmpl$310(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$8 = _el$6.nextSibling; _el$8.nextSibling;
11115
+ insert(_el$5, () => props.title, _el$6);
11116
+ insert(_el$5, () => props.previews.length, _el$8);
11117
+ insert(_el$4, createComponent(Show, {
11118
+ get when() {
11119
+ return props.previews.length > 0;
11120
+ },
11121
+ get fallback() {
11122
+ return (() => {
11123
+ var _el$0 = _tmpl$214();
11124
+ insert(_el$0, () => props.empty);
11125
+ effect(() => className(_el$0, styles().hookDetails.emptySmall));
11126
+ return _el$0;
11127
+ })();
11128
+ },
11129
+ get children() {
11130
+ var _el$9 = _tmpl$214();
11131
+ insert(_el$9, createComponent(For, {
11132
+ get each() {
11133
+ return props.previews;
11134
+ },
11135
+ children: (preview) => createComponent(PreviewMessage, {
11136
+ preview
11137
+ })
11138
+ }));
11139
+ effect(() => className(_el$9, styles().memoryPanel.list));
11140
+ return _el$9;
11141
+ }
11142
+ }), null);
11143
+ effect((_p$) => {
11144
+ var _v$4 = s().stepJsonItem, _v$5 = s().stepJsonItemLabel;
11145
+ _v$4 !== _p$.e && className(_el$4, _p$.e = _v$4);
11146
+ _v$5 !== _p$.t && className(_el$5, _p$.t = _v$5);
11147
+ return _p$;
11148
+ }, {
11149
+ e: void 0,
11150
+ t: void 0
11151
+ });
11152
+ return _el$4;
11153
+ })();
11154
+ };
11155
+ function kindLabel(kind) {
11156
+ if (kind === "started") return "Started";
11157
+ if (kind === "ended") return "Ended";
11158
+ return "State";
11159
+ }
11160
+ var CompactEvent = (props) => {
11161
+ const styles = useStyles();
11162
+ const s = () => styles().iterationTimeline;
11163
+ const [expanded, setExpanded] = createSignal(props.defaultOpen === true);
11164
+ const event = () => props.event;
11165
+ const isState = () => event().kind === "state";
11166
+ const stats = () => ({
11167
+ kind: event().kind,
11168
+ before: event().before,
11169
+ after: event().after,
11170
+ messagesBefore: event().messagesBefore,
11171
+ messagesAfter: event().messagesAfter,
11172
+ maxTokens: event().maxTokens,
11173
+ strategyKey: event().strategyKey,
11174
+ reusedCheckpoint: event().reusedCheckpoint,
11175
+ durationMs: event().durationMs
11176
+ });
11177
+ const countLabel = () => {
11178
+ if (event().kind === "started") {
11179
+ return `${event().messagesBefore ?? 0} msgs \xB7 ${event().before ?? 0} tok`;
11180
+ }
11181
+ if (event().kind === "ended") {
11182
+ return `${event().messagesAfter ?? 0} msgs \xB7 ${event().after ?? 0} tok`;
11183
+ }
11184
+ return `${event().messagesBefore ?? 0} \u2192 ${event().messagesAfter ?? 0} msgs`;
11185
+ };
11186
+ return [(() => {
11187
+ var _el$1 = _tmpl$77(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$20 = _el$12.nextSibling, _el$21 = _el$20.nextSibling;
11188
+ _el$1.$$click = () => setExpanded(!expanded());
11189
+ insert(_el$10, () => kindLabel(event().kind));
11190
+ insert(_el$11, () => shortStrategy(event()));
11191
+ insert(_el$12, countLabel);
11192
+ insert(_el$1, createComponent(Show, {
11193
+ get when() {
11194
+ return event().kind === "state";
11195
+ },
11196
+ get children() {
11197
+ var _el$13 = _tmpl$47(), _el$14 = _el$13.firstChild, _el$16 = _el$14.nextSibling; _el$16.nextSibling;
11198
+ insert(_el$13, () => event().before, _el$14);
11199
+ insert(_el$13, () => event().after, _el$16);
11200
+ effect(() => className(_el$13, s().stepDuration));
11201
+ return _el$13;
11202
+ }
11203
+ }), _el$20);
11204
+ insert(_el$1, createComponent(Show, {
11205
+ get when() {
11206
+ return event().durationMs !== void 0;
11207
+ },
11208
+ get children() {
11209
+ var _el$17 = _tmpl$57(), _el$18 = _el$17.firstChild;
11210
+ insert(_el$17, () => event().durationMs, _el$18);
11211
+ effect(() => className(_el$17, s().stepDuration));
11212
+ return _el$17;
11213
+ }
11214
+ }), _el$20);
11215
+ insert(_el$1, createComponent(Show, {
11216
+ get when() {
11217
+ return event().reusedCheckpoint;
11218
+ },
11219
+ get children() {
11220
+ var _el$19 = _tmpl$67();
11221
+ effect(() => className(_el$19, s().mwSuffix));
11222
+ return _el$19;
11223
+ }
11224
+ }), _el$20);
11225
+ insert(_el$20, () => formatTime3(event().timestamp));
11226
+ effect((_p$) => {
11227
+ var _v$6 = s().step, _v$7 = event().kind, _v$8 = `${s().stepPrefix} ${s().stepPrefixMiddleware}`, _v$9 = `${s().mwBadge} ${s().mwBadgeTransform}`, _v$0 = s().mwHook, _v$1 = s().stepDuration, _v$10 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
11228
+ _v$6 !== _p$.e && className(_el$1, _p$.e = _v$6);
11229
+ _v$7 !== _p$.t && setAttribute(_el$1, "data-kind", _p$.t = _v$7);
11230
+ _v$8 !== _p$.a && className(_el$10, _p$.a = _v$8);
11231
+ _v$9 !== _p$.o && className(_el$11, _p$.o = _v$9);
11232
+ _v$0 !== _p$.i && className(_el$12, _p$.i = _v$0);
11233
+ _v$1 !== _p$.n && className(_el$20, _p$.n = _v$1);
11234
+ _v$10 !== _p$.s && className(_el$21, _p$.s = _v$10);
11235
+ return _p$;
11236
+ }, {
11237
+ e: void 0,
11238
+ t: void 0,
11239
+ a: void 0,
11240
+ o: void 0,
11241
+ i: void 0,
11242
+ n: void 0,
11243
+ s: void 0
11244
+ });
11245
+ return _el$1;
11246
+ })(), createComponent(Show, {
11247
+ get when() {
11248
+ return expanded();
11249
+ },
11250
+ get children() {
11251
+ return [(() => {
11252
+ var _el$22 = _tmpl$214();
11253
+ insert(_el$22, createComponent(JsonTree, {
11254
+ get value() {
11255
+ return stats();
11256
+ },
11257
+ defaultExpansionDepth: 1,
11258
+ copyable: true
11259
+ }));
11260
+ effect(() => className(_el$22, s().mwChangesContainer));
11261
+ return _el$22;
11262
+ })(), createComponent(Show, {
11263
+ get when() {
11264
+ return isState();
11265
+ },
11266
+ get children() {
11267
+ var _el$23 = _tmpl$214();
11268
+ insert(_el$23, createComponent(PreviewColumn, {
11269
+ title: "Dropped",
11270
+ get previews() {
11271
+ return event().dropped ?? [];
11272
+ },
11273
+ empty: "Nothing was dropped."
11274
+ }), null);
11275
+ insert(_el$23, createComponent(PreviewColumn, {
11276
+ title: "Sent to model",
11277
+ get previews() {
11278
+ return event().result ?? [];
11279
+ },
11280
+ empty: "No compacted transcript on this event."
11281
+ }), null);
11282
+ effect(() => className(_el$23, s().stepJsonItemsCompare));
11283
+ return _el$23;
11284
+ }
11285
+ })];
11286
+ }
11287
+ })];
11288
+ };
11289
+ var CompactionPanel = (props) => {
11290
+ const {
11291
+ state,
11292
+ clearCompaction
11293
+ } = useAIStore();
11294
+ const styles = useStyles();
11295
+ const s = () => styles().iterationTimeline;
11296
+ const events = createMemo(() => compactionEventsForHook(state.compaction, props.hook));
11297
+ const lastStateIndex = createMemo(() => {
11298
+ const list = events();
11299
+ for (let i = list.length - 1; i >= 0; i--) {
11300
+ if (list[i]?.kind === "state") return i;
11301
+ }
11302
+ return -1;
11303
+ });
11304
+ return (() => {
11305
+ var _el$24 = _tmpl$97();
11306
+ insert(_el$24, createComponent(Show, {
11307
+ get when() {
11308
+ return events().length > 0;
11309
+ },
11310
+ get fallback() {
11311
+ return (() => {
11312
+ var _el$30 = _tmpl$06();
11313
+ effect(() => className(_el$30, styles().hookDetails.emptySmall));
11314
+ return _el$30;
11315
+ })();
11316
+ },
11317
+ get children() {
11318
+ return [(() => {
11319
+ var _el$25 = _tmpl$87(), _el$26 = _el$25.firstChild, _el$27 = _el$26.firstChild, _el$28 = _el$26.nextSibling;
11320
+ insert(_el$26, () => events().length, _el$27);
11321
+ insert(_el$26, () => events().length === 1 ? "" : "s", null);
11322
+ _el$28.$$click = () => clearCompaction();
11323
+ effect((_p$) => {
11324
+ var _v$11 = styles().memoryPanel.toolbar, _v$12 = styles().memoryPanel.badge, _v$13 = styles().memoryPanel.clearButton;
11325
+ _v$11 !== _p$.e && className(_el$25, _p$.e = _v$11);
11326
+ _v$12 !== _p$.t && className(_el$26, _p$.t = _v$12);
11327
+ _v$13 !== _p$.a && className(_el$28, _p$.a = _v$13);
11328
+ return _p$;
11329
+ }, {
11330
+ e: void 0,
11331
+ t: void 0,
11332
+ a: void 0
11333
+ });
11334
+ return _el$25;
11335
+ })(), (() => {
11336
+ var _el$29 = _tmpl$214();
11337
+ insert(_el$29, createComponent(For, {
11338
+ get each() {
11339
+ return events();
11340
+ },
11341
+ children: (event, index) => createComponent(CompactEvent, {
11342
+ event,
11343
+ get defaultOpen() {
11344
+ return memo(() => event.kind === "state")() && index() === lastStateIndex();
11345
+ }
11346
+ })
11347
+ }));
11348
+ effect(() => className(_el$29, s().iterCard));
11349
+ return _el$29;
11350
+ })()];
11351
+ }
11352
+ }));
11353
+ effect(() => className(_el$24, styles().memoryPanel.container));
11354
+ return _el$24;
11355
+ })();
11356
+ };
11357
+ delegateEvents(["click"]);
11358
+ var _tmpl$41 = /* @__PURE__ */ template(`<ul>`);
11359
+ var _tmpl$215 = /* @__PURE__ */ template(`<div><div>Catalog`);
11360
+ var _tmpl$311 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-skills-panel>`);
11361
+ var _tmpl$48 = /* @__PURE__ */ template(`<div>No skills on this run. Add \`withSkills(...)\` to \`chat()\` and the catalog will appear here. A skill lights up when the model calls \`load_skill\`.`);
11362
+ var _tmpl$58 = /* @__PURE__ */ template(`<div>Loaded via \`load_skill\`, but the catalog snapshot has not arrived yet.`);
11363
+ var _tmpl$68 = /* @__PURE__ */ template(`<span>loaded`);
11364
+ var _tmpl$78 = /* @__PURE__ */ template(`<li><span></span><span>`);
10955
11365
  function parseSkillName(argumentsJson) {
10956
11366
  if (!argumentsJson) return void 0;
10957
11367
  try {
@@ -11009,33 +11419,33 @@ var SkillsPanel = () => {
11009
11419
  });
11010
11420
  const catalog = createMemo(() => snapshot()?.catalog ?? []);
11011
11421
  return (() => {
11012
- var _el$ = _tmpl$310();
11422
+ var _el$ = _tmpl$311();
11013
11423
  insert(_el$, createComponent(Show, {
11014
11424
  get when() {
11015
11425
  return catalog().length > 0 || loaded().size > 0;
11016
11426
  },
11017
11427
  get fallback() {
11018
11428
  return (() => {
11019
- var _el$5 = _tmpl$47();
11429
+ var _el$5 = _tmpl$48();
11020
11430
  effect(() => className(_el$5, styles().memoryPanel.empty));
11021
11431
  return _el$5;
11022
11432
  })();
11023
11433
  },
11024
11434
  get children() {
11025
- var _el$2 = _tmpl$214(), _el$3 = _el$2.firstChild;
11435
+ var _el$2 = _tmpl$215(), _el$3 = _el$2.firstChild;
11026
11436
  insert(_el$2, createComponent(Show, {
11027
11437
  get when() {
11028
11438
  return catalog().length > 0;
11029
11439
  },
11030
11440
  get fallback() {
11031
11441
  return (() => {
11032
- var _el$6 = _tmpl$57();
11442
+ var _el$6 = _tmpl$58();
11033
11443
  effect(() => className(_el$6, styles().memoryPanel.sectionEmpty));
11034
11444
  return _el$6;
11035
11445
  })();
11036
11446
  },
11037
11447
  get children() {
11038
- var _el$4 = _tmpl$40();
11448
+ var _el$4 = _tmpl$41();
11039
11449
  insert(_el$4, createComponent(For, {
11040
11450
  get each() {
11041
11451
  return catalog();
@@ -11043,14 +11453,14 @@ var SkillsPanel = () => {
11043
11453
  children: (skill) => {
11044
11454
  const isLoaded = () => loaded().has(skill.name);
11045
11455
  return (() => {
11046
- var _el$7 = _tmpl$77(), _el$8 = _el$7.firstChild, _el$0 = _el$8.nextSibling;
11456
+ var _el$7 = _tmpl$78(), _el$8 = _el$7.firstChild, _el$0 = _el$8.nextSibling;
11047
11457
  insert(_el$8, () => skill.name);
11048
11458
  insert(_el$7, createComponent(Show, {
11049
11459
  get when() {
11050
11460
  return isLoaded();
11051
11461
  },
11052
11462
  get children() {
11053
- var _el$9 = _tmpl$67();
11463
+ var _el$9 = _tmpl$68();
11054
11464
  effect(() => className(_el$9, styles().memoryPanel.badge));
11055
11465
  return _el$9;
11056
11466
  }
@@ -11093,16 +11503,16 @@ var SkillsPanel = () => {
11093
11503
  };
11094
11504
 
11095
11505
  // src/components/hooks/HookDetails.tsx
11096
- var _tmpl$41 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
11097
- var _tmpl$215 = /* @__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>`);
11098
- var _tmpl$311 = /* @__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>`);
11099
- var _tmpl$48 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
11100
- var _tmpl$58 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
11101
- var _tmpl$68 = /* @__PURE__ */ template(`<span>running`);
11102
- var _tmpl$78 = /* @__PURE__ */ template(`<span> new`);
11103
- var _tmpl$87 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
11104
- var _tmpl$97 = /* @__PURE__ */ template(`<div><span></span><span>`);
11105
- var _tmpl$06 = /* @__PURE__ */ template(`<span>`);
11506
+ var _tmpl$49 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
11507
+ var _tmpl$216 = /* @__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>`);
11508
+ var _tmpl$312 = /* @__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>`);
11509
+ var _tmpl$410 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
11510
+ var _tmpl$59 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
11511
+ var _tmpl$69 = /* @__PURE__ */ template(`<span>running`);
11512
+ var _tmpl$79 = /* @__PURE__ */ template(`<span> new`);
11513
+ var _tmpl$88 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
11514
+ var _tmpl$98 = /* @__PURE__ */ template(`<div><span></span><span>`);
11515
+ var _tmpl$07 = /* @__PURE__ */ template(`<span>`);
11106
11516
  var _tmpl$116 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-technical-name>`);
11107
11517
  var _tmpl$106 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-registry-id>id `);
11108
11518
  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>`);
@@ -11115,7 +11525,7 @@ var _tmpl$173 = /* @__PURE__ */ template(`<div><button type=button data-testid=a
11115
11525
  var _tmpl$182 = /* @__PURE__ */ template(`<div><span>`);
11116
11526
  var _tmpl$192 = /* @__PURE__ */ template(`<div><span></span><div>`);
11117
11527
  var _tmpl$202 = /* @__PURE__ */ template(`<div>No messages yet. Start a conversation to see messages here.`);
11118
- var _tmpl$216 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-tools><div></div><div>`);
11528
+ var _tmpl$217 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-tools><div></div><div>`);
11119
11529
  var _tmpl$223 = /* @__PURE__ */ template(`<div>No tools.`);
11120
11530
  var _tmpl$232 = /* @__PURE__ */ template(`<span>approval`);
11121
11531
  var _tmpl$242 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-tool-row><span>`);
@@ -11155,7 +11565,7 @@ var HookDetails = () => {
11155
11565
  return Boolean(outputKind && outputKind !== "chat" && outputKind !== "structured");
11156
11566
  });
11157
11567
  createEffect(() => {
11158
- if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory" || activeTab() === "skills")) {
11568
+ if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory" || activeTab() === "compaction" || activeTab() === "skills")) {
11159
11569
  setActiveTab("conversation");
11160
11570
  }
11161
11571
  });
@@ -11193,14 +11603,15 @@ var HookDetails = () => {
11193
11603
  return createComponent(HookOverview, {
11194
11604
  onSelectHook: (selectedHook) => {
11195
11605
  selectHook(selectedHook.id);
11196
- if (state.conversations[selectedHook.id]) {
11197
- selectConversation(selectedHook.id);
11606
+ const conversationId = selectedHook.id || selectedHook.clientId || selectedHook.threadId;
11607
+ if (conversationId && state.conversations[conversationId]) {
11608
+ selectConversation(conversationId);
11198
11609
  }
11199
11610
  }
11200
11611
  });
11201
11612
  },
11202
11613
  children: (activeHook) => (() => {
11203
- var _el$ = _tmpl$215(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
11614
+ var _el$ = _tmpl$216(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
11204
11615
  insert(_el$, createComponent(HookHeader, {
11205
11616
  get hook() {
11206
11617
  return activeHook();
@@ -11263,6 +11674,13 @@ var HookDetails = () => {
11263
11674
  return activeTab();
11264
11675
  },
11265
11676
  onSelect: setActiveTab
11677
+ }), createComponent(TabButton, {
11678
+ label: "Compaction",
11679
+ tab: "compaction",
11680
+ get activeTab() {
11681
+ return activeTab();
11682
+ },
11683
+ onSelect: setActiveTab
11266
11684
  }), createComponent(TabButton, {
11267
11685
  label: "Skills",
11268
11686
  tab: "skills",
@@ -11349,6 +11767,18 @@ var HookDetails = () => {
11349
11767
  return createComponent(MemoryPanel, {});
11350
11768
  }
11351
11769
  }), null);
11770
+ insert(_el$4, createComponent(Show, {
11771
+ get when() {
11772
+ return activeTab() === "compaction";
11773
+ },
11774
+ get children() {
11775
+ return createComponent(CompactionPanel, {
11776
+ get hook() {
11777
+ return activeHook();
11778
+ }
11779
+ });
11780
+ }
11781
+ }), null);
11352
11782
  insert(_el$4, createComponent(Show, {
11353
11783
  get when() {
11354
11784
  return activeTab() === "skills";
@@ -11362,7 +11792,7 @@ var HookDetails = () => {
11362
11792
  return showSecondaryPane();
11363
11793
  },
11364
11794
  get children() {
11365
- var _el$5 = _tmpl$41(), _el$6 = _el$5.firstChild;
11795
+ var _el$5 = _tmpl$49(), _el$6 = _el$5.firstChild;
11366
11796
  _el$5.addEventListener("mouseleave", () => setHoverTarget(null));
11367
11797
  _el$5.$$mouseover = (event) => setHoverTargetFromEvent(event, "preview", setHoverTarget);
11368
11798
  use((el) => {
@@ -11443,13 +11873,13 @@ var HookOverview = (props) => {
11443
11873
  },
11444
11874
  get fallback() {
11445
11875
  return (() => {
11446
- var _el$12 = _tmpl$48();
11876
+ var _el$12 = _tmpl$410();
11447
11877
  effect(() => className(_el$12, styles().hookDetails.empty));
11448
11878
  return _el$12;
11449
11879
  })();
11450
11880
  },
11451
11881
  get children() {
11452
- var _el$7 = _tmpl$311(), _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;
11882
+ var _el$7 = _tmpl$312(), _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;
11453
11883
  insert(_el$10, createComponent(OverviewMetric, {
11454
11884
  label: "active hooks",
11455
11885
  get value() {
@@ -11503,7 +11933,7 @@ var HookOverview = (props) => {
11503
11933
  return groups();
11504
11934
  },
11505
11935
  children: (group) => (() => {
11506
- var _el$13 = _tmpl$58(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
11936
+ var _el$13 = _tmpl$59(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
11507
11937
  insert(_el$15, () => group.label);
11508
11938
  insert(_el$16, () => group.hooks.length);
11509
11939
  insert(_el$13, createComponent(For, {
@@ -11514,7 +11944,7 @@ var HookOverview = (props) => {
11514
11944
  const running = createMemo(() => isHookRunning(hook, state.hooks.runs));
11515
11945
  const unseenCount = createMemo(() => getHookUnseenEventCount(state.hooks, hook.id));
11516
11946
  return (() => {
11517
- 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;
11947
+ var _el$17 = _tmpl$88(), _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;
11518
11948
  _el$17.$$click = () => props.onSelectHook(hook);
11519
11949
  insert(_el$19, () => getHookDisplayName(hook));
11520
11950
  insert(_el$20, () => getHookIdentitySubtitle(hook));
@@ -11524,7 +11954,7 @@ var HookOverview = (props) => {
11524
11954
  return running();
11525
11955
  },
11526
11956
  get children() {
11527
- var _el$23 = _tmpl$68();
11957
+ var _el$23 = _tmpl$69();
11528
11958
  effect(() => className(_el$23, styles().hookDetails.lifecycle));
11529
11959
  return _el$23;
11530
11960
  }
@@ -11534,7 +11964,7 @@ var HookOverview = (props) => {
11534
11964
  return unseenCount() > 0;
11535
11965
  },
11536
11966
  get children() {
11537
- var _el$24 = _tmpl$78(), _el$25 = _el$24.firstChild;
11967
+ var _el$24 = _tmpl$79(), _el$25 = _el$24.firstChild;
11538
11968
  insert(_el$24, unseenCount, _el$25);
11539
11969
  effect(() => className(_el$24, styles().hookDetails.kind));
11540
11970
  return _el$24;
@@ -11605,7 +12035,7 @@ var HookOverview = (props) => {
11605
12035
  var OverviewMetric = (props) => {
11606
12036
  const styles = useStyles();
11607
12037
  return (() => {
11608
- var _el$26 = _tmpl$97(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling;
12038
+ var _el$26 = _tmpl$98(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling;
11609
12039
  insert(_el$27, () => props.value);
11610
12040
  insert(_el$28, () => props.label);
11611
12041
  effect((_p$) => {
@@ -11633,7 +12063,7 @@ var HookHeader = (props) => {
11633
12063
  return props.hook.outputKind;
11634
12064
  },
11635
12065
  get children() {
11636
- var _el$34 = _tmpl$06();
12066
+ var _el$34 = _tmpl$07();
11637
12067
  insert(_el$34, () => props.hook.outputKind);
11638
12068
  effect(() => className(_el$34, styles().hookDetails.kind));
11639
12069
  return _el$34;
@@ -11668,7 +12098,7 @@ var HookHeader = (props) => {
11668
12098
  return props.hook.framework;
11669
12099
  },
11670
12100
  get children() {
11671
- var _el$40 = _tmpl$06();
12101
+ var _el$40 = _tmpl$07();
11672
12102
  insert(_el$40, () => props.hook.framework);
11673
12103
  return _el$40;
11674
12104
  }
@@ -11737,7 +12167,7 @@ var HookHeader = (props) => {
11737
12167
  var Metric = (props) => {
11738
12168
  const styles = useStyles();
11739
12169
  return (() => {
11740
- var _el$42 = _tmpl$97(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
12170
+ var _el$42 = _tmpl$98(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
11741
12171
  insert(_el$43, () => props.value);
11742
12172
  insert(_el$44, () => props.label);
11743
12173
  effect((_p$) => {
@@ -12029,7 +12459,7 @@ var MessagesPreview = (props) => {
12029
12459
  },
12030
12460
  get fallback() {
12031
12461
  return (() => {
12032
- var _el$60 = _tmpl$06();
12462
+ var _el$60 = _tmpl$07();
12033
12463
  insert(_el$60, () => part.content);
12034
12464
  effect(() => className(_el$60, styles().hookDetails.previewPartContent));
12035
12465
  return _el$60;
@@ -12163,7 +12593,7 @@ var HookMessageTimeline = (props) => {
12163
12593
  },
12164
12594
  get fallback() {
12165
12595
  return (() => {
12166
- var _el$72 = _tmpl$06();
12596
+ var _el$72 = _tmpl$07();
12167
12597
  insert(_el$72, () => part.content);
12168
12598
  effect(() => className(_el$72, styles().hookDetails.previewPartContent));
12169
12599
  return _el$72;
@@ -12227,7 +12657,7 @@ var ToolsView = (props) => {
12227
12657
  const selectedTool = createMemo(() => props.hook.tools.find((tool) => tool.name === selectedToolName()));
12228
12658
  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));
12229
12659
  return (() => {
12230
- var _el$76 = _tmpl$216(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
12660
+ var _el$76 = _tmpl$217(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
12231
12661
  insert(_el$77, createComponent(Show, {
12232
12662
  get when() {
12233
12663
  return props.hook.tools.length > 0;
@@ -12318,7 +12748,7 @@ var ToolsView = (props) => {
12318
12748
  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;
12319
12749
  insert(_el$89, () => fixture.name ?? fixture.toolName);
12320
12750
  insert(_el$90, () => fixture.toolName, _el$91);
12321
- insert(_el$90, () => formatTime3(fixture.createdAt), null);
12751
+ insert(_el$90, () => formatTime4(fixture.createdAt), null);
12322
12752
  _el$93.$$click = () => applyToolFixture(fixture);
12323
12753
  _el$94.$$click = () => deleteToolFixture(fixture.id);
12324
12754
  effect((_p$) => {
@@ -12812,13 +13242,13 @@ function jsonSafeValue(value) {
12812
13242
  return `[ai-devtools] unserializable value: ${error instanceof Error ? error.message : String(error)}`;
12813
13243
  }
12814
13244
  }
12815
- function formatTime3(timestamp) {
13245
+ function formatTime4(timestamp) {
12816
13246
  return new Date(timestamp).toLocaleTimeString();
12817
13247
  }
12818
13248
  delegateEvents(["mouseover", "click"]);
12819
13249
 
12820
13250
  // src/components/Shell.tsx
12821
- var _tmpl$49 = /* @__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>`);
13251
+ var _tmpl$50 = /* @__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>`);
12822
13252
  function Devtools(props) {
12823
13253
  return createComponent(ThemeContextProvider, {
12824
13254
  get theme() {
@@ -12900,7 +13330,7 @@ function DevtoolsContent() {
12900
13330
  });
12901
13331
  return createComponent(MainPanel, {
12902
13332
  get children() {
12903
- var _el$ = _tmpl$49(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.nextSibling;
13333
+ var _el$ = _tmpl$50(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.nextSibling;
12904
13334
  insert(_el$, createComponent(Header, {
12905
13335
  get children() {
12906
13336
  return createComponent(HeaderLogo, {