@tanstack/ai-devtools-core 0.5.9 → 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';
@@ -1999,7 +1999,6 @@ var stylesFactory = (theme) => {
1999
1999
  border: 1px solid ${t(colors.gray[200], colors.darkGray[600])};
2000
2000
  border-radius: ${border.radius.sm};
2001
2001
  background: ${t(colors.white, colors.darkGray[900])};
2002
- min-height: 260px;
2003
2002
  max-height: 420px;
2004
2003
  overflow: auto;
2005
2004
  padding: ${size[2]} ${size[2]} ${size[2]} ${size[5]};
@@ -2874,7 +2873,7 @@ var stylesFactory = (theme) => {
2874
2873
  gap: ${size[3]};
2875
2874
  align-items: start;
2876
2875
  & > * {
2877
- min-height: 280px;
2876
+ max-height: 420px;
2878
2877
  border: 1px solid oklch(0.28 0.03 260);
2879
2878
  border-radius: 6px;
2880
2879
  background: oklch(0.18 0.02 260);
@@ -3935,7 +3934,6 @@ var stylesFactory = (theme) => {
3935
3934
  `,
3936
3935
  stepJsonPanel: css2`
3937
3936
  margin: ${size[1.5]} ${size[3]};
3938
- min-height: 280px;
3939
3937
  max-height: 520px;
3940
3938
  overflow: auto;
3941
3939
  padding: ${size[2]} ${size[2]} ${size[2]} ${size[5]};
@@ -3953,6 +3951,7 @@ var stylesFactory = (theme) => {
3953
3951
  grid-template-columns: repeat(2, minmax(320px, 1fr));
3954
3952
  gap: ${size[3]};
3955
3953
  align-items: start;
3954
+ padding-left: ${size[3]};
3956
3955
  padding-right: ${size[3]};
3957
3956
  @media (max-width: 760px) {
3958
3957
  grid-template-columns: 1fr;
@@ -4354,12 +4353,6 @@ function applyHookEvent(state, eventName, event) {
4354
4353
  markHookViewed(state, state.activeHookId);
4355
4354
  }
4356
4355
  }
4357
- function setActiveHook(state, hookId) {
4358
- state.activeHookId = hookId;
4359
- if (hookId) {
4360
- markHookViewed(state, hookId);
4361
- }
4362
- }
4363
4356
  function clearHookRegistry(state) {
4364
4357
  state.hooks = {};
4365
4358
  state.runs = {};
@@ -4511,8 +4504,8 @@ function removeHookRecord(state, hookId) {
4511
4504
  delete state.runs[runId];
4512
4505
  }
4513
4506
  }
4514
- for (const eventId2 of hookEventIds) {
4515
- delete state.events[eventId2];
4507
+ for (const eventId3 of hookEventIds) {
4508
+ delete state.events[eventId3];
4516
4509
  }
4517
4510
  delete state.hooks[hookId];
4518
4511
  delete state.seenHookActivityCounts[hookId];
@@ -4520,7 +4513,7 @@ function removeHookRecord(state, hookId) {
4520
4513
  state.activeHookId = null;
4521
4514
  }
4522
4515
  }
4523
- function upsertRun(state, event, eventId2) {
4516
+ function upsertRun(state, event, eventId3) {
4524
4517
  const existing = state.runs[event.runId];
4525
4518
  if (!existing) {
4526
4519
  state.runs[event.runId] = {
@@ -4534,7 +4527,7 @@ function upsertRun(state, event, eventId2) {
4534
4527
  updatedAt: event.timestamp,
4535
4528
  ...isTerminalRunStatus(event.status) ? { completedAt: event.timestamp } : {},
4536
4529
  ...event.error ? { error: event.error } : {},
4537
- eventIds: [eventId2]
4530
+ eventIds: [eventId3]
4538
4531
  };
4539
4532
  return;
4540
4533
  }
@@ -4550,8 +4543,8 @@ function upsertRun(state, event, eventId2) {
4550
4543
  if (event.error) {
4551
4544
  existing.error = event.error;
4552
4545
  }
4553
- if (!existing.eventIds.includes(eventId2)) {
4554
- existing.eventIds.push(eventId2);
4546
+ if (!existing.eventIds.includes(eventId3)) {
4547
+ existing.eventIds.push(eventId3);
4555
4548
  }
4556
4549
  }
4557
4550
  function attachRunToHook(state, hookId, runId) {
@@ -4559,7 +4552,7 @@ function attachRunToHook(state, hookId, runId) {
4559
4552
  if (!hook || hook.runIds.includes(runId)) return;
4560
4553
  hook.runIds.push(runId);
4561
4554
  }
4562
- function syncRunsFromSnapshot(state, snapshot, eventId2) {
4555
+ function syncRunsFromSnapshot(state, snapshot, eventId3) {
4563
4556
  const rawRuns = snapshot.state.runs;
4564
4557
  if (!Array.isArray(rawRuns)) return;
4565
4558
  for (const candidate of rawRuns) {
@@ -4585,7 +4578,7 @@ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4585
4578
  updatedAt,
4586
4579
  ...typeof run.completedAt === "number" ? { completedAt: run.completedAt } : isTerminalRunStatus(status) ? { completedAt: updatedAt } : {},
4587
4580
  ...typeof run.error === "string" ? { error: run.error } : {},
4588
- eventIds: [eventId2]
4581
+ eventIds: [eventId3]
4589
4582
  };
4590
4583
  } else {
4591
4584
  existing.hookId = snapshot.hookId;
@@ -4597,8 +4590,8 @@ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4597
4590
  existing.completedAt = updatedAt;
4598
4591
  }
4599
4592
  if (typeof run.error === "string") existing.error = run.error;
4600
- if (!existing.eventIds.includes(eventId2)) {
4601
- existing.eventIds.push(eventId2);
4593
+ if (!existing.eventIds.includes(eventId3)) {
4594
+ existing.eventIds.push(eventId3);
4602
4595
  }
4603
4596
  }
4604
4597
  attachRunToHook(state, snapshot.hookId, run.id);
@@ -4628,11 +4621,11 @@ function attachActivityRunToHook(state, hookId, runId) {
4628
4621
  if (!hook || hook.activityRunIds.includes(runId)) return;
4629
4622
  hook.activityRunIds.push(runId);
4630
4623
  }
4631
- function attachEventToHook(state, hookId, eventId2) {
4624
+ function attachEventToHook(state, hookId, eventId3) {
4632
4625
  if (!hookId) return;
4633
4626
  const hook = state.hooks[hookId];
4634
- if (!hook || hook.eventIds.includes(eventId2)) return;
4635
- hook.eventIds.push(eventId2);
4627
+ if (!hook || hook.eventIds.includes(eventId3)) return;
4628
+ hook.eventIds.push(eventId3);
4636
4629
  }
4637
4630
  function inferLifecycleFromSnapshot(state) {
4638
4631
  if (state.status === "error" || state.error) {
@@ -4775,6 +4768,80 @@ function clearMemoryRegistry(state) {
4775
4768
  state.scopes = {};
4776
4769
  }
4777
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
+
4827
+ // src/store/skills-registry.ts
4828
+ function createSkillsRegistryState() {
4829
+ return { snapshots: {} };
4830
+ }
4831
+ function clearSkillsRegistry(state) {
4832
+ state.snapshots = {};
4833
+ }
4834
+ function applySkillsSnapshot(state, payload) {
4835
+ const key = payload.hookId && payload.hookId.length > 0 ? payload.hookId : "_default";
4836
+ const catalog = Array.isArray(payload.catalog) ? payload.catalog : [];
4837
+ const activated = Array.isArray(payload.activated) ? payload.activated : [];
4838
+ state.snapshots[key] = {
4839
+ catalog,
4840
+ activated,
4841
+ updatedAt: payload.timestamp ?? Date.now()
4842
+ };
4843
+ }
4844
+
4778
4845
  // src/store/ai-context.tsx
4779
4846
  var AIContext = createContext();
4780
4847
  function useAIStore() {
@@ -4789,7 +4856,9 @@ var AIProvider = (props) => {
4789
4856
  conversations: {},
4790
4857
  activeConversationId: null,
4791
4858
  hooks: createHookRegistryState(),
4792
- memory: createMemoryRegistryState()
4859
+ memory: createMemoryRegistryState(),
4860
+ compaction: createCompactionRegistryState(),
4861
+ skills: createSkillsRegistryState()
4793
4862
  });
4794
4863
  const streamToConversation = /* @__PURE__ */ new Map();
4795
4864
  const requestToConversation = /* @__PURE__ */ new Map();
@@ -5046,11 +5115,24 @@ var AIProvider = (props) => {
5046
5115
  clearMemoryRegistry(memory);
5047
5116
  }));
5048
5117
  }
5049
- function selectHook(id) {
5050
- setState("hooks", produce((hooks) => {
5051
- setActiveHook(hooks, id);
5118
+ function clearCompaction() {
5119
+ setState("compaction", produce((compaction) => {
5120
+ clearCompactionRegistry(compaction);
5052
5121
  }));
5053
5122
  }
5123
+ function clearSkills() {
5124
+ setState("skills", produce((skills) => {
5125
+ clearSkillsRegistry(skills);
5126
+ }));
5127
+ }
5128
+ function selectHook(id) {
5129
+ setState("hooks", "activeHookId", id);
5130
+ if (id) {
5131
+ setState("hooks", produce((hooks) => {
5132
+ markHookViewed(hooks, id);
5133
+ }));
5134
+ }
5135
+ }
5054
5136
  function saveToolFixture(fixture) {
5055
5137
  const fixtures = mergeFixtures(fixture, state.hooks.fixtures);
5056
5138
  setState("hooks", produce((hooks) => {
@@ -5376,6 +5458,10 @@ var AIProvider = (props) => {
5376
5458
  setState("memory", produce((memory) => {
5377
5459
  applyMemorySnapshot(memory, e.payload);
5378
5460
  }));
5461
+ }), aiEventClient.on("skills:snapshot", (e) => {
5462
+ setState("skills", produce((skills) => {
5463
+ applySkillsSnapshot(skills, e.payload);
5464
+ }));
5379
5465
  }));
5380
5466
  const recordRunEvent = (eventName, payload) => {
5381
5467
  setState("hooks", produce((hooks) => {
@@ -6559,6 +6645,48 @@ var AIProvider = (props) => {
6559
6645
  arr.push(mwEvent);
6560
6646
  }));
6561
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
+ }));
6562
6690
  cleanupFns.push(aiEventClient.on("summarize:request:started", (e) => {
6563
6691
  const {
6564
6692
  requestId,
@@ -6952,6 +7080,8 @@ var AIProvider = (props) => {
6952
7080
  selectConversation,
6953
7081
  clearHooks,
6954
7082
  clearMemory,
7083
+ clearCompaction,
7084
+ clearSkills,
6955
7085
  selectHook,
6956
7086
  saveToolFixture,
6957
7087
  deleteToolFixture,
@@ -7086,8 +7216,9 @@ var HookDashboard = () => {
7086
7216
  const unseenUpdateCount = createMemo(() => hooks().reduce((count, hook) => count + getHookUnseenEventCount(state.hooks, hook.id), 0));
7087
7217
  const handleSelect = (hook) => {
7088
7218
  selectHook(hook.id);
7089
- if (state.conversations[hook.id]) {
7090
- selectConversation(hook.id);
7219
+ const conversationId = hook.id || hook.clientId || hook.threadId;
7220
+ if (conversationId && state.conversations[conversationId]) {
7221
+ selectConversation(conversationId);
7091
7222
  }
7092
7223
  };
7093
7224
  return (() => {
@@ -7563,6 +7694,9 @@ var MiddlewareStep = (props) => {
7563
7694
  if (ev().wasDropped) return "DROP";
7564
7695
  if (ev().hookName === "onChunk" && ev().hasTransform) return "TRANSFORM";
7565
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";
7566
7700
  if (ev().hookName === "onBeforeToolCall" && ev().hasTransform) return "DECISION";
7567
7701
  return null;
7568
7702
  };
@@ -7572,6 +7706,9 @@ var MiddlewareStep = (props) => {
7572
7706
  };
7573
7707
  return [(() => {
7574
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
+ };
7575
7712
  insert(_el$3, () => ev().middlewareName);
7576
7713
  insert(_el$4, () => ev().hookName);
7577
7714
  insert(_el$, createComponent(Show, {
@@ -7602,24 +7739,27 @@ var MiddlewareStep = (props) => {
7602
7739
  },
7603
7740
  get children() {
7604
7741
  var _el$8 = _tmpl$22();
7605
- _el$8.$$click = () => setExpanded(!expanded());
7606
7742
  insert(_el$8, () => expanded() ? "hide changes" : "show changes");
7607
7743
  effect(() => className(_el$8, s().stepExpandToggle));
7608
7744
  return _el$8;
7609
7745
  }
7610
7746
  }), null);
7611
7747
  effect((_p$) => {
7612
- 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;
7613
7751
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
7614
- _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
7615
- _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
7616
- _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);
7617
7756
  return _p$;
7618
7757
  }, {
7619
7758
  e: void 0,
7620
7759
  t: void 0,
7621
7760
  a: void 0,
7622
- o: void 0
7761
+ o: void 0,
7762
+ i: void 0
7623
7763
  });
7624
7764
  return _el$;
7625
7765
  })(), createComponent(Show, {
@@ -7675,9 +7815,9 @@ var ThinkingStep = (props) => {
7675
7815
  }
7676
7816
  }), null);
7677
7817
  effect((_p$) => {
7678
- var _v$5 = `${s().stepPrefix} ${s().stepPrefixThinking}`, _v$6 = s().stepContent;
7679
- _v$5 !== _p$.e && className(_el$1, _p$.e = _v$5);
7680
- _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);
7681
7821
  return _p$;
7682
7822
  }, {
7683
7823
  e: void 0,
@@ -7731,10 +7871,10 @@ var StructuredOutputStep = (props) => {
7731
7871
  }), false, true);
7732
7872
  insert(_el$15, () => part().status);
7733
7873
  effect((_p$) => {
7734
- var _v$7 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$8 = `${s().mwBadge} ${badgeClass()}`, _v$9 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
7735
- _v$7 !== _p$.e && className(_el$14, _p$.e = _v$7);
7736
- _v$8 !== _p$.t && className(_el$15, _p$.t = _v$8);
7737
- _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);
7738
7878
  return _p$;
7739
7879
  }, {
7740
7880
  e: void 0,
@@ -7759,10 +7899,10 @@ var StructuredOutputStep = (props) => {
7759
7899
  copyable: true
7760
7900
  }));
7761
7901
  effect((_p$) => {
7762
- var _v$10 = s().stepJsonItem, _v$11 = s().stepJsonItemLabel, _v$12 = s().stepJsonPanel;
7763
- _v$10 !== _p$.e && className(_el$19, _p$.e = _v$10);
7764
- _v$11 !== _p$.t && className(_el$20, _p$.t = _v$11);
7765
- _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);
7766
7906
  return _p$;
7767
7907
  }, {
7768
7908
  e: void 0,
@@ -7773,9 +7913,9 @@ var StructuredOutputStep = (props) => {
7773
7913
  })()
7774
7914
  }));
7775
7915
  effect((_p$) => {
7776
- var _v$0 = `${s().cardBody} ${expanded() ? s().cardBodyOpen : ""}`, _v$1 = `${s().cardBodyInner} ${s().stepJsonItemsCompare}`;
7777
- _v$0 !== _p$.e && className(_el$17, _p$.e = _v$0);
7778
- _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);
7779
7919
  return _p$;
7780
7920
  }, {
7781
7921
  e: void 0,
@@ -7824,9 +7964,9 @@ var AssistantStep = (props) => {
7824
7964
  }
7825
7965
  }), null);
7826
7966
  effect((_p$) => {
7827
- var _v$13 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$14 = isLong() ? s().stepContentLong : s().stepContent;
7828
- _v$13 !== _p$.e && className(_el$23, _p$.e = _v$13);
7829
- _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);
7830
7970
  return _p$;
7831
7971
  }, {
7832
7972
  e: void 0,
@@ -7917,10 +8057,10 @@ var ToolCallStep = (props) => {
7917
8057
  }
7918
8058
  }), _el$32);
7919
8059
  effect((_p$) => {
7920
- var _v$15 = `${s().stepPrefix} ${s().stepPrefixToolCall}`, _v$16 = `${s().mwBadge} ${s().mwBadgeToolCall}`, _v$17 = `${s().chevron} ${argsOpen() ? s().chevronOpen : ""}`;
7921
- _v$15 !== _p$.e && className(_el$28, _p$.e = _v$15);
7922
- _v$16 !== _p$.t && className(_el$29, _p$.t = _v$16);
7923
- _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);
7924
8064
  return _p$;
7925
8065
  }, {
7926
8066
  e: void 0,
@@ -7938,10 +8078,10 @@ var ToolCallStep = (props) => {
7938
8078
  copyable: true
7939
8079
  }));
7940
8080
  effect((_p$) => {
7941
- var _v$18 = `${s().cardBody} ${argsOpen() ? s().cardBodyOpen : ""}`, _v$19 = s().cardBodyInner, _v$20 = s().stepJsonPanel;
7942
- _v$18 !== _p$.e && className(_el$33, _p$.e = _v$18);
7943
- _v$19 !== _p$.t && className(_el$34, _p$.t = _v$19);
7944
- _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);
7945
8085
  return _p$;
7946
8086
  }, {
7947
8087
  e: void 0,
@@ -7987,10 +8127,10 @@ var ToolCallStep = (props) => {
7987
8127
  }
7988
8128
  }), _el$41);
7989
8129
  effect((_p$) => {
7990
- var _v$21 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$22 = `${s().mwBadge} ${s().mwBadgeToolResult}`, _v$23 = `${s().chevron} ${resultOpen() ? s().chevronOpen : ""}`;
7991
- _v$21 !== _p$.e && className(_el$37, _p$.e = _v$21);
7992
- _v$22 !== _p$.t && className(_el$38, _p$.t = _v$22);
7993
- _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);
7994
8134
  return _p$;
7995
8135
  }, {
7996
8136
  e: void 0,
@@ -8008,10 +8148,10 @@ var ToolCallStep = (props) => {
8008
8148
  copyable: true
8009
8149
  }));
8010
8150
  effect((_p$) => {
8011
- var _v$24 = `${s().cardBody} ${resultOpen() ? s().cardBodyOpen : ""}`, _v$25 = s().cardBodyInner, _v$26 = s().stepJsonPanel;
8012
- _v$24 !== _p$.e && className(_el$42, _p$.e = _v$24);
8013
- _v$25 !== _p$.t && className(_el$43, _p$.t = _v$25);
8014
- _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);
8015
8155
  return _p$;
8016
8156
  }, {
8017
8157
  e: void 0,
@@ -8051,9 +8191,9 @@ var ToolResultStep = (props) => {
8051
8191
  }
8052
8192
  }), false, true);
8053
8193
  effect((_p$) => {
8054
- var _v$27 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$28 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`;
8055
- _v$27 !== _p$.e && className(_el$47, _p$.e = _v$27);
8056
- _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);
8057
8197
  return _p$;
8058
8198
  }, {
8059
8199
  e: void 0,
@@ -8070,10 +8210,10 @@ var ToolResultStep = (props) => {
8070
8210
  copyable: true
8071
8211
  }));
8072
8212
  effect((_p$) => {
8073
- var _v$29 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$30 = s().cardBodyInner, _v$31 = s().stepJsonPanel;
8074
- _v$29 !== _p$.e && className(_el$49, _p$.e = _v$29);
8075
- _v$30 !== _p$.t && className(_el$50, _p$.t = _v$30);
8076
- _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);
8077
8217
  return _p$;
8078
8218
  }, {
8079
8219
  e: void 0,
@@ -8346,9 +8486,9 @@ var IterationCard = (props) => {
8346
8486
  var _el$69 = _tmpl$17(); _el$69.firstChild;
8347
8487
  insert(_el$69, totalToolCalls, null);
8348
8488
  effect((_p$) => {
8349
- var _v$32 = `${s().badge} ${s().badgeFinishReasonToolCalls}`, _v$33 = `${totalToolCalls()} tool ${totalToolCalls() === 1 ? "call" : "calls"}`;
8350
- _v$32 !== _p$.e && className(_el$69, _p$.e = _v$32);
8351
- _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);
8352
8492
  return _p$;
8353
8493
  }, {
8354
8494
  e: void 0,
@@ -8365,9 +8505,9 @@ var IterationCard = (props) => {
8365
8505
  var _el$71 = _tmpl$18(); _el$71.firstChild;
8366
8506
  insert(_el$71, () => formatDuration(duration()), null);
8367
8507
  effect((_p$) => {
8368
- var _v$34 = `${s().badge} ${s().badgeDuration}`, _v$35 = formatDuration(duration());
8369
- _v$34 !== _p$.e && className(_el$71, _p$.e = _v$34);
8370
- _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);
8371
8511
  return _p$;
8372
8512
  }, {
8373
8513
  e: void 0,
@@ -8384,9 +8524,9 @@ var IterationCard = (props) => {
8384
8524
  var _el$94 = _tmpl$25(); _el$94.firstChild;
8385
8525
  insert(_el$94, () => usage().totalTokens.toLocaleString(), null);
8386
8526
  effect((_p$) => {
8387
- var _v$56 = `${s().badge} ${s().badgeUsage}`, _v$57 = `Prompt: ${usage().promptTokens.toLocaleString()} | Completion: ${usage().completionTokens.toLocaleString()}`;
8388
- _v$56 !== _p$.e && className(_el$94, _p$.e = _v$56);
8389
- _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);
8390
8530
  return _p$;
8391
8531
  }, {
8392
8532
  e: void 0,
@@ -8443,12 +8583,12 @@ var IterationCard = (props) => {
8443
8583
  insert(_el$103, () => diff.from);
8444
8584
  insert(_el$105, () => diff.to);
8445
8585
  effect((_p$) => {
8446
- var _v$58 = s().configDiffRow, _v$59 = s().configDiffKey, _v$60 = s().configDiffFrom, _v$61 = s().configDiffArrow, _v$62 = s().configDiffTo;
8447
- _v$58 !== _p$.e && className(_el$100, _p$.e = _v$58);
8448
- _v$59 !== _p$.t && className(_el$101, _p$.t = _v$59);
8449
- _v$60 !== _p$.a && className(_el$103, _p$.a = _v$60);
8450
- _v$61 !== _p$.o && className(_el$104, _p$.o = _v$61);
8451
- _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);
8452
8592
  return _p$;
8453
8593
  }, {
8454
8594
  e: void 0,
@@ -8461,10 +8601,10 @@ var IterationCard = (props) => {
8461
8601
  })()
8462
8602
  }));
8463
8603
  effect((_p$) => {
8464
- var _v$36 = s().configPanelSection, _v$37 = s().configPanelLabel, _v$38 = s().configDiffSection;
8465
- _v$36 !== _p$.e && className(_el$78, _p$.e = _v$36);
8466
- _v$37 !== _p$.t && className(_el$79, _p$.t = _v$37);
8467
- _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);
8468
8608
  return _p$;
8469
8609
  }, {
8470
8610
  e: void 0,
@@ -8489,9 +8629,9 @@ var IterationCard = (props) => {
8489
8629
  insert(_el$106, name, _el$107);
8490
8630
  insert(_el$107, () => toolInvocationCounts().get(name) || 0);
8491
8631
  effect((_p$) => {
8492
- var _v$63 = s().configToolChip, _v$64 = s().configToolChipCount;
8493
- _v$63 !== _p$.e && className(_el$106, _p$.e = _v$63);
8494
- _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);
8495
8635
  return _p$;
8496
8636
  }, {
8497
8637
  e: void 0,
@@ -8501,10 +8641,10 @@ var IterationCard = (props) => {
8501
8641
  })()
8502
8642
  }));
8503
8643
  effect((_p$) => {
8504
- var _v$39 = s().configPanelSection, _v$40 = s().configPanelLabel, _v$41 = s().configToolsList;
8505
- _v$39 !== _p$.e && className(_el$81, _p$.e = _v$39);
8506
- _v$40 !== _p$.t && className(_el$82, _p$.t = _v$40);
8507
- _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);
8508
8648
  return _p$;
8509
8649
  }, {
8510
8650
  e: void 0,
@@ -8533,9 +8673,9 @@ var IterationCard = (props) => {
8533
8673
  })
8534
8674
  }), null);
8535
8675
  effect((_p$) => {
8536
- var _v$42 = s().configPanelSection, _v$43 = s().configPanelLabel;
8537
- _v$42 !== _p$.e && className(_el$84, _p$.e = _v$42);
8538
- _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);
8539
8679
  return _p$;
8540
8680
  }, {
8541
8681
  e: void 0,
@@ -8558,10 +8698,10 @@ var IterationCard = (props) => {
8558
8698
  copyable: true
8559
8699
  }));
8560
8700
  effect((_p$) => {
8561
- var _v$44 = s().configPanelSection, _v$45 = s().configPanelLabel, _v$46 = s().configJsonTreeContainer;
8562
- _v$44 !== _p$.e && className(_el$89, _p$.e = _v$44);
8563
- _v$45 !== _p$.t && className(_el$90, _p$.t = _v$45);
8564
- _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);
8565
8705
  return _p$;
8566
8706
  }, {
8567
8707
  e: void 0,
@@ -8663,16 +8803,16 @@ var IterationCard = (props) => {
8663
8803
  })
8664
8804
  }));
8665
8805
  effect((_p$) => {
8666
- 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;
8667
- _v$47 !== _p$.e && className(_el$54, _p$.e = _v$47);
8668
- _v$48 !== _p$.t && className(_el$55, _p$.t = _v$48);
8669
- _v$49 !== _p$.a && className(_el$56, _p$.a = _v$49);
8670
- _v$50 !== _p$.o && className(_el$67, _p$.o = _v$50);
8671
- _v$51 !== _p$.i && className(_el$74, _p$.i = _v$51);
8672
- _v$52 !== _p$.n && className(_el$75, _p$.n = _v$52);
8673
- _v$53 !== _p$.s && className(_el$76, _p$.s = _v$53);
8674
- _v$54 !== _p$.h && className(_el$92, _p$.h = _v$54);
8675
- _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);
8676
8816
  return _p$;
8677
8817
  }, {
8678
8818
  e: void 0,
@@ -10935,18 +11075,461 @@ var MemoryPanel = () => {
10935
11075
  })();
10936
11076
  };
10937
11077
  delegateEvents(["click"]);
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>`);
11382
+ function parseSkillName(argumentsJson) {
11383
+ if (!argumentsJson) return void 0;
11384
+ try {
11385
+ const parsed = JSON.parse(argumentsJson);
11386
+ if (parsed && typeof parsed === "object" && "name" in parsed && typeof parsed.name === "string") {
11387
+ return parsed.name;
11388
+ }
11389
+ } catch {
11390
+ return void 0;
11391
+ }
11392
+ return void 0;
11393
+ }
11394
+ function loadedFromMessages(messages) {
11395
+ const names = /* @__PURE__ */ new Set();
11396
+ for (const message of messages) {
11397
+ for (const toolCall of message.toolCalls ?? []) {
11398
+ if (toolCall.name === "load_skill") {
11399
+ const name = parseSkillName(toolCall.arguments);
11400
+ if (name) names.add(name);
11401
+ }
11402
+ }
11403
+ for (const part of message.parts ?? []) {
11404
+ if (part.type === "tool-call" && part.toolName === "load_skill") {
11405
+ const name = parseSkillName(part.arguments);
11406
+ if (name) names.add(name);
11407
+ }
11408
+ }
11409
+ }
11410
+ return [...names];
11411
+ }
11412
+ var SkillsPanel = () => {
11413
+ const {
11414
+ state
11415
+ } = useAIStore();
11416
+ const styles = useStyles();
11417
+ const snapshot = createMemo(() => {
11418
+ const hookId = state.hooks.activeHookId;
11419
+ if (hookId && state.skills.snapshots[hookId]) {
11420
+ return state.skills.snapshots[hookId];
11421
+ }
11422
+ const first = Object.values(state.skills.snapshots)[0];
11423
+ return first;
11424
+ });
11425
+ const conversation = createMemo(() => {
11426
+ const hookId = state.hooks.activeHookId;
11427
+ if (!hookId) return void 0;
11428
+ return state.conversations[hookId];
11429
+ });
11430
+ const loaded = createMemo(() => {
11431
+ const fromSnap = new Set(snapshot()?.activated ?? []);
11432
+ for (const name of loadedFromMessages(conversation()?.messages ?? [])) {
11433
+ fromSnap.add(name);
11434
+ }
11435
+ return fromSnap;
11436
+ });
11437
+ const catalog = createMemo(() => snapshot()?.catalog ?? []);
11438
+ return (() => {
11439
+ var _el$ = _tmpl$311();
11440
+ insert(_el$, createComponent(Show, {
11441
+ get when() {
11442
+ return catalog().length > 0 || loaded().size > 0;
11443
+ },
11444
+ get fallback() {
11445
+ return (() => {
11446
+ var _el$5 = _tmpl$48();
11447
+ effect(() => className(_el$5, styles().memoryPanel.empty));
11448
+ return _el$5;
11449
+ })();
11450
+ },
11451
+ get children() {
11452
+ var _el$2 = _tmpl$215(), _el$3 = _el$2.firstChild;
11453
+ insert(_el$2, createComponent(Show, {
11454
+ get when() {
11455
+ return catalog().length > 0;
11456
+ },
11457
+ get fallback() {
11458
+ return (() => {
11459
+ var _el$6 = _tmpl$58();
11460
+ effect(() => className(_el$6, styles().memoryPanel.sectionEmpty));
11461
+ return _el$6;
11462
+ })();
11463
+ },
11464
+ get children() {
11465
+ var _el$4 = _tmpl$41();
11466
+ insert(_el$4, createComponent(For, {
11467
+ get each() {
11468
+ return catalog();
11469
+ },
11470
+ children: (skill) => {
11471
+ const isLoaded = () => loaded().has(skill.name);
11472
+ return (() => {
11473
+ var _el$7 = _tmpl$78(), _el$8 = _el$7.firstChild, _el$0 = _el$8.nextSibling;
11474
+ insert(_el$8, () => skill.name);
11475
+ insert(_el$7, createComponent(Show, {
11476
+ get when() {
11477
+ return isLoaded();
11478
+ },
11479
+ get children() {
11480
+ var _el$9 = _tmpl$68();
11481
+ effect(() => className(_el$9, styles().memoryPanel.badge));
11482
+ return _el$9;
11483
+ }
11484
+ }), _el$0);
11485
+ insert(_el$0, () => skill.description);
11486
+ effect((_p$) => {
11487
+ var _v$3 = styles().memoryPanel.row, _v$4 = styles().memoryPanel.badge, _v$5 = styles().memoryPanel.sectionEmpty;
11488
+ _v$3 !== _p$.e && className(_el$7, _p$.e = _v$3);
11489
+ _v$4 !== _p$.t && className(_el$8, _p$.t = _v$4);
11490
+ _v$5 !== _p$.a && className(_el$0, _p$.a = _v$5);
11491
+ return _p$;
11492
+ }, {
11493
+ e: void 0,
11494
+ t: void 0,
11495
+ a: void 0
11496
+ });
11497
+ return _el$7;
11498
+ })();
11499
+ }
11500
+ }));
11501
+ effect(() => className(_el$4, styles().memoryPanel.list));
11502
+ return _el$4;
11503
+ }
11504
+ }), null);
11505
+ effect((_p$) => {
11506
+ var _v$ = styles().memoryPanel.section, _v$2 = styles().memoryPanel.sectionTitle;
11507
+ _v$ !== _p$.e && className(_el$2, _p$.e = _v$);
11508
+ _v$2 !== _p$.t && className(_el$3, _p$.t = _v$2);
11509
+ return _p$;
11510
+ }, {
11511
+ e: void 0,
11512
+ t: void 0
11513
+ });
11514
+ return _el$2;
11515
+ }
11516
+ }));
11517
+ effect(() => className(_el$, styles().memoryPanel.container));
11518
+ return _el$;
11519
+ })();
11520
+ };
10938
11521
 
10939
11522
  // src/components/hooks/HookDetails.tsx
10940
- var _tmpl$40 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
10941
- var _tmpl$214 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-hook-detail><nav data-testid=ai-devtools-hook-tabs></nav><div><main data-testid=ai-devtools-primary-pane>`);
10942
- var _tmpl$310 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-dashboard-overview><header><div><div>Hooks Dashboard</div><div>Select a hook from the left or open one of the active hooks below.</div></div></header><div></div><div>`);
10943
- var _tmpl$47 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
10944
- var _tmpl$57 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
10945
- var _tmpl$67 = /* @__PURE__ */ template(`<span>running`);
10946
- var _tmpl$77 = /* @__PURE__ */ template(`<span> new`);
10947
- var _tmpl$87 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
10948
- var _tmpl$97 = /* @__PURE__ */ template(`<div><span></span><span>`);
10949
- var _tmpl$06 = /* @__PURE__ */ template(`<span>`);
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>`);
10950
11533
  var _tmpl$116 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-technical-name>`);
10951
11534
  var _tmpl$106 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-registry-id>id `);
10952
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>`);
@@ -10959,7 +11542,7 @@ var _tmpl$173 = /* @__PURE__ */ template(`<div><button type=button data-testid=a
10959
11542
  var _tmpl$182 = /* @__PURE__ */ template(`<div><span>`);
10960
11543
  var _tmpl$192 = /* @__PURE__ */ template(`<div><span></span><div>`);
10961
11544
  var _tmpl$202 = /* @__PURE__ */ template(`<div>No messages yet. Start a conversation to see messages here.`);
10962
- var _tmpl$215 = /* @__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>`);
10963
11546
  var _tmpl$223 = /* @__PURE__ */ template(`<div>No tools.`);
10964
11547
  var _tmpl$232 = /* @__PURE__ */ template(`<span>approval`);
10965
11548
  var _tmpl$242 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-tool-row><span>`);
@@ -10981,7 +11564,8 @@ var HookDetails = () => {
10981
11564
  let previewPane;
10982
11565
  const hook = createMemo(() => {
10983
11566
  const id = state.hooks.activeHookId;
10984
- return id ? state.hooks.hooks[id] : void 0;
11567
+ if (id === null) return void 0;
11568
+ return state.hooks.hooks[id];
10985
11569
  });
10986
11570
  const conversation = createMemo(() => {
10987
11571
  const activeHook = hook();
@@ -10998,7 +11582,7 @@ var HookDetails = () => {
10998
11582
  return Boolean(outputKind && outputKind !== "chat" && outputKind !== "structured");
10999
11583
  });
11000
11584
  createEffect(() => {
11001
- if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory")) {
11585
+ if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory" || activeTab() === "compaction" || activeTab() === "skills")) {
11002
11586
  setActiveTab("conversation");
11003
11587
  }
11004
11588
  });
@@ -11014,7 +11598,7 @@ var HookDetails = () => {
11014
11598
  return [];
11015
11599
  });
11016
11600
  const showSecondaryPane = createMemo(() => {
11017
- if (activeTab() === "tools" && !isGenerationHook()) return false;
11601
+ if ((activeTab() === "tools" || activeTab() === "skills") && !isGenerationHook()) return false;
11018
11602
  return isGenerationHook() || !hasStructuredOutputPreview(previewMessages());
11019
11603
  });
11020
11604
  createEffect(() => {
@@ -11036,14 +11620,15 @@ var HookDetails = () => {
11036
11620
  return createComponent(HookOverview, {
11037
11621
  onSelectHook: (selectedHook) => {
11038
11622
  selectHook(selectedHook.id);
11039
- if (state.conversations[selectedHook.id]) {
11040
- selectConversation(selectedHook.id);
11623
+ const conversationId = selectedHook.id || selectedHook.clientId || selectedHook.threadId;
11624
+ if (conversationId && state.conversations[conversationId]) {
11625
+ selectConversation(conversationId);
11041
11626
  }
11042
11627
  }
11043
11628
  });
11044
11629
  },
11045
11630
  children: (activeHook) => (() => {
11046
- var _el$ = _tmpl$214(), _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;
11047
11632
  insert(_el$, createComponent(HookHeader, {
11048
11633
  get hook() {
11049
11634
  return activeHook();
@@ -11099,14 +11684,28 @@ var HookDetails = () => {
11099
11684
  return !isGenerationHook();
11100
11685
  },
11101
11686
  get children() {
11102
- return createComponent(TabButton, {
11687
+ return [createComponent(TabButton, {
11103
11688
  label: "Memory",
11104
11689
  tab: "memory",
11105
11690
  get activeTab() {
11106
11691
  return activeTab();
11107
11692
  },
11108
11693
  onSelect: setActiveTab
11109
- });
11694
+ }), createComponent(TabButton, {
11695
+ label: "Compaction",
11696
+ tab: "compaction",
11697
+ get activeTab() {
11698
+ return activeTab();
11699
+ },
11700
+ onSelect: setActiveTab
11701
+ }), createComponent(TabButton, {
11702
+ label: "Skills",
11703
+ tab: "skills",
11704
+ get activeTab() {
11705
+ return activeTab();
11706
+ },
11707
+ onSelect: setActiveTab
11708
+ })];
11110
11709
  }
11111
11710
  }), null);
11112
11711
  _el$4.addEventListener("mouseleave", () => setHoverTarget(null));
@@ -11185,12 +11784,32 @@ var HookDetails = () => {
11185
11784
  return createComponent(MemoryPanel, {});
11186
11785
  }
11187
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);
11799
+ insert(_el$4, createComponent(Show, {
11800
+ get when() {
11801
+ return activeTab() === "skills";
11802
+ },
11803
+ get children() {
11804
+ return createComponent(SkillsPanel, {});
11805
+ }
11806
+ }), null);
11188
11807
  insert(_el$3, createComponent(Show, {
11189
11808
  get when() {
11190
11809
  return showSecondaryPane();
11191
11810
  },
11192
11811
  get children() {
11193
- var _el$5 = _tmpl$40(), _el$6 = _el$5.firstChild;
11812
+ var _el$5 = _tmpl$49(), _el$6 = _el$5.firstChild;
11194
11813
  _el$5.addEventListener("mouseleave", () => setHoverTarget(null));
11195
11814
  _el$5.$$mouseover = (event) => setHoverTargetFromEvent(event, "preview", setHoverTarget);
11196
11815
  use((el) => {
@@ -11271,13 +11890,13 @@ var HookOverview = (props) => {
11271
11890
  },
11272
11891
  get fallback() {
11273
11892
  return (() => {
11274
- var _el$12 = _tmpl$47();
11893
+ var _el$12 = _tmpl$410();
11275
11894
  effect(() => className(_el$12, styles().hookDetails.empty));
11276
11895
  return _el$12;
11277
11896
  })();
11278
11897
  },
11279
11898
  get children() {
11280
- var _el$7 = _tmpl$310(), _el$8 = _el$7.firstChild, _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$8.nextSibling, _el$11 = _el$10.nextSibling;
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;
11281
11900
  insert(_el$10, createComponent(OverviewMetric, {
11282
11901
  label: "active hooks",
11283
11902
  get value() {
@@ -11331,7 +11950,7 @@ var HookOverview = (props) => {
11331
11950
  return groups();
11332
11951
  },
11333
11952
  children: (group) => (() => {
11334
- var _el$13 = _tmpl$57(), _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;
11335
11954
  insert(_el$15, () => group.label);
11336
11955
  insert(_el$16, () => group.hooks.length);
11337
11956
  insert(_el$13, createComponent(For, {
@@ -11342,7 +11961,7 @@ var HookOverview = (props) => {
11342
11961
  const running = createMemo(() => isHookRunning(hook, state.hooks.runs));
11343
11962
  const unseenCount = createMemo(() => getHookUnseenEventCount(state.hooks, hook.id));
11344
11963
  return (() => {
11345
- var _el$17 = _tmpl$87(), _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild;
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;
11346
11965
  _el$17.$$click = () => props.onSelectHook(hook);
11347
11966
  insert(_el$19, () => getHookDisplayName(hook));
11348
11967
  insert(_el$20, () => getHookIdentitySubtitle(hook));
@@ -11352,7 +11971,7 @@ var HookOverview = (props) => {
11352
11971
  return running();
11353
11972
  },
11354
11973
  get children() {
11355
- var _el$23 = _tmpl$67();
11974
+ var _el$23 = _tmpl$69();
11356
11975
  effect(() => className(_el$23, styles().hookDetails.lifecycle));
11357
11976
  return _el$23;
11358
11977
  }
@@ -11362,7 +11981,7 @@ var HookOverview = (props) => {
11362
11981
  return unseenCount() > 0;
11363
11982
  },
11364
11983
  get children() {
11365
- var _el$24 = _tmpl$77(), _el$25 = _el$24.firstChild;
11984
+ var _el$24 = _tmpl$79(), _el$25 = _el$24.firstChild;
11366
11985
  insert(_el$24, unseenCount, _el$25);
11367
11986
  effect(() => className(_el$24, styles().hookDetails.kind));
11368
11987
  return _el$24;
@@ -11433,7 +12052,7 @@ var HookOverview = (props) => {
11433
12052
  var OverviewMetric = (props) => {
11434
12053
  const styles = useStyles();
11435
12054
  return (() => {
11436
- 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;
11437
12056
  insert(_el$27, () => props.value);
11438
12057
  insert(_el$28, () => props.label);
11439
12058
  effect((_p$) => {
@@ -11461,7 +12080,7 @@ var HookHeader = (props) => {
11461
12080
  return props.hook.outputKind;
11462
12081
  },
11463
12082
  get children() {
11464
- var _el$34 = _tmpl$06();
12083
+ var _el$34 = _tmpl$07();
11465
12084
  insert(_el$34, () => props.hook.outputKind);
11466
12085
  effect(() => className(_el$34, styles().hookDetails.kind));
11467
12086
  return _el$34;
@@ -11496,7 +12115,7 @@ var HookHeader = (props) => {
11496
12115
  return props.hook.framework;
11497
12116
  },
11498
12117
  get children() {
11499
- var _el$40 = _tmpl$06();
12118
+ var _el$40 = _tmpl$07();
11500
12119
  insert(_el$40, () => props.hook.framework);
11501
12120
  return _el$40;
11502
12121
  }
@@ -11565,7 +12184,7 @@ var HookHeader = (props) => {
11565
12184
  var Metric = (props) => {
11566
12185
  const styles = useStyles();
11567
12186
  return (() => {
11568
- 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;
11569
12188
  insert(_el$43, () => props.value);
11570
12189
  insert(_el$44, () => props.label);
11571
12190
  effect((_p$) => {
@@ -11857,7 +12476,7 @@ var MessagesPreview = (props) => {
11857
12476
  },
11858
12477
  get fallback() {
11859
12478
  return (() => {
11860
- var _el$60 = _tmpl$06();
12479
+ var _el$60 = _tmpl$07();
11861
12480
  insert(_el$60, () => part.content);
11862
12481
  effect(() => className(_el$60, styles().hookDetails.previewPartContent));
11863
12482
  return _el$60;
@@ -11991,7 +12610,7 @@ var HookMessageTimeline = (props) => {
11991
12610
  },
11992
12611
  get fallback() {
11993
12612
  return (() => {
11994
- var _el$72 = _tmpl$06();
12613
+ var _el$72 = _tmpl$07();
11995
12614
  insert(_el$72, () => part.content);
11996
12615
  effect(() => className(_el$72, styles().hookDetails.previewPartContent));
11997
12616
  return _el$72;
@@ -12055,7 +12674,7 @@ var ToolsView = (props) => {
12055
12674
  const selectedTool = createMemo(() => props.hook.tools.find((tool) => tool.name === selectedToolName()));
12056
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));
12057
12676
  return (() => {
12058
- var _el$76 = _tmpl$215(), _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;
12059
12678
  insert(_el$77, createComponent(Show, {
12060
12679
  get when() {
12061
12680
  return props.hook.tools.length > 0;
@@ -12146,7 +12765,7 @@ var ToolsView = (props) => {
12146
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;
12147
12766
  insert(_el$89, () => fixture.name ?? fixture.toolName);
12148
12767
  insert(_el$90, () => fixture.toolName, _el$91);
12149
- insert(_el$90, () => formatTime3(fixture.createdAt), null);
12768
+ insert(_el$90, () => formatTime4(fixture.createdAt), null);
12150
12769
  _el$93.$$click = () => applyToolFixture(fixture);
12151
12770
  _el$94.$$click = () => deleteToolFixture(fixture.id);
12152
12771
  effect((_p$) => {
@@ -12646,13 +13265,13 @@ function jsonSafeValue(value) {
12646
13265
  return `[ai-devtools] unserializable value: ${error instanceof Error ? error.message : String(error)}`;
12647
13266
  }
12648
13267
  }
12649
- function formatTime3(timestamp) {
13268
+ function formatTime4(timestamp) {
12650
13269
  return new Date(timestamp).toLocaleTimeString();
12651
13270
  }
12652
13271
  delegateEvents(["mouseover", "click"]);
12653
13272
 
12654
13273
  // src/components/Shell.tsx
12655
- var _tmpl$41 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-panel><div><div data-testid=ai-devtools-left-panel style=min-width:150px;max-width:800px><div>AI Hooks</div></div><div></div><div data-testid=ai-devtools-right-panel style=flex:1>`);
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>`);
12656
13275
  function Devtools(props) {
12657
13276
  return createComponent(ThemeContextProvider, {
12658
13277
  get theme() {
@@ -12734,7 +13353,7 @@ function DevtoolsContent() {
12734
13353
  });
12735
13354
  return createComponent(MainPanel, {
12736
13355
  get children() {
12737
- var _el$ = _tmpl$41(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.nextSibling;
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;
12738
13357
  insert(_el$, createComponent(Header, {
12739
13358
  get children() {
12740
13359
  return createComponent(HeaderLogo, {