@tanstack/ai-devtools-core 0.5.10 → 0.5.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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;
@@ -4352,12 +4353,6 @@ function applyHookEvent(state, eventName, event) {
4352
4353
  markHookViewed(state, state.activeHookId);
4353
4354
  }
4354
4355
  }
4355
- function setActiveHook(state, hookId) {
4356
- state.activeHookId = hookId;
4357
- if (hookId) {
4358
- markHookViewed(state, hookId);
4359
- }
4360
- }
4361
4356
  function clearHookRegistry(state) {
4362
4357
  state.hooks = {};
4363
4358
  state.runs = {};
@@ -4509,8 +4504,8 @@ function removeHookRecord(state, hookId) {
4509
4504
  delete state.runs[runId];
4510
4505
  }
4511
4506
  }
4512
- for (const eventId2 of hookEventIds) {
4513
- delete state.events[eventId2];
4507
+ for (const eventId3 of hookEventIds) {
4508
+ delete state.events[eventId3];
4514
4509
  }
4515
4510
  delete state.hooks[hookId];
4516
4511
  delete state.seenHookActivityCounts[hookId];
@@ -4518,7 +4513,7 @@ function removeHookRecord(state, hookId) {
4518
4513
  state.activeHookId = null;
4519
4514
  }
4520
4515
  }
