@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;
@@ -4346,12 +4345,6 @@ function applyHookEvent(state, eventName, event) {
4346
4345
  markHookViewed(state, state.activeHookId);
4347
4346
  }
4348
4347
  }
4349
- function setActiveHook(state, hookId) {
4350
- state.activeHookId = hookId;
4351
- if (hookId) {
4352
- markHookViewed(state, hookId);
4353
- }
4354
- }
4355
4348
  function clearHookRegistry(state) {
4356
4349
  state.hooks = {};
4357
4350
  state.runs = {};
@@ -4503,8 +4496,8 @@ function removeHookRecord(state, hookId) {
4503
4496
  delete state.runs[runId];
4504
4497
  }
4505
4498
  }
4506
- for (const eventId2 of hookEventIds) {
4507
- delete state.events[eventId2];
4499
+ for (const eventId3 of hookEventIds) {
4500
+ delete state.events[eventId3];
4508
4501
  }
4509
4502
  delete state.hooks[hookId];
4510
4503
  delete state.seenHookActivityCounts[hookId];
@@ -4512,7 +4505,7 @@ function removeHookRecord(state, hookId) {
4512
4505
  state.activeHookId = null;
4513
4506
  }
4514
4507
  }
4515
- function upsertRun(state, event, eventId2) {
4508
+ function upsertRun(state, event, eventId3) {
4516
4509
  const existing = state.runs[event.runId];
4517
4510
  if (!existing) {
4518
4511
  state.runs[event.runId] = {
@@ -4526,7 +4519,7 @@ function upsertRun(state, event, eventId2) {
4526
4519
  updatedAt: event.timestamp,
4527
4520
  ...isTerminalRunStatus(event.status) ? { completedAt: event.timestamp } : {},
4528
4521
  ...event.error ? { error: event.error } : {},
4529
- eventIds: [eventId2]
4522
+ eventIds: [eventId3]
4530
4523
  };
4531
4524
  return;
4532
4525
  }
@@ -4542,8 +4535,8 @@ function upsertRun(state, event, eventId2) {
4542
4535
  if (event.error) {
4543
4536
  existing.error = event.error;
4544
4537
  }
4545
- if (!existing.eventIds.includes(eventId2)) {
4546
- existing.eventIds.push(eventId2);
4538
+ if (!existing.eventIds.includes(eventId3)) {
4539
+ existing.eventIds.push(eventId3);
4547
4540
  }
4548
4541
  }
4549
4542
  function attachRunToHook(state, hookId, runId) {
@@ -4551,7 +4544,7 @@ function attachRunToHook(state, hookId, runId) {
4551
4544
  if (!hook || hook.runIds.includes(runId)) return;
4552
4545
  hook.runIds.push(runId);
4553
4546
  }
4554
- function syncRunsFromSnapshot(state, snapshot, eventId2) {
4547
+ function syncRunsFromSnapshot(state, snapshot, eventId3) {
4555
4548
  const rawRuns = snapshot.state.runs;
4556
4549
  if (!Array.isArray(rawRuns)) return;
4557
4550
  for (const candidate of rawRuns) {
@@ -4574,7 +4567,7 @@ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4574
4567
  updatedAt,
4575
4568
  ...typeof run.completedAt === "number" ? { completedAt: run.completedAt } : isTerminalRunStatus(status) ? { completedAt: updatedAt } : {},
4576
4569
  ...typeof run.error === "string" ? { error: run.error } : {},
4577
- eventIds: [eventId2]
4570
+ eventIds: [eventId3]
4578
4571
  };
4579
4572
  } else {
4580
4573
  existing.hookId = snapshot.hookId;
@@ -4586,8 +4579,8 @@ function syncRunsFromSnapshot(state, snapshot, eventId2) {
4586
4579
  existing.completedAt = updatedAt;
4587
4580
  }
4588
4581
  if (typeof run.error === "string") existing.error = run.error;
4589
- if (!existing.eventIds.includes(eventId2)) {
4590
- existing.eventIds.push(eventId2);
4582
+ if (!existing.eventIds.includes(eventId3)) {
4583
+ existing.eventIds.push(eventId3);
4591
4584
  }
4592
4585
  }
4593
4586
  attachRunToHook(state, snapshot.hookId, run.id);
@@ -4617,11 +4610,11 @@ function attachActivityRunToHook(state, hookId, runId) {
4617
4610
  if (!hook || hook.activityRunIds.includes(runId)) return;
4618
4611
  hook.activityRunIds.push(runId);
4619
4612
  }
4620
- function attachEventToHook(state, hookId, eventId2) {
4613
+ function attachEventToHook(state, hookId, eventId3) {
4621
4614
  if (!hookId) return;
4622
4615
  const hook = state.hooks[hookId];
4623
- if (!hook || hook.eventIds.includes(eventId2)) return;
4624
- hook.eventIds.push(eventId2);
4616
+ if (!hook || hook.eventIds.includes(eventId3)) return;
4617
+ hook.eventIds.push(eventId3);
4625
4618
  }
4626
4619
  function inferLifecycleFromSnapshot(state) {
4627
4620
  if (state.status === "error" || state.error) {
@@ -4764,6 +4757,80 @@ function clearMemoryRegistry(state) {
4764
4757
  state.scopes = {};
4765
4758
  }
4766
4759
 
4760
+ // src/store/compaction-registry.ts
4761
+ var MAX_EVENTS = 50;
4762
+ function createCompactionRegistryState() {
4763
+ return { events: [] };
4764
+ }
4765
+ function eventId2(kind, event) {
4766
+ return [
4767
+ "cmp",
4768
+ kind,
4769
+ String(event.timestamp),
4770
+ event.hookId ?? event.clientId ?? event.threadId ?? "unknown",
4771
+ String(event.before ?? event.after ?? "")
4772
+ ].join("-");
4773
+ }
4774
+ function applyCompactionEvent(state, kind, event) {
4775
+ state.events.push({
4776
+ id: event.eventId ?? eventId2(kind, event),
4777
+ kind,
4778
+ timestamp: event.timestamp,
4779
+ hookId: event.hookId,
4780
+ clientId: event.clientId,
4781
+ threadId: event.threadId,
4782
+ runId: event.runId,
4783
+ before: event.before,
4784
+ after: event.after,
4785
+ messagesBefore: event.messagesBefore,
4786
+ messagesAfter: event.messagesAfter,
4787
+ reusedCheckpoint: event.reusedCheckpoint,
4788
+ maxTokens: event.maxTokens,
4789
+ strategyKey: event.strategyKey,
4790
+ durationMs: event.durationMs,
4791
+ dropped: event.dropped,
4792
+ result: event.result
4793
+ });
4794
+ if (state.events.length > MAX_EVENTS) {
4795
+ state.events.splice(0, state.events.length - MAX_EVENTS);
4796
+ }
4797
+ }
4798
+ function clearCompactionRegistry(state) {
4799
+ state.events = [];
4800
+ }
4801
+ function compactionEventsForHook(state, hook) {
4802
+ const matched = state.events.filter((event) => {
4803
+ if (event.hookId && event.hookId === hook.id) return true;
4804
+ if (event.clientId && hook.clientId && event.clientId === hook.clientId) {
4805
+ return true;
4806
+ }
4807
+ if (event.threadId && hook.threadId && event.threadId === hook.threadId) {
4808
+ return true;
4809
+ }
4810
+ return false;
4811
+ });
4812
+ if (matched.length > 0) return matched;
4813
+ return state.events;
4814
+ }
4815
+
4816
+ // src/store/skills-registry.ts
4817
+ function createSkillsRegistryState() {
4818
+ return { snapshots: {} };
4819
+ }
4820
+ function clearSkillsRegistry(state) {
4821
+ state.snapshots = {};
4822
+ }
4823
+ function applySkillsSnapshot(state, payload) {
4824
+ const key = payload.hookId && payload.hookId.length > 0 ? payload.hookId : "_default";
4825
+ const catalog = Array.isArray(payload.catalog) ? payload.catalog : [];
4826
+ const activated = Array.isArray(payload.activated) ? payload.activated : [];
4827
+ state.snapshots[key] = {
4828
+ catalog,
4829
+ activated,
4830
+ updatedAt: payload.timestamp ?? Date.now()
4831
+ };
4832
+ }
4833
+
4767
4834
  // src/store/ai-context.tsx
4768
4835
  var AIContext = createContext();
4769
4836
  function useAIStore() {
@@ -4778,7 +4845,9 @@ var AIProvider = (props) => {
4778
4845
  conversations: {},
4779
4846
  activeConversationId: null,
4780
4847
  hooks: createHookRegistryState(),
4781
- memory: createMemoryRegistryState()
4848
+ memory: createMemoryRegistryState(),
4849
+ compaction: createCompactionRegistryState(),
4850
+ skills: createSkillsRegistryState()
4782
4851
  });
4783
4852
  const streamToConversation = /* @__PURE__ */ new Map();
4784
4853
  const requestToConversation = /* @__PURE__ */ new Map();
@@ -5035,11 +5104,24 @@ var AIProvider = (props) => {
5035
5104
  clearMemoryRegistry(memory);
5036
5105
  }));
5037
5106
  }
5038
- function selectHook(id) {
5039
- setState("hooks", produce((hooks) => {
5040
- setActiveHook(hooks, id);
5107
+ function clearCompaction() {
5108
+ setState("compaction", produce((compaction) => {
5109
+ clearCompactionRegistry(compaction);
5041
5110
  }));
5042
5111
  }
5112
+ function clearSkills() {
5113
+ setState("skills", produce((skills) => {
5114
+ clearSkillsRegistry(skills);
5115
+ }));
5116
+ }
5117
+ function selectHook(id) {
5118
+ setState("hooks", "activeHookId", id);
5119
+ if (id) {
5120
+ setState("hooks", produce((hooks) => {
5121
+ markHookViewed(hooks, id);
5122
+ }));
5123
+ }
5124
+ }
5043
5125
  function saveToolFixture(fixture) {
5044
5126
  const fixtures = mergeFixtures(fixture, state.hooks.fixtures);
5045
5127
  setState("hooks", produce((hooks) => {
@@ -5359,6 +5441,10 @@ var AIProvider = (props) => {
5359
5441
  setState("memory", produce((memory) => {
5360
5442
  applyMemorySnapshot(memory, e.payload);
5361
5443
  }));
5444
+ }), aiEventClient.on("skills:snapshot", (e) => {
5445
+ setState("skills", produce((skills) => {
5446
+ applySkillsSnapshot(skills, e.payload);
5447
+ }));
5362
5448
  }));
5363
5449
  const recordRunEvent = (eventName, payload) => {
5364
5450
  setState("hooks", produce((hooks) => {
@@ -6542,6 +6628,48 @@ var AIProvider = (props) => {
6542
6628
  arr.push(mwEvent);
6543
6629
  }));
6544
6630
  }));
6631
+ const recordCompactionLifecycle = (kind, hookName, payload) => {
6632
+ setState("compaction", produce((compaction) => {
6633
+ applyCompactionEvent(compaction, kind, payload);
6634
+ }));
6635
+ const {
6636
+ requestId,
6637
+ streamId,
6638
+ clientId
6639
+ } = payload;
6640
+ const conversationId = (clientId && state.conversations[clientId] ? clientId : void 0) || (streamId ? streamToConversation.get(streamId) : void 0) || (requestId ? requestToConversation.get(requestId) : void 0);
6641
+ if (!conversationId || !state.conversations[conversationId]) return;
6642
+ const conv = state.conversations[conversationId];
6643
+ const iterIndex = findLatestIterationIndex(conv, requestId);
6644
+ if (iterIndex < 0) return;
6645
+ const mwEvent = {
6646
+ id: `mw-cmp-${kind}-${Date.now()}-${Math.random()}`,
6647
+ middlewareName: "compaction",
6648
+ hookName,
6649
+ timestamp: payload.timestamp,
6650
+ hasTransform: kind === "state",
6651
+ configChanges: {
6652
+ before: payload.before,
6653
+ after: payload.after,
6654
+ messagesBefore: payload.messagesBefore,
6655
+ messagesAfter: payload.messagesAfter,
6656
+ reusedCheckpoint: payload.reusedCheckpoint,
6657
+ maxTokens: payload.maxTokens,
6658
+ strategyKey: payload.strategyKey,
6659
+ durationMs: payload.durationMs
6660
+ }
6661
+ };
6662
+ setState("conversations", conversationId, "iterations", iterIndex, "middlewareEvents", produce((arr) => {
6663
+ arr.push(mwEvent);
6664
+ }));
6665
+ };
6666
+ cleanupFns.push(aiEventClient.on("compaction:started", (e) => {
6667
+ recordCompactionLifecycle("started", "onCompactStart", e.payload);
6668
+ }), aiEventClient.on("compaction:state", (e) => {
6669
+ recordCompactionLifecycle("state", "onCompact", e.payload);
6670
+ }), aiEventClient.on("compaction:ended", (e) => {
6671
+ recordCompactionLifecycle("ended", "onCompactEnd", e.payload);
6672
+ }));
6545
6673
  cleanupFns.push(aiEventClient.on("summarize:request:started", (e) => {
6546
6674
  const {
6547
6675
  requestId,
@@ -6935,6 +7063,8 @@ var AIProvider = (props) => {
6935
7063
  selectConversation,
6936
7064
  clearHooks,
6937
7065
  clearMemory,
7066
+ clearCompaction,
7067
+ clearSkills,
6938
7068
  selectHook,
6939
7069
  saveToolFixture,
6940
7070
  deleteToolFixture,
@@ -7069,8 +7199,9 @@ var HookDashboard = () => {
7069
7199
  const unseenUpdateCount = createMemo(() => hooks().reduce((count, hook) => count + getHookUnseenEventCount(state.hooks, hook.id), 0));
7070
7200
  const handleSelect = (hook) => {
7071
7201
  selectHook(hook.id);
7072
- if (state.conversations[hook.id]) {
7073
- selectConversation(hook.id);
7202
+ const conversationId = hook.id || hook.clientId || hook.threadId;
7203
+ if (conversationId && state.conversations[conversationId]) {
7204
+ selectConversation(conversationId);
7074
7205
  }
7075
7206
  };
7076
7207
  return (() => {
@@ -7546,6 +7677,9 @@ var MiddlewareStep = (props) => {
7546
7677
  if (ev().wasDropped) return "DROP";
7547
7678
  if (ev().hookName === "onChunk" && ev().hasTransform) return "TRANSFORM";
7548
7679
  if (ev().hookName === "onConfig" && ev().hasTransform) return "TRANSFORM";
7680
+ if (ev().hookName === "onCompactStart") return "START";
7681
+ if (ev().hookName === "onCompact") return "COMPACT";
7682
+ if (ev().hookName === "onCompactEnd") return "END";
7549
7683
  if (ev().hookName === "onBeforeToolCall" && ev().hasTransform) return "DECISION";
7550
7684
  return null;
7551
7685
  };
@@ -7555,6 +7689,9 @@ var MiddlewareStep = (props) => {
7555
7689
  };
7556
7690
  return [(() => {
7557
7691
  var _el$ = _tmpl$32(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.nextSibling;
7692
+ _el$.$$click = () => {
7693
+ if (hasChanges()) setExpanded(!expanded());
7694
+ };
7558
7695
  insert(_el$3, () => ev().middlewareName);
7559
7696
  insert(_el$4, () => ev().hookName);
7560
7697
  insert(_el$, createComponent(Show, {
@@ -7585,24 +7722,27 @@ var MiddlewareStep = (props) => {
7585
7722
  },
7586
7723
  get children() {
7587
7724
  var _el$8 = _tmpl$22();
7588
- _el$8.$$click = () => setExpanded(!expanded());
7589
7725
  insert(_el$8, () => expanded() ? "hide changes" : "show changes");
7590
7726
  effect(() => className(_el$8, s().stepExpandToggle));
7591
7727
  return _el$8;
7592
7728
  }
7593
7729
  }), null);
7594
7730
  effect((_p$) => {
7595
- var _v$ = s().step, _v$2 = `${s().stepPrefix} ${s().stepPrefixMiddleware}`, _v$3 = `${s().mwBadge} ${badgeClass()}`, _v$4 = s().mwHook;
7731
+ var _v$ = s().step, _v$2 = hasChanges() ? {
7732
+ cursor: "pointer"
7733
+ } : void 0, _v$3 = `${s().stepPrefix} ${s().stepPrefixMiddleware}`, _v$4 = `${s().mwBadge} ${badgeClass()}`, _v$5 = s().mwHook;
7596
7734
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
7597
- _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
7598
- _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
7599
- _v$4 !== _p$.o && className(_el$4, _p$.o = _v$4);
7735
+ _p$.t = style(_el$, _v$2, _p$.t);
7736
+ _v$3 !== _p$.a && className(_el$2, _p$.a = _v$3);
7737
+ _v$4 !== _p$.o && className(_el$3, _p$.o = _v$4);
7738
+ _v$5 !== _p$.i && className(_el$4, _p$.i = _v$5);
7600
7739
  return _p$;
7601
7740
  }, {
7602
7741
  e: void 0,
7603
7742
  t: void 0,
7604
7743
  a: void 0,
7605
- o: void 0
7744
+ o: void 0,
7745
+ i: void 0
7606
7746
  });
7607
7747
  return _el$;
7608
7748
  })(), createComponent(Show, {
@@ -7658,9 +7798,9 @@ var ThinkingStep = (props) => {
7658
7798
  }
7659
7799
  }), null);
7660
7800
  effect((_p$) => {
7661
- var _v$5 = `${s().stepPrefix} ${s().stepPrefixThinking}`, _v$6 = s().stepContent;
7662
- _v$5 !== _p$.e && className(_el$1, _p$.e = _v$5);
7663
- _v$6 !== _p$.t && className(_el$10, _p$.t = _v$6);
7801
+ var _v$6 = `${s().stepPrefix} ${s().stepPrefixThinking}`, _v$7 = s().stepContent;
7802
+ _v$6 !== _p$.e && className(_el$1, _p$.e = _v$6);
7803
+ _v$7 !== _p$.t && className(_el$10, _p$.t = _v$7);
7664
7804
  return _p$;
7665
7805
  }, {
7666
7806
  e: void 0,
@@ -7714,10 +7854,10 @@ var StructuredOutputStep = (props) => {
7714
7854
  }), false, true);
7715
7855
  insert(_el$15, () => part().status);
7716
7856
  effect((_p$) => {
7717
- var _v$7 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$8 = `${s().mwBadge} ${badgeClass()}`, _v$9 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
7718
- _v$7 !== _p$.e && className(_el$14, _p$.e = _v$7);
7719
- _v$8 !== _p$.t && className(_el$15, _p$.t = _v$8);
7720
- _v$9 !== _p$.a && className(_el$16, _p$.a = _v$9);
7857
+ var _v$8 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$9 = `${s().mwBadge} ${badgeClass()}`, _v$0 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
7858
+ _v$8 !== _p$.e && className(_el$14, _p$.e = _v$8);
7859
+ _v$9 !== _p$.t && className(_el$15, _p$.t = _v$9);
7860
+ _v$0 !== _p$.a && className(_el$16, _p$.a = _v$0);
7721
7861
  return _p$;
7722
7862
  }, {
7723
7863
  e: void 0,
@@ -7742,10 +7882,10 @@ var StructuredOutputStep = (props) => {
7742
7882
  copyable: true
7743
7883
  }));
7744
7884
  effect((_p$) => {
7745
- var _v$10 = s().stepJsonItem, _v$11 = s().stepJsonItemLabel, _v$12 = s().stepJsonPanel;
7746
- _v$10 !== _p$.e && className(_el$19, _p$.e = _v$10);
7747
- _v$11 !== _p$.t && className(_el$20, _p$.t = _v$11);
7748
- _v$12 !== _p$.a && className(_el$21, _p$.a = _v$12);
7885
+ var _v$11 = s().stepJsonItem, _v$12 = s().stepJsonItemLabel, _v$13 = s().stepJsonPanel;
7886
+ _v$11 !== _p$.e && className(_el$19, _p$.e = _v$11);
7887
+ _v$12 !== _p$.t && className(_el$20, _p$.t = _v$12);
7888
+ _v$13 !== _p$.a && className(_el$21, _p$.a = _v$13);
7749
7889
  return _p$;
7750
7890
  }, {
7751
7891
  e: void 0,
@@ -7756,9 +7896,9 @@ var StructuredOutputStep = (props) => {
7756
7896
  })()
7757
7897
  }));
7758
7898
  effect((_p$) => {
7759
- var _v$0 = `${s().cardBody} ${expanded() ? s().cardBodyOpen : ""}`, _v$1 = `${s().cardBodyInner} ${s().stepJsonItemsCompare}`;
7760
- _v$0 !== _p$.e && className(_el$17, _p$.e = _v$0);
7761
- _v$1 !== _p$.t && className(_el$18, _p$.t = _v$1);
7899
+ var _v$1 = `${s().cardBody} ${expanded() ? s().cardBodyOpen : ""}`, _v$10 = `${s().cardBodyInner} ${s().stepJsonItemsCompare}`;
7900
+ _v$1 !== _p$.e && className(_el$17, _p$.e = _v$1);
7901
+ _v$10 !== _p$.t && className(_el$18, _p$.t = _v$10);
7762
7902
  return _p$;
7763
7903
  }, {
7764
7904
  e: void 0,
@@ -7807,9 +7947,9 @@ var AssistantStep = (props) => {
7807
7947
  }
7808
7948
  }), null);
7809
7949
  effect((_p$) => {
7810
- var _v$13 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$14 = isLong() ? s().stepContentLong : s().stepContent;
7811
- _v$13 !== _p$.e && className(_el$23, _p$.e = _v$13);
7812
- _v$14 !== _p$.t && className(_el$24, _p$.t = _v$14);
7950
+ var _v$14 = `${s().stepPrefix} ${s().stepPrefixAssistant}`, _v$15 = isLong() ? s().stepContentLong : s().stepContent;
7951
+ _v$14 !== _p$.e && className(_el$23, _p$.e = _v$14);
7952
+ _v$15 !== _p$.t && className(_el$24, _p$.t = _v$15);
7813
7953
  return _p$;
7814
7954
  }, {
7815
7955
  e: void 0,
@@ -7900,10 +8040,10 @@ var ToolCallStep = (props) => {
7900
8040
  }
7901
8041
  }), _el$32);
7902
8042
  effect((_p$) => {
7903
- var _v$15 = `${s().stepPrefix} ${s().stepPrefixToolCall}`, _v$16 = `${s().mwBadge} ${s().mwBadgeToolCall}`, _v$17 = `${s().chevron} ${argsOpen() ? s().chevronOpen : ""}`;
7904
- _v$15 !== _p$.e && className(_el$28, _p$.e = _v$15);
7905
- _v$16 !== _p$.t && className(_el$29, _p$.t = _v$16);
7906
- _v$17 !== _p$.a && className(_el$32, _p$.a = _v$17);
8043
+ var _v$16 = `${s().stepPrefix} ${s().stepPrefixToolCall}`, _v$17 = `${s().mwBadge} ${s().mwBadgeToolCall}`, _v$18 = `${s().chevron} ${argsOpen() ? s().chevronOpen : ""}`;
8044
+ _v$16 !== _p$.e && className(_el$28, _p$.e = _v$16);
8045
+ _v$17 !== _p$.t && className(_el$29, _p$.t = _v$17);
8046
+ _v$18 !== _p$.a && className(_el$32, _p$.a = _v$18);
7907
8047
  return _p$;
7908
8048
  }, {
7909
8049
  e: void 0,
@@ -7921,10 +8061,10 @@ var ToolCallStep = (props) => {
7921
8061
  copyable: true
7922
8062
  }));
7923
8063
  effect((_p$) => {
7924
- var _v$18 = `${s().cardBody} ${argsOpen() ? s().cardBodyOpen : ""}`, _v$19 = s().cardBodyInner, _v$20 = s().stepJsonPanel;
7925
- _v$18 !== _p$.e && className(_el$33, _p$.e = _v$18);
7926
- _v$19 !== _p$.t && className(_el$34, _p$.t = _v$19);
7927
- _v$20 !== _p$.a && className(_el$35, _p$.a = _v$20);
8064
+ var _v$19 = `${s().cardBody} ${argsOpen() ? s().cardBodyOpen : ""}`, _v$20 = s().cardBodyInner, _v$21 = s().stepJsonPanel;
8065
+ _v$19 !== _p$.e && className(_el$33, _p$.e = _v$19);
8066
+ _v$20 !== _p$.t && className(_el$34, _p$.t = _v$20);
8067
+ _v$21 !== _p$.a && className(_el$35, _p$.a = _v$21);
7928
8068
  return _p$;
7929
8069
  }, {
7930
8070
  e: void 0,
@@ -7970,10 +8110,10 @@ var ToolCallStep = (props) => {
7970
8110
  }
7971
8111
  }), _el$41);
7972
8112
  effect((_p$) => {
7973
- var _v$21 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$22 = `${s().mwBadge} ${s().mwBadgeToolResult}`, _v$23 = `${s().chevron} ${resultOpen() ? s().chevronOpen : ""}`;
7974
- _v$21 !== _p$.e && className(_el$37, _p$.e = _v$21);
7975
- _v$22 !== _p$.t && className(_el$38, _p$.t = _v$22);
7976
- _v$23 !== _p$.a && className(_el$41, _p$.a = _v$23);
8113
+ var _v$22 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$23 = `${s().mwBadge} ${s().mwBadgeToolResult}`, _v$24 = `${s().chevron} ${resultOpen() ? s().chevronOpen : ""}`;
8114
+ _v$22 !== _p$.e && className(_el$37, _p$.e = _v$22);
8115
+ _v$23 !== _p$.t && className(_el$38, _p$.t = _v$23);
8116
+ _v$24 !== _p$.a && className(_el$41, _p$.a = _v$24);
7977
8117
  return _p$;
7978
8118
  }, {
7979
8119
  e: void 0,
@@ -7991,10 +8131,10 @@ var ToolCallStep = (props) => {
7991
8131
  copyable: true
7992
8132
  }));
7993
8133
  effect((_p$) => {
7994
- var _v$24 = `${s().cardBody} ${resultOpen() ? s().cardBodyOpen : ""}`, _v$25 = s().cardBodyInner, _v$26 = s().stepJsonPanel;
7995
- _v$24 !== _p$.e && className(_el$42, _p$.e = _v$24);
7996
- _v$25 !== _p$.t && className(_el$43, _p$.t = _v$25);
7997
- _v$26 !== _p$.a && className(_el$44, _p$.a = _v$26);
8134
+ var _v$25 = `${s().cardBody} ${resultOpen() ? s().cardBodyOpen : ""}`, _v$26 = s().cardBodyInner, _v$27 = s().stepJsonPanel;
8135
+ _v$25 !== _p$.e && className(_el$42, _p$.e = _v$25);
8136
+ _v$26 !== _p$.t && className(_el$43, _p$.t = _v$26);
8137
+ _v$27 !== _p$.a && className(_el$44, _p$.a = _v$27);
7998
8138
  return _p$;
7999
8139
  }, {
8000
8140
  e: void 0,
@@ -8034,9 +8174,9 @@ var ToolResultStep = (props) => {
8034
8174
  }
8035
8175
  }), false, true);
8036
8176
  effect((_p$) => {
8037
- var _v$27 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$28 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`;
8038
- _v$27 !== _p$.e && className(_el$47, _p$.e = _v$27);
8039
- _v$28 !== _p$.t && className(_el$48, _p$.t = _v$28);
8177
+ var _v$28 = `${s().stepPrefix} ${s().stepPrefixToolResult}`, _v$29 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`;
8178
+ _v$28 !== _p$.e && className(_el$47, _p$.e = _v$28);
8179
+ _v$29 !== _p$.t && className(_el$48, _p$.t = _v$29);
8040
8180
  return _p$;
8041
8181
  }, {
8042
8182
  e: void 0,
@@ -8053,10 +8193,10 @@ var ToolResultStep = (props) => {
8053
8193
  copyable: true
8054
8194
  }));
8055
8195
  effect((_p$) => {
8056
- var _v$29 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$30 = s().cardBodyInner, _v$31 = s().stepJsonPanel;
8057
- _v$29 !== _p$.e && className(_el$49, _p$.e = _v$29);
8058
- _v$30 !== _p$.t && className(_el$50, _p$.t = _v$30);
8059
- _v$31 !== _p$.a && className(_el$51, _p$.a = _v$31);
8196
+ var _v$30 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$31 = s().cardBodyInner, _v$32 = s().stepJsonPanel;
8197
+ _v$30 !== _p$.e && className(_el$49, _p$.e = _v$30);
8198
+ _v$31 !== _p$.t && className(_el$50, _p$.t = _v$31);
8199
+ _v$32 !== _p$.a && className(_el$51, _p$.a = _v$32);
8060
8200
  return _p$;
8061
8201
  }, {
8062
8202
  e: void 0,
@@ -8329,9 +8469,9 @@ var IterationCard = (props) => {
8329
8469
  var _el$69 = _tmpl$17(); _el$69.firstChild;
8330
8470
  insert(_el$69, totalToolCalls, null);
8331
8471
  effect((_p$) => {
8332
- var _v$32 = `${s().badge} ${s().badgeFinishReasonToolCalls}`, _v$33 = `${totalToolCalls()} tool ${totalToolCalls() === 1 ? "call" : "calls"}`;
8333
- _v$32 !== _p$.e && className(_el$69, _p$.e = _v$32);
8334
- _v$33 !== _p$.t && setAttribute(_el$69, "title", _p$.t = _v$33);
8472
+ var _v$33 = `${s().badge} ${s().badgeFinishReasonToolCalls}`, _v$34 = `${totalToolCalls()} tool ${totalToolCalls() === 1 ? "call" : "calls"}`;
8473
+ _v$33 !== _p$.e && className(_el$69, _p$.e = _v$33);
8474
+ _v$34 !== _p$.t && setAttribute(_el$69, "title", _p$.t = _v$34);
8335
8475
  return _p$;
8336
8476
  }, {
8337
8477
  e: void 0,
@@ -8348,9 +8488,9 @@ var IterationCard = (props) => {
8348
8488
  var _el$71 = _tmpl$18(); _el$71.firstChild;
8349
8489
  insert(_el$71, () => formatDuration(duration()), null);
8350
8490
  effect((_p$) => {
8351
- var _v$34 = `${s().badge} ${s().badgeDuration}`, _v$35 = formatDuration(duration());
8352
- _v$34 !== _p$.e && className(_el$71, _p$.e = _v$34);
8353
- _v$35 !== _p$.t && setAttribute(_el$71, "title", _p$.t = _v$35);
8491
+ var _v$35 = `${s().badge} ${s().badgeDuration}`, _v$36 = formatDuration(duration());
8492
+ _v$35 !== _p$.e && className(_el$71, _p$.e = _v$35);
8493
+ _v$36 !== _p$.t && setAttribute(_el$71, "title", _p$.t = _v$36);
8354
8494
  return _p$;
8355
8495
  }, {
8356
8496
  e: void 0,
@@ -8367,9 +8507,9 @@ var IterationCard = (props) => {
8367
8507
  var _el$94 = _tmpl$25(); _el$94.firstChild;
8368
8508
  insert(_el$94, () => usage().totalTokens.toLocaleString(), null);
8369
8509
  effect((_p$) => {
8370
- var _v$56 = `${s().badge} ${s().badgeUsage}`, _v$57 = `Prompt: ${usage().promptTokens.toLocaleString()} | Completion: ${usage().completionTokens.toLocaleString()}`;
8371
- _v$56 !== _p$.e && className(_el$94, _p$.e = _v$56);
8372
- _v$57 !== _p$.t && setAttribute(_el$94, "title", _p$.t = _v$57);
8510
+ var _v$57 = `${s().badge} ${s().badgeUsage}`, _v$58 = `Prompt: ${usage().promptTokens.toLocaleString()} | Completion: ${usage().completionTokens.toLocaleString()}`;
8511
+ _v$57 !== _p$.e && className(_el$94, _p$.e = _v$57);
8512
+ _v$58 !== _p$.t && setAttribute(_el$94, "title", _p$.t = _v$58);
8373
8513
  return _p$;
8374
8514
  }, {
8375
8515
  e: void 0,
@@ -8426,12 +8566,12 @@ var IterationCard = (props) => {
8426
8566
  insert(_el$103, () => diff.from);
8427
8567
  insert(_el$105, () => diff.to);
8428
8568
  effect((_p$) => {
8429
- var _v$58 = s().configDiffRow, _v$59 = s().configDiffKey, _v$60 = s().configDiffFrom, _v$61 = s().configDiffArrow, _v$62 = s().configDiffTo;
8430
- _v$58 !== _p$.e && className(_el$100, _p$.e = _v$58);
8431
- _v$59 !== _p$.t && className(_el$101, _p$.t = _v$59);
8432
- _v$60 !== _p$.a && className(_el$103, _p$.a = _v$60);
8433
- _v$61 !== _p$.o && className(_el$104, _p$.o = _v$61);
8434
- _v$62 !== _p$.i && className(_el$105, _p$.i = _v$62);
8569
+ var _v$59 = s().configDiffRow, _v$60 = s().configDiffKey, _v$61 = s().configDiffFrom, _v$62 = s().configDiffArrow, _v$63 = s().configDiffTo;
8570
+ _v$59 !== _p$.e && className(_el$100, _p$.e = _v$59);
8571
+ _v$60 !== _p$.t && className(_el$101, _p$.t = _v$60);
8572
+ _v$61 !== _p$.a && className(_el$103, _p$.a = _v$61);
8573
+ _v$62 !== _p$.o && className(_el$104, _p$.o = _v$62);
8574
+ _v$63 !== _p$.i && className(_el$105, _p$.i = _v$63);
8435
8575
  return _p$;
8436
8576
  }, {
8437
8577
  e: void 0,
@@ -8444,10 +8584,10 @@ var IterationCard = (props) => {
8444
8584
  })()
8445
8585
  }));
8446
8586
  effect((_p$) => {
8447
- var _v$36 = s().configPanelSection, _v$37 = s().configPanelLabel, _v$38 = s().configDiffSection;
8448
- _v$36 !== _p$.e && className(_el$78, _p$.e = _v$36);
8449
- _v$37 !== _p$.t && className(_el$79, _p$.t = _v$37);
8450
- _v$38 !== _p$.a && className(_el$80, _p$.a = _v$38);
8587
+ var _v$37 = s().configPanelSection, _v$38 = s().configPanelLabel, _v$39 = s().configDiffSection;
8588
+ _v$37 !== _p$.e && className(_el$78, _p$.e = _v$37);
8589
+ _v$38 !== _p$.t && className(_el$79, _p$.t = _v$38);
8590
+ _v$39 !== _p$.a && className(_el$80, _p$.a = _v$39);
8451
8591
  return _p$;
8452
8592
  }, {
8453
8593
  e: void 0,
@@ -8472,9 +8612,9 @@ var IterationCard = (props) => {
8472
8612
  insert(_el$106, name, _el$107);
8473
8613
  insert(_el$107, () => toolInvocationCounts().get(name) || 0);
8474
8614
  effect((_p$) => {
8475
- var _v$63 = s().configToolChip, _v$64 = s().configToolChipCount;
8476
- _v$63 !== _p$.e && className(_el$106, _p$.e = _v$63);
8477
- _v$64 !== _p$.t && className(_el$107, _p$.t = _v$64);
8615
+ var _v$64 = s().configToolChip, _v$65 = s().configToolChipCount;
8616
+ _v$64 !== _p$.e && className(_el$106, _p$.e = _v$64);
8617
+ _v$65 !== _p$.t && className(_el$107, _p$.t = _v$65);
8478
8618
  return _p$;
8479
8619
  }, {
8480
8620
  e: void 0,
@@ -8484,10 +8624,10 @@ var IterationCard = (props) => {
8484
8624
  })()
8485
8625
  }));
8486
8626
  effect((_p$) => {
8487
- var _v$39 = s().configPanelSection, _v$40 = s().configPanelLabel, _v$41 = s().configToolsList;
8488
- _v$39 !== _p$.e && className(_el$81, _p$.e = _v$39);
8489
- _v$40 !== _p$.t && className(_el$82, _p$.t = _v$40);
8490
- _v$41 !== _p$.a && className(_el$83, _p$.a = _v$41);
8627
+ var _v$40 = s().configPanelSection, _v$41 = s().configPanelLabel, _v$42 = s().configToolsList;
8628
+ _v$40 !== _p$.e && className(_el$81, _p$.e = _v$40);
8629
+ _v$41 !== _p$.t && className(_el$82, _p$.t = _v$41);
8630
+ _v$42 !== _p$.a && className(_el$83, _p$.a = _v$42);
8491
8631
  return _p$;
8492
8632
  }, {
8493
8633
  e: void 0,
@@ -8516,9 +8656,9 @@ var IterationCard = (props) => {
8516
8656
  })
8517
8657
  }), null);
8518
8658
  effect((_p$) => {
8519
- var _v$42 = s().configPanelSection, _v$43 = s().configPanelLabel;
8520
- _v$42 !== _p$.e && className(_el$84, _p$.e = _v$42);
8521
- _v$43 !== _p$.t && className(_el$85, _p$.t = _v$43);
8659
+ var _v$43 = s().configPanelSection, _v$44 = s().configPanelLabel;
8660
+ _v$43 !== _p$.e && className(_el$84, _p$.e = _v$43);
8661
+ _v$44 !== _p$.t && className(_el$85, _p$.t = _v$44);
8522
8662
  return _p$;
8523
8663
  }, {
8524
8664
  e: void 0,
@@ -8541,10 +8681,10 @@ var IterationCard = (props) => {
8541
8681
  copyable: true
8542
8682
  }));
8543
8683
  effect((_p$) => {
8544
- var _v$44 = s().configPanelSection, _v$45 = s().configPanelLabel, _v$46 = s().configJsonTreeContainer;
8545
- _v$44 !== _p$.e && className(_el$89, _p$.e = _v$44);
8546
- _v$45 !== _p$.t && className(_el$90, _p$.t = _v$45);
8547
- _v$46 !== _p$.a && className(_el$91, _p$.a = _v$46);
8684
+ var _v$45 = s().configPanelSection, _v$46 = s().configPanelLabel, _v$47 = s().configJsonTreeContainer;
8685
+ _v$45 !== _p$.e && className(_el$89, _p$.e = _v$45);
8686
+ _v$46 !== _p$.t && className(_el$90, _p$.t = _v$46);
8687
+ _v$47 !== _p$.a && className(_el$91, _p$.a = _v$47);
8548
8688
  return _p$;
8549
8689
  }, {
8550
8690
  e: void 0,
@@ -8646,16 +8786,16 @@ var IterationCard = (props) => {
8646
8786
  })
8647
8787
  }));
8648
8788
  effect((_p$) => {
8649
- 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;
8650
- _v$47 !== _p$.e && className(_el$54, _p$.e = _v$47);
8651
- _v$48 !== _p$.t && className(_el$55, _p$.t = _v$48);
8652
- _v$49 !== _p$.a && className(_el$56, _p$.a = _v$49);
8653
- _v$50 !== _p$.o && className(_el$67, _p$.o = _v$50);
8654
- _v$51 !== _p$.i && className(_el$74, _p$.i = _v$51);
8655
- _v$52 !== _p$.n && className(_el$75, _p$.n = _v$52);
8656
- _v$53 !== _p$.s && className(_el$76, _p$.s = _v$53);
8657
- _v$54 !== _p$.h && className(_el$92, _p$.h = _v$54);
8658
- _v$55 !== _p$.r && className(_el$93, _p$.r = _v$55);
8789
+ var _v$48 = s().cardHeaderContent, _v$49 = s().iterCardTitle, _v$50 = s().cardSubtitle, _v$51 = s().cardHeaderBadges, _v$52 = `${s().chevron} ${isOpen() ? s().chevronOpen : ""}`, _v$53 = `${s().configPanelWrapper} ${configExpanded() ? s().configPanelWrapperOpen : ""}`, _v$54 = s().configPanel, _v$55 = `${s().cardBody} ${isOpen() ? s().cardBodyOpen : ""}`, _v$56 = s().cardBodyInner;
8790
+ _v$48 !== _p$.e && className(_el$54, _p$.e = _v$48);
8791
+ _v$49 !== _p$.t && className(_el$55, _p$.t = _v$49);
8792
+ _v$50 !== _p$.a && className(_el$56, _p$.a = _v$50);
8793
+ _v$51 !== _p$.o && className(_el$67, _p$.o = _v$51);
8794
+ _v$52 !== _p$.i && className(_el$74, _p$.i = _v$52);
8795
+ _v$53 !== _p$.n && className(_el$75, _p$.n = _v$53);
8796
+ _v$54 !== _p$.s && className(_el$76, _p$.s = _v$54);
8797
+ _v$55 !== _p$.h && className(_el$92, _p$.h = _v$55);
8798
+ _v$56 !== _p$.r && className(_el$93, _p$.r = _v$56);
8659
8799
  return _p$;
8660
8800
  }, {
8661
8801
  e: void 0,
@@ -10918,18 +11058,461 @@ var MemoryPanel = () => {
10918
11058
  })();
10919
11059
  };
10920
11060
  delegateEvents(["click"]);
11061
+ var _tmpl$40 = /* @__PURE__ */ template(`<div><div></div><div>`);
11062
+ var _tmpl$214 = /* @__PURE__ */ template(`<div>`);
11063
+ var _tmpl$310 = /* @__PURE__ */ template(`<div><div> (<!>)`);
11064
+ var _tmpl$47 = /* @__PURE__ */ template(`<span> \u2192 <!> tok`);
11065
+ var _tmpl$57 = /* @__PURE__ */ template(`<span>ms`);
11066
+ var _tmpl$67 = /* @__PURE__ */ template(`<span>checkpoint`);
11067
+ var _tmpl$77 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-compaction-event style=cursor:pointer><span></span><span></span><span></span><span></span><span>\u25B6`);
11068
+ var _tmpl$87 = /* @__PURE__ */ template(`<div><span> event</span><button type=button>Clear`);
11069
+ var _tmpl$97 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-compaction-panel>`);
11070
+ var _tmpl$06 = /* @__PURE__ */ template(`<div>No compaction yet. When the transcript passes maxTokens, each compact appears here.`);
11071
+ function formatTime3(value) {
11072
+ const date = new Date(value);
11073
+ if (Number.isNaN(date.getTime())) return "";
11074
+ return date.toLocaleTimeString();
11075
+ }
11076
+ function shortStrategy(event) {
11077
+ const key = event.strategyKey;
11078
+ if (!key) return event.reusedCheckpoint ? "checkpoint" : "compaction";
11079
+ const cut = key.indexOf(":maxTokens=");
11080
+ return cut === -1 ? key : key.slice(0, cut);
11081
+ }
11082
+ var PreviewMessage = (props) => {
11083
+ const styles = useStyles();
11084
+ return (() => {
11085
+ var _el$ = _tmpl$40(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
11086
+ insert(_el$2, () => props.preview.role, null);
11087
+ insert(_el$2, createComponent(Show, {
11088
+ get when() {
11089
+ return props.preview.tokens > 0;
11090
+ },
11091
+ get children() {
11092
+ return ` \xB7 ${props.preview.tokens} tok`;
11093
+ }
11094
+ }), null);
11095
+ insert(_el$3, () => props.preview.text);
11096
+ effect((_p$) => {
11097
+ var _v$ = styles().hookDetails.message, _v$2 = styles().hookDetails.messageRole, _v$3 = styles().hookDetails.messageContent;
11098
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
11099
+ _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
11100
+ _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
11101
+ return _p$;
11102
+ }, {
11103
+ e: void 0,
11104
+ t: void 0,
11105
+ a: void 0
11106
+ });
11107
+ return _el$;
11108
+ })();
11109
+ };
11110
+ var PreviewColumn = (props) => {
11111
+ const styles = useStyles();
11112
+ const s = () => styles().iterationTimeline;
11113
+ return (() => {
11114
+ var _el$4 = _tmpl$310(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$8 = _el$6.nextSibling; _el$8.nextSibling;
11115
+ insert(_el$5, () => props.title, _el$6);
11116
+ insert(_el$5, () => props.previews.length, _el$8);
11117
+ insert(_el$4, createComponent(Show, {
11118
+ get when() {
11119
+ return props.previews.length > 0;
11120
+ },
11121
+ get fallback() {
11122
+ return (() => {
11123
+ var _el$0 = _tmpl$214();
11124
+ insert(_el$0, () => props.empty);
11125
+ effect(() => className(_el$0, styles().hookDetails.emptySmall));
11126
+ return _el$0;
11127
+ })();
11128
+ },
11129
+ get children() {
11130
+ var _el$9 = _tmpl$214();
11131
+ insert(_el$9, createComponent(For, {
11132
+ get each() {
11133
+ return props.previews;
11134
+ },
11135
+ children: (preview) => createComponent(PreviewMessage, {
11136
+ preview
11137
+ })
11138
+ }));
11139
+ effect(() => className(_el$9, styles().memoryPanel.list));
11140
+ return _el$9;
11141
+ }
11142
+ }), null);
11143
+ effect((_p$) => {
11144
+ var _v$4 = s().stepJsonItem, _v$5 = s().stepJsonItemLabel;
11145
+ _v$4 !== _p$.e && className(_el$4, _p$.e = _v$4);
11146
+ _v$5 !== _p$.t && className(_el$5, _p$.t = _v$5);
11147
+ return _p$;
11148
+ }, {
11149
+ e: void 0,
11150
+ t: void 0
11151
+ });
11152
+ return _el$4;
11153
+ })();
11154
+ };
11155
+ function kindLabel(kind) {
11156
+ if (kind === "started") return "Started";
11157
+ if (kind === "ended") return "Ended";
11158
+ return "State";
11159
+ }
11160
+ var CompactEvent = (props) => {
11161
+ const styles = useStyles();
11162
+ const s = () => styles().iterationTimeline;
11163
+ const [expanded, setExpanded] = createSignal(props.defaultOpen === true);
11164
+ const event = () => props.event;
11165
+ const isState = () => event().kind === "state";
11166
+ const stats = () => ({
11167
+ kind: event().kind,
11168
+ before: event().before,
11169
+ after: event().after,
11170
+ messagesBefore: event().messagesBefore,
11171
+ messagesAfter: event().messagesAfter,
11172
+ maxTokens: event().maxTokens,
11173
+ strategyKey: event().strategyKey,
11174
+ reusedCheckpoint: event().reusedCheckpoint,
11175
+ durationMs: event().durationMs
11176
+ });
11177
+ const countLabel = () => {
11178
+ if (event().kind === "started") {
11179
+ return `${event().messagesBefore ?? 0} msgs \xB7 ${event().before ?? 0} tok`;
11180
+ }
11181
+ if (event().kind === "ended") {
11182
+ return `${event().messagesAfter ?? 0} msgs \xB7 ${event().after ?? 0} tok`;
11183
+ }
11184
+ return `${event().messagesBefore ?? 0} \u2192 ${event().messagesAfter ?? 0} msgs`;
11185
+ };
11186
+ return [(() => {
11187
+ var _el$1 = _tmpl$77(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling, _el$12 = _el$11.nextSibling, _el$20 = _el$12.nextSibling, _el$21 = _el$20.nextSibling;
11188
+ _el$1.$$click = () => setExpanded(!expanded());
11189
+ insert(_el$10, () => kindLabel(event().kind));
11190
+ insert(_el$11, () => shortStrategy(event()));
11191
+ insert(_el$12, countLabel);
11192
+ insert(_el$1, createComponent(Show, {
11193
+ get when() {
11194
+ return event().kind === "state";
11195
+ },
11196
+ get children() {
11197
+ var _el$13 = _tmpl$47(), _el$14 = _el$13.firstChild, _el$16 = _el$14.nextSibling; _el$16.nextSibling;
11198
+ insert(_el$13, () => event().before, _el$14);
11199
+ insert(_el$13, () => event().after, _el$16);
11200
+ effect(() => className(_el$13, s().stepDuration));
11201
+ return _el$13;
11202
+ }
11203
+ }), _el$20);
11204
+ insert(_el$1, createComponent(Show, {
11205
+ get when() {
11206
+ return event().durationMs !== void 0;
11207
+ },
11208
+ get children() {
11209
+ var _el$17 = _tmpl$57(), _el$18 = _el$17.firstChild;
11210
+ insert(_el$17, () => event().durationMs, _el$18);
11211
+ effect(() => className(_el$17, s().stepDuration));
11212
+ return _el$17;
11213
+ }
11214
+ }), _el$20);
11215
+ insert(_el$1, createComponent(Show, {
11216
+ get when() {
11217
+ return event().reusedCheckpoint;
11218
+ },
11219
+ get children() {
11220
+ var _el$19 = _tmpl$67();
11221
+ effect(() => className(_el$19, s().mwSuffix));
11222
+ return _el$19;
11223
+ }
11224
+ }), _el$20);
11225
+ insert(_el$20, () => formatTime3(event().timestamp));
11226
+ effect((_p$) => {
11227
+ var _v$6 = s().step, _v$7 = event().kind, _v$8 = `${s().stepPrefix} ${s().stepPrefixMiddleware}`, _v$9 = `${s().mwBadge} ${s().mwBadgeTransform}`, _v$0 = s().mwHook, _v$1 = s().stepDuration, _v$10 = `${s().chevron} ${expanded() ? s().chevronOpen : ""}`;
11228
+ _v$6 !== _p$.e && className(_el$1, _p$.e = _v$6);
11229
+ _v$7 !== _p$.t && setAttribute(_el$1, "data-kind", _p$.t = _v$7);
11230
+ _v$8 !== _p$.a && className(_el$10, _p$.a = _v$8);
11231
+ _v$9 !== _p$.o && className(_el$11, _p$.o = _v$9);
11232
+ _v$0 !== _p$.i && className(_el$12, _p$.i = _v$0);
11233
+ _v$1 !== _p$.n && className(_el$20, _p$.n = _v$1);
11234
+ _v$10 !== _p$.s && className(_el$21, _p$.s = _v$10);
11235
+ return _p$;
11236
+ }, {
11237
+ e: void 0,
11238
+ t: void 0,
11239
+ a: void 0,
11240
+ o: void 0,
11241
+ i: void 0,
11242
+ n: void 0,
11243
+ s: void 0
11244
+ });
11245
+ return _el$1;
11246
+ })(), createComponent(Show, {
11247
+ get when() {
11248
+ return expanded();
11249
+ },
11250
+ get children() {
11251
+ return [(() => {
11252
+ var _el$22 = _tmpl$214();
11253
+ insert(_el$22, createComponent(JsonTree, {
11254
+ get value() {
11255
+ return stats();
11256
+ },
11257
+ defaultExpansionDepth: 1,
11258
+ copyable: true
11259
+ }));
11260
+ effect(() => className(_el$22, s().mwChangesContainer));
11261
+ return _el$22;
11262
+ })(), createComponent(Show, {
11263
+ get when() {
11264
+ return isState();
11265
+ },
11266
+ get children() {
11267
+ var _el$23 = _tmpl$214();
11268
+ insert(_el$23, createComponent(PreviewColumn, {
11269
+ title: "Dropped",
11270
+ get previews() {
11271
+ return event().dropped ?? [];
11272
+ },
11273
+ empty: "Nothing was dropped."
11274
+ }), null);
11275
+ insert(_el$23, createComponent(PreviewColumn, {
11276
+ title: "Sent to model",
11277
+ get previews() {
11278
+ return event().result ?? [];
11279
+ },
11280
+ empty: "No compacted transcript on this event."
11281
+ }), null);
11282
+ effect(() => className(_el$23, s().stepJsonItemsCompare));
11283
+ return _el$23;
11284
+ }
11285
+ })];
11286
+ }
11287
+ })];
11288
+ };
11289
+ var CompactionPanel = (props) => {
11290
+ const {
11291
+ state,
11292
+ clearCompaction
11293
+ } = useAIStore();
11294
+ const styles = useStyles();
11295
+ const s = () => styles().iterationTimeline;
11296
+ const events = createMemo(() => compactionEventsForHook(state.compaction, props.hook));
11297
+ const lastStateIndex = createMemo(() => {
11298
+ const list = events();
11299
+ for (let i = list.length - 1; i >= 0; i--) {
11300
+ if (list[i]?.kind === "state") return i;
11301
+ }
11302
+ return -1;
11303
+ });
11304
+ return (() => {
11305
+ var _el$24 = _tmpl$97();
11306
+ insert(_el$24, createComponent(Show, {
11307
+ get when() {
11308
+ return events().length > 0;
11309
+ },
11310
+ get fallback() {
11311
+ return (() => {
11312
+ var _el$30 = _tmpl$06();
11313
+ effect(() => className(_el$30, styles().hookDetails.emptySmall));
11314
+ return _el$30;
11315
+ })();
11316
+ },
11317
+ get children() {
11318
+ return [(() => {
11319
+ var _el$25 = _tmpl$87(), _el$26 = _el$25.firstChild, _el$27 = _el$26.firstChild, _el$28 = _el$26.nextSibling;
11320
+ insert(_el$26, () => events().length, _el$27);
11321
+ insert(_el$26, () => events().length === 1 ? "" : "s", null);
11322
+ _el$28.$$click = () => clearCompaction();
11323
+ effect((_p$) => {
11324
+ var _v$11 = styles().memoryPanel.toolbar, _v$12 = styles().memoryPanel.badge, _v$13 = styles().memoryPanel.clearButton;
11325
+ _v$11 !== _p$.e && className(_el$25, _p$.e = _v$11);
11326
+ _v$12 !== _p$.t && className(_el$26, _p$.t = _v$12);
11327
+ _v$13 !== _p$.a && className(_el$28, _p$.a = _v$13);
11328
+ return _p$;
11329
+ }, {
11330
+ e: void 0,
11331
+ t: void 0,
11332
+ a: void 0
11333
+ });
11334
+ return _el$25;
11335
+ })(), (() => {
11336
+ var _el$29 = _tmpl$214();
11337
+ insert(_el$29, createComponent(For, {
11338
+ get each() {
11339
+ return events();
11340
+ },
11341
+ children: (event, index) => createComponent(CompactEvent, {
11342
+ event,
11343
+ get defaultOpen() {
11344
+ return memo(() => event.kind === "state")() && index() === lastStateIndex();
11345
+ }
11346
+ })
11347
+ }));
11348
+ effect(() => className(_el$29, s().iterCard));
11349
+ return _el$29;
11350
+ })()];
11351
+ }
11352
+ }));
11353
+ effect(() => className(_el$24, styles().memoryPanel.container));
11354
+ return _el$24;
11355
+ })();
11356
+ };
11357
+ delegateEvents(["click"]);
11358
+ var _tmpl$41 = /* @__PURE__ */ template(`<ul>`);
11359
+ var _tmpl$215 = /* @__PURE__ */ template(`<div><div>Catalog`);
11360
+ var _tmpl$311 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-skills-panel>`);
11361
+ var _tmpl$48 = /* @__PURE__ */ template(`<div>No skills on this run. Add \`withSkills(...)\` to \`chat()\` and the catalog will appear here. A skill lights up when the model calls \`load_skill\`.`);
11362
+ var _tmpl$58 = /* @__PURE__ */ template(`<div>Loaded via \`load_skill\`, but the catalog snapshot has not arrived yet.`);
11363
+ var _tmpl$68 = /* @__PURE__ */ template(`<span>loaded`);
11364
+ var _tmpl$78 = /* @__PURE__ */ template(`<li><span></span><span>`);
11365
+ function parseSkillName(argumentsJson) {
11366
+ if (!argumentsJson) return void 0;
11367
+ try {
11368
+ const parsed = JSON.parse(argumentsJson);
11369
+ if (parsed && typeof parsed === "object" && "name" in parsed && typeof parsed.name === "string") {
11370
+ return parsed.name;
11371
+ }
11372
+ } catch {
11373
+ return void 0;
11374
+ }
11375
+ return void 0;
11376
+ }
11377
+ function loadedFromMessages(messages) {
11378
+ const names = /* @__PURE__ */ new Set();
11379
+ for (const message of messages) {
11380
+ for (const toolCall of message.toolCalls ?? []) {
11381
+ if (toolCall.name === "load_skill") {
11382
+ const name = parseSkillName(toolCall.arguments);
11383
+ if (name) names.add(name);
11384
+ }
11385
+ }
11386
+ for (const part of message.parts ?? []) {
11387
+ if (part.type === "tool-call" && part.toolName === "load_skill") {
11388
+ const name = parseSkillName(part.arguments);
11389
+ if (name) names.add(name);
11390
+ }
11391
+ }
11392
+ }
11393
+ return [...names];
11394
+ }
11395
+ var SkillsPanel = () => {
11396
+ const {
11397
+ state
11398
+ } = useAIStore();
11399
+ const styles = useStyles();
11400
+ const snapshot = createMemo(() => {
11401
+ const hookId = state.hooks.activeHookId;
11402
+ if (hookId && state.skills.snapshots[hookId]) {
11403
+ return state.skills.snapshots[hookId];
11404
+ }
11405
+ const first = Object.values(state.skills.snapshots)[0];
11406
+ return first;
11407
+ });
11408
+ const conversation = createMemo(() => {
11409
+ const hookId = state.hooks.activeHookId;
11410
+ if (!hookId) return void 0;
11411
+ return state.conversations[hookId];
11412
+ });
11413
+ const loaded = createMemo(() => {
11414
+ const fromSnap = new Set(snapshot()?.activated ?? []);
11415
+ for (const name of loadedFromMessages(conversation()?.messages ?? [])) {
11416
+ fromSnap.add(name);
11417
+ }
11418
+ return fromSnap;
11419
+ });
11420
+ const catalog = createMemo(() => snapshot()?.catalog ?? []);
11421
+ return (() => {
11422
+ var _el$ = _tmpl$311();
11423
+ insert(_el$, createComponent(Show, {
11424
+ get when() {
11425
+ return catalog().length > 0 || loaded().size > 0;
11426
+ },
11427
+ get fallback() {
11428
+ return (() => {
11429
+ var _el$5 = _tmpl$48();
11430
+ effect(() => className(_el$5, styles().memoryPanel.empty));
11431
+ return _el$5;
11432
+ })();
11433
+ },
11434
+ get children() {
11435
+ var _el$2 = _tmpl$215(), _el$3 = _el$2.firstChild;
11436
+ insert(_el$2, createComponent(Show, {
11437
+ get when() {
11438
+ return catalog().length > 0;
11439
+ },
11440
+ get fallback() {
11441
+ return (() => {
11442
+ var _el$6 = _tmpl$58();
11443
+ effect(() => className(_el$6, styles().memoryPanel.sectionEmpty));
11444
+ return _el$6;
11445
+ })();
11446
+ },
11447
+ get children() {
11448
+ var _el$4 = _tmpl$41();
11449
+ insert(_el$4, createComponent(For, {
11450
+ get each() {
11451
+ return catalog();
11452
+ },
11453
+ children: (skill) => {
11454
+ const isLoaded = () => loaded().has(skill.name);
11455
+ return (() => {
11456
+ var _el$7 = _tmpl$78(), _el$8 = _el$7.firstChild, _el$0 = _el$8.nextSibling;
11457
+ insert(_el$8, () => skill.name);
11458
+ insert(_el$7, createComponent(Show, {
11459
+ get when() {
11460
+ return isLoaded();
11461
+ },
11462
+ get children() {
11463
+ var _el$9 = _tmpl$68();
11464
+ effect(() => className(_el$9, styles().memoryPanel.badge));
11465
+ return _el$9;
11466
+ }
11467
+ }), _el$0);
11468
+ insert(_el$0, () => skill.description);
11469
+ effect((_p$) => {
11470
+ var _v$3 = styles().memoryPanel.row, _v$4 = styles().memoryPanel.badge, _v$5 = styles().memoryPanel.sectionEmpty;
11471
+ _v$3 !== _p$.e && className(_el$7, _p$.e = _v$3);
11472
+ _v$4 !== _p$.t && className(_el$8, _p$.t = _v$4);
11473
+ _v$5 !== _p$.a && className(_el$0, _p$.a = _v$5);
11474
+ return _p$;
11475
+ }, {
11476
+ e: void 0,
11477
+ t: void 0,
11478
+ a: void 0
11479
+ });
11480
+ return _el$7;
11481
+ })();
11482
+ }
11483
+ }));
11484
+ effect(() => className(_el$4, styles().memoryPanel.list));
11485
+ return _el$4;
11486
+ }
11487
+ }), null);
11488
+ effect((_p$) => {
11489
+ var _v$ = styles().memoryPanel.section, _v$2 = styles().memoryPanel.sectionTitle;
11490
+ _v$ !== _p$.e && className(_el$2, _p$.e = _v$);
11491
+ _v$2 !== _p$.t && className(_el$3, _p$.t = _v$2);
11492
+ return _p$;
11493
+ }, {
11494
+ e: void 0,
11495
+ t: void 0
11496
+ });
11497
+ return _el$2;
11498
+ }
11499
+ }));
11500
+ effect(() => className(_el$, styles().memoryPanel.container));
11501
+ return _el$;
11502
+ })();
11503
+ };
10921
11504
 
10922
11505
  // src/components/hooks/HookDetails.tsx
10923
- var _tmpl$40 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
10924
- 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>`);
10925
- 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>`);
10926
- var _tmpl$47 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
10927
- var _tmpl$57 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
10928
- var _tmpl$67 = /* @__PURE__ */ template(`<span>running`);
10929
- var _tmpl$77 = /* @__PURE__ */ template(`<span> new`);
10930
- var _tmpl$87 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
10931
- var _tmpl$97 = /* @__PURE__ */ template(`<div><span></span><span>`);
10932
- var _tmpl$06 = /* @__PURE__ */ template(`<span>`);
11506
+ var _tmpl$49 = /* @__PURE__ */ template(`<aside data-testid=ai-devtools-preview-pane><div>`);
11507
+ var _tmpl$216 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-hook-detail><nav data-testid=ai-devtools-hook-tabs></nav><div><main data-testid=ai-devtools-primary-pane>`);
11508
+ var _tmpl$312 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-dashboard-overview><header><div><div>Hooks Dashboard</div><div>Select a hook from the left or open one of the active hooks below.</div></div></header><div></div><div>`);
11509
+ var _tmpl$410 = /* @__PURE__ */ template(`<div>Open a page with TanStack AI hooks to inspect live state.`);
11510
+ var _tmpl$59 = /* @__PURE__ */ template(`<section data-testid=ai-devtools-overview-category><div><span></span><span>`);
11511
+ var _tmpl$69 = /* @__PURE__ */ template(`<span>running`);
11512
+ var _tmpl$79 = /* @__PURE__ */ template(`<span> new`);
11513
+ var _tmpl$88 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-overview-hook><div><span></span><span></span></div><div><span>`);
11514
+ var _tmpl$98 = /* @__PURE__ */ template(`<div><span></span><span>`);
11515
+ var _tmpl$07 = /* @__PURE__ */ template(`<span>`);
10933
11516
  var _tmpl$116 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-technical-name>`);
10934
11517
  var _tmpl$106 = /* @__PURE__ */ template(`<span data-testid=ai-devtools-hook-registry-id>id `);
10935
11518
  var _tmpl$117 = /* @__PURE__ */ template(`<header data-testid=ai-devtools-hook-header><div><div><span data-testid=ai-devtools-hook-title></span><span></span></div><div><span data-testid=ai-devtools-hook-identity></span></div></div><div>`);
@@ -10942,7 +11525,7 @@ var _tmpl$173 = /* @__PURE__ */ template(`<div><button type=button data-testid=a
10942
11525
  var _tmpl$182 = /* @__PURE__ */ template(`<div><span>`);
10943
11526
  var _tmpl$192 = /* @__PURE__ */ template(`<div><span></span><div>`);
10944
11527
  var _tmpl$202 = /* @__PURE__ */ template(`<div>No messages yet. Start a conversation to see messages here.`);
10945
- var _tmpl$215 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-tools><div></div><div>`);
11528
+ var _tmpl$217 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-tools><div></div><div>`);
10946
11529
  var _tmpl$223 = /* @__PURE__ */ template(`<div>No tools.`);
10947
11530
  var _tmpl$232 = /* @__PURE__ */ template(`<span>approval`);
10948
11531
  var _tmpl$242 = /* @__PURE__ */ template(`<button type=button data-testid=ai-devtools-tool-row><span>`);
@@ -10964,7 +11547,8 @@ var HookDetails = () => {
10964
11547
  let previewPane;
10965
11548
  const hook = createMemo(() => {
10966
11549
  const id = state.hooks.activeHookId;
10967
- return id ? state.hooks.hooks[id] : void 0;
11550
+ if (id === null) return void 0;
11551
+ return state.hooks.hooks[id];
10968
11552
  });
10969
11553
  const conversation = createMemo(() => {
10970
11554
  const activeHook = hook();
@@ -10981,7 +11565,7 @@ var HookDetails = () => {
10981
11565
  return Boolean(outputKind && outputKind !== "chat" && outputKind !== "structured");
10982
11566
  });
10983
11567
  createEffect(() => {
10984
- if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory")) {
11568
+ if (isGenerationHook() && (activeTab() === "tools" || activeTab() === "memory" || activeTab() === "compaction" || activeTab() === "skills")) {
10985
11569
  setActiveTab("conversation");
10986
11570
  }
10987
11571
  });
@@ -10997,7 +11581,7 @@ var HookDetails = () => {
10997
11581
  return [];
10998
11582
  });
10999
11583
  const showSecondaryPane = createMemo(() => {
11000
- if (activeTab() === "tools" && !isGenerationHook()) return false;
11584
+ if ((activeTab() === "tools" || activeTab() === "skills") && !isGenerationHook()) return false;
11001
11585
  return isGenerationHook() || !hasStructuredOutputPreview(previewMessages());
11002
11586
  });
11003
11587
  createEffect(() => {
@@ -11019,14 +11603,15 @@ var HookDetails = () => {
11019
11603
  return createComponent(HookOverview, {
11020
11604
  onSelectHook: (selectedHook) => {
11021
11605
  selectHook(selectedHook.id);
11022
- if (state.conversations[selectedHook.id]) {
11023
- selectConversation(selectedHook.id);
11606
+ const conversationId = selectedHook.id || selectedHook.clientId || selectedHook.threadId;
11607
+ if (conversationId && state.conversations[conversationId]) {
11608
+ selectConversation(conversationId);
11024
11609
  }
11025
11610
  }
11026
11611
  });
11027
11612
  },
11028
11613
  children: (activeHook) => (() => {
11029
- var _el$ = _tmpl$214(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
11614
+ var _el$ = _tmpl$216(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild;
11030
11615
  insert(_el$, createComponent(HookHeader, {
11031
11616
  get hook() {
11032
11617
  return activeHook();
@@ -11082,14 +11667,28 @@ var HookDetails = () => {
11082
11667
  return !isGenerationHook();
11083
11668
  },
11084
11669
  get children() {
11085
- return createComponent(TabButton, {
11670
+ return [createComponent(TabButton, {
11086
11671
  label: "Memory",
11087
11672
  tab: "memory",
11088
11673
  get activeTab() {
11089
11674
  return activeTab();
11090
11675
  },
11091
11676
  onSelect: setActiveTab
11092
- });
11677
+ }), createComponent(TabButton, {
11678
+ label: "Compaction",
11679
+ tab: "compaction",
11680
+ get activeTab() {
11681
+ return activeTab();
11682
+ },
11683
+ onSelect: setActiveTab
11684
+ }), createComponent(TabButton, {
11685
+ label: "Skills",
11686
+ tab: "skills",
11687
+ get activeTab() {
11688
+ return activeTab();
11689
+ },
11690
+ onSelect: setActiveTab
11691
+ })];
11093
11692
  }
11094
11693
  }), null);
11095
11694
  _el$4.addEventListener("mouseleave", () => setHoverTarget(null));
@@ -11168,12 +11767,32 @@ var HookDetails = () => {
11168
11767
  return createComponent(MemoryPanel, {});
11169
11768
  }
11170
11769
  }), null);
11770
+ insert(_el$4, createComponent(Show, {
11771
+ get when() {
11772
+ return activeTab() === "compaction";
11773
+ },
11774
+ get children() {
11775
+ return createComponent(CompactionPanel, {
11776
+ get hook() {
11777
+ return activeHook();
11778
+ }
11779
+ });
11780
+ }
11781
+ }), null);
11782
+ insert(_el$4, createComponent(Show, {
11783
+ get when() {
11784
+ return activeTab() === "skills";
11785
+ },
11786
+ get children() {
11787
+ return createComponent(SkillsPanel, {});
11788
+ }
11789
+ }), null);
11171
11790
  insert(_el$3, createComponent(Show, {
11172
11791
  get when() {
11173
11792
  return showSecondaryPane();
11174
11793
  },
11175
11794
  get children() {
11176
- var _el$5 = _tmpl$40(), _el$6 = _el$5.firstChild;
11795
+ var _el$5 = _tmpl$49(), _el$6 = _el$5.firstChild;
11177
11796
  _el$5.addEventListener("mouseleave", () => setHoverTarget(null));
11178
11797
  _el$5.$$mouseover = (event) => setHoverTargetFromEvent(event, "preview", setHoverTarget);
11179
11798
  use((el) => {
@@ -11254,13 +11873,13 @@ var HookOverview = (props) => {
11254
11873
  },
11255
11874
  get fallback() {
11256
11875
  return (() => {
11257
- var _el$12 = _tmpl$47();
11876
+ var _el$12 = _tmpl$410();
11258
11877
  effect(() => className(_el$12, styles().hookDetails.empty));
11259
11878
  return _el$12;
11260
11879
  })();
11261
11880
  },
11262
11881
  get children() {
11263
- 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;
11882
+ var _el$7 = _tmpl$312(), _el$8 = _el$7.firstChild, _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling, _el$10 = _el$8.nextSibling, _el$11 = _el$10.nextSibling;
11264
11883
  insert(_el$10, createComponent(OverviewMetric, {
11265
11884
  label: "active hooks",
11266
11885
  get value() {
@@ -11314,7 +11933,7 @@ var HookOverview = (props) => {
11314
11933
  return groups();
11315
11934
  },
11316
11935
  children: (group) => (() => {
11317
- var _el$13 = _tmpl$57(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
11936
+ var _el$13 = _tmpl$59(), _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$15.nextSibling;
11318
11937
  insert(_el$15, () => group.label);
11319
11938
  insert(_el$16, () => group.hooks.length);
11320
11939
  insert(_el$13, createComponent(For, {
@@ -11325,7 +11944,7 @@ var HookOverview = (props) => {
11325
11944
  const running = createMemo(() => isHookRunning(hook, state.hooks.runs));
11326
11945
  const unseenCount = createMemo(() => getHookUnseenEventCount(state.hooks, hook.id));
11327
11946
  return (() => {
11328
- var _el$17 = _tmpl$87(), _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild;
11947
+ var _el$17 = _tmpl$88(), _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$20 = _el$19.nextSibling, _el$21 = _el$18.nextSibling, _el$22 = _el$21.firstChild;
11329
11948
  _el$17.$$click = () => props.onSelectHook(hook);
11330
11949
  insert(_el$19, () => getHookDisplayName(hook));
11331
11950
  insert(_el$20, () => getHookIdentitySubtitle(hook));
@@ -11335,7 +11954,7 @@ var HookOverview = (props) => {
11335
11954
  return running();
11336
11955
  },
11337
11956
  get children() {
11338
- var _el$23 = _tmpl$67();
11957
+ var _el$23 = _tmpl$69();
11339
11958
  effect(() => className(_el$23, styles().hookDetails.lifecycle));
11340
11959
  return _el$23;
11341
11960
  }
@@ -11345,7 +11964,7 @@ var HookOverview = (props) => {
11345
11964
  return unseenCount() > 0;
11346
11965
  },
11347
11966
  get children() {
11348
- var _el$24 = _tmpl$77(), _el$25 = _el$24.firstChild;
11967
+ var _el$24 = _tmpl$79(), _el$25 = _el$24.firstChild;
11349
11968
  insert(_el$24, unseenCount, _el$25);
11350
11969
  effect(() => className(_el$24, styles().hookDetails.kind));
11351
11970
  return _el$24;
@@ -11416,7 +12035,7 @@ var HookOverview = (props) => {
11416
12035
  var OverviewMetric = (props) => {
11417
12036
  const styles = useStyles();
11418
12037
  return (() => {
11419
- var _el$26 = _tmpl$97(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling;
12038
+ var _el$26 = _tmpl$98(), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling;
11420
12039
  insert(_el$27, () => props.value);
11421
12040
  insert(_el$28, () => props.label);
11422
12041
  effect((_p$) => {
@@ -11444,7 +12063,7 @@ var HookHeader = (props) => {
11444
12063
  return props.hook.outputKind;
11445
12064
  },
11446
12065
  get children() {
11447
- var _el$34 = _tmpl$06();
12066
+ var _el$34 = _tmpl$07();
11448
12067
  insert(_el$34, () => props.hook.outputKind);
11449
12068
  effect(() => className(_el$34, styles().hookDetails.kind));
11450
12069
  return _el$34;
@@ -11479,7 +12098,7 @@ var HookHeader = (props) => {
11479
12098
  return props.hook.framework;
11480
12099
  },
11481
12100
  get children() {
11482
- var _el$40 = _tmpl$06();
12101
+ var _el$40 = _tmpl$07();
11483
12102
  insert(_el$40, () => props.hook.framework);
11484
12103
  return _el$40;
11485
12104
  }
@@ -11548,7 +12167,7 @@ var HookHeader = (props) => {
11548
12167
  var Metric = (props) => {
11549
12168
  const styles = useStyles();
11550
12169
  return (() => {
11551
- var _el$42 = _tmpl$97(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
12170
+ var _el$42 = _tmpl$98(), _el$43 = _el$42.firstChild, _el$44 = _el$43.nextSibling;
11552
12171
  insert(_el$43, () => props.value);
11553
12172
  insert(_el$44, () => props.label);
11554
12173
  effect((_p$) => {
@@ -11840,7 +12459,7 @@ var MessagesPreview = (props) => {
11840
12459
  },
11841
12460
  get fallback() {
11842
12461
  return (() => {
11843
- var _el$60 = _tmpl$06();
12462
+ var _el$60 = _tmpl$07();
11844
12463
  insert(_el$60, () => part.content);
11845
12464
  effect(() => className(_el$60, styles().hookDetails.previewPartContent));
11846
12465
  return _el$60;
@@ -11974,7 +12593,7 @@ var HookMessageTimeline = (props) => {
11974
12593
  },
11975
12594
  get fallback() {
11976
12595
  return (() => {
11977
- var _el$72 = _tmpl$06();
12596
+ var _el$72 = _tmpl$07();
11978
12597
  insert(_el$72, () => part.content);
11979
12598
  effect(() => className(_el$72, styles().hookDetails.previewPartContent));
11980
12599
  return _el$72;
@@ -12038,7 +12657,7 @@ var ToolsView = (props) => {
12038
12657
  const selectedTool = createMemo(() => props.hook.tools.find((tool) => tool.name === selectedToolName()));
12039
12658
  const savedFixtures = createMemo(() => state.hooks.fixtures.filter((fixture) => fixture.hookId === props.hook.id || !!props.hook.threadId && fixture.threadId === props.hook.threadId).sort((a, b) => b.createdAt - a.createdAt));
12040
12659
  return (() => {
12041
- var _el$76 = _tmpl$215(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
12660
+ var _el$76 = _tmpl$217(), _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling;
12042
12661
  insert(_el$77, createComponent(Show, {
12043
12662
  get when() {
12044
12663
  return props.hook.tools.length > 0;
@@ -12129,7 +12748,7 @@ var ToolsView = (props) => {
12129
12748
  var _el$87 = _tmpl$282(), _el$88 = _el$87.firstChild, _el$89 = _el$88.firstChild, _el$90 = _el$89.nextSibling, _el$91 = _el$90.firstChild, _el$92 = _el$88.nextSibling, _el$93 = _el$92.firstChild, _el$94 = _el$93.nextSibling;
12130
12749
  insert(_el$89, () => fixture.name ?? fixture.toolName);
12131
12750
  insert(_el$90, () => fixture.toolName, _el$91);
12132
- insert(_el$90, () => formatTime3(fixture.createdAt), null);
12751
+ insert(_el$90, () => formatTime4(fixture.createdAt), null);
12133
12752
  _el$93.$$click = () => applyToolFixture(fixture);
12134
12753
  _el$94.$$click = () => deleteToolFixture(fixture.id);
12135
12754
  effect((_p$) => {
@@ -12623,13 +13242,13 @@ function jsonSafeValue(value) {
12623
13242
  return `[ai-devtools] unserializable value: ${error instanceof Error ? error.message : String(error)}`;
12624
13243
  }
12625
13244
  }
12626
- function formatTime3(timestamp) {
13245
+ function formatTime4(timestamp) {
12627
13246
  return new Date(timestamp).toLocaleTimeString();
12628
13247
  }
12629
13248
  delegateEvents(["mouseover", "click"]);
12630
13249
 
12631
13250
  // src/components/Shell.tsx
12632
- 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>`);
13251
+ var _tmpl$50 = /* @__PURE__ */ template(`<div data-testid=ai-devtools-panel><div><div data-testid=ai-devtools-left-panel style=min-width:150px;max-width:800px><div>AI Hooks</div></div><div></div><div data-testid=ai-devtools-right-panel style=flex:1>`);
12633
13252
  function Devtools(props) {
12634
13253
  return createComponent(ThemeContextProvider, {
12635
13254
  get theme() {
@@ -12711,7 +13330,7 @@ function DevtoolsContent() {
12711
13330
  });
12712
13331
  return createComponent(MainPanel, {
12713
13332
  get children() {
12714
- 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;
13333
+ var _el$ = _tmpl$50(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.nextSibling;
12715
13334
  insert(_el$, createComponent(Header, {
12716
13335
  get children() {
12717
13336
  return createComponent(HeaderLogo, {