summaryrefslogtreecommitdiffhomepage
path: root/src/app/views/CompactionPane.svelte
blob: ff31f0bc50b098fe43871eb2bd77f22c99e8af00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<script lang="ts">
  /**
   * The `compaction` view — message compaction with the store adapters.
   * Per-conversation (keyed so the percent + feedback can't bleed across tabs;
   * the {#key} moved inside the wrapper).
   */
  import {
    CompactionView,
    type CompactNowResult,
    type SaveCompactPercentResult,
  } from "../../features/chat";
  import type { AppViewPorts } from "../view-ports";

  let { ports }: { ports: AppViewPorts } = $props();
  const store = $derived(ports.store);

  // Adapt the store's compact result to the compaction view's port.
  async function compactNow(): Promise<CompactNowResult | null> {
    const result = await store.compactNow();
    if (result === null) return null;
    return result.ok
      ? {
          ok: true,
          messagesSummarized: result.response.messagesSummarized,
          messagesKept: result.response.messagesKept,
        }
      : { ok: false, error: result.error };
  }

  async function saveCompactPercent(
    percent: number,
  ): Promise<SaveCompactPercentResult | null> {
    const result = await store.setCompactPercent(percent);
    if (result === null) return null;
    return result.ok
      ? { ok: true, percent: result.percent }
      : { ok: false, error: result.error };
  }
</script>

{#key store.currentConversationId}
  <CompactionView
    percent={store.compactPercent}
    canCompact={store.activeConversationId !== null}
    {compactNow}
    savePercent={saveCompactPercent}
  />
{/key}