4521
- function upsertRun(state, event, eventId2) {
4516
+ function upsertRun(state, event, eventId3) {
4522
4517
  const existing = state.runs[event.runId];
4523
4518
  if (!existing) {
4524
4519
  state.runs[event.runId] = {
@@ -4532,7 +4527,7 @@ function upsertRun(state, event, eventId2) {
4532
4527
  updatedAt: event.timestamp,
4533
4528
  ...isTerminalRunStatus(event.status) ? { completedAt: event.timestamp } : {},
4534
4529
  ...event.error ? { error: event.error } : {},
4535
- eventIds: [eventId2]
4530
+ eventIds: [eventId3]
4536
4531
  };
4537
4532
  return;
4538
4533
  }
@@ -4548,8 +4543,8 @@ function upsertRun(state, event, eventId2) {
4548
4543
  if (event.error) {
4549
4544
  existing.error = event.error;
4550
4545
  }
4551
- if (!existing.eventIds.includes(eventId2)) {
4552
- existing.eventIds.push(eventId2);
4546
+ if (!existing.eventIds.includes(eventId3)) {
4547
+ existing.eventIds.push(eventId3);
4553
4548
  }
4554
4549
  }
4555
4550
  function attachRunToHook(state, hookId, runId) {
@@ -4557,7 +4552,7 @@ function attachRunToHook(state, hookId, runId) {
4557
4552
  if (!hook || hook.runIds.includes(runId)) return;
4558
4553
  hook.runIds.push(runId);
4559
4554
  }
4560
- function syncRunsFromSnapshot(state, snapshot, eventId2) {
4555
+ function syncRunsFromSnapshot(state, snapshot, eventId3) {
4561
4556
  const rawRuns = snapshot.state.runs;
4562
4557
  if (!Array.isArray(rawRuns)) return;
4563
4558
  for (const candidate of rawRuns) {
@@ -4583,7 +4578,7 @@ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4583
4578
  updatedAt,
4584
4579
  ...typeof run.completedAt === "number" ? { completedAt: run.completedAt } : isTerminalRunStatus(status) ? { completedAt: updatedAt } : {},
4585
4580
  ...typeof run.error === "string" ? { error: run.error } : {},
4586
- eventIds: [eventId2]
4581
+ eventIds: [eventId3]
4587
4582
  };
4588
4583
  } else {
4589
4584
  existing.hookId = snapshot.hookId;
@@ -4595,8 +4590,8 @@ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4595
4590
  existing.completedAt = updatedAt;
4596
4591
  }
4597
4592
  if (typeof run.error === "string") existing.error = run.error;
4598
- if (!existing.eventIds.includes(eventId2)) {
4599
- existing.eventIds.push(eventId2);
4593
+ if (!existing.eventIds.includes(eventId3)) {
4594
+ existing.eventIds.push(eventId3);
4600
4595
  }
4601
4596
  }
4602
4597
  attachRunToHook(state, snapshot.hookId, run.id);
@@ -4626,11 +4621,11 @@ function attachActivityRunToHook(state, hookId, runId) {
4626
4621
  if (!hook || hook.activityRunIds.includes(runId)) return;
4627
4622
  hook.activityRunIds.push(runId);
4628
4623
  }
4629
- function attachEventToHook(state, hookId, eventId2) {
4624
+ function attachEventToHook(state, hookId, eventId3) {
4630
4625
  if (!hookId) return;
4631
4626
  const hook = state.hooks[hookId];
4632
- if (!hook || hook.eventIds.includes(eventId2)) return;
4633
- hook.eventIds.push(eventId2);
4627
+ if (!hook || hook.eventIds.includes(eventId3)) return;
4628
+ hook.eventIds.push(eventId3);
4634
4629
  }
4635
4630
  function inferLifecycleFromSnapshot(state) {
4636
4631
  if (state.status === "error" || state.error) {
@@ -4773,6 +4768,62 @@ function clearMemoryRegistry(state) {
4773
4768
  state.scopes = {};
4774
4769
  }
4775
4770
 
4771
+ // src/store/compaction-registry.ts
4772
+ var MAX_EVENTS = 50;
4773
+ function createCompactionRegistryState() {
4774
+ return { events: [] };
4775
+ }
4776
+ function eventId2(kind, event) {
4777
+ return [
4778
+ "cmp",
4779
+ kind,
4780
+ String(event.timestamp),
4781
+ event.hookId ?? event.clientId ?? event.threadId ?? "unknown",
4782
+ String(event.before ?? event.after ?? "")
4783
+ ].join("-");
4784
+ }
4785
+ function applyCompactionEvent(state, kind, event) {
4786
+ state.events.push({
4787
+ id: event.eventId ?? eventId2(kind, event),
4788
+ kind,
4789
+ timestamp: event.timestamp,
4790
+ hookId: event.hookId,
4791
+ clientId: event.clientId,
4792
+ threadId: event.threadId,
4793
+ runId: event.runId,
4794
+ before: event.before,
4795
+ after: event.after,
4796
+ messagesBefore: event.messagesBefore,
4797
+ messagesAfter: event.messagesAfter,
4798
+ reusedCheckpoint: event.reusedCheckpoint,
4799
+ maxTokens: event.maxTokens,
4800
+ strategyKey: event.strategyKey,
4801
+ durationMs: event.durationMs,
4802
+ dropped: event.dropped,
4803
+ result: event.result
4804
+ });
4805
+ if (state.events.length > MAX_EVENTS) {
4806
+ state.events.splice(0, state.events.length - MAX_EVENTS);
4807
+ }
4808
+ }
4809
+ function clearCompactionRegistry(state) {
4810
+ state.events = [];
4811
+ }
4812
+ function compactionEventsForHook(state, hook) {
4813
+ const matched = state.events.filter((event) => {
4814
+ if (event.hookId && event.hookId === hook.id) return true;
4815
+ if (event.clientId && hook.clientId && event.clientId === hook.clientId) {
4816
+ return true;
4817
+ }
4818
+ if (event.threadId && hook.threadId && event.threadId === hook.threadId) {
4819
+ return true;
4820
+ }
4821
+ return false;
4822
+ });
4823
+ if (matched.length > 0) return matched;
4824
+ return state.events;
4825
+ }
4826
+
4776
4827
  // src/store/skills-registry.ts
4777
4828
  function createSkillsRegistryState() {
4778
4829
  return { snapshots: {} };
@@ -4806,6 +4857,7 @@ var AIProvider = (props) => {
4806
4857
  activeConversationId: null,
4807
4858
  hooks: createHookRegistryState(),
4808
4859
  memory: createMemoryRegistryState(),
4860
+ compaction: createCompactionRegistryState(),
4809
4861
  skills: createSkillsRegistryState()
4810
4862
  });
4811
4863
  const streamToConversation = /* @__PURE__ */ new Map();
@@ -5063,15 +5115,23 @@ var AIProvider = (props) => {
5063
5115
  clearMemoryRegistry(memory);
5064
5116
  }));
5065
5117
  }
5118
+ function clearCompaction() {
5119
+ setState("compaction", produce((compaction) => {
5120
+ clearCompactionRegistry(compaction);
5121
+ }));
5122
+ }
5066
5123
  function clearSkills() {
5067
5124
  setState("skills", produce((skills) => {
5068
5125
  clearSkillsRegistry(skills);
5069
5126
  }));
5070
5127
  }
5071
5128
  function selectHook(id) {
5072
- setState("hooks", produce((hooks) => {
5073
- setActiveHook(hooks, id);
5074
- }));
5129
+ setState("hooks", "activeHookId", id);
5130
+ if (id) {
5131
+ setState("hooks", produce((hooks) => {
5132
+ markHookViewed(hooks, id);
5133
+ }));
5134
+ }
5075
5135
  }
5076
5136
  function saveToolFixture(fixture) {
5077
5137
  const fixtures = mergeFixtures(fixture, state.hooks.fixtures);
@@ -6585,6 +6645,48 @@ var AIProvider = (props) => {
6585
6645
  arr.push(mwEvent);
6586
6646
  }));
6587
6647
  }));
6648
+ const recordCompactionLifecycle = (kind, hookName, payload) => {
6649
+ setState("compaction", produce((compaction) => {
6650
+ applyCompactionEvent(compaction, kind, payload);
6651
+ }));
6652
+ const {
6653
+ requestId,
6654
+ streamId,
6655
+ clientId
6656
+ } = payload;
6657
+ const conversationId = (clientId && state.conversations[clientId] ? clientId : void 0) || (streamId ? streamToConversation.get(streamId) : void 0) || (requestId ? requestToConversation.get(requestId) : void 0);
6658
+ if (!conversationId || !state.conversations[conversationId]) return;
6659
+ const conv = state.conversations[conversationId];
6660
+ const iterIndex = findLatestIterationIndex(conv, requestId);
6661
+ if (iterIndex < 0) return;
6662
+ const mwEvent = {
6663
+ id: `mw-cmp-${kind}-${Date.now()}-${Math.random()}`,
6664
+ middlewareName: "compaction",
6665
+ hookName,
6666
+ timestamp: payload.timestamp,
6667
+ hasTransform: kind === "state",
6668
+ configChanges: {
6669
+ before: payload.before,
6670
+ after: payload.after,
6671
+ messagesBefore: payload.messagesBefore,
6672
+ messagesAfter: payload.messagesAfter,
6673
+ reusedCheckpoint: payload.reusedCheckpoint,
6674
+ maxTokens: payload.maxTokens,
6675
+ strategyKey: payload.strategyKey,
6676
+ durationMs: payload.durationMs
6677
+ }
6678
+ };
6679
+ setState("conversations", conversationId, "iterations", iterIndex, "middlewareEvents", produce((arr) => {
6680
+ arr.push(mwEvent);
6681
+ }));
6682
+ };
6683
+ cleanupFns.push(aiEventClient.on("compaction:started", (e) => {
6684
+ recordCompactionLifecycle("started", "onCompactStart", e.payload);
6685
+ }), aiEventClient.on("compaction:state", (e) => {
6686
+ recordCompactionLifecycle("state", "onCompact", e.payload);
6687
+ }), aiEventClient.on("compaction:ended", (e) => {
6688
+ recordCompactionLifecycle("ended", "onCompactEnd", e.payload);
6689
+ }));
6588
6690
  cleanupFns.push(aiEventClient.on("summarize:request:started", (e) => {
6589
6691
  const {
6590
6692
  requestId,
@@ -6978,6 +7080,7 @@ var AIProvider = (props) => {
6978
7080
  selectConversation,
6979
7081
  clearHooks,
6980
7082
  clearMemory,
7083
+ clearCompaction,
6981
7084
  clearSkills,
6982
7085
  selectHook,
6983
7086
  saveToolFixture,
@@ -7113,8 +7216,9 @@ var HookDashboard = () => {
7113
7216
  const unseenUpdateCount = createMemo(() => hooks().reduce((count, hook) => count + getHookUnseenEventCount(state.hooks, hook.id), 0));
7114
7217
  const handleSelect = (hook) => {
7115
7218
  selectHook(hook.id);
7116
- if (state.conversations[hook.id]) {
7117
- selectConversation(hook.id);
7219
+ const conversationId = hook.id || hook.clientId || hook.threadId;
7220
+ if (conversationId && state.conversations[conversationId]) {
7221
+ selectConversation(conversationId);
7118
7222
  }
7119
7223
  };
7120
7224
  return (() => {
@@ -7590,6 +7694,9 @@ var MiddlewareStep = (props) => {
7590
7694
  if (ev().wasDropped) return "DROP";
7591
7695
  if (ev().hookName === "onChunk" && ev().hasTransform) return "TRANSFORM";
7592
7696
  if (ev().hookName === "onConfig" && ev().hasTransform) return "TRANSFORM";
7697
+ if (ev().hookName === "onCompactStart") return "START";
7698
+ if (ev().hookName === "onCompact") return "COMPACT";
7699
+ if (ev().hookName === "onCompactEnd") return "END";
7593
7700
  if (ev().hookName === "onBeforeToolCall" && ev().hasTransform) return "DECISION";
7594
7701
  return null;
7595
7702
  };
@@ -7599,6 +7706,9 @@ var MiddlewareStep = (props) => {
7599
7706
  };
7600
7707
  return [(() => {
7601
7708
  var _el$ = _tmpl$32(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.nextSibling;
7709
+ _el$.$$click = () => {
7710
+ if (hasChanges()) setExpanded(!expanded());
7711
+ };
7602
7712
  insert(_el$3, () => ev().middlewareName);
7603
7713
  insert(_el$4, () => ev().hookName);
7604
7714
  insert(_el$, createComponent(Show, {
@@ -7629,24 +7739,27 @@ var MiddlewareStep = (props) => {
7629
7739
  },
7630
7740
  get children() {
7631
7741
  var _el$8 = _tmpl$22();
7632
- _el$8.$$click = () => setExpanded(!expanded());
7633
7742
  insert(_el$8, () => expanded() ? "hide changes" : "show changes");
7634
7743
  effect(() => className(_el$8, s().stepExpandToggle));
7635
7744
  return _el$8;
7636
7745
  }
7637
7746
  }), null);
7638
7747
  effect((_p$) => {
7639
- var _v$ = s().step, _v$2 = `${s().stepPrefix} ${s().stepPrefixMiddleware}`, _v$3 = `${s().mwBadge} ${badgeClass()}`, _v$4 = s().mwHook;
7748
+ var _v$ = s().step, _v$2 = hasChanges() ? {
7749
+ cursor: "pointer"
7750
+ } : void 0, _v$3 = `${s().stepPrefix} ${s().stepPrefixMiddleware}`, _v$4 = `${s().mwBadge} ${badgeClass()}`, _v$5 = s().mwHook;
7640
7751
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
7641
- _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
7642
- _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
7643
- _v$4 !== _p$.o && className(_el$4, _p$.o = _v$4);
7752
+ _p$.t = style(_el$, _v$2, _p$.t);
7753
+ _v$3 !== _p$.a && className(_el$2, _p$.a = _v$3);
7754
+ _v$4 !== _p$.o && className(_el$3, _p$.o = _v$4);
7755
+ _v$5 !== _p$.i && className(_el$4, _p$.i = _v$5);
7644
7756
  return _p$;
7645
7757
  }, {
7646
7758
  e: void 0,
7647
7759
  t: void 0,
7648
7760
  a: void 0,
7649
- o: void 0
7761
+ o: void 0,
7762
+ i: void 0
7650
7763
  });
7651
7764
  return _el$;
7652
7765
  })(), createComponent(Show, {
@@ -7702,9 +7815,9 @@ var ThinkingStep = (props) => {
7702
7815
  }
7703
7816
  }), null);
7704
7817
  effect((_p$) => {
7705
- var _v$5 = `${s().stepPrefix} ${s().stepPrefixThinking}`, _v$6 = s().stepContent;
7706
- _v$5 !== _p$.e && className(_el$1, _p$.e = _v$5);
7707
- _v$6 !== _p$.t && className(_el$10, _p$.t = _v$6);
7818
+ var _v$6 = `${s().stepPrefix} ${s().stepPrefixThinking}`, _v$7 = s().stepContent;
7819
+ _v$6 !== _p$.e && className(_el$1, _p$.e = _v$6);
7820
+ _v$7 !== _p$.t && className(_el$10, _p$.t = _v$7);
7708
7821
  return _p$;
7709
7822
  }, {
7710
7823
  e: void 0,
@@ -7758,10 +7871,10 @@ var StructuredOutputStep = (props) => {
7758
7871
  }), false, true);
7759
7872
  insert(_el$15, () => part().status);
7760
7873
  effect((_p$) => {
7761
- var _v$7 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$8 = `${s().mwBadge} ${badgeClass()}`, _v$9 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
7762
- _v$7 !== _p$.e && className(_el$14, _p$.e = _v$7);
7763
- _v$8 !== _p$.t && className(_el$15, _p$.t = _v$8);
7764
- _v$9 !== _p$.a && className(_el$16, _p$.a = _v$9);
7874
+ var _v$8 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$9 = `${s().mwBadge} ${badgeClass()}`, _v$0 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
7875
+ _v$8 !== _p$.e && className(_el$14, _p$.e = _v$8);
7876
+ _v$9 !== _p$.t && className(_el$15, _p$.t = _v$9);
7877
+ _v$0 !== _p$.a && className(_el$16, _p$.a = _v$0);
7765
7878
  return _p$;
7766
7879
  }, {
7767
7880
  e: void 0,
@@ -7786,10 +7899,10 @@ var StructuredOutputStep = (props) => {
7786
7899
  copyable: true
7787
7900
  }));
7788
7901
  effect((_p$) => {
7789
- var _v$10 = s().stepJsonItem, _v$11 = s().stepJsonItemLabel, _v$12 = s().stepJsonPanel;
7790
- _v$10 !== _p$.e && className(_el$19, _p$.e = _v$10);
7791
- _v$11 !== _p$.t && className(_el$20, _p$.t = _v$11);
7792
- _v$12 !== _p$.a && className(_el$21, _p$.a = _v$12);
7902
+ var _v$11 = s().stepJsonItem, _v$12 = s().stepJsonItemLabel, _v$13 = s().stepJsonPanel;
7903
+ _v$11 !== _p$.e && className(_el$19, _p$.e = _v$11);
7904
+ _v$12 !== _p$.t && className(_el$20, _p$.t = _v$12);
7905
+ _v$13 !== _p$.a && className(_el$21, _p$.a = _v$13);
7793
7906
  return _p$;
7794
7907
  }, {
7795
7908
  e: void 0,
@@ -7800,9 +7913,9 @@ var StructuredOutputStep = (props) => {
7800
7913
  })()
7801
7914
  }));
7802
7915
  effect((_p$) => {
7803
- var _v$0 = `${s().cardBody} ${expanded() ? s().cardBodyOpen : ""}`, _v$1 = `${s().cardBodyInner} ${s().stepJsonItemsCompare}`;
7804
- _v$0 !== _p$.e && className(_el$17, _p$.e = _v$0);
7805
- _v$1 !== _p$.t && className(_el$18, _p$.t = _v$1);
7916
+ var _v$1 = `${s().cardBody} ${expanded() ? s().cardBodyOpen : ""}`, _v$10 = `${s().cardBodyInner} ${s().stepJsonItemsCompare}`;
7917
+ _v$1 !== _p$.e && className(_el$17, _p$.e = _v$1);
7918
+ _v$10 !== _p$.t && className(_el$18, _p$.t = _v$10);
7806
7919
  return _p$;
7807
7920
  }, {
7808
7921
  e: void 0,
@@ -7851,9 +7964,9 @@ var AssistantStep = (props) => {
7851
7964
  }
7852
7965
  }), null);
7853
7966
  effect((_p$) => {
7854
- var _v$13 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$14 = isLong() ? s().stepContentLong : s().stepContent;
7855
- _v$13 !== _p$.e && className(_el$23, _p$.e = _v$13);
7856
- _v$14 !== _p$.t && className(_el$24, _p$.t = _v$14);
7967
+ var _v$14 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$15 = isLong() ? s().stepContentLong : s().stepContent;
7968
+ _v$14 !== _p$.e && className(_el$23, _p$.e = _v$14);
7969
+ _v$15 !== _p$.t && className(_el$24, _p$.t = _v$15);
7857
7970
  return _p$;
7858
7971
  }, {
7859
7972
  e: void 0,
@@ -7944,10 +8057,10 @@ var ToolCallStep = (props) => {
7944
8057
  }
7945
8058
  }), _el$32);
7946
8059
  effect((_p$) => {
7947
- var _v$15 = `${s().stepPrefix} ${s().stepPrefixToolCall}`, _v$16 = `${s().mwBadge} ${s().mwBadgeToolCall}`, _v$17 = `${s().chevron} ${argsOpen() ? s().chevronOpen : ""}`;
7948
- _v$15 !== _p$.e && className(_el$28, _p$.e = _v$15);
7949
- _v$16 !== _p$.t && className(_el$29, _p$.t = _v$16);
7950
- _v$17 !== _p$.a && className(_el$32, _p$.a = _v$17);
8060
+ var _v$16 = `${s().stepPrefix} ${s().stepPrefixToolCall}`, _v$17 = `${s().mwBadge} ${s().mwBadgeToolCall}`, _v$18 = `${s().chevron} ${argsOpen() ? s().chevronOpen : ""}`;
8061
+ _v$16 !== _p$.e && className(_el$28, _p$.e = _v$16);
8062
+ _v$17 !== _p$.t && className(_el$29, _p$.t = _v$17);
8063
+ _v$18 !== _p$.a && className(_el$32, _p$.a = _v$18);
7951
8064
  return _p$;
7952
8065
  }, {
7953
8066
  e: void 0,
@@ -7965,10 +8078,10 @@ var ToolCallStep = (props) => {
7965
8078
  copyable: true
7966
8079
  }));
7967
8080
  effect((_p$) => {
7968
- var _v$18 = `${s().cardBody} ${argsOpen() ? s().cardBodyOpen : ""}`, _v$19 = s().cardBodyInner, _v$20 = s().stepJsonPanel;
7969
- _v$18 !== _p$.e && className(_el$33, _p$.e = _v$18);
7970
- _v$19 !== _p$.t && className(_el$34, _p$.t = _v$19);
7971
- _v$20 !== _p$.a && className(_el$35, _p$.a = _v$20);
8081
+ var _v$19 = `${s().cardBody} ${argsOpen() ? s().cardBodyOpen : ""}`, _v$20 = s().cardBodyInner, _v$21 = s().stepJsonPanel;
8082
+ _v$19 !== _p$.e && className(_el$33, _p$.e = _v$19);
8083
+ _v$20 !== _p$.t && className(_el$34, _p$.t = _v$20);
8084
+ _v$21 !== _p$.a && className(_el$35, _p$.a = _v$21);
7972
8085
  return _p$;
7973
8086
  }, {
7974
8087
  e: void 0,
@@ -8014,10 +8127,10 @@ var ToolCallStep = (props) => {
8014
8127
  }
8015
8128
  }), _el$41);
8016
8129
  effect((_p$) => {
8017
- var _v$21 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$22 = `${s().mwBadge} ${s().mwBadgeToolResult}`, _v$23 = `${s().chevron} ${resultOpen() ? s().chevronOpen : ""}`;
8018
- _v$21 !== _p$.e && className(_el$37, _p$.e = _v$21);
8019
- _v$22 !== _p$.t && className(_el$38, _p$.t = _v$22);
8020
- _v$23 !== _p$.a && className(_el$41, _p$.a = _v$23);
8130
+ var _v$22 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$23 = `${s().mwBadge} ${s().mwBadgeToolResult}`, _v$24 = `${s().chevron} ${resultOpen() ? s().chevronOpen : ""}`;
8131
+ _v$22 !== _p$.e && className(_el$37, _p$.e = _v$22);
8132
+ _v$23 !== _p$.t && className(_el$38, _p$.t = _v$23);
8133
+ _v$24 !== _p$.a && className(_el$41, _p$.a = _v$24);
8021
8134
  return _p$;
8022
8135
  }, {
8023
8136
  e: void 0,
@@ -8035,10 +8148,10 @@ var ToolCallStep = (props) => {
8035
8148
  copyable: true
8036
8149
  }));
8037
8150
  effect((_p$) => {
8038
- var _v$24 = `${s().cardBody} ${resultOpen() ? s().cardBodyOpen : ""}`, _v$25 = s().cardBodyInner, _v$26 = s().stepJsonPanel;
8039
- _v$24 !== _p$.e && className(_el$42, _p$.e = _v$24);
8040
- _v$25 !== _p$.t && className(_el$43, _p$.t = _v$25);
8041
- _v$26 !== _p$.a && className(_el$44, _p$.a = _v$26);
8151
+ var _v$25 = `${s().cardBody} ${resultOpen() ? s().cardBodyOpen : ""}`, _v$26 = s().cardBodyInner, _v$27 = s().stepJsonPanel;
8152
+ _v$25 !== _p$.e && className(_el$42, _p$.e = _v$25);
8153
+ _v$26 !== _p$.t && className(_el$43, _p$.t = _v$26);
8154
+ _v$27 !== _p$.a && className(_el$44, _p$.a = _v$27);
8042
8155
  return _p$;
8043
8156
  }, {
8044
8157
  e: void 0,
@@ -8078,9 +8191,9 @@ var ToolResultStep = (props) => {
8078
8191
  }
8079
8192
  }), false, true);
8080
8193
  effect((_p$) => {
8081
- var _v$27 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$28 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`;
8082
- _v$27 !== _p$.e && className(_el$47, _p$.e = _v$27);
8083
- _v$28 !== _p$.t && className(_el$48, _p$.t = _v$28);
8194
+ var _v$28 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$29 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`;
8195
+ _v$28 !== _p$.e && className(_el$47, _p$.e = _v$28);
8196
+ _v$29 !== _p$.t && className(_el$48, _p$.t = _v$29);
8084
8197
  return _p$;
8085
8198
  }, {
8086
8199
  e: void 0,
@@ -8097,10 +8210,10 @@ var ToolResultStep = (props) => {
8097
8210
  copyable: true
8098
8211
  }));
8099
8212
  effect((_p$) => {
8100
- var _v$29 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$30 = s().cardBodyInner, _v$31 = s().stepJsonPanel;
8101
- _v$29 !== _p$.e && className(_el$49, _p$.e = _v$29);
8102
- _v$30 !== _p$.t && className(_el$50, _p$.t = _v$30);
8103
- _v$31 !== _p$.a && className(_el$51, _p$.a = _v$31);
8213
+ var _v$30 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$31 = s().cardBodyInner, _v$32 = s().stepJsonPanel;
8214
+ _v$30 !== _p$.e && className(_el$49, _p$.e = _v$30);
8215
+ _v$31 !== _p$.t && className(_el$50, _p$.t = _v$31);
8216
+ _v$32 !== _p$.a && className(_el$51, _p$.a = _v$32);
8104
8217
  return _p$;
8105
8218
  }, {
8106
8219
  e: void 0,
@@ -8373,9 +8486,9 @@ var IterationCard = (props) => {
8373
8486
  var _el$69 = _tmpl$17(); _el$69.firstChild;
8374
8487
  insert(_el$69, totalToolCalls, null);
8375
8488
  effect((_p$) => {
8376
- var _v$32 = `${s().badge} ${s().badgeFinishReasonToolCalls}`, _v$33 = `${totalToolCalls()} tool ${totalToolCalls() === 1 ? "call" : "calls"}`;
8377
- _v$32 !== _p$.e && className(_el$69, _p$.e = _v$32);
8378
- _v$33 !== _p$.t && setAttribute(_el$69, "title", _p$.t = _v$33);
8489
+ var _v$33 = `${s().badge} ${s().badgeFinishReasonToolCalls}`, _v$34 = `${totalToolCalls()} tool ${totalToolCalls() === 1 ? "call" : "calls"}`;
8490
+ _v$33 !== _p$.e && className(_el$69, _p$.e = _v$33);
8491
+ _v$34 !== _p$.t && setAttribute(_el$69, "title", _p$.t = _v$34);
8379
8492
  return _p$;
8380
8493
  }, {
8381
8494
  e: void 0,
@@ -8392,9 +8505,9 @@ var IterationCard = (props) => {
8392
8505
  var _el$71 = _tmpl$18(); _el$71.firstChild;
8393
8506
  insert(_el$71, () => formatDuration(duration()), null);
8394
8507
  effect((_p$) => {
8395
- var _v$34 = `${s().badge} ${s().badgeDuration}`, _v$35 = formatDuration(duration());
8396
- _v$34 !== _p$.e && className(_el$71, _p$.e = _v$34);
8397
- _v$35 !== _p$.t && setAttribute(_el$71, "title", _p$.t = _v$35);
8508
+ var _v$35 = `${s().badge} ${s().badgeDuration}`, _v$36 = formatDuration(duration());
8509
+ _v$35 !== _p$.e && className(_el$71, _p$.e = _v$35);
8510
+ _v$36 !== _p$.t && setAttribute(_el$71, "title", _p$.t = _v$36);
8398
8511
  return _p$;
8399
8512
  }, {
8400
8513
  e: void 0,
@@ -8411,9 +8524,9 @@ var IterationCard = (props) => {
8411
8524
  var _el$94 = _tmpl$25(); _el$94.firstChild;
8412
8525
  insert(_el$94, () => usage().totalTokens.toLocaleString(), null);
8413
8526
  effect((_p$) => {
8414
- var _v$56 = `${s().badge} ${s().badgeUsage}`, _v$57 = `Prompt: ${usage().promptTokens.toLocaleString()} | Completion: ${usage().completionTokens.toLocaleString()}`;
8415
- _v$56 !== _p$.e && className(_el$94, _p$.e = _v$56);
8416
- _v$57 !== _p$.t && setAttribute(_el$94, "title", _p$.t = _v$57);
8527
+ var _v$57 = `${s().badge} ${s().badgeUsage}`, _v$58 = `Prompt: ${usage().promptTokens.toLocaleString()} | Completion: ${usage().completionTokens.toLocaleString()}`;
8528
+ _v$57 !== _p$.e && className(_el$94, _p$.e = _v$57);
8529
+ _v$58 !== _p$.t && setAttribute(_el$94, "title", _p$.t = _v$58);
8417
8530
  return _p$;
8418
8531
  }, {
8419
8532
  e: void 0,
@@ -8470,12 +8583,12 @@ var IterationCard = (props) => {
8470
8583
  insert(_el$103, () => diff.from);
8471
8584
  insert(_el$105, () => diff.to);
8472
8585
  effect((_p$) => {
8473
- var _v$58 = s().configDiffRow, _v$59 = s().configDiffKey, _v$60 = s().configDiffFrom, _v$61 = s().configDiffArrow, _v$62 = s().configDiffTo;
8474
- _v$58 !== _p$.e && className(_el$100, _p$.e = _v$58);
8475
- _v$59 !== _p$.t && className(_el$101, _p$.t = _v$59);
8476
- _v$60 !== _p$.a && className(_el$103, _p$.a = _v$60);
8477
- _v$61 !== _p$.o && className(_el$104, _p$.o = _v$61);
8478
- _v$62 !== _p$.i && className(_el$105, _p$.i = _v$62);
8586
+ var _v$59 = s().configDiffRow, _v$60 = s().configDiffKey, _v$61 = s().configDiffFrom, _v$62 = s().configDiffArrow, _v$63 = s().configDiffTo;
8587
+ _v$59 !== _p$.e && className(_el$100, _p$.e = _v$59);
8588
+ _v$60 !== _p$.t && className(_el$101, _p$.t = _v$60);
8589
+ _v$61 !== _p$.a && className(_el$103, _p$.a = _v$61);
8590
+ _v$62 !== _p$.o && className(_el$104, _p$.o = _v$62);
8591
+ _v$63 !== _p$.i && className(_el$105, _p$.i = _v$63);
8479
8592
  return _p$;
8480
8593
  }, {
8481
8594
  e: void 0,
@@ -8488,10 +8601,10 @@ var IterationCard = (props) => {
8488
8601
  })()
8489
8602
  }));
8490
8603
  effect((_p$) => {
8491
- var _v$36 = s().configPanelSection, _v$37 = s().configPanelLabel, _v$38 = s().configDiffSection;
8492
- _v$36 !== _p$.e && className(_el$78, _p$.e = _v$36);
8493
- _v$37 !== _p$.t && className(_el$79, _p$.t = _v$37);
8494
- _v$38 !== _p$.a && className(_el$80, _p$.a = _v$38);
8604
+ var _v$37 = s().configPanelSection, _v$38 = s().configPanelLabel, _v$39 = s().configDiffSection;
8605
+ _v$37 !== _p$.e && className(_el$78, _p$.e = _v$37);
8606
+ _v$38 !== _p$.t && className(_el$79, _p$.t = _v$38);
8607
+ _v$39 !== _p$.a && className(_el$80, _p$.a = _v$39);
8495
8608
  return _p$;
8496
8609
  }, {
8497
8610
  e: void 0,
@@ -8516,9 +8629,9 @@ var IterationCard = (props) => {
8516
8629
  insert(_el$106, name, _el$107);
8517
8630
  insert(_el$107, () => toolInvocationCounts().get(name) || 0);
8518
8631
  effect((_p$) => {
8519
- var _v$63 = s().configToolChip, _v$64 = s().configToolChipCount;
8520
- _v$63 !== _p$.e && className(_el$106, _p$.e = _v$63);
8521
- _v$64 !== _p$.t && className(_el$107, _p$.t = _v$64);
8632
+ var _v$64 = s().configToolChip, _v$65 = s().configToolChipCount;
8633
+ _v$64 !== _p$.e && className(_el$106, _p$.e = _v$64);
8634
+ _v$65 !== _p$.t && className(_el$107, _p$.t = _v$65);
8522
8635
  return _p$;
8523
8636
  }, {
8524
8637
  e: void 0,
@@ -8528,10 +8641,10 @@ var IterationCard = (props) => {
8528
8641
  })()
8529
8642
  }));
8530
8643
  effect((_p$) => {
8531
- var _v$39 = s().configPanelSection, _v$40 = s().configPanelLabel, _v$41 = s().configToolsList;
8532
- _v$39 !== _p$.e && className(_el$81, _p$.e = _v$39);
8533
- _v$40 !== _p$.t && className(_el$82, _p$.t = _v$40);
8534
- _v$41 !== _p$.a && className(_el$83, _p$.a = _v$41);
8644
+ var _v$40 = s().configPanelSection, _v$41 = s().configPanelLabel, _v$42 = s().configToolsList;
8645
+ _v$40 !== _p$.e && className(_el$81, _p$.e = _v$40);
8646
+ _v$41 !== _p$.t && className(_el$82, _p$.t = _v$41);
8647
+ _v$42 !== _p$.a && className(_el$83, _p$.a = _v$42);
8535
8648
  return _p$;
8536
8649
  }, {
8537
8650
  e: void 0,
@@ -8560,9 +8673,9 @@ var IterationCard = (props) => {
8560
8673
  })
8561
8674
  }), null);
8562
8675
  effect((_p$) => {
8563
- var _v$42 = s().configPanelSection, _v$43 = s().configPanelLabel;
8564
- _v$42 !== _p$.e && className(_el$84, _p$.e = _v$42);
8565
- _v$43 !== _p$.t && className(_el$85, _p$.t = _v$43);
8676
+ var _v$43 = s().configPanelSection, _v$44 = s().configPanelLabel;
8677
+ _v$43 !== _p$.e && className(_el$84, _p$.e = _v$43);
8678
+ _v$44 !== _p$.t && className(_el$85, _p$.t = _v$44);
8566
8679
  return _p$;
8567
8680
  }, {
8568
8681
  e: void 0,
@@ -8585,10 +8698,10 @@ var IterationCard = (props) => {
8585
8698
  copyable: true
8586
8699
  }));
8587
8700
  effect((_p$) => {
8588
- var _v$44 = s().configPanelSection, _v$45 = s().configPanelLabel, _v$46 = s().configJsonTreeContainer;
8589
- _v$44 !== _p$.e && className(_el$89, _p$.e = _v$44);
8590
- _v$45 !== _p$.t && className(_el$90, _p$.t = _v$45);
8591
- _v$46 !== _p$.a && className(_el$91, _p$.a = _v$46);
8701
+ var _v$45 = s().configPanelSection, _v$46 = s().configPanelLabel, _v$47 = s().configJsonTreeContainer;
8702
+ _v$45 !== _p$.e && className(_el$89, _p$.e = _v$45);
8703
+ _v$46 !== _p$.t && className(_el$90, _p$.t = _v$46);
8704
+ _v$47 !== _p$.a && className(_el$91, _p$.a = _v$47);
8592
8705
  return _p$;
8593
8706
  }, {
8594
8707
  e: void 0,
@@ -8690,16 +8803,16 @@ var IterationCard = (props) => {
8690
8803
  })
8691
8804
  }));
8692
8805
  effect((_p$) => {
8693
- 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;
8694
- _v$47 !== _p$.e && className(_el$54, _p$.e = _v$47);
8695
- _v$48 !== _p$.t && className(_el$55, _p$.t = _v$48);
8696
- _v$49 !== _p$.a && className(_el$56, _p$.a = _v$49);
8697
- _v$50 !== _p$.o && className(_el$67, _p$.o = _v$50);
8698
- _v$51 !== _p$.i && className(_el$74, _p$.i = _v$51);
8699
- _v$52 !== _p$.n && className(_el$75, _p$.n = _v$52);
8700
- _v$53 !== _p$.s && className(_el$76, _p$.s = _v$53);
8701
- _v$54 !== _p$.h && className(_el$92, _p$.h = _v$54);
8702
- _v$55 !== _p$.r && className(_el$93, _p$.r = _v$55);
8806
+ 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;
8807
+ _v$48 !== _p$.e && className(_el$54, _p$.e = _v$48);
8808
+ _v$49 !== _p$.t && className(_el$55, _p$.t = _v$49);
8809
+ _v$50 !== _p$.a && className(_el$56, _p$.a = _v$50);
8810
+ _v$51 !== _p$.o && className(_el$67, _p$.o = _v$51);
8811
+ _v$52 !== _p$.i && className(_el$74, _p$.i = _v$52);
8812
+ _v$53 !== _p$.n && className(_el$75, _p$.n = _v$53);
8813
+ _v$54 !== _p$.s && className(_el$76, _p$.s = _v$54);
8814
+ _v$55 !== _p$.h && className(_el$92, _p$.h = _v$55);
8815
+ _v$56 !== _p$.r && className(_el$93, _p$.r = _v$56);
8703
8816
  return _p$;
8704
8817
  }, {
8705
8818
  e: void 0,
@@ -10962,13 +11075,310 @@ var MemoryPanel = () => {
10962
11075
  })();
10963
11076
  };
10964
11077
  delegateEvents(["click"]);
10965
- var _tmpl$40 = /* @__PURE__ */ template(`<ul>`);
10966
- var _tmpl$214 = /* @__PURE__ */ template(`<div><div>Catalog`);
10967
- var _tmpl$310 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-skills-panel>`);
10968
- 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\`.`);
10969
- var _tmpl$57 = /* @__PURE__ */ template(`<div>Loaded via \`load_skill\`, but the catalog snapshot has not arrived yet.`);
10970
- var _tmpl$67 = /* @__PURE__ */ template(`<span>loaded`);
10971
- var _tmpl$77 = /* @__PURE__ */ template(`<li><span></span><span>`);
11078
+ var _tmpl$40 = /* @__PURE__ */ template(`<div><div></div><div>`);
11079
+ var _tmpl$214 = /* @__PURE__ */ template(`<div>`);
11080
+ var _tmpl$310 = /* @__PURE__ */ template(`<div><div> (<!>)`);
11081
+ var _tmpl$47 = /* @__PURE__ */ template(`<span> \u2192 <!> tok`);
11082
+ var _tmpl$57 = /* @__PURE__ */ template(`<span>ms`);
11083
+ var _tmpl$67 = /* @__PURE__ */ template(`<span>checkpoint`);
11084
+ 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`);
11085
+ var _tmpl$87 = /* @__PURE__ */ template(`<div><span> event</span><button type=button>Clear`);
11086
+ var _tmpl$97 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-compaction-panel>`);
11087
+ var _tmpl$06 = /* @__PURE__ */ template(`<div>No compaction yet. When the transcript passes maxTokens, each compact appears here.`);
11088
+ function formatTime3(value) {
11089
+ const date = new Date(value);
11090
+ if (Number.isNaN(date.getTime())) return "";
11091
+ return date.toLocaleTimeString();
11092
+ }
11093
+ function shortStrategy(event) {
11094
+ const key = event.strategyKey;
11095
+ if (!key) return event.reusedCheckpoint ? "checkpoint" : "compaction";
11096
+ const cut = key.indexOf(":maxTokens=");
11097
+ return cut === -1 ? key : key.slice(0, cut);
11098
+ }
11099
+ var PreviewMessage = (props) => {
11100
+ const styles = useStyles();
11101
+ return (() => {
11102
+ var _el$ = _tmpl$40(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
11103
+ insert(_el$2, () => props.preview.role, null);
11104
+ insert(_el$2, createComponent(Show, {
11105
+ get when() {
11106
+ return props.preview.tokens > 0;
11107
+ },
11108
+ get children() {
11109
+ return ` \xB7 ${props.preview.tokens} tok`;
11110
+ }
11111
+ }), null);
11112
+ insert(_el$3, () => props.preview.text);
11113
+ effect((_p$) => {
11114
+ var _v$ = styles().hookDetails.message, _v$2 = styles().hookDetails.messageRole, _v$3 = styles().hookDetails.messageContent;
11115
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
11116
+ _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
11117
+ _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
11118
+ return _p$;
11119
+ }, {
11120
+ e: void 0,
11121
+ t: void 0,
11122
+ a: void 0
11123
+ });
11124
+ return _el$;
11125
+ })();
11126
+ };
11127
+ var PreviewColumn = (props) => {
11128
+ const styles = useStyles();
11129
+ const s = () => styles().iterationTimeline;
11130
+ return (() => {
11131
+ var _el$4 = _tmpl$310(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$8 = _el$6.nextSibling; _el$8.nextSibling;
11132
+ insert(_el$5, () => props.title, _el$6);
11133
+ insert(_el$5, () => props.previews.length, _el$8);
11134
+ insert(_el$4, createComponent(Show, {
11135
+ get when() {
11136
+ return props.previews.length > 0;
11137
+ },
11138
+ get fallback() {
11139
+ return (() => {
11140
+ var _el$0 = _tmpl$214();
11141
+ insert(_el$0, () => props.empty);
11142
+ effect(() => className(_el$0, styles().hookDetails.emptySmall));
11143
+ return _el$0;
11144
+ })();
11145
+ },
11146
+ get children() {
11147
+ var _el$9 = _tmpl$214();
11148
+ insert(_el$9, createComponent(For, {
11149
+ get each() {
11150
+ return props.previews;
11151
+ },
11152
+ children: (preview) => createComponent(PreviewMessage, {
11153
+ preview
11154
+ })
11155
+ }));
11156
+ effect(() => className(_el$9, styles().memoryPanel.list));
11157
+ return _el$9;
11158
+ }
11159
+ }), null);
11160
+ effect((_p$) => {
11161
+ var _v$4 = s().stepJsonItem, _v$5 = s().stepJsonItemLabel;
11162
+ _v$4 !== _p$.e && className(_el$4, _p$.e = _v$4);
11163
+ _v$5 !== _p$.t && className(_el$5, _p$.t = _v$5);
11164
+ return _p$;
11165
+ }, {
11166
+ e: void 0,
11167
+ t: void 0
11168
+ });
11169
+ return _el$4;
11170
+ })();
11171
+ };
11172
+ function kindLabel(kind) {
11173
+ if (kind === "started") return "Started";
11174
+ if (kind === "ended") return "Ended";
11175
+ return "State";
11176
+ }
11177
+ var CompactEvent = (props) => {
11178
+ const styles = useStyles();
11179
+ const s = () => styles().iterationTimeline;
11180
+ const [expanded, setExpanded] = createSignal(props.defaultOpen === true);
11181
+ const event = () => props.event;
11182
+ const isState = () => event().kind === "state";
11183
+ const stats = () => ({
11184
+ kind: event().kind,
11185
+ before: event().before,
11186
+ after: event().after,
11187
+ messagesBefore: event().messagesBefore,
11188
+ messagesAfter: event().messagesAfter,
11189
+ maxTokens: event().maxTokens,
11190
+ strategyKey: event().strategyKey,
11191
+ reusedCheckpoint: event().reusedCheckpoint,
11192
+ durationMs: event().durationMs
11193
+ });
11194
+ const countLabel = () => {
11195
+ if (event().kind === "started") {
11196
+ return `${event().messagesBefore ?? 0} msgs \xB7 ${event().before ?? 0} tok`;
11197
+ }
11198
+ if (event().kind === "ended") {
11199
+ return `${event().messagesAfter ?? 0} msgs \xB7 ${event().after ?? 0} tok`;
11200
+ }
11201
+ return `${event().messagesBefore ?? 0} \u2192 ${event().messagesAfter ?? 0} msgs`;
11202
+ };
11203
+ return [(() => {
11204
+ 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;
11205
+ _el$1.$$click = () => setExpanded(!expanded());
11206
+ insert(_el$10, () => kindLabel(event().kind));
11207
+ insert(_el$11, () => shortStrategy(event()));
11208
+ insert(_el$12, countLabel);
11209
+ insert(_el$1, createComponent(Show, {
11210
+ get when() {
11211
+ return event().kind === "state";
11212
+ },
11213
+ get children() {
11214
+ var _el$13 = _tmpl$47(), _el$14 = _el$13.firstChild, _el$16 = _el$14.nextSibling; _el$16.nextSibling;
11215
+ insert(_el$13, () => event().before, _el$14);
11216
+ insert(_el$13, () => event().after, _el$16);
11217
+ effect(() => className(_el$13, s().stepDuration));
11218
+ return _el$13;
11219
+ }
11220
+ }), _el$20);
11221
+ insert(_el$1, createComponent(Show, {
11222
+ get when() {
11223
+ return event().durationMs !== void 0;
11224
+ },
11225
+ get children() {
11226
+ var _el$17 = _tmpl$57(), _el$18 = _el$17.firstChild;
11227
+ insert(_el$17, () => event().durationMs, _el$18);
11228
+ effect(() => className(_el$17, s().stepDuration));
11229
+ return _el$17;
11230
+ }
11231
+ }), _el$20);
11232
+ insert(_el$1, createComponent(Show, {
11233
+ get when() {
11234
+ return event().reusedCheckpoint;
11235
+ },
11236
+ get children() {
11237
+ var _el$19 = _tmpl$67();
11238
+ effect(() => className(_el$19, s().mwSuffix));
11239
+ return _el$19;
11240
+ }
11241
+ }), _el$20);
11242
+ insert(_el$20, () => formatTime3(event().timestamp));
11243
+ effect((_p$) => {
11244
+ 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 : ""}`;
11245
+ _v$6 !== _p$.e && className(_el$1, _p$.e = _v$6);
11246
+ _v$7 !== _p$.t && setAttribute(_el$1, "data-kind", _p$.t = _v$7);
11247
+ _v$8 !== _p$.a && className(_el$10, _p$.a = _v$8);
11248
+ _v$9 !== _p$.o && className(_el$11, _p$.o = _v$9);
11249
+ _v$0 !== _p$.i && className(_el$12, _p$.i = _v$0);
11250
+ _v$1 !== _p$.n && className(_el$20, _p$.n = _v$1);
11251
+ _v$10 !== _p$.s && className(_el$21, _p$.s = _v$10);
11252
+ return _p$;
11253
+ }, {
11254
+ e: void 0,
11255
+ t: void 0,
11256
+ a: void 0,
11257
+ o: void 0,
11258
+ i: void 0,
11259
+ n: void 0,
11260
+ s: void 0
11261
+ });
11262
+ return _el$1;
11263
+ })(), createComponent(Show, {
11264
+ get when() {
11265
+ return expanded();
11266
+ },
11267
+ get children() {
11268
+ return [(() => {
11269
+ var _el$22 = _tmpl$214();
11270
+ insert(_el$22, createComponent(JsonTree, {
11271
+ get value() {
11272
+ return stats();
11273
+ },
11274
+ defaultExpansionDepth: 1,
11275
+ copyable: true
11276
+ }));
11277
+ effect(() => className(_el$22, s().mwChangesContainer));
11278
+ return _el$22;
11279
+ })(), createComponent(Show, {
11280
+ get when() {
11281
+ return isState();
11282
+ },
11283
+ get children() {
11284
+ var _el$23 = _tmpl$214();
11285
+ insert(_el$23, createComponent(PreviewColumn, {
11286
+ title: "Dropped",
11287
+ get previews() {
11288
+ return event().dropped ?? [];
11289
+ },
11290
+ empty: "Nothing was dropped."
11291
+ }), null);
11292
+ insert(_el$23, createComponent(PreviewColumn, {
11293
+ title: "Sent to model",
11294
+ get previews() {
11295
+ return event().result ?? [];
11296
+ },
11297
+ empty: "No compacted transcript on this event."
11298
+ }), null);
11299
+ effect(() => className(_el$23, s().stepJsonItemsCompare));
11300
+ return _el$23;
11301
+ }
11302
+ })];
11303
+ }
11304
+ })];
11305
+ };
11306
+ var CompactionPanel = (props) => {
11307
+ const {
11308
+ state,
11309
+ clearCompaction
11310
+ } = useAIStore();
11311
+ const styles = useStyles();
11312
+ const s = () => styles().iterationTimeline;
11313
+ const events = createMemo(() => compactionEventsForHook(state.compaction, props.hook));
11314
+ const lastStateIndex = createMemo(() => {
11315
+ const list = events();
11316
+ for (let i = list.length - 1; i >= 0; i--) {
11317
+ if (list[i]?.kind === "state") return i;
11318
+ }
11319
+ return -1;
11320
+ });
11321
+ return (() => {
11322
+ var _el$24 = _tmpl$97();
11323
+ insert(_el$24, createComponent(Show, {
11324
+ get when() {
11325
+ return events().length > 0;
11326
+ },
11327
+ get fallback() {
11328
+ return (() => {
11329
+ var _el$30 = _tmpl$06();
11330
+ effect(() => className(_el$30, styles().hookDetails.emptySmall));
11331
+ return _el$30;
11332
+ })();
11333
+ },
11334
+ get children() {
11335
+ return [(() => {
11336
+ var _el$25 = _tmpl$87(), _el$26 = _el$25.firstChild, _el$27 = _el$26.firstChild, _el$28 = _el$26.nextSibling;
11337
+ insert(_el$26, () => events().length, _el$27);
11338
+ insert(_el$26, () => events().length === 1 ? "" : "s", null);
11339
+ _el$28.$$click = () => clearCompaction();
11340
+ effect((_p$) => {
11341
+ var _v$11 = styles().memoryPanel.toolbar, _v$12 = styles().memoryPanel.badge, _v$13 = styles().memoryPanel.clearButton;
11342
+ _v$11 !== _p$.e && className(_el$25, _p$.e = _v$11);
11343
+ _v$12 !== _p$.t && className(_el$26, _p$.t = _v$12);
11344
+ _v$13 !== _p$.a && className(_el$28, _p$.a = _v$13);
11345
+ return _p$;
11346
+ }, {
11347
+ e: void 0,
11348
+ t: void 0,
11349
+ a: void 0
11350
+ });
11351
+ return _el$25;
11352
+ })(), (() => {
11353
+ var _el$29 = _tmpl$214();
11354
+ insert(_el$29, createComponent(For, {
11355
+ get each() {
11356
+ return events();
11357
+ },
11358
+ children: (event, index) => createComponent(CompactEvent, {
11359
+ event,
11360
+ get defaultOpen() {
11361
+ return memo(() => event.kind === "state")() && index() === lastStateIndex();
11362
+ }
11363
+ })
11364
+ }));
11365
+ effect(() => className(_el$29, s().iterCard));
11366
+ return _el$29;
11367
+ })()];
11368
+ }
11369
+ }));
11370
+ effect(() => className(_el$24, styles().memoryPanel.container));
11371
+ return _el$24;
11372
+ })();
11373
+ };
11374
+ delegateEvents(["click"]);
11375
+ var _tmpl$41 = /* @__PURE__ */ template(`<ul>`);
11376
+ var _tmpl$215 = /* @__PURE__ */ template(`<div><div>Catalog`);
11377
+ var _tmpl$311 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-skills-panel>`);
11378
+ 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\`.`);
11379
+ var _tmpl$58 = /* @__PURE__ */ template(`<div>Loaded via \`load_skill\`, but the catalog snapshot has not arrived yet.`);
11380
+ var _tmpl$68 = /* @__PURE__ */ template(`<span>loaded`);
11381
+ var _tmpl$78 = /* @__PURE__ */ template(`<li><span></span><span>`);
10972
11382
  function parseSkillName(argumentsJson) {
10973
11383
  if (!argumentsJson) return void 0;
10974
11384
  try {
@@ -11026,33 +11436,33 @@ var SkillsPanel = () => {
11026
11436
  });
11027
11437
  const catalog = createMemo(() => snapshot()?.catalog ?? []);
11028
11438
  return (() => {
11029
- var _el$ = _tmpl$310();
11439
+ var _el$ = _tmpl$311();
11030
11440
  insert(_el$, createComponent(Show, {
11031
11441
  get when() {
11032
11442
  return catalog().length > 0 || loaded().size > 0;
11033
11443
  },
11034
11444
  get fallback() {
11035
11445
  return (() => {
11036
- var _el$5 = _tmpl$47();
11446
+ var _el$5 = _tmpl$48();
11037
11447
  effect(() => className(_el$5, styles().memoryPanel.empty));
11038
11448
  return _el$5;
11039
11449
  })();
11040
11450
  },
11041
11451
  get children() {
11042
- var _el$2 = _tmpl$214(), _el$3 = _el$2.firstChild;
11452
+ var _el$2 = _tmpl$215(), _el$3 = _el$2.firstChild;
11043
11453
  insert(_el$2, createComponent(Show, {
11044
11454
  get when() {
11045
11455
  return catalog().length > 0;
11046
11456
  },
11047
11457
  get fallback() {
11048
11458
  return (() => {
11049
- var _el$6 = _tmpl$57();
11459
+ var _el$6 = _tmpl$58();
11050
11460
  effect(() => className(_el$6, styles().memoryPanel.sectionEmpty));
11051
11461
  return _el$6;
11052
11462
  })();
11053
11463
  },
11054
11464
  get children() {
11055
- var _el$4 = _tmpl$40();
11465
+ var _el$4 = _tmpl$41();
11056
11466
  insert(_el$4, createComponent(For, {
11057
11467
  get each() {
11058
11468
  return catalog();
@@ -11060,14 +11470,14 @@ var SkillsPanel = () => {
11060
11470
  children: (skill) => {
11061
11471
  const isLoaded = () => loaded().has(skill.name);
11062
11472
  return (() => {
11063
- var _el$7 = _tmpl$77(), _el$8 = _el$7.firstChild, _el$0 = _el$8.nextSibling;
11473
+ var _el$7 = _tmpl$78(), _el$8 = _el$7.firstChild, _el$0 = _el$8.nextSibling;
11064
11474
  insert(_el$8, () => skill.name);
11065
11475
  insert(_el$7, createComponent(Show, {
11066
11476
  get when() {
11067
11477
  return isLoaded();
11068
11478
  },
11069
11479
  get children() {
11070
- var _el$9 = _tmpl$67();
11480
+ var _el$9 = _tmpl$68();
11071
11481
  effect(() => className(_el$9, styles().memoryPanel.badge));
11072
11482
  return _el$9;
11073
11483
  }
@@ -11110,16 +11520,16 @@ var SkillsPanel = () => {
11110
11520
  };
11111
11521
 
11112
11522
  // src/components/hooks/HookDetails.tsx
11113
- var _tmpl$41 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
11114
- 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>`);
11115
- 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>`);
11116
- var _tmpl$48 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
11117
- var _tmpl$58 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
11118
- var _tmpl$68 = /* @__PURE__ */ template(`<span>running`);
11119
- var _tmpl$78 = /* @__PURE__ */ template(`<span> new`);
11120
- var _tmpl$87 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
11121
- var _tmpl$97 = /* @__PURE__ */ template(`<div><span></span><span>`);
11122
- var _tmpl$06 = /* @__PURE__ */ template(`<span>`);
11523
+ var _tmpl$49 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
11524
+ 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>`);
11525
+ 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>`);
11526
+ var _tmpl$410 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
11527
+ var _tmpl$59 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
11528
+ var _tmpl$69 = /* @__PURE__ */ template(`<span>running`);
11529
+ var _tmpl$79 = /* @__PURE__ */ template(`<span> new`);
11530
+ var _tmpl$88 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
11531
+ var _tmpl$98 = /* @__PURE__ */ template(`<div><span></span><span>`);
11532
+ var _tmpl$07 = /* @__PURE__ */ template(`<span>`);
11123
11533
  var _tmpl$116 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-technical-name>`);
11124
11534
  var _tmpl$106 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-registry-id>id `);
11125
11535
  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>`);
@@ -11132,7 +11542,7 @@ var _tmpl$173 = /* @__PURE__ */ template(`<div><button type=button data-testid=a
11132
11542
  var _tmpl$182 = /* @__PURE__ */ template(`<div><span>`);
11133
11543
  var _tmpl$192 = /* @__PURE__ */ template(`<div><span></span><div>`);
11134
11544
  var _tmpl$202 = /* @__PURE__ */ template(`<div>No messages yet. Start a conversation to see messages here.`);
11135
- var _tmpl$216 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-tools><div></div><div>`);
11545
+ var _tmpl$217 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-tools><div></div><div>`);
11136
11546
  var _tmpl$223 = /* @__PURE__ */ template(`<div>No tools.`);
11137
11547
  var _tmpl$232 = /* @__PURE__ */ template(`<span>approval`);
11138
11548
  var _tmpl$242 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-tool-row><span>`);
@@ -11172,7 +11582,7 @@ var HookDetails = () => {
11172
11582
  return Boolean(outputKind && outputKind !== "chat" && outputKind !== "structured");
11173
11583
  });
11174
11584
  createEffect(() => {
11175
- if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory" || activeTab() === "skills")) {
11585
+ if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory" || activeTab() === "compaction" || activeTab() === "skills")) {
11176
11586
  setActiveTab("conversation");
11177
11587
  }
11178
11588
  });
@@ -11210,14 +11620,15 @@ var HookDetails = () => {
11210
11620
  return createComponent(HookOverview, {
11211
11621
  onSelectHook: (selectedHook) => {
11212
11622
  selectHook(selectedHook.id);
11213
- if (state.conversations[selectedHook.id]) {
11214
- selectConversation(selectedHook.id);
11623
+ const conversationId = selectedHook.id || selectedHook.clientId || selectedHook.threadId;
11624
+ if (conversationId && state.conversations[conversationId]) {
11625
+ selectConversation(conversationId);
11215
11626
  }
11216
11627
  }
11217
11628
  });
11218
11629
  },
11219
11630
  children: (activeHook) => (() => {
11220
- var _el$ = _tmpl$215(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
11631
+ var _el$ = _tmpl$216(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
11221
11632
  insert(_el$, createComponent(HookHeader, {
11222
11633
  get hook() {
11223
11634
  return activeHook();
@@ -11280,6 +11691,13 @@ var HookDetails = () => {
11280
11691
  return activeTab();
11281
11692
  },
11282
11693
  onSelect: setActiveTab
11694
+ }), createComponent(TabButton, {
11695
+ label: "Compaction",
11696
+ tab: "compaction",
11697
+ get activeTab() {
11698
+ return activeTab();
11699
+ },
11700
+ onSelect: setActiveTab
11283
11701
  }), createComponent(TabButton, {
11284
11702
  label: "Skills",
11285
11703
  tab: "skills",
@@ -11366,6 +11784,18 @@ var HookDetails = () => {
11366
11784
  return createComponent(MemoryPanel, {});
11367
11785
  }
11368
11786
  }), null);
11787
+ insert(_el$4, createComponent(Show, {
11788
+ get when() {
11789
+ return activeTab() === "compaction";
11790
+ },
11791
+ get children() {
11792
+ return createComponent(CompactionPanel, {
11793
+ get hook() {
11794
+ return activeHook();
11795
+ }
11796
+ });
11797
+ }
11798
+ }), null);
11369
11799
  insert(_el$4, createComponent(Show, {
11370
11800
  get when() {
11371
11801
  return activeTab() === "skills";
@@ -11379,7 +11809,7 @@ var HookDetails = () => {
11379
11809
  return showSecondaryPane();
11380
11810
  },
11381
11811
  get children() {
11382
- var _el$5 = _tmpl$41(), _el$6 = _el$5.firstChild;
11812
+ var _el$5 = _tmpl$49(), _el$6 = _el$5.firstChild;
11383
11813
  _el$5.addEventListener("mouseleave", () => setHoverTarget(null));
11384
11814
  _el$5.$$mouseover = (event) => setHoverTargetFromEvent(event, "preview", setHoverTarget);
11385
11815
  use((el) => {
@@ -11460,13 +11890,13 @@ var HookOverview = (props) => {
11460
11890
  },
11461
11891
  get fallback() {
11462
11892
  return (() => {
11463
- var _el$12 = _tmpl$48();
11893
+ var _el$12 = _tmpl$410();
11464
11894
  effect(() => className(_el$12, styles().hookDetails.empty));
11465
11895
  return _el$12;
11466
11896
  })();
11467
11897
  },
11468
11898
  get children() {
11469
- 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;
11899
+ 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;
11470
11900
  insert(_el$10, createComponent(OverviewMetric, {
11471
11901
  label: "active hooks",
11472
11902
  get value() {
@@ -11520,7 +11950,7 @@ var HookOverview = (props) => {
11520
11950
  return groups();
11521
11951
  },
11522
11952
  children: (group) => (() => {
11523
- var _el$13 = _tmpl$58(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
11953
+ var _el$13 = _tmpl$59(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
11524
11954
  insert(_el$15, () => group.label);
11525
11955
  insert(_el$16, () => group.hooks.length);
11526
11956
  insert(_el$13, createComponent(For, {
@@ -11531,7 +11961,7 @@ var HookOverview = (props) => {
11531
11961
  const running = createMemo(() => isHookRunning(hook, state.hooks.runs));
11532
11962
  const unseenCount = createMemo(() => getHookUnseenEventCount(state.hooks, hook.id));
11533
11963
  return (() => {
11534
- 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;
11964
+ 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;
11535
11965
  _el$17.$$click = () => props.onSelectHook(hook);
11536
11966
  insert(_el$19, () => getHookDisplayName(hook));
11537
11967
  insert(_el$20, () => getHookIdentitySubtitle(hook));
@@ -11541,7 +11971,7 @@ var HookOverview = (props) => {
11541
11971
  return running();
11542
11972
  },
11543
11973
  get children() {
11544
- var _el$23 = _tmpl$68();
11974
+ var _el$23 = _tmpl$69();
11545
11975
  effect(() => className(_el$23, styles().hookDetails.lifecycle));
11546
11976
  return _el$23;
11547
11977
  }
@@ -11551,7 +11981,7 @@ var HookOverview = (props) => {
11551
11981
  return unseenCount() > 0;
11552
11982
  },
11553
11983
  get children() {
11554
- var _el$24 = _tmpl$78(), _el$25 = _el$24.firstChild;
11984
+ var _el$24 = _tmpl$79(), _el$25 = _el$24.firstChild;
11555
11985
  insert(_el$24, unseenCount, _el$25);
11556
11986
  effect(() => className(_el$24, styles().hookDetails.kind));
11557
11987
  return _el$24;
@@ -11622,7 +12052,7 @@ var HookOverview = (props) => {
11622
12052
  var OverviewMetric = (props) => {
11623
12053
  const styles = useStyles();
11624
12054
  return (() => {
11625
- var _el$26 = _tmpl$97(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling;
12055
+ var _el$26 = _tmpl$98(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling;
11626
12056
  insert(_el$27, () => props.value);
11627
12057
  insert(_el$28, () => props.label);
11628
12058
  effect((_p$) => {
@@ -11650,7 +12080,7 @@ var HookHeader = (props) => {
11650
12080
  return props.hook.outputKind;
11651
12081
  },
11652
12082
  get children() {
11653
- var _el$34 = _tmpl$06();
12083
+ var _el$34 = _tmpl$07();
11654
12084
  insert(_el$34, () => props.hook.outputKind);
11655
12085
  effect(() => className(_el$34, styles().hookDetails.kind));
11656
12086
  return _el$34;
@@ -11685,7 +12115,7 @@ var HookHeader = (props) => {
11685
12115
  return props.hook.framework;
11686
12116
  },
11687
12117
  get children() {
11688
- var _el$40 = _tmpl$06();
12118
+ var _el$40 = _tmpl$07();
11689
12119
  insert(_el$40, () => props.hook.framework);
11690
12120
  return _el$40;
11691
12121
  }
@@ -11754,7 +12184,7 @@ var HookHeader = (props) => {
11754
12184
  var Metric = (props) => {
11755
12185
  const styles = useStyles();
11756
12186
  return (() => {
11757
- var _el$42 = _tmpl$97(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
12187
+ var _el$42 = _tmpl$98(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
11758
12188
  insert(_el$43, () => props.value);
11759
12189
  insert(_el$44, () => props.label);
11760
12190
  effect((_p$) => {
@@ -12046,7 +12476,7 @@ var MessagesPreview = (props) => {
12046
12476
  },
12047
12477
  get fallback() {
12048
12478
  return (() => {
12049
- var _el$60 = _tmpl$06();
12479
+ var _el$60 = _tmpl$07();
12050
12480
  insert(_el$60, () => part.content);
12051
12481
  effect(() => className(_el$60, styles().hookDetails.previewPartContent));
12052
12482
  return _el$60;
@@ -12180,7 +12610,7 @@ var HookMessageTimeline = (props) => {
12180
12610
  },
12181
12611
  get fallback() {
12182
12612
  return (() => {
12183
- var _el$72 = _tmpl$06();
12613
+ var _el$72 = _tmpl$07();
12184
12614
  insert(_el$72, () => part.content);
12185
12615
  effect(() => className(_el$72, styles().hookDetails.previewPartContent));
12186
12616
  return _el$72;
@@ -12244,7 +12674,7 @@ var ToolsView = (props) => {
12244
12674
  const selectedTool = createMemo(() => props.hook.tools.find((tool) => tool.name === selectedToolName()));
12245
12675
  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));
12246
12676
  return (() => {
12247
- var _el$76 = _tmpl$216(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
12677
+ var _el$76 = _tmpl$217(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
12248
12678
  insert(_el$77, createComponent(Show, {
12249
12679
  get when() {
12250
12680
  return props.hook.tools.length > 0;
@@ -12335,7 +12765,7 @@ var ToolsView = (props) => {
12335
12765
  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;
12336
12766
  insert(_el$89, () => fixture.name ?? fixture.toolName);
12337
12767
  insert(_el$90, () => fixture.toolName, _el$91);
12338
- insert(_el$90, () => formatTime3(fixture.createdAt), null);
12768
+ insert(_el$90, () => formatTime4(fixture.createdAt), null);
12339
12769
  _el$93.$$click = () => applyToolFixture(fixture);
12340
12770
  _el$94.$$click = () => deleteToolFixture(fixture.id);
12341
12771
  effect((_p$) => {
@@ -12835,13 +13265,13 @@ function jsonSafeValue(value) {
12835
13265
  return `[ai-devtools] unserializable value: ${error instanceof Error ? error.message : String(error)}`;
12836
13266
  }
12837
13267
  }
12838
- function formatTime3(timestamp) {
13268
+ function formatTime4(timestamp) {
12839
13269
  return new Date(timestamp).toLocaleTimeString();
12840
13270
  }
12841
13271
  delegateEvents(["mouseover", "click"]);
12842
13272
 
12843
13273
  // src/components/Shell.tsx
12844
- 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>`);
13274
+ 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>`);
12845
13275
  function Devtools(props) {
12846
13276
  return createComponent(ThemeContextProvider, {
12847
13277
  get theme() {
@@ -12923,7 +13353,7 @@ function DevtoolsContent() {
12923
13353
  });
12924
13354
  return createComponent(MainPanel, {
12925
13355
  get children() {
12926
- 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;
13356
+ 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;
12927
13357
  insert(_el$, createComponent(Header, {
12928
13358
  get children() {
12929
13359
  return createComponent(HeaderLogo, {