pi-mega-compact 0.20.39 → 0.20.40
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.
- package/dist/config/vector-cortex-ml5d.js +28 -0
- package/dist/config/vector-cortex.js +2 -2
- package/dist/config.js +1 -1
- package/dist/extensions/dashboard-server/api-contracts/cortex-improve.js +14 -0
- package/dist/extensions/dashboard-server/api-contracts/endpoints/registry-ext.js +13 -0
- package/dist/extensions/dashboard-server/route-dispatch.js +5 -1
- package/dist/extensions/dashboard-server/routes-cortex-improve.js +220 -0
- package/dist/extensions/dashboard-server/routes-rag-settings-vector-cortex.js +1 -0
- package/dist/extensions/dashboard-server/routes.js +1 -0
- package/dist/extensions/mega-runtime/dashboard-snapshot.js +2 -2
- package/dist/src/config/vector-cortex-ml5d.js +28 -0
- package/dist/src/config/vector-cortex.js +2 -2
- package/dist/src/config.js +1 -1
- package/dist/src/vector-cortex/improve.js +24 -0
- package/dist/vector-cortex/improve.js +24 -0
- package/extensions/dashboard-client/dist/assets/{AreaChart-DjXp8u2Y.js → AreaChart-BT7YPcp7.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AreaChart-DjXp8u2Y.js.map → AreaChart-BT7YPcp7.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{BarChart-BZbus-dR.js → BarChart-DceGcBUh.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{BarChart-BZbus-dR.js.map → BarChart-DceGcBUh.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab-DQ2CjxVW.js → CacheTab-B9lCouRl.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-DQ2CjxVW.js.map → CacheTab-B9lCouRl.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-DUpnOV1p.js → EventsTab-oqJ11jY7.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-DUpnOV1p.js.map → EventsTab-oqJ11jY7.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{HealthTab-Bul_xjcn.js → HealthTab-Dbosf2Ik.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{HealthTab-Bul_xjcn.js.map → HealthTab-Dbosf2Ik.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DLUjdKd3.js → MaintenanceTab-6TiApCVE.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DLUjdKd3.js.map → MaintenanceTab-6TiApCVE.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-cBsE4mTf.js +2 -0
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-BFy0hb6F.js.map → MemoryMapTab-cBsE4mTf.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsTab-BpYuUkq3.js → MetricsTab-CX-X9hhy.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-BpYuUkq3.js.map → MetricsTab-CX-X9hhy.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-z7yuT-uq.js → OverviewTab-CpPYaTJF.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-z7yuT-uq.js.map → OverviewTab-CpPYaTJF.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-ClORoDy_.js → ReposTab-D_Ot4QbU.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-ClORoDy_.js.map → ReposTab-D_Ot4QbU.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-CUpehIt9.js → SessionsTab-BUzO3iGK.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-CUpehIt9.js.map → SessionsTab-BUzO3iGK.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SetupTab-Cii80Fdz.js → SetupTab-Be4w9v4j.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SetupTab-Cii80Fdz.js.map → SetupTab-Be4w9v4j.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BV2iCSdV.js → TimeSavedCard-Cx-g6CXH.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BV2iCSdV.js.map → TimeSavedCard-Cx-g6CXH.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-1T86rHnD.js → TurnsTab-CC_7T7ad.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{TurnsTab-1T86rHnD.js.map → TurnsTab-CC_7T7ad.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{VcStatusBadge-DKPleja8.js → VcStatusBadge-ZTItXSiH.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{VcStatusBadge-DKPleja8.js.map → VcStatusBadge-ZTItXSiH.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-DgAUZ4Pg.js +2 -0
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-DgAUZ4Pg.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/WikiTab-DnKupXTv.js +2 -0
- package/extensions/dashboard-client/dist/assets/{WikiTab-DKTILa1M.js.map → WikiTab-DnKupXTv.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/button-CFt3e0yc.js +2 -0
- package/extensions/dashboard-client/dist/assets/{button-5fSU8BZj.js.map → button-CFt3e0yc.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{card-BFUnpXE_.js → card-C6ZjsHrl.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{card-BFUnpXE_.js.map → card-C6ZjsHrl.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/client-extra-DdEdGTIe.js +2 -0
- package/extensions/dashboard-client/dist/assets/client-extra-DdEdGTIe.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-xCzi6pWn.js → generateCategoricalChart-C9_fu2hc.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-xCzi6pWn.js.map → generateCategoricalChart-C9_fu2hc.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-DqjmZ88m.js → index-DY81TY4f.js} +11 -11
- package/extensions/dashboard-client/dist/assets/index-DY81TY4f.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{switch-CeZUPf_e.js → switch-BOqa1d6x.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{switch-CeZUPf_e.js.map → switch-BOqa1d6x.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{toggle-MQQwdkwD.js → toggle-DToFaIEd.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{toggle-MQQwdkwD.js.map → toggle-DToFaIEd.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-BetS7QHN.js → useSSE-CZqkhU18.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-BetS7QHN.js.map → useSSE-CZqkhU18.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +1 -1
- package/extensions/dashboard-client/src/api/client-extra.ts +19 -1
- package/extensions/dashboard-client/src/components/ModelImprovementCard.tsx +141 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexTab.tsx +6 -0
- package/extensions/dashboard-client/src/types/cortex-improve.ts +42 -0
- package/extensions/dashboard-server/api-contracts/cortex-improve.ts +82 -0
- package/extensions/dashboard-server/api-contracts/endpoints/registry-ext.ts +31 -0
- package/extensions/dashboard-server/api-contracts/index.ts +12 -0
- package/extensions/dashboard-server/route-dispatch.ts +4 -0
- package/extensions/dashboard-server/routes-cortex-improve.ts +256 -0
- package/extensions/dashboard-server/routes-rag-settings-vector-cortex.ts +6 -0
- package/extensions/dashboard-server/routes.ts +4 -0
- package/extensions/mega-runtime/dashboard-snapshot.ts +2 -2
- package/package.json +1 -1
- package/src/config/vector-cortex-ml5d.ts +30 -0
- package/src/config/vector-cortex.ts +2 -2
- package/src/config.ts +1 -0
- package/src/vector-cortex/improve.ts +28 -0
- package/extensions/dashboard-client/dist/assets/MemoryMapTab-BFy0hb6F.js +0 -2
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-BRzvd_pU.js +0 -2
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-BRzvd_pU.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/WikiTab-DKTILa1M.js +0 -2
- package/extensions/dashboard-client/dist/assets/button-5fSU8BZj.js +0 -2
- package/extensions/dashboard-client/dist/assets/client-extra-BZbw21wu.js +0 -2
- package/extensions/dashboard-client/dist/assets/client-extra-BZbw21wu.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/index-DqjmZ88m.js.map +0 -1
package/extensions/dashboard-client/dist/assets/{WikiTab-DKTILa1M.js.map → WikiTab-DnKupXTv.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WikiTab-DKTILa1M.js","sources":["../../src/tabs/WikiTab/WikiPageControls.tsx","../../src/tabs/WikiTab/TopicTimeline.tsx","../../src/tabs/WikiTab/WikiPage.tsx","../../src/tabs/WikiTab/TopicEvolutionGraph.tsx","../../src/tabs/WikiTab/TopicEvolutionView.tsx","../../src/tabs/WikiTab.tsx"],"sourcesContent":["/**\n * dashboard-client/src/tabs/WikiTab/WikiPageControls.tsx — rename/merge/split.\n *\n * Controlled dialogs for the three curation mutations. Non-destructive: on\n * success the parent refetches and paints the returned CurationResult; on\n * failure the pre-mutation snapshot stays (no local partial apply).\n *\n * Styling: Tailwind + shadcn (Button). No legacy CSS classes.\n */\n\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { renameTopic, mergeTopics, splitTopic } from \"../../api/client\";\nimport type { MemoryProvenance } from \"@contracts\";\nimport { Button } from \"../../components/ui/button\";\n\ninterface ControlsProps {\n\ttopicId: string;\n\tothers: Array<{ id: string; label: string }>;\n\tmembers: MemoryProvenance[];\n\tonMutated: () => void;\n}\n\ntype Mode = \"rename\" | \"merge\" | \"split\" | null;\n\nfunction memberSnippet(id: string, method: string): string {\n\tconst base = id.length > 14 ? id.slice(0, 14) + \"…\" : id;\n\treturn method ? `${base} (${method})` : base;\n}\n\nexport default function WikiPageControls({\n\ttopicId,\n\tothers,\n\tmembers,\n\tonMutated,\n}: ControlsProps): React.ReactElement {\n\tconst [mode, setMode] = useState<Mode>(null);\n\tconst [label, setLabel] = useState(\"\");\n\tconst [target, setTarget] = useState(\"\");\n\tconst [picked, setPicked] = useState<string[]>([]);\n\tconst [busy, setBusy] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tfunction open(m: Exclude<Mode, null>): void {\n\t\tsetMode(m);\n\t\tsetError(null);\n\t\tsetLabel(\"\");\n\t\tsetTarget(\"\");\n\t\tsetPicked([]);\n\t}\n\n\tasync function submit(): Promise<void> {\n\t\tsetBusy(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tif (mode === \"rename\") {\n\t\t\t\tawait renameTopic(topicId, label);\n\t\t\t} else if (mode === \"merge\") {\n\t\t\t\tif (!target) {\n\t\t\t\t\tsetError(\"Pick a target topic.\");\n\t\t\t\t\tsetBusy(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait mergeTopics(topicId, target);\n\t\t\t} else if (mode === \"split\") {\n\t\t\t\tif (picked.length === 0) {\n\t\t\t\t\tsetError(\"Pick at least one memory.\");\n\t\t\t\t\tsetBusy(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait splitTopic(topicId, picked);\n\t\t\t}\n\t\t\tsetMode(null);\n\t\t\tonMutated();\n\t\t} catch (e) {\n\t\t\tsetError(e instanceof Error ? e.message : String(e));\n\t\t} finally {\n\t\t\tsetBusy(false);\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={() => open(\"rename\")}>\n\t\t\t\t\tRename\n\t\t\t\t</Button>\n\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={() => open(\"merge\")}>\n\t\t\t\t\tMerge into…\n\t\t\t\t</Button>\n\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={() => open(\"split\")}>\n\t\t\t\t\tSplit\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{mode && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\"\n\t\t\t\t\tonClick={() => setMode(null)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"w-full max-w-md rounded-lg border border-border bg-bg-card p-5 shadow-xl\"\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\taria-label={mode}\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<h3 className=\"mb-3 font-heading text-base font-semibold text-foreground\">\n\t\t\t\t\t\t\t{mode === \"rename\"\n\t\t\t\t\t\t\t\t? \"Rename topic\"\n\t\t\t\t\t\t\t\t: mode === \"merge\"\n\t\t\t\t\t\t\t\t\t? \"Merge into…\"\n\t\t\t\t\t\t\t\t\t: \"Split topic\"}\n\t\t\t\t\t\t</h3>\n\n\t\t\t\t\t\t{mode === \"rename\" && (\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tvalue={label}\n\t\t\t\t\t\t\t\tplaceholder=\"New label (empty = back to auto)\"\n\t\t\t\t\t\t\t\taria-label=\"New topic label\"\n\t\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\t\tonChange={(e) => setLabel(e.target.value)}\n\t\t\t\t\t\t\t\tclassName=\"w-full rounded-md border border-border bg-bg-elevated/50 px-3 py-2 text-sm outline-none transition-colors focus:border-primary\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{mode === \"merge\" && (\n\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\tvalue={target}\n\t\t\t\t\t\t\t\taria-label=\"Target topic\"\n\t\t\t\t\t\t\t\tonChange={(e) => setTarget(e.target.value)}\n\t\t\t\t\t\t\t\tclassName=\"w-full rounded-md border border-border bg-bg-elevated/50 px-3 py-2 text-sm outline-none transition-colors focus:border-primary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<option value=\"\">Pick a target topic…</option>\n\t\t\t\t\t\t\t\t{others.map((o) => (\n\t\t\t\t\t\t\t\t\t<option key={o.id} value={o.id}>\n\t\t\t\t\t\t\t\t\t\t{o.label}\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{mode === \"split\" && (\n\t\t\t\t\t\t\t<div className=\"max-h-56 overflow-auto rounded-md border border-border/60\">\n\t\t\t\t\t\t\t\t{members.map((m) => (\n\t\t\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\t\t\tkey={m.memoryId}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center gap-2 border-b border-border/40 px-3 py-2 text-sm last:border-0 hover:bg-bg-elevated/40\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\tchecked={picked.includes(m.memoryId)}\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetPicked((prev) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\te.target.checked\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...prev, m.memoryId]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: prev.filter((x) => x !== m.memoryId),\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"accent-primary\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{memberSnippet(m.memoryId, m.method)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{error && (\n\t\t\t\t\t\t\t<p className=\"mt-3 text-sm text-danger\">{error}</p>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div className=\"mt-4 flex justify-end gap-2\">\n\t\t\t\t\t\t\t<Button variant=\"ghost\" size=\"sm\" onClick={() => setMode(null)}>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button size=\"sm\" onClick={submit} disabled={busy}>\n\t\t\t\t\t\t\t\t{busy ? \"…\" : \"Confirm\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab/TopicTimeline.tsx — per-topic timeline.\n *\n * Renders topic memory-addition buckets as a lightweight SVG bar strip (no\n * chart library needed). X = time bucket, bar height = memories added.\n * Fetches GET /api/wiki/topic/:topicId/timeline.\n *\n * Styling: Tailwind + shadcn (Card). No legacy CSS classes.\n */\n\nimport type React from \"react\";\nimport { useCallback } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { fetchTopicTimeline } from \"../../api/client\";\nimport type { TopicTimelineResponse } from \"@contracts\";\n\nconst W = 720;\nconst H = 56;\nconst BAR_W = 10;\nconst GAP = 3;\n\ninterface Props {\n\ttopicId: string;\n}\n\nfunction fmtBucket(ts: number): string {\n\tif (!ts) return \"—\";\n\treturn new Date(ts).toLocaleDateString();\n}\n\nexport default function TopicTimeline({ topicId }: Props): React.ReactElement {\n\tconst { data, error } = useApi<TopicTimelineResponse>(\n\t\tuseCallback(() => fetchTopicTimeline(topicId), [topicId]),\n\t\t{},\n\t);\n\n\tif (error) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-4 text-sm text-muted-foreground\">\n\t\t\t\tTimeline unavailable.\n\t\t\t</div>\n\t\t);\n\t}\n\tif (!data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-4 text-sm text-muted-foreground\">\n\t\t\t\tLoading timeline…\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst { buckets, total } = data;\n\tconst max = Math.max(...buckets.map((b) => b.count), 1);\n\tconst totalWidth = buckets.length * (BAR_W + GAP);\n\tconst scale = Math.min(1, (W - 24) / Math.max(totalWidth, 1));\n\n\treturn (\n\t\t<div className=\"rounded-lg border border-border bg-bg-card p-4\">\n\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\tMemory timeline{\" \"}\n\t\t\t\t<span className=\"font-normal text-xs\">\n\t\t\t\t\t({total} memory{total !== 1 ? \"ies\" : \"y\"} · daily buckets)\n\t\t\t\t</span>\n\t\t\t</h3>\n\t\t\t{buckets.length === 0 ? (\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">No timeline data yet.</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\theight={H}\n\t\t\t\t\t\tviewBox={`0 0 ${Math.max(W, totalWidth * scale)} ${H}`}\n\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\taria-label=\"Memory additions over time\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{buckets.map((b, i) => {\n\t\t\t\t\t\t\tconst x = i * (BAR_W + GAP) * scale;\n\t\t\t\t\t\t\tconst h = Math.max(3, (b.count / max) * (H - 20));\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tkey={`${b.bucket}-${i}`}\n\t\t\t\t\t\t\t\t\tx={x}\n\t\t\t\t\t\t\t\t\ty={H - 6 - h}\n\t\t\t\t\t\t\t\t\twidth={Math.max(2, BAR_W * scale)}\n\t\t\t\t\t\t\t\t\theight={h}\n\t\t\t\t\t\t\t\t\trx={2}\n\t\t\t\t\t\t\t\t\tfill=\"hsl(var(--primary))\"\n\t\t\t\t\t\t\t\t\topacity={0.85}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<title>{`${fmtBucket(b.bucket)}: ${b.count}`}</title>\n\t\t\t\t\t\t\t\t</rect>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p className=\"mt-1 text-xs text-muted-foreground\">\n\t\t\t\t\t\tFirst display: {fmtBucket(buckets[0].bucket)} · last:\n\t\t\t\t\t\t{fmtBucket(buckets[buckets.length - 1].bucket)}\n\t\t\t\t\t</p>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab/WikiPage.tsx — single wiki topic page.\n *\n * Renders the extractive summary, key member memories, the member provenance\n * table (memory → session/assigned-at/method), related topics (resolved from\n * the wiki index), and the per-topic memory timeline. Mutations\n * (rename/merge/split) delegate to WikiPageControls; on mutation success the\n * page + index are refetched.\n *\n * Styling: Tailwind + shadcn (Card, Badge, Button) — no legacy CSS.\n */\n\nimport type React from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { fetchWikiTopic, fetchWikiIndex } from \"../../api/client\";\nimport type { WikiPageResponse, WikiIndexResponse } from \"@contracts\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { Card, CardContent } from \"../../components/ui/card\";\nimport WikiPageControls from \"./WikiPageControls\";\nimport TopicTimeline from \"./TopicTimeline\";\n\ninterface WikiPageProps {\n\ttopicId: string;\n\tonBack: () => void;\n}\n\nfunction fmtTs(ms: number): string {\n\tif (!ms) return \"—\";\n\treturn new Date(ms).toLocaleString();\n}\n\nconst METHOD_LABELS: Record<string, string> = {\n\t\"kmeans+tfidf\": \"kmeans\",\n\tmerge: \"merge\",\n\tsplit: \"split\",\n\tmanual: \"manual\",\n};\n\nexport default function WikiPage({\n\ttopicId,\n\tonBack,\n}: WikiPageProps): React.ReactElement {\n\tconst [dirty, setDirty] = useState(0);\n\tconst bump = useCallback(() => setDirty((d) => d + 1), []);\n\n\tconst { data: page, error, loading } = useApi<WikiPageResponse>(\n\t\tuseCallback(() => fetchWikiTopic(topicId), [topicId, dirty]),\n\t\t{},\n\t);\n\tconst { data: index } = useApi<WikiIndexResponse>(\n\t\tuseCallback(() => fetchWikiIndex(), []),\n\t\t{},\n\t);\n\n\tconst labelOf = useMemo(() => {\n\t\tconst map = new Map<string, string>();\n\t\tfor (const t of index?.topics ?? []) map.set(t.id, t.label);\n\t\treturn map;\n\t}, [index]);\n\n\tif (error && !page) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-danger\">\n\t\t\t\tError loading topic: {error.message}\n\t\t\t</div>\n\t\t);\n\t}\n\tif (loading && !page) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tLoading topic…\n\t\t\t</div>\n\t\t);\n\t}\n\tif (!page) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tNo topic data available.\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst otherTopics = (index?.topics ?? [])\n\t\t.filter((t) => t.id !== topicId)\n\t\t.map((t) => ({ id: t.id, label: t.label }));\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={onBack}>\n\t\t\t\t\t\t← Wiki\n\t\t\t\t\t</Button>\n\t\t\t\t\t<h2 className=\"font-heading text-lg font-semibold\">\n\t\t\t\t\t\t{page.topic.label}\n\t\t\t\t\t</h2>\n\t\t\t\t\t{page.topic.edited && <Badge variant=\"outline\">edited</Badge>}\n\t\t\t\t\t<Badge variant=\"default\">\n\t\t\t\t\t\t{page.provenance.length} memories\n\t\t\t\t\t</Badge>\n\t\t\t\t</div>\n\t\t\t\t<WikiPageControls\n\t\t\t\t\ttopicId={topicId}\n\t\t\t\t\tothers={otherTopics}\n\t\t\t\t\tmembers={page.provenance}\n\t\t\t\t\tonMutated={bump}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{page.summary && (\n\t\t\t\t<Card>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<h3 className=\"mb-1 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\t\t\tSummary\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<p className=\"text-sm leading-relaxed text-foreground/90\">\n\t\t\t\t\t\t\t{page.summary}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\n\t\t\t{page.keyMemories.length > 0 && (\n\t\t\t\t<Card>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\t\t\tKey memories\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t{page.keyMemories.map((m) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={m.memoryId}\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-md border border-border/60 bg-bg-elevated/40 p-3 text-sm\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p className=\"line-clamp-3 text-foreground/90\">{m.content}</p>\n\t\t\t\t\t\t\t\t\t<p className=\"mt-1 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{m.memoryId} · {fmtTs(m.timestamp)}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\n\t\t\t<TopicTimeline topicId={topicId} />\n\n\t\t\t{page.provenance.length > 0 && (\n\t\t\t\t<Card>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\t\t\tProvenance\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<div className=\"max-h-72 overflow-auto rounded-md border border-border/60\">\n\t\t\t\t\t\t\t<table className=\"w-full text-sm\">\n\t\t\t\t\t\t\t\t<thead className=\"sticky top-0 bg-bg-card\">\n\t\t\t\t\t\t\t\t\t<tr className=\"border-b border-border text-left text-xs uppercase text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t<th className=\"px-3 py-2 font-medium\">Memory</th>\n\t\t\t\t\t\t\t\t\t\t<th className=\"px-3 py-2 font-medium\">Session</th>\n\t\t\t\t\t\t\t\t\t\t<th className=\"px-3 py-2 font-medium\">Assigned</th>\n\t\t\t\t\t\t\t\t\t\t<th className=\"px-3 py-2 font-medium\">Method</th>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t{page.provenance.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\t\t\tkey={p.memoryId}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"border-b border-border/40 last:border-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<td className=\"px-3 py-1.5 font-mono text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t{p.memoryId}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{p.sessionId || \"unknown\"}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{fmtTs(p.assignedAt)}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td className=\"px-3 py-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge variant=\"outline\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{METHOD_LABELS[p.method] ?? p.method}\n\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\n\t\t\t{page.relatedTopicIds.length > 0 && (\n\t\t\t\t<Card>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\t\t\tRelated topics\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t\t{page.relatedTopicIds.map((id) => (\n\t\t\t\t\t\t\t\t<Badge key={id} variant=\"accent\">\n\t\t\t\t\t\t\t\t\t{labelOf.get(id) ?? id}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab/TopicEvolutionGraph.tsx — D3 evolution.\n *\n * Force-directed graph of wiki topics over time. Nodes are topics (radius scales\n * with memoryCount); edges are merge/split curation events. A bucket scrubber\n * (from the response buckets) dims nodes that had no activity up to the selected\n * time window — a lightweight \"growth over time\" view.\n *\n * Self-contained force simulation (Coulomb repulsion + Hooke attraction +\n * center gravity) — the codebase deliberately avoids external graph libraries\n * (see memory-map-layout.ts). No data is fabricated: only real node/edge/bucket\n * fields from the contract are used. Styling is Tailwind.\n */\n\nimport type React from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { TopicEvolutionResponse } from \"@contracts\";\n\n// ── Simulation constants ────────────────────────────────────────────────\nconst W = 900;\nconst H = 560;\nconst REPULSION = 60_000;\nconst ATTRACTION = 0.012;\nconst CENTER_GRAVITY = 0.012;\nconst DAMPING = 0.8;\nconst SPEED_LIMIT = 2;\nconst MIN_VELOCITY = 0.02;\nconst MAX_ITERATIONS = 250;\n\ninterface SimNode {\n\tid: string;\n\tlabel: string;\n\tmemoryCount: number;\n\tpos: { x: number; y: number };\n\tvx: number;\n\tvy: number;\n}\n\ninterface SimEdge {\n\tsource: number;\n\ttarget: number;\n\tkind: \"merge\" | \"split\";\n}\n\nfunction edgeColor(kind: \"merge\" | \"split\"): string {\n\treturn kind === \"merge\" ? \"#f59e0b\" : \"#22c55e\"; // amber / green\n}\n\nfunction initialLayout(nodes: TopicEvolutionResponse[\"nodes\"]): SimNode[] {\n\treturn nodes.map((n, i) => {\n\t\tconst angle = (2 * Math.PI * i) / Math.max(nodes.length, 1);\n\t\treturn {\n\t\t\tid: n.id,\n\t\t\tlabel: n.label,\n\t\t\tmemoryCount: n.memoryCount,\n\t\t\tpos: { x: Math.cos(angle) * 220 + W / 2, y: Math.sin(angle) * 220 + H / 2 },\n\t\t\tvx: 0,\n\t\t\tvy: 0,\n\t\t};\n\t});\n}\n\nfunction applyForces(sim: { nodes: SimNode[]; edges: SimEdge[] }): void {\n\tconst { nodes, edges } = sim;\n\tfor (let i = 0; i < nodes.length; i++) {\n\t\tconst n = nodes[i];\n\t\tlet fx = 0;\n\t\tlet fy = 0;\n\t\tfor (let j = 0; j < nodes.length; j++) {\n\t\t\tif (i === j) continue;\n\t\t\tconst dx = n.pos.x - nodes[j].pos.x;\n\t\t\tconst dy = n.pos.y - nodes[j].pos.y;\n\t\t\tconst distSq = dx * dx + dy * dy || 1;\n\t\t\tconst dist = Math.sqrt(distSq);\n\t\t\tfx += (dx / dist) * (REPULSION / distSq);\n\t\t\tfy += (dy / dist) * (REPULSION / distSq);\n\t\t}\n\t\tfor (const e of edges) {\n\t\t\tlet other: number;\n\t\t\tif (e.source === i) other = e.target;\n\t\t\telse if (e.target === i) other = e.source;\n\t\t\telse continue;\n\t\t\tconst dx = nodes[other].pos.x - n.pos.x;\n\t\t\tconst dy = nodes[other].pos.y - n.pos.y;\n\t\t\tfx += dx * ATTRACTION;\n\t\t\tfy += dy * ATTRACTION;\n\t\t}\n\t\tfx -= n.pos.x * CENTER_GRAVITY;\n\t\tfy -= n.pos.y * CENTER_GRAVITY;\n\t\tn.vx = (n.vx + fx) * DAMPING;\n\t\tn.vy = (n.vy + fy) * DAMPING;\n\t\tconst speed = Math.sqrt(n.vx * n.vx + n.vy * n.vy);\n\t\tif (speed > SPEED_LIMIT) {\n\t\t\tn.vx = (n.vx / speed) * SPEED_LIMIT;\n\t\t\tn.vy = (n.vy / speed) * SPEED_LIMIT;\n\t\t}\n\t\tif (speed > MIN_VELOCITY) {\n\t\t\tn.pos.x += n.vx;\n\t\t\tn.pos.y += n.vy;\n\t\t}\n\t}\n}\n\ninterface Props {\n\tdata: TopicEvolutionResponse;\n}\n\nexport default function TopicEvolutionGraph({\n\tdata,\n}: Props): React.ReactElement {\n\tconst simRef = useRef<{\n\t\tnodes: SimNode[];\n\t\tedges: SimEdge[];\n\t\ttimeByActivity: Map<string, number> | null;\n\t} | null>(null);\n\tconst animRef = useRef(0);\n\tconst [, setFrame] = useState(0);\n\tconst [scrub, setScrub] = useState<number>(0);\n\n\t// Initialize simulation from data (re-run when data changes).\n\tuseEffect(() => {\n\t\tconst nodes = initialLayout(data.nodes);\n\t\tconst indexById = new Map(nodes.map((n, i) => [n.id, i]));\n\t\tconst edges: SimEdge[] = data.edges\n\t\t\t.map((e) => {\n\t\t\t\tconst si = indexById.get(e.source);\n\t\t\t\tconst ti = indexById.get(e.target);\n\t\t\t\tif (si === undefined || ti === undefined || si === ti) return null;\n\t\t\t\treturn { source: si, target: ti, kind: e.kind };\n\t\t\t})\n\t\t\t.filter((e): e is SimEdge => e !== null);\n\t\t// Latest activity per node (from merge/split edge timestamps).\n\t\tconst timeByActivity = new Map<string, number>();\n\t\tfor (const e of data.edges) {\n\t\t\ttimeByActivity.set(e.source, Math.max(timeByActivity.get(e.source) ?? 0, e.at));\n\t\t\ttimeByActivity.set(e.target, Math.max(timeByActivity.get(e.target) ?? 0, e.at));\n\t\t}\n\t\tsimRef.current = { nodes, edges, timeByActivity };\n\t\tsetFrame(1);\n\t\treturn () => cancelAnimationFrame(animRef.current);\n\t}, [data]);\n\n\t// Run the force simulation to stable layout.\n\tuseEffect(() => {\n\t\tif (!simRef.current) return;\n\t\tlet iter = 0;\n\t\tconst tick = () => {\n\t\t\tif (!simRef.current || iter >= MAX_ITERATIONS) return;\n\t\t\tapplyForces(simRef.current);\n\t\t\titer++;\n\t\t\tsetFrame(iter);\n\t\t\tanimRef.current = requestAnimationFrame(tick);\n\t\t};\n\t\tanimRef.current = requestAnimationFrame(tick);\n\t\treturn () => cancelAnimationFrame(animRef.current);\n\t}, [data]);\n\n\tconst sim = simRef.current;\n\n\tconst scrubMax = Math.max(data.buckets.length - 1, 0);\n\tconst scrubBucket = useMemo(() => {\n\t\tif (data.buckets.length === 0) return null;\n\t\tconst idx = Math.min(scrub, data.buckets.length - 1);\n\t\treturn data.buckets[idx].bucket;\n\t}, [scrub, data.buckets]);\n\n\tif (!sim || data.nodes.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tNo evolution data yet. Merge or split topics to see connections, then\n\t\t\t\tcheck back after a rebuild.\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst activeSet =\n\t\tscrubBucket == null || !sim.timeByActivity\n\t\t\t? null\n\t\t\t: new Set(\n\t\t\t\t\t[...sim.timeByActivity.entries()]\n\t\t\t\t\t\t.filter(([, t]) => t <= scrubBucket)\n\t\t\t\t\t\t.map(([id]) => id),\n\t\t\t\t);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t{/* Scrubber */}\n\t\t\t{data.buckets.length > 1 && (\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\tmax={scrubMax}\n\t\t\t\t\t\tvalue={scrub}\n\t\t\t\t\t\tonChange={(e) => setScrub(Number(e.target.value))}\n\t\t\t\t\t\tclassName=\"w-full accent-primary\"\n\t\t\t\t\t\taria-label=\"Scrub through topic activity time\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"whitespace-nowrap text-xs text-muted-foreground\">\n\t\t\t\t\t\t{scrubBucket ? new Date(scrubBucket).toLocaleDateString() : \"all\"}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* SVG graph */}\n\t\t\t<svg\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight={H}\n\t\t\t\tviewBox={`0 0 ${W} ${H}`}\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Topic evolution graph\"\n\t\t\t\tclassName=\"rounded-lg border border-border/60 bg-bg-card\"\n\t\t\t>\n\t\t\t\t{sim.edges.map((e, i) => {\n\t\t\t\t\tconst a = sim.nodes[e.source];\n\t\t\t\t\tconst b = sim.nodes[e.target];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<line\n\t\t\t\t\t\t\tkey={`edge-${i}`}\n\t\t\t\t\t\t\tx1={a.pos.x}\n\t\t\t\t\t\t\ty1={a.pos.y}\n\t\t\t\t\t\t\tx2={b.pos.x}\n\t\t\t\t\t\t\ty2={b.pos.y}\n\t\t\t\t\t\t\tstroke={edgeColor(e.kind)}\n\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\tstrokeDasharray={e.kind === \"split\" ? \"4 3\" : undefined}\n\t\t\t\t\t\t\topacity={0.5}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{sim.nodes.map((n, i) => {\n\t\t\t\t\tconst active =\n\t\t\t\t\t\tactiveSet == null || activeSet.size === 0 || activeSet.has(n.id);\n\t\t\t\t\tconst r = Math.min(32, 8 + n.memoryCount * 3);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<g key={`node-${i}`} opacity={active ? 1 : 0.15}>\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tcx={n.pos.x}\n\t\t\t\t\t\t\t\tcy={n.pos.y}\n\t\t\t\t\t\t\t\tr={r}\n\t\t\t\t\t\t\t\tfill=\"hsl(var(--primary) / 0.18)\"\n\t\t\t\t\t\t\t\tstroke=\"hsl(var(--primary))\"\n\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\tx={n.pos.x}\n\t\t\t\t\t\t\t\ty={n.pos.y + 4}\n\t\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\t\tfontSize=\"10px\"\n\t\t\t\t\t\t\t\tfill=\"hsl(var(--foreground))\"\n\t\t\t\t\t\t\t\tclassName=\"pointer-events-none\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{n.label.length > 16 ? n.label.slice(0, 15) + \"…\" : n.label}\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</svg>\n\n\t\t\t<div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t<span className=\"inline-block h-0.5 w-6 bg-amber-500\" /> merge\n\t\t\t\t</span>\n\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t<span className=\"inline-block h-0.5 w-6 border-t border-dashed border-green-500\" />\n\t\t\t\t\tsplit\n\t\t\t\t</span>\n\t\t\t\t<span>\n\t\t\t\t\t{data.nodes.length} nodes · {data.edges.length} curation events\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab/TopicEvolutionView.tsx — planet evolution.\n *\n * Thin shell over TopicEvolutionGraph: fetches GET /api/wiki/evolution via\n * useApi and refetches when a `wiki_rebuilt` SSE event lands (emitted by the\n * extension after a topic-model rebuild), so the graph + scrubber stay live\n * between polls. No data is fabricated — only the contract fields are used.\n *\n * Styling: Tailwind + shadcn (Card). No legacy CSS classes.\n */\n\nimport type React from \"react\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useSSE } from \"../../hooks/useSSE\";\nimport { fetchTopicEvolution } from \"../../api/client\";\nimport type { TopicEvolutionResponse, SseEvent } from \"@contracts\";\nimport { Card, CardContent } from \"../../components/ui/card\";\nimport TopicEvolutionGraph from \"./TopicEvolutionGraph\";\n\nfunction isWikiRebuilt(e: SseEvent): e is Extract<SseEvent, { type: \"wiki_rebuilt\" }> {\n\treturn e.type === \"wiki_rebuilt\";\n}\n\nexport default function TopicEvolutionView(): React.ReactElement {\n\tconst { data, error, loading, refetch } = useApi<TopicEvolutionResponse>(\n\t\tuseCallback(() => fetchTopicEvolution(), []),\n\t\t{ pollInterval: 60_000 },\n\t);\n\n\tconst { events } = useSSE();\n\tconst lastRebuiltTs = useMemo(() => {\n\t\tconst rebuilt = events.filter(isWikiRebuilt);\n\t\tif (rebuilt.length === 0) return null;\n\t\treturn rebuilt[rebuilt.length - 1].ts;\n\t}, [events]);\n\n\tuseEffect(() => {\n\t\tif (lastRebuiltTs != null) refetch();\n\t}, [lastRebuiltTs, refetch]);\n\n\tif (error && !data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-danger\">\n\t\t\t\tError loading evolution graph: {error.message}\n\t\t\t</div>\n\t\t);\n\t}\n\tif (loading && !data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tLoading evolution graph…\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Card>\n\t\t\t<CardContent>\n\t\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\tTopic evolution\n\t\t\t\t</h3>\n\t\t\t\t{data ? (\n\t\t\t\t\t<TopicEvolutionGraph data={data} />\n\t\t\t\t) : (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">No data yet.</p>\n\t\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab.tsx — Wiki Revival (W3): wiki landing list.\n *\n * Replaces TopicsTab in the App registry (TopicsTab.tsx kept, unused). Renders\n * the wiki index: each auto-categorized topic with its resolved label (edited\n * badge when user-renamed), member count, curation badges (label/merge/split),\n * and a click-to-open that pushes a client-side page state to WikiPage.\n *\n * Styling is Tailwind + shadcn (Card, Badge, Button) — no legacy CSS classes.\n */\n\nimport type React from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useApi } from \"../hooks/useApi\";\nimport { fetchWikiIndex } from \"../api/client\";\nimport type { WikiIndexEntry, WikiIndexResponse } from \"@contracts\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Button } from \"../components/ui/button\";\nimport { Toggle } from \"../components/ui/toggle\";\nimport WikiPage from \"./WikiTab/WikiPage\";\nimport TopicEvolutionView from \"./WikiTab/TopicEvolutionView\";\n\ntype WikiView = \"list\" | \"evolution\";\n\nconst KIND_BADGES: Record<string, \"default\" | \"accent\" | \"warning\"> = {\n\tlabel: \"accent\",\n\tmerge: \"warning\",\n\tsplit: \"default\",\n};\n\nfunction fmtTs(ms: number | null): string {\n\tif (!ms) return \"—\";\n\treturn new Date(ms).toLocaleString();\n}\n\nfunction ViewToggle({\n\tview,\n\tonChange,\n}: {\n\tview: WikiView;\n\tonChange: (v: WikiView) => void;\n}): React.ReactElement {\n\treturn (\n\t\t<div className=\"flex gap-1\">\n\t\t\t<Toggle pressed={view === \"list\"} onClick={() => onChange(\"list\")}>\n\t\t\t\tTopics\n\t\t\t</Toggle>\n\t\t\t<Toggle\n\t\t\t\tpressed={view === \"evolution\"}\n\t\t\t\tonClick={() => onChange(\"evolution\")}\n\t\t\t>\n\t\t\t\tEvolution\n\t\t\t</Toggle>\n\t\t</div>\n\t);\n}\n\ninterface RowProps {\n\tentry: WikiIndexEntry;\n\tonOpen: (id: string) => void;\n}\n\nfunction TopicRow({ entry, onOpen }: RowProps): React.ReactElement {\n\treturn (\n\t\t<tr className=\"border-b border-border/60 last:border-0 hover:bg-bg-elevated/40\">\n\t\t\t<td className=\"py-2 pr-3\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<span className=\"font-medium text-foreground\">{entry.label}</span>\n\t\t\t\t\t{entry.edited && <Badge variant=\"outline\">edited</Badge>}\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td className=\"py-2 pr-3 text-sm text-muted-foreground\">\n\t\t\t\t{entry.memoryCount}\n\t\t\t</td>\n\t\t\t<td className=\"py-2 pr-3\">\n\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t{entry.overrideKinds.map((k) => (\n\t\t\t\t\t\t<Badge key={k} variant={KIND_BADGES[k] ?? \"default\"}>\n\t\t\t\t\t\t\t{k}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td className=\"py-2 pr-3 text-xs text-muted-foreground\">\n\t\t\t\t{fmtTs(entry.lastUpdated)}\n\t\t\t</td>\n\t\t\t<td className=\"py-2 text-right\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={() => onOpen(entry.id)}\n\t\t\t\t>\n\t\t\t\t\tOpen\n\t\t\t\t</Button>\n\t\t\t</td>\n\t\t</tr>\n\t);\n}\n\nexport default function WikiTab(): React.ReactElement {\n\tconst { data, loading, error } = useApi<WikiIndexResponse>(\n\t\tuseCallback(() => fetchWikiIndex(), []),\n\t\t{ pollInterval: 30_000 },\n\t);\n\tconst [view, setView] = useState<WikiView>(\"list\");\n\tconst [query, setQuery] = useState(\"\");\n\tconst [openId, setOpenId] = useState<string | null>(null);\n\n\tconst filtered = useMemo(() => {\n\t\tif (!data) return [];\n\t\tconst q = query.trim().toLowerCase();\n\t\tif (!q) return data.topics;\n\t\treturn data.topics.filter((t) =>\n\t\t\tt.label.toLowerCase().includes(q),\n\t\t);\n\t}, [data, query]);\n\n\tif (openId) {\n\t\treturn <WikiPage topicId={openId} onBack={() => setOpenId(null)} />;\n\t}\n\n\tif (view === \"evolution\") {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t<ViewToggle view={view} onChange={setView} />\n\t\t\t\t<TopicEvolutionView />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (error && !data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-danger\">\n\t\t\t\tError loading wiki: {error.message}\n\t\t\t</div>\n\t\t);\n\t}\n\tif (loading && !data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tLoading wiki…\n\t\t\t</div>\n\t\t);\n\t}\n\tif (!data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tNo wiki data available.\n\t\t\t</div>\n\t\t);\n\t}\n\tif (data.totalTopics === 0) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\t<h3 className=\"mb-2 font-heading text-base text-foreground\">Wiki</h3>\n\t\t\t\t<p>\n\t\t\t\t\tNo topics yet. Topics are auto-generated after every Nth compaction\n\t\t\t\t\tfrom real memory embeddings (k-means + TF-IDF).\n\t\t\t\t</p>\n\t\t\t\t<p className=\"mt-2\">Check back after a few more compaction cycles.</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-wrap items-end justify-between gap-2\">\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t<ViewToggle view={view} onChange={setView} />\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h2 className=\"font-heading text-lg font-semibold\">Wiki</h2>\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{data.totalTopics} topic{data.totalTopics !== 1 ? \"s\" : \"\"} ·{\" \"}\n\t\t\t\t\t\t\t{data.totalMemories} assigned memori\n\t\t\t\t\t\t\t{data.totalMemories !== 1 ? \"es\" : \"y\"}\n\t\t\t\t\t\t\t{data.lastRebuildAt != null && (\n\t\t\t\t\t\t\t\t<> · last rebuild {fmtTs(data.lastRebuildAt)}</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tplaceholder=\"Filter topics by label…\"\n\t\t\t\t\taria-label=\"Filter topics by label\"\n\t\t\t\t\tvalue={query}\n\t\t\t\t\tonChange={(e) => setQuery(e.target.value)}\n\t\t\t\t\tclassName=\"w-64 rounded-md border border-border bg-bg-elevated/50 px-3 py-2 text-sm outline-none transition-colors focus:border-primary\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"overflow-x-auto rounded-lg border border-border bg-bg-card\">\n\t\t\t\t<table className=\"w-full table-fixed text-sm\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr className=\"border-b border-border text-left text-xs uppercase text-muted-foreground\">\n\t\t\t\t\t\t\t<th className=\"w-1/3 px-4 py-2 font-medium\">Label</th>\n\t\t\t\t\t\t\t<th className=\"w-16 py-2 font-medium\">Memories</th>\n\t\t\t\t\t\t\t<th className=\"w-40 py-2 font-medium\">Badges</th>\n\t\t\t\t\t\t\t<th className=\"w-40 py-2 font-medium\">Last updated</th>\n\t\t\t\t\t\t\t<th className=\"w-20 py-2\" />\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{filtered.map((t) => (\n\t\t\t\t\t\t\t<TopicRow key={t.id} entry={t} onOpen={setOpenId} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\tcolSpan={5}\n\t\t\t\t\t\t\t\t\tclassName=\"px-4 py-6 text-center text-muted-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tNo topics match \"{query}\".\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"names":["memberSnippet","id","method","base","WikiPageControls","topicId","others","members","onMutated","mode","setMode","useState","label","setLabel","target","setTarget","picked","setPicked","busy","setBusy","error","setError","open","m","submit","renameTopic","mergeTopics","splitTopic","e","jsxs","Fragment","jsx","Button","o","prev","x","W","H","BAR_W","GAP","fmtBucket","ts","TopicTimeline","data","useApi","useCallback","fetchTopicTimeline","buckets","total","max","b","totalWidth","scale","i","h","fmtTs","ms","METHOD_LABELS","WikiPage","onBack","dirty","setDirty","bump","d","page","loading","fetchWikiTopic","index","fetchWikiIndex","labelOf","useMemo","map","t","otherTopics","Badge","Card","CardContent","p","REPULSION","ATTRACTION","CENTER_GRAVITY","DAMPING","SPEED_LIMIT","MIN_VELOCITY","MAX_ITERATIONS","edgeColor","kind","initialLayout","nodes","n","angle","applyForces","sim","edges","fx","fy","j","dx","dy","distSq","dist","other","speed","TopicEvolutionGraph","simRef","useRef","animRef","setFrame","scrub","setScrub","useEffect","indexById","si","ti","timeByActivity","iter","tick","scrubMax","scrubBucket","idx","activeSet","a","active","r","isWikiRebuilt","TopicEvolutionView","refetch","fetchTopicEvolution","events","useSSE","lastRebuiltTs","rebuilt","KIND_BADGES","ViewToggle","view","onChange","Toggle","TopicRow","entry","onOpen","k","WikiTab","setView","query","setQuery","openId","setOpenId","filtered","q"],"mappings":"uRAyBA,SAASA,EAAcC,EAAYC,EAAwB,CAC1D,MAAMC,EAAOF,EAAG,OAAS,GAAKA,EAAG,MAAM,EAAG,EAAE,EAAI,IAAMA,EACtD,OAAOC,EAAS,GAAGC,CAAI,KAAKD,CAAM,IAAMC,CACzC,CAEA,SAAwBC,GAAiB,CACxC,QAAAC,EACA,OAAAC,EACA,QAAAC,EACA,UAAAC,CACD,EAAsC,CACrC,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAe,IAAI,EACrC,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAS,EAAE,EAC/B,CAACG,EAAQC,CAAS,EAAIJ,EAAAA,SAAS,EAAE,EACjC,CAACK,EAAQC,CAAS,EAAIN,EAAAA,SAAmB,CAAA,CAAE,EAC3C,CAACO,EAAMC,CAAO,EAAIR,EAAAA,SAAS,EAAK,EAChC,CAACS,EAAOC,CAAQ,EAAIV,EAAAA,SAAwB,IAAI,EAEtD,SAASW,EAAKC,EAA8B,CAC3Cb,EAAQa,CAAC,EACTF,EAAS,IAAI,EACbR,EAAS,EAAE,EACXE,EAAU,EAAE,EACZE,EAAU,CAAA,CAAE,CACb,CAEA,eAAeO,GAAwB,CACtCL,EAAQ,EAAI,EACZE,EAAS,IAAI,EACb,GAAI,CACH,GAAIZ,IAAS,SACZ,MAAMgB,EAAYpB,EAASO,CAAK,UACtBH,IAAS,QAAS,CAC5B,GAAI,CAACK,EAAQ,CACZO,EAAS,sBAAsB,EAC/BF,EAAQ,EAAK,EACb,MACD,CACA,MAAMO,EAAYrB,EAASS,CAAM,CAClC,SAAWL,IAAS,QAAS,CAC5B,GAAIO,EAAO,SAAW,EAAG,CACxBK,EAAS,2BAA2B,EACpCF,EAAQ,EAAK,EACb,MACD,CACA,MAAMQ,EAAWtB,EAASW,CAAM,CACjC,CACAN,EAAQ,IAAI,EACZF,EAAA,CACD,OAASoB,EAAG,CACXP,EAASO,aAAa,MAAQA,EAAE,QAAU,OAAOA,CAAC,CAAC,CACpD,QAAA,CACCT,EAAQ,EAAK,CACd,CACD,CAEA,OACCU,EAAAA,KAAAC,WAAA,CACC,SAAA,CAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAE,EAAAA,IAACC,EAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,QAAS,IAAMV,EAAK,QAAQ,EAAG,SAAA,QAAA,CAEnE,EACAS,EAAAA,IAACC,EAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,QAAS,IAAMV,EAAK,OAAO,EAAG,SAAA,aAAA,CAElE,EACAS,EAAAA,IAACC,EAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,QAAS,IAAMV,EAAK,OAAO,EAAG,SAAA,OAAA,CAElE,CAAA,EACD,EAECb,GACAsB,EAAAA,IAAC,MAAA,CACA,UAAU,sEACV,QAAS,IAAMrB,EAAQ,IAAI,EAE3B,SAAAmB,EAAAA,KAAC,MAAA,CACA,UAAU,2EACV,KAAK,SACL,aAAW,OACX,aAAYpB,EACZ,QAAUmB,GAAMA,EAAE,gBAAA,EAElB,SAAA,CAAAG,EAAAA,IAAC,KAAA,CAAG,UAAU,4DACZ,SAAAtB,IAAS,SACP,eACAA,IAAS,QACR,cACA,aAAA,CACL,EAECA,IAAS,UACTsB,EAAAA,IAAC,QAAA,CACA,KAAK,OACL,MAAOnB,EACP,YAAY,mCACZ,aAAW,kBACX,UAAS,GACT,SAAWgB,GAAMf,EAASe,EAAE,OAAO,KAAK,EACxC,UAAU,gIAAA,CAAA,EAIXnB,IAAS,SACToB,EAAAA,KAAC,SAAA,CACA,MAAOf,EACP,aAAW,eACX,SAAWc,GAAMb,EAAUa,EAAE,OAAO,KAAK,EACzC,UAAU,iIAEV,SAAA,CAAAG,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,uBAAoB,EACpCzB,EAAO,IAAK2B,GACZF,EAAAA,IAAC,SAAA,CAAkB,MAAOE,EAAE,GAC1B,SAAAA,EAAE,KAAA,EADSA,EAAE,EAEf,CACA,CAAA,CAAA,CAAA,EAIFxB,IAAS,SACTsB,MAAC,MAAA,CAAI,UAAU,4DACb,SAAAxB,EAAQ,IAAKgB,GACbM,EAAAA,KAAC,QAAA,CAEA,UAAU,2HAEV,SAAA,CAAAE,EAAAA,IAAC,QAAA,CACA,KAAK,WACL,QAASf,EAAO,SAASO,EAAE,QAAQ,EACnC,SAAWK,GAAM,CAChBX,EAAWiB,GACVN,EAAE,OAAO,QACN,CAAC,GAAGM,EAAMX,EAAE,QAAQ,EACpBW,EAAK,OAAQC,GAAMA,IAAMZ,EAAE,QAAQ,CAAA,CAExC,EACA,UAAU,gBAAA,CAAA,EAEXQ,EAAAA,IAAC,QAAK,UAAU,0CACd,WAAcR,EAAE,SAAUA,EAAE,MAAM,CAAA,CACpC,CAAA,CAAA,EAjBKA,EAAE,QAAA,CAmBR,EACF,EAGAH,GACAW,EAAAA,IAAC,IAAA,CAAE,UAAU,2BAA4B,SAAAX,EAAM,EAGhDS,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACd,SAAA,CAAAE,EAAAA,IAACC,EAAA,CAAO,QAAQ,QAAQ,KAAK,KAAK,QAAS,IAAMtB,EAAQ,IAAI,EAAG,SAAA,QAAA,CAEhE,EACAqB,EAAAA,IAACC,EAAA,CAAO,KAAK,KAAK,QAASR,EAAQ,SAAUN,EAC3C,SAAAA,EAAO,IAAM,SAAA,CACf,CAAA,CAAA,CACD,CAAA,CAAA,CAAA,CACD,CAAA,CACD,EAEF,CAEF,CC3KA,MAAMkB,EAAI,IACJC,EAAI,GACJC,EAAQ,GACRC,EAAM,EAMZ,SAASC,EAAUC,EAAoB,CACtC,OAAKA,EACE,IAAI,KAAKA,CAAE,EAAE,mBAAA,EADJ,GAEjB,CAEA,SAAwBC,GAAc,CAAE,QAAArC,GAAsC,CAC7E,KAAM,CAAE,KAAAsC,EAAM,MAAAvB,CAAA,EAAUwB,EACvBC,EAAAA,YAAY,IAAMC,EAAmBzC,CAAO,EAAG,CAACA,CAAO,CAAC,EACxD,CAAA,CAAC,EAGF,GAAIe,EACH,OACCW,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAA+E,SAAA,wBAE9F,EAGF,GAAI,CAACY,EACJ,OACCZ,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAA+E,SAAA,oBAE9F,EAIF,KAAM,CAAE,QAAAgB,EAAS,MAAAC,CAAA,EAAUL,EACrBM,EAAM,KAAK,IAAI,GAAGF,EAAQ,IAAKG,GAAMA,EAAE,KAAK,EAAG,CAAC,EAChDC,EAAaJ,EAAQ,QAAUT,EAAQC,GACvCa,EAAQ,KAAK,IAAI,GAAIhB,EAAI,IAAM,KAAK,IAAIe,EAAY,CAAC,CAAC,EAE5D,OACCtB,EAAAA,KAAC,MAAA,CAAI,UAAU,iDACd,SAAA,CAAAA,EAAAA,KAAC,KAAA,CAAG,UAAU,gEAAgE,SAAA,CAAA,kBAC7D,IAChBA,EAAAA,KAAC,OAAA,CAAK,UAAU,sBAAsB,SAAA,CAAA,IACnCmB,EAAM,UAAQA,IAAU,EAAI,MAAQ,IAAI,mBAAA,CAAA,CAC3C,CAAA,EACD,EACCD,EAAQ,SAAW,EACnBhB,EAAAA,IAAC,KAAE,UAAU,gCAAgC,SAAA,uBAAA,CAAqB,EAElEF,EAAAA,KAAAC,EAAAA,SAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACA,MAAM,OACN,OAAQM,EACR,QAAS,OAAO,KAAK,IAAID,EAAGe,EAAaC,CAAK,CAAC,IAAIf,CAAC,GACpD,KAAK,MACL,aAAW,6BAEV,SAAAU,EAAQ,IAAI,CAACG,EAAGG,IAAM,CACtB,MAAMlB,EAAIkB,GAAKf,EAAQC,GAAOa,EACxBE,EAAI,KAAK,IAAI,EAAIJ,EAAE,MAAQD,GAAQZ,EAAI,GAAG,EAChD,OACCN,EAAAA,IAAC,OAAA,CAEA,EAAAI,EACA,EAAGE,EAAI,EAAIiB,EACX,MAAO,KAAK,IAAI,EAAGhB,EAAQc,CAAK,EAChC,OAAQE,EACR,GAAI,EACJ,KAAK,sBACL,QAAS,IAET,SAAAvB,EAAAA,IAAC,QAAA,CAAO,SAAA,GAAGS,EAAUU,EAAE,MAAM,CAAC,KAAKA,EAAE,KAAK,EAAA,CAAG,CAAA,EATxC,GAAGA,EAAE,MAAM,IAAIG,CAAC,EAAA,CAYxB,CAAC,CAAA,CAAA,EAEFxB,EAAAA,KAAC,IAAA,CAAE,UAAU,qCAAqC,SAAA,CAAA,kBACjCW,EAAUO,EAAQ,CAAC,EAAE,MAAM,EAAE,WAC5CP,EAAUO,EAAQA,EAAQ,OAAS,CAAC,EAAE,MAAM,CAAA,CAAA,CAC9C,CAAA,CAAA,CACD,CAAA,EAEF,CAEF,CC1EA,SAASQ,EAAMC,EAAoB,CAClC,OAAKA,EACE,IAAI,KAAKA,CAAE,EAAE,eAAA,EADJ,GAEjB,CAEA,MAAMC,GAAwC,CAC7C,eAAgB,SAChB,MAAO,QACP,MAAO,QACP,OAAQ,QACT,EAEA,SAAwBC,GAAS,CAChC,QAAArD,EACA,OAAAsD,CACD,EAAsC,CACrC,KAAM,CAACC,EAAOC,CAAQ,EAAIlD,EAAAA,SAAS,CAAC,EAC9BmD,EAAOjB,EAAAA,YAAY,IAAMgB,EAAUE,GAAMA,EAAI,CAAC,EAAG,EAAE,EAEnD,CAAE,KAAMC,EAAM,MAAA5C,EAAO,QAAA6C,GAAYrB,EACtCC,EAAAA,YAAY,IAAMqB,EAAe7D,CAAO,EAAG,CAACA,EAASuD,CAAK,CAAC,EAC3D,CAAA,CAAC,EAEI,CAAE,KAAMO,CAAA,EAAUvB,EACvBC,cAAY,IAAMuB,EAAA,EAAkB,EAAE,EACtC,CAAA,CAAC,EAGIC,EAAUC,EAAAA,QAAQ,IAAM,CAC7B,MAAMC,MAAU,IAChB,UAAWC,KAAKL,GAAO,QAAU,CAAA,IAAQ,IAAIK,EAAE,GAAIA,EAAE,KAAK,EAC1D,OAAOD,CACR,EAAG,CAACJ,CAAK,CAAC,EAEV,GAAI/C,GAAS,CAAC4C,EACb,OACCnC,EAAAA,KAAC,MAAA,CAAI,UAAU,qEAAqE,SAAA,CAAA,wBAC7DT,EAAM,OAAA,EAC7B,EAGF,GAAI6C,GAAW,CAACD,EACf,OACCjC,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAA+E,SAAA,iBAE9F,EAGF,GAAI,CAACiC,EACJ,OACCjC,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAA+E,SAAA,2BAE9F,EAIF,MAAM0C,GAAeN,GAAO,QAAU,CAAA,GACpC,OAAQK,GAAMA,EAAE,KAAOnE,CAAO,EAC9B,IAAKmE,IAAO,CAAE,GAAIA,EAAE,GAAI,MAAOA,EAAE,KAAA,EAAQ,EAE3C,OACC3C,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAE,EAAAA,IAACC,GAAO,QAAQ,UAAU,KAAK,KAAK,QAAS2B,EAAQ,SAAA,QAAA,CAErD,QACC,KAAA,CAAG,UAAU,qCACZ,SAAAK,EAAK,MAAM,MACb,EACCA,EAAK,MAAM,cAAWU,EAAA,CAAM,QAAQ,UAAU,SAAA,SAAM,EACrD7C,EAAAA,KAAC6C,EAAA,CAAM,QAAQ,UACb,SAAA,CAAAV,EAAK,WAAW,OAAO,WAAA,CAAA,CACzB,CAAA,EACD,EACAjC,EAAAA,IAAC3B,GAAA,CACA,QAAAC,EACA,OAAQoE,EACR,QAAST,EAAK,WACd,UAAWF,CAAA,CAAA,CACZ,EACD,EAECE,EAAK,SACLjC,EAAAA,IAAC4C,EAAA,CACA,gBAACC,EAAA,CACA,SAAA,CAAA7C,EAAAA,IAAC,KAAA,CAAG,UAAU,gEAAgE,SAAA,UAE9E,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,6CACX,WAAK,OAAA,CACP,CAAA,CAAA,CACD,CAAA,CACD,EAGAiC,EAAK,YAAY,OAAS,GAC1BjC,EAAAA,IAAC4C,EAAA,CACA,gBAACC,EAAA,CACA,SAAA,CAAA7C,EAAAA,IAAC,KAAA,CAAG,UAAU,gEAAgE,SAAA,eAE9E,EACAA,EAAAA,IAAC,MAAG,UAAU,sBACZ,WAAK,YAAY,IAAKR,GACtBM,EAAAA,KAAC,KAAA,CAEA,UAAU,mEAEV,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAR,EAAE,QAAQ,EAC1DM,EAAAA,KAAC,IAAA,CAAE,UAAU,qCACX,SAAA,CAAAN,EAAE,SAAS,MAAIgC,EAAMhC,EAAE,SAAS,CAAA,CAAA,CAClC,CAAA,CAAA,EANKA,EAAE,QAAA,CAQR,CAAA,CACF,CAAA,CAAA,CACD,CAAA,CACD,EAGDQ,MAACW,IAAc,QAAArC,EAAkB,EAEhC2D,EAAK,WAAW,OAAS,GACzBjC,EAAAA,IAAC4C,EAAA,CACA,gBAACC,EAAA,CACA,SAAA,CAAA7C,EAAAA,IAAC,KAAA,CAAG,UAAU,gEAAgE,SAAA,aAE9E,QACC,MAAA,CAAI,UAAU,4DACd,SAAAF,EAAAA,KAAC,QAAA,CAAM,UAAU,iBAChB,SAAA,CAAAE,EAAAA,IAAC,SAAM,UAAU,0BAChB,SAAAF,EAAAA,KAAC,KAAA,CAAG,UAAU,2EACb,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,SAAM,EAC5CA,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,UAAO,EAC7CA,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,WAAQ,EAC9CA,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,QAAA,CAAM,CAAA,CAAA,CAC7C,CAAA,CACD,QACC,QAAA,CACC,SAAAiC,EAAK,WAAW,IAAKa,GACrBhD,EAAAA,KAAC,KAAA,CAEA,UAAU,0CAEV,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,gCACZ,SAAA8C,EAAE,SACJ,QACC,KAAA,CAAG,UAAU,4CACZ,SAAAA,EAAE,WAAa,UACjB,QACC,KAAA,CAAG,UAAU,4CACZ,SAAAtB,EAAMsB,EAAE,UAAU,EACpB,EACA9C,EAAAA,IAAC,KAAA,CAAG,UAAU,cACb,eAAC2C,EAAA,CAAM,QAAQ,UACb,SAAAjB,GAAcoB,EAAE,MAAM,GAAKA,EAAE,OAC/B,CAAA,CACD,CAAA,CAAA,EAhBKA,EAAE,QAAA,CAkBR,CAAA,CACF,CAAA,CAAA,CACD,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CACD,EAGAb,EAAK,gBAAgB,OAAS,GAC9BjC,EAAAA,IAAC4C,EAAA,CACA,gBAACC,EAAA,CACA,SAAA,CAAA7C,EAAAA,IAAC,KAAA,CAAG,UAAU,gEAAgE,SAAA,iBAE9E,EACAA,EAAAA,IAAC,OAAI,UAAU,uBACb,WAAK,gBAAgB,IAAK9B,GAC1B8B,EAAAA,IAAC2C,GAAe,QAAQ,SACtB,WAAQ,IAAIzE,CAAE,GAAKA,CAAA,EADTA,CAEZ,CACA,CAAA,CACF,CAAA,CAAA,CACD,CAAA,CACD,CAAA,EAEF,CAEF,CCjMA,MAAMmC,EAAI,IACJC,EAAI,IACJyC,EAAY,IACZC,EAAa,KACbC,EAAiB,KACjBC,EAAU,GACVC,EAAc,EACdC,GAAe,IACfC,GAAiB,IAiBvB,SAASC,GAAUC,EAAiC,CACnD,OAAOA,IAAS,QAAU,UAAY,SACvC,CAEA,SAASC,GAAcC,EAAmD,CACzE,OAAOA,EAAM,IAAI,CAACC,EAAGpC,IAAM,CAC1B,MAAMqC,EAAS,EAAI,KAAK,GAAKrC,EAAK,KAAK,IAAImC,EAAM,OAAQ,CAAC,EAC1D,MAAO,CACN,GAAIC,EAAE,GACN,MAAOA,EAAE,MACT,YAAaA,EAAE,YACf,IAAK,CAAE,EAAG,KAAK,IAAIC,CAAK,EAAI,IAAMtD,EAAI,EAAG,EAAG,KAAK,IAAIsD,CAAK,EAAI,IAAMrD,EAAI,CAAA,EACxE,GAAI,EACJ,GAAI,CAAA,CAEN,CAAC,CACF,CAEA,SAASsD,GAAYC,EAAmD,CACvE,KAAM,CAAE,MAAAJ,EAAO,MAAAK,CAAA,EAAUD,EACzB,QAAS,EAAI,EAAG,EAAIJ,EAAM,OAAQ,IAAK,CACtC,MAAM,EAAIA,EAAM,CAAC,EACjB,IAAIM,EAAK,EACLC,EAAK,EACT,QAASC,EAAI,EAAGA,EAAIR,EAAM,OAAQQ,IAAK,CACtC,GAAI,IAAMA,EAAG,SACb,MAAMC,EAAK,EAAE,IAAI,EAAIT,EAAMQ,CAAC,EAAE,IAAI,EAC5BE,EAAK,EAAE,IAAI,EAAIV,EAAMQ,CAAC,EAAE,IAAI,EAC5BG,EAASF,EAAKA,EAAKC,EAAKA,GAAM,EAC9BE,EAAO,KAAK,KAAKD,CAAM,EAC7BL,GAAOG,EAAKG,GAAStB,EAAYqB,GACjCJ,GAAOG,EAAKE,GAAStB,EAAYqB,EAClC,CACA,UAAWvE,KAAKiE,EAAO,CACtB,IAAIQ,EACJ,GAAIzE,EAAE,SAAW,EAAGyE,EAAQzE,EAAE,eACrBA,EAAE,SAAW,EAAGyE,EAAQzE,EAAE,WAC9B,UACL,MAAMqE,EAAKT,EAAMa,CAAK,EAAE,IAAI,EAAI,EAAE,IAAI,EAChCH,EAAKV,EAAMa,CAAK,EAAE,IAAI,EAAI,EAAE,IAAI,EACtCP,GAAMG,EAAKlB,EACXgB,GAAMG,EAAKnB,CACZ,CACAe,GAAM,EAAE,IAAI,EAAId,EAChBe,GAAM,EAAE,IAAI,EAAIf,EAChB,EAAE,IAAM,EAAE,GAAKc,GAAMb,EACrB,EAAE,IAAM,EAAE,GAAKc,GAAMd,EACrB,MAAMqB,EAAQ,KAAK,KAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,EAAE,EAC7CA,EAAQpB,IACX,EAAE,GAAM,EAAE,GAAKoB,EAASpB,EACxB,EAAE,GAAM,EAAE,GAAKoB,EAASpB,GAErBoB,EAAQnB,KACX,EAAE,IAAI,GAAK,EAAE,GACb,EAAE,IAAI,GAAK,EAAE,GAEf,CACD,CAMA,SAAwBoB,GAAoB,CAC3C,KAAA5D,CACD,EAA8B,CAC7B,MAAM6D,EAASC,EAAAA,OAIL,IAAI,EACRC,EAAUD,EAAAA,OAAO,CAAC,EAClB,EAAGE,CAAQ,EAAIhG,EAAAA,SAAS,CAAC,EACzB,CAACiG,EAAOC,CAAQ,EAAIlG,EAAAA,SAAiB,CAAC,EAG5CmG,EAAAA,UAAU,IAAM,CACf,MAAMtB,EAAQD,GAAc5C,EAAK,KAAK,EAChCoE,EAAY,IAAI,IAAIvB,EAAM,IAAI,CAACC,EAAGpC,IAAM,CAACoC,EAAE,GAAIpC,CAAC,CAAC,CAAC,EAClDwC,EAAmBlD,EAAK,MAC5B,IAAKf,GAAM,CACX,MAAMoF,EAAKD,EAAU,IAAInF,EAAE,MAAM,EAC3BqF,EAAKF,EAAU,IAAInF,EAAE,MAAM,EACjC,OAAIoF,IAAO,QAAaC,IAAO,QAAaD,IAAOC,EAAW,KACvD,CAAE,OAAQD,EAAI,OAAQC,EAAI,KAAMrF,EAAE,IAAA,CAC1C,CAAC,EACA,OAAQA,GAAoBA,IAAM,IAAI,EAElCsF,MAAqB,IAC3B,UAAWtF,KAAKe,EAAK,MACpBuE,EAAe,IAAItF,EAAE,OAAQ,KAAK,IAAIsF,EAAe,IAAItF,EAAE,MAAM,GAAK,EAAGA,EAAE,EAAE,CAAC,EAC9EsF,EAAe,IAAItF,EAAE,OAAQ,KAAK,IAAIsF,EAAe,IAAItF,EAAE,MAAM,GAAK,EAAGA,EAAE,EAAE,CAAC,EAE/E,OAAA4E,EAAO,QAAU,CAAE,MAAAhB,EAAO,MAAAK,EAAO,eAAAqB,CAAA,EACjCP,EAAS,CAAC,EACH,IAAM,qBAAqBD,EAAQ,OAAO,CAClD,EAAG,CAAC/D,CAAI,CAAC,EAGTmE,EAAAA,UAAU,IAAM,CACf,GAAI,CAACN,EAAO,QAAS,OACrB,IAAIW,EAAO,EACX,MAAMC,EAAO,IAAM,CACd,CAACZ,EAAO,SAAWW,GAAQ/B,KAC/BO,GAAYa,EAAO,OAAO,EAC1BW,IACAR,EAASQ,CAAI,EACbT,EAAQ,QAAU,sBAAsBU,CAAI,EAC7C,EACA,OAAAV,EAAQ,QAAU,sBAAsBU,CAAI,EACrC,IAAM,qBAAqBV,EAAQ,OAAO,CAClD,EAAG,CAAC/D,CAAI,CAAC,EAET,MAAMiD,EAAMY,EAAO,QAEba,EAAW,KAAK,IAAI1E,EAAK,QAAQ,OAAS,EAAG,CAAC,EAC9C2E,EAAchD,EAAAA,QAAQ,IAAM,CACjC,GAAI3B,EAAK,QAAQ,SAAW,EAAG,OAAO,KACtC,MAAM4E,EAAM,KAAK,IAAIX,EAAOjE,EAAK,QAAQ,OAAS,CAAC,EACnD,OAAOA,EAAK,QAAQ4E,CAAG,EAAE,MAC1B,EAAG,CAACX,EAAOjE,EAAK,OAAO,CAAC,EAExB,GAAI,CAACiD,GAAOjD,EAAK,MAAM,SAAW,EACjC,OACCZ,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAA+E,SAAA,oGAG9F,EAIF,MAAMyF,EACLF,GAAe,MAAQ,CAAC1B,EAAI,eACzB,KACA,IAAI,IACJ,CAAC,GAAGA,EAAI,eAAe,SAAS,EAC9B,OAAO,CAAC,CAAA,CAAGpB,CAAC,IAAMA,GAAK8C,CAAW,EAClC,IAAI,CAAC,CAACrH,CAAE,IAAMA,CAAE,CAAA,EAGtB,OACC4B,EAAAA,KAAC,MAAA,CAAI,UAAU,sBAEb,SAAA,CAAAc,EAAK,QAAQ,OAAS,GACtBd,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAE,EAAAA,IAAC,QAAA,CACA,KAAK,QACL,IAAK,EACL,IAAKsF,EACL,MAAOT,EACP,SAAWhF,GAAMiF,EAAS,OAAOjF,EAAE,OAAO,KAAK,CAAC,EAChD,UAAU,wBACV,aAAW,mCAAA,CAAA,EAEZG,EAAAA,IAAC,OAAA,CAAK,UAAU,kDACd,SAAAuF,EAAc,IAAI,KAAKA,CAAW,EAAE,mBAAA,EAAuB,KAAA,CAC7D,CAAA,EACD,EAIDzF,EAAAA,KAAC,MAAA,CACA,MAAM,OACN,OAAQQ,EACR,QAAS,OAAOD,CAAC,IAAIC,CAAC,GACtB,KAAK,MACL,aAAW,wBACX,UAAU,gDAET,SAAA,CAAAuD,EAAI,MAAM,IAAI,CAAChE,EAAGyB,IAAM,CACxB,MAAMoE,EAAI7B,EAAI,MAAMhE,EAAE,MAAM,EACtB,EAAIgE,EAAI,MAAMhE,EAAE,MAAM,EAC5B,OACCG,EAAAA,IAAC,OAAA,CAEA,GAAI0F,EAAE,IAAI,EACV,GAAIA,EAAE,IAAI,EACV,GAAI,EAAE,IAAI,EACV,GAAI,EAAE,IAAI,EACV,OAAQpC,GAAUzD,EAAE,IAAI,EACxB,YAAa,IACb,gBAAiBA,EAAE,OAAS,QAAU,MAAQ,OAC9C,QAAS,EAAA,EARJ,QAAQyB,CAAC,EAAA,CAWjB,CAAC,EACAuC,EAAI,MAAM,IAAI,CAACH,EAAGpC,IAAM,CACxB,MAAMqE,EACLF,GAAa,MAAQA,EAAU,OAAS,GAAKA,EAAU,IAAI/B,EAAE,EAAE,EAC1DkC,EAAI,KAAK,IAAI,GAAI,EAAIlC,EAAE,YAAc,CAAC,EAC5C,OACC5D,EAAAA,KAAC,IAAA,CAAoB,QAAS6F,EAAS,EAAI,IAC1C,SAAA,CAAA3F,EAAAA,IAAC,SAAA,CACA,GAAI0D,EAAE,IAAI,EACV,GAAIA,EAAE,IAAI,EACV,EAAAkC,EACA,KAAK,6BACL,OAAO,sBACP,YAAa,GAAA,CAAA,EAEd5F,EAAAA,IAAC,OAAA,CACA,EAAG0D,EAAE,IAAI,EACT,EAAGA,EAAE,IAAI,EAAI,EACb,WAAW,SACX,SAAS,OACT,KAAK,yBACL,UAAU,sBAET,SAAAA,EAAE,MAAM,OAAS,GAAKA,EAAE,MAAM,MAAM,EAAG,EAAE,EAAI,IAAMA,EAAE,KAAA,CAAA,CACvD,CAAA,EAlBO,QAAQpC,CAAC,EAmBjB,CAEF,CAAC,CAAA,CAAA,CAAA,EAGFxB,EAAAA,KAAC,MAAA,CAAI,UAAU,wDACd,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,4BACf,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,qCAAA,CAAsC,EAAE,QAAA,EACzD,EACAF,EAAAA,KAAC,OAAA,CAAK,UAAU,4BACf,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gEAAA,CAAiE,EAAE,OAAA,EAEpF,SACC,OAAA,CACC,SAAA,CAAAY,EAAK,MAAM,OAAO,YAAUA,EAAK,MAAM,OAAO,kBAAA,CAAA,CAChD,CAAA,CAAA,CACD,CAAA,EACD,CAEF,CC7PA,SAASiF,GAAchG,EAA+D,CACrF,OAAOA,EAAE,OAAS,cACnB,CAEA,SAAwBiG,IAAyC,CAChE,KAAM,CAAE,KAAAlF,EAAM,MAAAvB,EAAO,QAAA6C,EAAS,QAAA6D,GAAYlF,EACzCC,cAAY,IAAMkF,EAAA,EAAuB,EAAE,EAC3C,CAAE,aAAc,GAAA,CAAO,EAGlB,CAAE,OAAAC,CAAA,EAAWC,EAAA,EACbC,EAAgB5D,EAAAA,QAAQ,IAAM,CACnC,MAAM6D,EAAUH,EAAO,OAAOJ,EAAa,EAC3C,OAAIO,EAAQ,SAAW,EAAU,KAC1BA,EAAQA,EAAQ,OAAS,CAAC,EAAE,EACpC,EAAG,CAACH,CAAM,CAAC,EAMX,OAJAlB,EAAAA,UAAU,IAAM,CACXoB,GAAiB,MAAMJ,EAAA,CAC5B,EAAG,CAACI,EAAeJ,CAAO,CAAC,EAEvB1G,GAAS,CAACuB,EAEZd,EAAAA,KAAC,MAAA,CAAI,UAAU,qEAAqE,SAAA,CAAA,kCACnDT,EAAM,OAAA,EACvC,EAGE6C,GAAW,CAACtB,EAEdZ,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAA+E,SAAA,2BAE9F,EAKDA,EAAAA,IAAC4C,EAAA,CACA,SAAA9C,EAAAA,KAAC+C,EAAA,CACA,SAAA,CAAA7C,EAAAA,IAAC,KAAA,CAAG,UAAU,gEAAgE,SAAA,kBAE9E,EACCY,QACC4D,GAAA,CAAoB,KAAA5D,CAAA,CAAY,EAEjCZ,MAAC,IAAA,CAAE,UAAU,gCAAgC,SAAA,cAAA,CAAY,CAAA,CAAA,CAE3D,CAAA,CACD,CAEF,CC9CA,MAAMqG,GAAgE,CACrE,MAAO,SACP,MAAO,UACP,MAAO,SACR,EAEA,SAAS7E,EAAMC,EAA2B,CACzC,OAAKA,EACE,IAAI,KAAKA,CAAE,EAAE,eAAA,EADJ,GAEjB,CAEA,SAAS6E,EAAW,CACnB,KAAAC,EACA,SAAAC,CACD,EAGuB,CACtB,OACC1G,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAE,EAAAA,IAACyG,EAAA,CAAO,QAASF,IAAS,OAAQ,QAAS,IAAMC,EAAS,MAAM,EAAG,SAAA,QAAA,CAEnE,EACAxG,EAAAA,IAACyG,EAAA,CACA,QAASF,IAAS,YAClB,QAAS,IAAMC,EAAS,WAAW,EACnC,SAAA,WAAA,CAAA,CAED,EACD,CAEF,CAOA,SAASE,GAAS,CAAE,MAAAC,EAAO,OAAAC,GAAwC,CAClE,OACC9G,EAAAA,KAAC,KAAA,CAAG,UAAU,kEACb,SAAA,CAAAE,EAAAA,IAAC,MAAG,UAAU,YACb,SAAAF,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAA+B,SAAA2G,EAAM,MAAM,EAC1DA,EAAM,QAAU3G,EAAAA,IAAC2C,EAAA,CAAM,QAAQ,UAAU,SAAA,QAAA,CAAM,CAAA,CAAA,CACjD,CAAA,CACD,EACA3C,EAAAA,IAAC,KAAA,CAAG,UAAU,0CACZ,WAAM,YACR,EACAA,EAAAA,IAAC,KAAA,CAAG,UAAU,YACb,SAAAA,EAAAA,IAAC,OAAI,UAAU,uBACb,SAAA2G,EAAM,cAAc,IAAKE,GACzB7G,EAAAA,IAAC2C,EAAA,CAAc,QAAS0D,GAAYQ,CAAC,GAAK,UACxC,SAAAA,CAAA,EADUA,CAEZ,CACA,CAAA,CACF,CAAA,CACD,QACC,KAAA,CAAG,UAAU,0CACZ,SAAArF,EAAMmF,EAAM,WAAW,EACzB,EACA3G,EAAAA,IAAC,KAAA,CAAG,UAAU,kBACb,SAAAA,EAAAA,IAACC,EAAA,CACA,QAAQ,UACR,KAAK,KACL,QAAS,IAAM2G,EAAOD,EAAM,EAAE,EAC9B,SAAA,MAAA,CAAA,CAED,CACD,CAAA,EACD,CAEF,CAEA,SAAwBG,IAA8B,CACrD,KAAM,CAAE,KAAAlG,EAAM,QAAAsB,EAAS,MAAA7C,CAAA,EAAUwB,EAChCC,cAAY,IAAMuB,EAAA,EAAkB,EAAE,EACtC,CAAE,aAAc,GAAA,CAAO,EAElB,CAACkE,EAAMQ,CAAO,EAAInI,EAAAA,SAAmB,MAAM,EAC3C,CAACoI,EAAOC,CAAQ,EAAIrI,EAAAA,SAAS,EAAE,EAC/B,CAACsI,EAAQC,CAAS,EAAIvI,EAAAA,SAAwB,IAAI,EAElDwI,EAAW7E,EAAAA,QAAQ,IAAM,CAC9B,GAAI,CAAC3B,EAAM,MAAO,CAAA,EAClB,MAAMyG,EAAIL,EAAM,KAAA,EAAO,YAAA,EACvB,OAAKK,EACEzG,EAAK,OAAO,OAAQ6B,GAC1BA,EAAE,MAAM,YAAA,EAAc,SAAS4E,CAAC,CAAA,EAFlBzG,EAAK,MAIrB,EAAG,CAACA,EAAMoG,CAAK,CAAC,EAEhB,OAAIE,EACIlH,EAAAA,IAAC2B,IAAS,QAASuF,EAAQ,OAAQ,IAAMC,EAAU,IAAI,EAAG,EAG9DZ,IAAS,YAEXzG,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAE,EAAAA,IAACsG,EAAA,CAAW,KAAAC,EAAY,SAAUQ,CAAA,CAAS,QAC1CjB,GAAA,CAAA,CAAmB,CAAA,EACrB,EAIEzG,GAAS,CAACuB,EAEZd,EAAAA,KAAC,MAAA,CAAI,UAAU,qEAAqE,SAAA,CAAA,uBAC9DT,EAAM,OAAA,EAC5B,EAGE6C,GAAW,CAACtB,EAEdZ,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAA+E,SAAA,gBAE9F,EAGGY,EAODA,EAAK,cAAgB,EAEvBd,EAAAA,KAAC,MAAA,CAAI,UAAU,+EACd,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,8CAA8C,SAAA,OAAI,EAChEA,EAAAA,IAAC,KAAE,SAAA,qHAAA,CAGH,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,OAAO,SAAA,gDAAA,CAA8C,CAAA,EACnE,EAKDF,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iDACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAE,EAAAA,IAACsG,EAAA,CAAW,KAAAC,EAAY,SAAUQ,CAAA,CAAS,SAC1C,MAAA,CACA,SAAA,CAAA/G,EAAAA,IAAC,KAAA,CAAG,UAAU,qCAAqC,SAAA,OAAI,EACvDF,EAAAA,KAAC,IAAA,CAAE,UAAU,gCACX,SAAA,CAAAc,EAAK,YAAY,SAAOA,EAAK,cAAgB,EAAI,IAAM,GAAG,KAAG,IAC7DA,EAAK,cAAc,mBACnBA,EAAK,gBAAkB,EAAI,KAAO,IAClCA,EAAK,eAAiB,MACtBd,EAAAA,KAAAC,EAAAA,SAAA,CAAE,SAAA,CAAA,mBAAiByB,EAAMZ,EAAK,aAAa,CAAA,CAAA,CAAE,CAAA,CAAA,CAE/C,CAAA,CAAA,CACD,CAAA,EACD,EACAZ,EAAAA,IAAC,QAAA,CACA,KAAK,SACL,YAAY,0BACZ,aAAW,yBACX,MAAOgH,EACP,SAAWnH,GAAMoH,EAASpH,EAAE,OAAO,KAAK,EACxC,UAAU,8HAAA,CAAA,CACX,EACD,QAEC,MAAA,CAAI,UAAU,6DACd,SAAAC,EAAAA,KAAC,QAAA,CAAM,UAAU,6BAChB,SAAA,CAAAE,MAAC,QAAA,CACA,SAAAF,EAAAA,KAAC,KAAA,CAAG,UAAU,2EACb,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,8BAA8B,SAAA,QAAK,EACjDA,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,WAAQ,EAC9CA,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,SAAM,EAC5CA,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAwB,SAAA,eAAY,EAClDA,EAAAA,IAAC,KAAA,CAAG,UAAU,WAAA,CAAY,CAAA,CAAA,CAC3B,CAAA,CACD,SACC,QAAA,CACC,SAAA,CAAAoH,EAAS,IAAK3E,GACdzC,EAAAA,IAAC0G,GAAA,CAAoB,MAAOjE,EAAG,OAAQ0E,CAAA,EAAxB1E,EAAE,EAAiC,CAClD,EACA2E,EAAS,SAAW,GACpBpH,EAAAA,IAAC,KAAA,CACA,SAAAF,EAAAA,KAAC,KAAA,CACA,QAAS,EACT,UAAU,8CACV,SAAA,CAAA,oBACkBkH,EAAM,IAAA,CAAA,CAAA,CACzB,CACD,CAAA,CAAA,CAEF,CAAA,CAAA,CACD,CAAA,CACD,CAAA,EACD,EAzEChH,EAAAA,IAAC,MAAA,CAAI,UAAU,+EAA+E,SAAA,0BAE9F,CAyEH"}
|
|
1
|
+
{"version":3,"file":"WikiTab-DnKupXTv.js","sources":["../../src/tabs/WikiTab/WikiPageControls.tsx","../../src/tabs/WikiTab/TopicTimeline.tsx","../../src/tabs/WikiTab/WikiPage.tsx","../../src/tabs/WikiTab/TopicEvolutionGraph.tsx","../../src/tabs/WikiTab/TopicEvolutionView.tsx","../../src/tabs/WikiTab.tsx"],"sourcesContent":["/**\n * dashboard-client/src/tabs/WikiTab/WikiPageControls.tsx — rename/merge/split.\n *\n * Controlled dialogs for the three curation mutations. Non-destructive: on\n * success the parent refetches and paints the returned CurationResult; on\n * failure the pre-mutation snapshot stays (no local partial apply).\n *\n * Styling: Tailwind + shadcn (Button). No legacy CSS classes.\n */\n\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { renameTopic, mergeTopics, splitTopic } from \"../../api/client\";\nimport type { MemoryProvenance } from \"@contracts\";\nimport { Button } from \"../../components/ui/button\";\n\ninterface ControlsProps {\n\ttopicId: string;\n\tothers: Array<{ id: string; label: string }>;\n\tmembers: MemoryProvenance[];\n\tonMutated: () => void;\n}\n\ntype Mode = \"rename\" | \"merge\" | \"split\" | null;\n\nfunction memberSnippet(id: string, method: string): string {\n\tconst base = id.length > 14 ? id.slice(0, 14) + \"…\" : id;\n\treturn method ? `${base} (${method})` : base;\n}\n\nexport default function WikiPageControls({\n\ttopicId,\n\tothers,\n\tmembers,\n\tonMutated,\n}: ControlsProps): React.ReactElement {\n\tconst [mode, setMode] = useState<Mode>(null);\n\tconst [label, setLabel] = useState(\"\");\n\tconst [target, setTarget] = useState(\"\");\n\tconst [picked, setPicked] = useState<string[]>([]);\n\tconst [busy, setBusy] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tfunction open(m: Exclude<Mode, null>): void {\n\t\tsetMode(m);\n\t\tsetError(null);\n\t\tsetLabel(\"\");\n\t\tsetTarget(\"\");\n\t\tsetPicked([]);\n\t}\n\n\tasync function submit(): Promise<void> {\n\t\tsetBusy(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tif (mode === \"rename\") {\n\t\t\t\tawait renameTopic(topicId, label);\n\t\t\t} else if (mode === \"merge\") {\n\t\t\t\tif (!target) {\n\t\t\t\t\tsetError(\"Pick a target topic.\");\n\t\t\t\t\tsetBusy(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait mergeTopics(topicId, target);\n\t\t\t} else if (mode === \"split\") {\n\t\t\t\tif (picked.length === 0) {\n\t\t\t\t\tsetError(\"Pick at least one memory.\");\n\t\t\t\t\tsetBusy(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait splitTopic(topicId, picked);\n\t\t\t}\n\t\t\tsetMode(null);\n\t\t\tonMutated();\n\t\t} catch (e) {\n\t\t\tsetError(e instanceof Error ? e.message : String(e));\n\t\t} finally {\n\t\t\tsetBusy(false);\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={() => open(\"rename\")}>\n\t\t\t\t\tRename\n\t\t\t\t</Button>\n\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={() => open(\"merge\")}>\n\t\t\t\t\tMerge into…\n\t\t\t\t</Button>\n\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={() => open(\"split\")}>\n\t\t\t\t\tSplit\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{mode && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\"\n\t\t\t\t\tonClick={() => setMode(null)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"w-full max-w-md rounded-lg border border-border bg-bg-card p-5 shadow-xl\"\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\taria-label={mode}\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<h3 className=\"mb-3 font-heading text-base font-semibold text-foreground\">\n\t\t\t\t\t\t\t{mode === \"rename\"\n\t\t\t\t\t\t\t\t? \"Rename topic\"\n\t\t\t\t\t\t\t\t: mode === \"merge\"\n\t\t\t\t\t\t\t\t\t? \"Merge into…\"\n\t\t\t\t\t\t\t\t\t: \"Split topic\"}\n\t\t\t\t\t\t</h3>\n\n\t\t\t\t\t\t{mode === \"rename\" && (\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tvalue={label}\n\t\t\t\t\t\t\t\tplaceholder=\"New label (empty = back to auto)\"\n\t\t\t\t\t\t\t\taria-label=\"New topic label\"\n\t\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\t\tonChange={(e) => setLabel(e.target.value)}\n\t\t\t\t\t\t\t\tclassName=\"w-full rounded-md border border-border bg-bg-elevated/50 px-3 py-2 text-sm outline-none transition-colors focus:border-primary\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{mode === \"merge\" && (\n\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\tvalue={target}\n\t\t\t\t\t\t\t\taria-label=\"Target topic\"\n\t\t\t\t\t\t\t\tonChange={(e) => setTarget(e.target.value)}\n\t\t\t\t\t\t\t\tclassName=\"w-full rounded-md border border-border bg-bg-elevated/50 px-3 py-2 text-sm outline-none transition-colors focus:border-primary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<option value=\"\">Pick a target topic…</option>\n\t\t\t\t\t\t\t\t{others.map((o) => (\n\t\t\t\t\t\t\t\t\t<option key={o.id} value={o.id}>\n\t\t\t\t\t\t\t\t\t\t{o.label}\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{mode === \"split\" && (\n\t\t\t\t\t\t\t<div className=\"max-h-56 overflow-auto rounded-md border border-border/60\">\n\t\t\t\t\t\t\t\t{members.map((m) => (\n\t\t\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\t\t\tkey={m.memoryId}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex cursor-pointer items-center gap-2 border-b border-border/40 px-3 py-2 text-sm last:border-0 hover:bg-bg-elevated/40\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\tchecked={picked.includes(m.memoryId)}\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetPicked((prev) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\te.target.checked\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...prev, m.memoryId]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: prev.filter((x) => x !== m.memoryId),\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"accent-primary\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{memberSnippet(m.memoryId, m.method)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{error && (\n\t\t\t\t\t\t\t<p className=\"mt-3 text-sm text-danger\">{error}</p>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div className=\"mt-4 flex justify-end gap-2\">\n\t\t\t\t\t\t\t<Button variant=\"ghost\" size=\"sm\" onClick={() => setMode(null)}>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button size=\"sm\" onClick={submit} disabled={busy}>\n\t\t\t\t\t\t\t\t{busy ? \"…\" : \"Confirm\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab/TopicTimeline.tsx — per-topic timeline.\n *\n * Renders topic memory-addition buckets as a lightweight SVG bar strip (no\n * chart library needed). X = time bucket, bar height = memories added.\n * Fetches GET /api/wiki/topic/:topicId/timeline.\n *\n * Styling: Tailwind + shadcn (Card). No legacy CSS classes.\n */\n\nimport type React from \"react\";\nimport { useCallback } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { fetchTopicTimeline } from \"../../api/client\";\nimport type { TopicTimelineResponse } from \"@contracts\";\n\nconst W = 720;\nconst H = 56;\nconst BAR_W = 10;\nconst GAP = 3;\n\ninterface Props {\n\ttopicId: string;\n}\n\nfunction fmtBucket(ts: number): string {\n\tif (!ts) return \"—\";\n\treturn new Date(ts).toLocaleDateString();\n}\n\nexport default function TopicTimeline({ topicId }: Props): React.ReactElement {\n\tconst { data, error } = useApi<TopicTimelineResponse>(\n\t\tuseCallback(() => fetchTopicTimeline(topicId), [topicId]),\n\t\t{},\n\t);\n\n\tif (error) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-4 text-sm text-muted-foreground\">\n\t\t\t\tTimeline unavailable.\n\t\t\t</div>\n\t\t);\n\t}\n\tif (!data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-4 text-sm text-muted-foreground\">\n\t\t\t\tLoading timeline…\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst { buckets, total } = data;\n\tconst max = Math.max(...buckets.map((b) => b.count), 1);\n\tconst totalWidth = buckets.length * (BAR_W + GAP);\n\tconst scale = Math.min(1, (W - 24) / Math.max(totalWidth, 1));\n\n\treturn (\n\t\t<div className=\"rounded-lg border border-border bg-bg-card p-4\">\n\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\tMemory timeline{\" \"}\n\t\t\t\t<span className=\"font-normal text-xs\">\n\t\t\t\t\t({total} memory{total !== 1 ? \"ies\" : \"y\"} · daily buckets)\n\t\t\t\t</span>\n\t\t\t</h3>\n\t\t\t{buckets.length === 0 ? (\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">No timeline data yet.</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\theight={H}\n\t\t\t\t\t\tviewBox={`0 0 ${Math.max(W, totalWidth * scale)} ${H}`}\n\t\t\t\t\t\trole=\"img\"\n\t\t\t\t\t\taria-label=\"Memory additions over time\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{buckets.map((b, i) => {\n\t\t\t\t\t\t\tconst x = i * (BAR_W + GAP) * scale;\n\t\t\t\t\t\t\tconst h = Math.max(3, (b.count / max) * (H - 20));\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tkey={`${b.bucket}-${i}`}\n\t\t\t\t\t\t\t\t\tx={x}\n\t\t\t\t\t\t\t\t\ty={H - 6 - h}\n\t\t\t\t\t\t\t\t\twidth={Math.max(2, BAR_W * scale)}\n\t\t\t\t\t\t\t\t\theight={h}\n\t\t\t\t\t\t\t\t\trx={2}\n\t\t\t\t\t\t\t\t\tfill=\"hsl(var(--primary))\"\n\t\t\t\t\t\t\t\t\topacity={0.85}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<title>{`${fmtBucket(b.bucket)}: ${b.count}`}</title>\n\t\t\t\t\t\t\t\t</rect>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p className=\"mt-1 text-xs text-muted-foreground\">\n\t\t\t\t\t\tFirst display: {fmtBucket(buckets[0].bucket)} · last:\n\t\t\t\t\t\t{fmtBucket(buckets[buckets.length - 1].bucket)}\n\t\t\t\t\t</p>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab/WikiPage.tsx — single wiki topic page.\n *\n * Renders the extractive summary, key member memories, the member provenance\n * table (memory → session/assigned-at/method), related topics (resolved from\n * the wiki index), and the per-topic memory timeline. Mutations\n * (rename/merge/split) delegate to WikiPageControls; on mutation success the\n * page + index are refetched.\n *\n * Styling: Tailwind + shadcn (Card, Badge, Button) — no legacy CSS.\n */\n\nimport type React from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { fetchWikiTopic, fetchWikiIndex } from \"../../api/client\";\nimport type { WikiPageResponse, WikiIndexResponse } from \"@contracts\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { Card, CardContent } from \"../../components/ui/card\";\nimport WikiPageControls from \"./WikiPageControls\";\nimport TopicTimeline from \"./TopicTimeline\";\n\ninterface WikiPageProps {\n\ttopicId: string;\n\tonBack: () => void;\n}\n\nfunction fmtTs(ms: number): string {\n\tif (!ms) return \"—\";\n\treturn new Date(ms).toLocaleString();\n}\n\nconst METHOD_LABELS: Record<string, string> = {\n\t\"kmeans+tfidf\": \"kmeans\",\n\tmerge: \"merge\",\n\tsplit: \"split\",\n\tmanual: \"manual\",\n};\n\nexport default function WikiPage({\n\ttopicId,\n\tonBack,\n}: WikiPageProps): React.ReactElement {\n\tconst [dirty, setDirty] = useState(0);\n\tconst bump = useCallback(() => setDirty((d) => d + 1), []);\n\n\tconst { data: page, error, loading } = useApi<WikiPageResponse>(\n\t\tuseCallback(() => fetchWikiTopic(topicId), [topicId, dirty]),\n\t\t{},\n\t);\n\tconst { data: index } = useApi<WikiIndexResponse>(\n\t\tuseCallback(() => fetchWikiIndex(), []),\n\t\t{},\n\t);\n\n\tconst labelOf = useMemo(() => {\n\t\tconst map = new Map<string, string>();\n\t\tfor (const t of index?.topics ?? []) map.set(t.id, t.label);\n\t\treturn map;\n\t}, [index]);\n\n\tif (error && !page) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-danger\">\n\t\t\t\tError loading topic: {error.message}\n\t\t\t</div>\n\t\t);\n\t}\n\tif (loading && !page) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tLoading topic…\n\t\t\t</div>\n\t\t);\n\t}\n\tif (!page) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tNo topic data available.\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst otherTopics = (index?.topics ?? [])\n\t\t.filter((t) => t.id !== topicId)\n\t\t.map((t) => ({ id: t.id, label: t.label }));\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={onBack}>\n\t\t\t\t\t\t← Wiki\n\t\t\t\t\t</Button>\n\t\t\t\t\t<h2 className=\"font-heading text-lg font-semibold\">\n\t\t\t\t\t\t{page.topic.label}\n\t\t\t\t\t</h2>\n\t\t\t\t\t{page.topic.edited && <Badge variant=\"outline\">edited</Badge>}\n\t\t\t\t\t<Badge variant=\"default\">\n\t\t\t\t\t\t{page.provenance.length} memories\n\t\t\t\t\t</Badge>\n\t\t\t\t</div>\n\t\t\t\t<WikiPageControls\n\t\t\t\t\ttopicId={topicId}\n\t\t\t\t\tothers={otherTopics}\n\t\t\t\t\tmembers={page.provenance}\n\t\t\t\t\tonMutated={bump}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{page.summary && (\n\t\t\t\t<Card>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<h3 className=\"mb-1 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\t\t\tSummary\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<p className=\"text-sm leading-relaxed text-foreground/90\">\n\t\t\t\t\t\t\t{page.summary}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\n\t\t\t{page.keyMemories.length > 0 && (\n\t\t\t\t<Card>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\t\t\tKey memories\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t{page.keyMemories.map((m) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={m.memoryId}\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-md border border-border/60 bg-bg-elevated/40 p-3 text-sm\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p className=\"line-clamp-3 text-foreground/90\">{m.content}</p>\n\t\t\t\t\t\t\t\t\t<p className=\"mt-1 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{m.memoryId} · {fmtTs(m.timestamp)}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\n\t\t\t<TopicTimeline topicId={topicId} />\n\n\t\t\t{page.provenance.length > 0 && (\n\t\t\t\t<Card>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\t\t\tProvenance\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<div className=\"max-h-72 overflow-auto rounded-md border border-border/60\">\n\t\t\t\t\t\t\t<table className=\"w-full text-sm\">\n\t\t\t\t\t\t\t\t<thead className=\"sticky top-0 bg-bg-card\">\n\t\t\t\t\t\t\t\t\t<tr className=\"border-b border-border text-left text-xs uppercase text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t<th className=\"px-3 py-2 font-medium\">Memory</th>\n\t\t\t\t\t\t\t\t\t\t<th className=\"px-3 py-2 font-medium\">Session</th>\n\t\t\t\t\t\t\t\t\t\t<th className=\"px-3 py-2 font-medium\">Assigned</th>\n\t\t\t\t\t\t\t\t\t\t<th className=\"px-3 py-2 font-medium\">Method</th>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t{page.provenance.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\t\t\tkey={p.memoryId}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"border-b border-border/40 last:border-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<td className=\"px-3 py-1.5 font-mono text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t{p.memoryId}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{p.sessionId || \"unknown\"}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td className=\"px-3 py-1.5 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{fmtTs(p.assignedAt)}\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td className=\"px-3 py-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge variant=\"outline\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{METHOD_LABELS[p.method] ?? p.method}\n\t\t\t\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\n\t\t\t{page.relatedTopicIds.length > 0 && (\n\t\t\t\t<Card>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\t\t\tRelated topics\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t\t{page.relatedTopicIds.map((id) => (\n\t\t\t\t\t\t\t\t<Badge key={id} variant=\"accent\">\n\t\t\t\t\t\t\t\t\t{labelOf.get(id) ?? id}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab/TopicEvolutionGraph.tsx — D3 evolution.\n *\n * Force-directed graph of wiki topics over time. Nodes are topics (radius scales\n * with memoryCount); edges are merge/split curation events. A bucket scrubber\n * (from the response buckets) dims nodes that had no activity up to the selected\n * time window — a lightweight \"growth over time\" view.\n *\n * Self-contained force simulation (Coulomb repulsion + Hooke attraction +\n * center gravity) — the codebase deliberately avoids external graph libraries\n * (see memory-map-layout.ts). No data is fabricated: only real node/edge/bucket\n * fields from the contract are used. Styling is Tailwind.\n */\n\nimport type React from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { TopicEvolutionResponse } from \"@contracts\";\n\n// ── Simulation constants ────────────────────────────────────────────────\nconst W = 900;\nconst H = 560;\nconst REPULSION = 60_000;\nconst ATTRACTION = 0.012;\nconst CENTER_GRAVITY = 0.012;\nconst DAMPING = 0.8;\nconst SPEED_LIMIT = 2;\nconst MIN_VELOCITY = 0.02;\nconst MAX_ITERATIONS = 250;\n\ninterface SimNode {\n\tid: string;\n\tlabel: string;\n\tmemoryCount: number;\n\tpos: { x: number; y: number };\n\tvx: number;\n\tvy: number;\n}\n\ninterface SimEdge {\n\tsource: number;\n\ttarget: number;\n\tkind: \"merge\" | \"split\";\n}\n\nfunction edgeColor(kind: \"merge\" | \"split\"): string {\n\treturn kind === \"merge\" ? \"#f59e0b\" : \"#22c55e\"; // amber / green\n}\n\nfunction initialLayout(nodes: TopicEvolutionResponse[\"nodes\"]): SimNode[] {\n\treturn nodes.map((n, i) => {\n\t\tconst angle = (2 * Math.PI * i) / Math.max(nodes.length, 1);\n\t\treturn {\n\t\t\tid: n.id,\n\t\t\tlabel: n.label,\n\t\t\tmemoryCount: n.memoryCount,\n\t\t\tpos: { x: Math.cos(angle) * 220 + W / 2, y: Math.sin(angle) * 220 + H / 2 },\n\t\t\tvx: 0,\n\t\t\tvy: 0,\n\t\t};\n\t});\n}\n\nfunction applyForces(sim: { nodes: SimNode[]; edges: SimEdge[] }): void {\n\tconst { nodes, edges } = sim;\n\tfor (let i = 0; i < nodes.length; i++) {\n\t\tconst n = nodes[i];\n\t\tlet fx = 0;\n\t\tlet fy = 0;\n\t\tfor (let j = 0; j < nodes.length; j++) {\n\t\t\tif (i === j) continue;\n\t\t\tconst dx = n.pos.x - nodes[j].pos.x;\n\t\t\tconst dy = n.pos.y - nodes[j].pos.y;\n\t\t\tconst distSq = dx * dx + dy * dy || 1;\n\t\t\tconst dist = Math.sqrt(distSq);\n\t\t\tfx += (dx / dist) * (REPULSION / distSq);\n\t\t\tfy += (dy / dist) * (REPULSION / distSq);\n\t\t}\n\t\tfor (const e of edges) {\n\t\t\tlet other: number;\n\t\t\tif (e.source === i) other = e.target;\n\t\t\telse if (e.target === i) other = e.source;\n\t\t\telse continue;\n\t\t\tconst dx = nodes[other].pos.x - n.pos.x;\n\t\t\tconst dy = nodes[other].pos.y - n.pos.y;\n\t\t\tfx += dx * ATTRACTION;\n\t\t\tfy += dy * ATTRACTION;\n\t\t}\n\t\tfx -= n.pos.x * CENTER_GRAVITY;\n\t\tfy -= n.pos.y * CENTER_GRAVITY;\n\t\tn.vx = (n.vx + fx) * DAMPING;\n\t\tn.vy = (n.vy + fy) * DAMPING;\n\t\tconst speed = Math.sqrt(n.vx * n.vx + n.vy * n.vy);\n\t\tif (speed > SPEED_LIMIT) {\n\t\t\tn.vx = (n.vx / speed) * SPEED_LIMIT;\n\t\t\tn.vy = (n.vy / speed) * SPEED_LIMIT;\n\t\t}\n\t\tif (speed > MIN_VELOCITY) {\n\t\t\tn.pos.x += n.vx;\n\t\t\tn.pos.y += n.vy;\n\t\t}\n\t}\n}\n\ninterface Props {\n\tdata: TopicEvolutionResponse;\n}\n\nexport default function TopicEvolutionGraph({\n\tdata,\n}: Props): React.ReactElement {\n\tconst simRef = useRef<{\n\t\tnodes: SimNode[];\n\t\tedges: SimEdge[];\n\t\ttimeByActivity: Map<string, number> | null;\n\t} | null>(null);\n\tconst animRef = useRef(0);\n\tconst [, setFrame] = useState(0);\n\tconst [scrub, setScrub] = useState<number>(0);\n\n\t// Initialize simulation from data (re-run when data changes).\n\tuseEffect(() => {\n\t\tconst nodes = initialLayout(data.nodes);\n\t\tconst indexById = new Map(nodes.map((n, i) => [n.id, i]));\n\t\tconst edges: SimEdge[] = data.edges\n\t\t\t.map((e) => {\n\t\t\t\tconst si = indexById.get(e.source);\n\t\t\t\tconst ti = indexById.get(e.target);\n\t\t\t\tif (si === undefined || ti === undefined || si === ti) return null;\n\t\t\t\treturn { source: si, target: ti, kind: e.kind };\n\t\t\t})\n\t\t\t.filter((e): e is SimEdge => e !== null);\n\t\t// Latest activity per node (from merge/split edge timestamps).\n\t\tconst timeByActivity = new Map<string, number>();\n\t\tfor (const e of data.edges) {\n\t\t\ttimeByActivity.set(e.source, Math.max(timeByActivity.get(e.source) ?? 0, e.at));\n\t\t\ttimeByActivity.set(e.target, Math.max(timeByActivity.get(e.target) ?? 0, e.at));\n\t\t}\n\t\tsimRef.current = { nodes, edges, timeByActivity };\n\t\tsetFrame(1);\n\t\treturn () => cancelAnimationFrame(animRef.current);\n\t}, [data]);\n\n\t// Run the force simulation to stable layout.\n\tuseEffect(() => {\n\t\tif (!simRef.current) return;\n\t\tlet iter = 0;\n\t\tconst tick = () => {\n\t\t\tif (!simRef.current || iter >= MAX_ITERATIONS) return;\n\t\t\tapplyForces(simRef.current);\n\t\t\titer++;\n\t\t\tsetFrame(iter);\n\t\t\tanimRef.current = requestAnimationFrame(tick);\n\t\t};\n\t\tanimRef.current = requestAnimationFrame(tick);\n\t\treturn () => cancelAnimationFrame(animRef.current);\n\t}, [data]);\n\n\tconst sim = simRef.current;\n\n\tconst scrubMax = Math.max(data.buckets.length - 1, 0);\n\tconst scrubBucket = useMemo(() => {\n\t\tif (data.buckets.length === 0) return null;\n\t\tconst idx = Math.min(scrub, data.buckets.length - 1);\n\t\treturn data.buckets[idx].bucket;\n\t}, [scrub, data.buckets]);\n\n\tif (!sim || data.nodes.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tNo evolution data yet. Merge or split topics to see connections, then\n\t\t\t\tcheck back after a rebuild.\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst activeSet =\n\t\tscrubBucket == null || !sim.timeByActivity\n\t\t\t? null\n\t\t\t: new Set(\n\t\t\t\t\t[...sim.timeByActivity.entries()]\n\t\t\t\t\t\t.filter(([, t]) => t <= scrubBucket)\n\t\t\t\t\t\t.map(([id]) => id),\n\t\t\t\t);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t{/* Scrubber */}\n\t\t\t{data.buckets.length > 1 && (\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"range\"\n\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\tmax={scrubMax}\n\t\t\t\t\t\tvalue={scrub}\n\t\t\t\t\t\tonChange={(e) => setScrub(Number(e.target.value))}\n\t\t\t\t\t\tclassName=\"w-full accent-primary\"\n\t\t\t\t\t\taria-label=\"Scrub through topic activity time\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"whitespace-nowrap text-xs text-muted-foreground\">\n\t\t\t\t\t\t{scrubBucket ? new Date(scrubBucket).toLocaleDateString() : \"all\"}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* SVG graph */}\n\t\t\t<svg\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight={H}\n\t\t\t\tviewBox={`0 0 ${W} ${H}`}\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Topic evolution graph\"\n\t\t\t\tclassName=\"rounded-lg border border-border/60 bg-bg-card\"\n\t\t\t>\n\t\t\t\t{sim.edges.map((e, i) => {\n\t\t\t\t\tconst a = sim.nodes[e.source];\n\t\t\t\t\tconst b = sim.nodes[e.target];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<line\n\t\t\t\t\t\t\tkey={`edge-${i}`}\n\t\t\t\t\t\t\tx1={a.pos.x}\n\t\t\t\t\t\t\ty1={a.pos.y}\n\t\t\t\t\t\t\tx2={b.pos.x}\n\t\t\t\t\t\t\ty2={b.pos.y}\n\t\t\t\t\t\t\tstroke={edgeColor(e.kind)}\n\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\tstrokeDasharray={e.kind === \"split\" ? \"4 3\" : undefined}\n\t\t\t\t\t\t\topacity={0.5}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{sim.nodes.map((n, i) => {\n\t\t\t\t\tconst active =\n\t\t\t\t\t\tactiveSet == null || activeSet.size === 0 || activeSet.has(n.id);\n\t\t\t\t\tconst r = Math.min(32, 8 + n.memoryCount * 3);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<g key={`node-${i}`} opacity={active ? 1 : 0.15}>\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tcx={n.pos.x}\n\t\t\t\t\t\t\t\tcy={n.pos.y}\n\t\t\t\t\t\t\t\tr={r}\n\t\t\t\t\t\t\t\tfill=\"hsl(var(--primary) / 0.18)\"\n\t\t\t\t\t\t\t\tstroke=\"hsl(var(--primary))\"\n\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\tx={n.pos.x}\n\t\t\t\t\t\t\t\ty={n.pos.y + 4}\n\t\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\t\tfontSize=\"10px\"\n\t\t\t\t\t\t\t\tfill=\"hsl(var(--foreground))\"\n\t\t\t\t\t\t\t\tclassName=\"pointer-events-none\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{n.label.length > 16 ? n.label.slice(0, 15) + \"…\" : n.label}\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</svg>\n\n\t\t\t<div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t<span className=\"inline-block h-0.5 w-6 bg-amber-500\" /> merge\n\t\t\t\t</span>\n\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t<span className=\"inline-block h-0.5 w-6 border-t border-dashed border-green-500\" />\n\t\t\t\t\tsplit\n\t\t\t\t</span>\n\t\t\t\t<span>\n\t\t\t\t\t{data.nodes.length} nodes · {data.edges.length} curation events\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab/TopicEvolutionView.tsx — planet evolution.\n *\n * Thin shell over TopicEvolutionGraph: fetches GET /api/wiki/evolution via\n * useApi and refetches when a `wiki_rebuilt` SSE event lands (emitted by the\n * extension after a topic-model rebuild), so the graph + scrubber stay live\n * between polls. No data is fabricated — only the contract fields are used.\n *\n * Styling: Tailwind + shadcn (Card). No legacy CSS classes.\n */\n\nimport type React from \"react\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useSSE } from \"../../hooks/useSSE\";\nimport { fetchTopicEvolution } from \"../../api/client\";\nimport type { TopicEvolutionResponse, SseEvent } from \"@contracts\";\nimport { Card, CardContent } from \"../../components/ui/card\";\nimport TopicEvolutionGraph from \"./TopicEvolutionGraph\";\n\nfunction isWikiRebuilt(e: SseEvent): e is Extract<SseEvent, { type: \"wiki_rebuilt\" }> {\n\treturn e.type === \"wiki_rebuilt\";\n}\n\nexport default function TopicEvolutionView(): React.ReactElement {\n\tconst { data, error, loading, refetch } = useApi<TopicEvolutionResponse>(\n\t\tuseCallback(() => fetchTopicEvolution(), []),\n\t\t{ pollInterval: 60_000 },\n\t);\n\n\tconst { events } = useSSE();\n\tconst lastRebuiltTs = useMemo(() => {\n\t\tconst rebuilt = events.filter(isWikiRebuilt);\n\t\tif (rebuilt.length === 0) return null;\n\t\treturn rebuilt[rebuilt.length - 1].ts;\n\t}, [events]);\n\n\tuseEffect(() => {\n\t\tif (lastRebuiltTs != null) refetch();\n\t}, [lastRebuiltTs, refetch]);\n\n\tif (error && !data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-danger\">\n\t\t\t\tError loading evolution graph: {error.message}\n\t\t\t</div>\n\t\t);\n\t}\n\tif (loading && !data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tLoading evolution graph…\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Card>\n\t\t\t<CardContent>\n\t\t\t\t<h3 className=\"mb-2 font-heading text-sm font-semibold text-muted-foreground\">\n\t\t\t\t\tTopic evolution\n\t\t\t\t</h3>\n\t\t\t\t{data ? (\n\t\t\t\t\t<TopicEvolutionGraph data={data} />\n\t\t\t\t) : (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">No data yet.</p>\n\t\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/WikiTab.tsx — Wiki Revival (W3): wiki landing list.\n *\n * Replaces TopicsTab in the App registry (TopicsTab.tsx kept, unused). Renders\n * the wiki index: each auto-categorized topic with its resolved label (edited\n * badge when user-renamed), member count, curation badges (label/merge/split),\n * and a click-to-open that pushes a client-side page state to WikiPage.\n *\n * Styling is Tailwind + shadcn (Card, Badge, Button) — no legacy CSS classes.\n */\n\nimport type React from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useApi } from \"../hooks/useApi\";\nimport { fetchWikiIndex } from \"../api/client\";\nimport type { WikiIndexEntry, WikiIndexResponse } from \"@contracts\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Button } from \"../components/ui/button\";\nimport { Toggle } from \"../components/ui/toggle\";\nimport WikiPage from \"./WikiTab/WikiPage\";\nimport TopicEvolutionView from \"./WikiTab/TopicEvolutionView\";\n\ntype WikiView = \"list\" | \"evolution\";\n\nconst KIND_BADGES: Record<string, \"default\" | \"accent\" | \"warning\"> = {\n\tlabel: \"accent\",\n\tmerge: \"warning\",\n\tsplit: \"default\",\n};\n\nfunction fmtTs(ms: number | null): string {\n\tif (!ms) return \"—\";\n\treturn new Date(ms).toLocaleString();\n}\n\nfunction ViewToggle({\n\tview,\n\tonChange,\n}: {\n\tview: WikiView;\n\tonChange: (v: WikiView) => void;\n}): React.ReactElement {\n\treturn (\n\t\t<div className=\"flex gap-1\">\n\t\t\t<Toggle pressed={view === \"list\"} onClick={() => onChange(\"list\")}>\n\t\t\t\tTopics\n\t\t\t</Toggle>\n\t\t\t<Toggle\n\t\t\t\tpressed={view === \"evolution\"}\n\t\t\t\tonClick={() => onChange(\"evolution\")}\n\t\t\t>\n\t\t\t\tEvolution\n\t\t\t</Toggle>\n\t\t</div>\n\t);\n}\n\ninterface RowProps {\n\tentry: WikiIndexEntry;\n\tonOpen: (id: string) => void;\n}\n\nfunction TopicRow({ entry, onOpen }: RowProps): React.ReactElement {\n\treturn (\n\t\t<tr className=\"border-b border-border/60 last:border-0 hover:bg-bg-elevated/40\">\n\t\t\t<td className=\"py-2 pr-3\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<span className=\"font-medium text-foreground\">{entry.label}</span>\n\t\t\t\t\t{entry.edited && <Badge variant=\"outline\">edited</Badge>}\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td className=\"py-2 pr-3 text-sm text-muted-foreground\">\n\t\t\t\t{entry.memoryCount}\n\t\t\t</td>\n\t\t\t<td className=\"py-2 pr-3\">\n\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t{entry.overrideKinds.map((k) => (\n\t\t\t\t\t\t<Badge key={k} variant={KIND_BADGES[k] ?? \"default\"}>\n\t\t\t\t\t\t\t{k}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td className=\"py-2 pr-3 text-xs text-muted-foreground\">\n\t\t\t\t{fmtTs(entry.lastUpdated)}\n\t\t\t</td>\n\t\t\t<td className=\"py-2 text-right\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={() => onOpen(entry.id)}\n\t\t\t\t>\n\t\t\t\t\tOpen\n\t\t\t\t</Button>\n\t\t\t</td>\n\t\t</tr>\n\t);\n}\n\nexport default function WikiTab(): React.ReactElement {\n\tconst { data, loading, error } = useApi<WikiIndexResponse>(\n\t\tuseCallback(() => fetchWikiIndex(), []),\n\t\t{ pollInterval: 30_000 },\n\t);\n\tconst [view, setView] = useState<WikiView>(\"list\");\n\tconst [query, setQuery] = useState(\"\");\n\tconst [openId, setOpenId] = useState<string | null>(null);\n\n\tconst filtered = useMemo(() => {\n\t\tif (!data) return [];\n\t\tconst q = query.trim().toLowerCase();\n\t\tif (!q) return data.topics;\n\t\treturn data.topics.filter((t) =>\n\t\t\tt.label.toLowerCase().includes(q),\n\t\t);\n\t}, [data, query]);\n\n\tif (openId) {\n\t\treturn <WikiPage topicId={openId} onBack={() => setOpenId(null)} />;\n\t}\n\n\tif (view === \"evolution\") {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t<ViewToggle view={view} onChange={setView} />\n\t\t\t\t<TopicEvolutionView />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (error && !data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-danger\">\n\t\t\t\tError loading wiki: {error.message}\n\t\t\t</div>\n\t\t);\n\t}\n\tif (loading && !data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tLoading wiki…\n\t\t\t</div>\n\t\t);\n\t}\n\tif (!data) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\tNo wiki data available.\n\t\t\t</div>\n\t\t);\n\t}\n\tif (data.totalTopics === 0) {\n\t\treturn (\n\t\t\t<div className=\"rounded-lg border border-border bg-bg-card p-6 text-sm text-muted-foreground\">\n\t\t\t\t<h3 className=\"mb-2 font-heading text-base text-foreground\">Wiki</h3>\n\t\t\t\t<p>\n\t\t\t\t\tNo topics yet. Topics are auto-generated after every Nth compaction\n\t\t\t\t\tfrom real memory embeddings (k-means + TF-IDF).\n\t\t\t\t</p>\n\t\t\t\t<p className=\"mt-2\">Check back after a few more compaction cycles.</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-wrap items-end justify-between gap-2\">\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t<ViewToggle view={view} onChange={setView} />\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h2 className=\"font-heading text-lg font-semibold\">Wiki</h2>\n\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{data.totalTopics} topic{data.totalTopics !== 1 ? \"s\" : \"\"} ·{\" \"}\n\t\t\t\t\t\t\t{data.totalMemories} assigned memori\n\t\t\t\t\t\t\t{data.totalMemories !== 1 ? \"es\" : \"y\"}\n\t\t\t\t\t\t\t{data.lastRebuildAt != null && (\n\t\t\t\t\t\t\t\t<> · last rebuild {fmtTs(data.lastRebuildAt)}</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tplaceholder=\"Filter topics by label…\"\n\t\t\t\t\taria-label=\"Filter topics by label\"\n\t\t\t\t\tvalue={query}\n\t\t\t\t\tonChange={(e) => setQuery(e.target.value)}\n\t\t\t\t\tclassName=\"w-64 rounded-md border border-border bg-bg-elevated/50 px-3 py-2 text-sm outline-none transition-colors focus:border-primary\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"overflow-x-auto rounded-lg border border-border bg-bg-card\">\n\t\t\t\t<table className=\"w-full table-fixed text-sm\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr className=\"border-b border-border text-left text-xs uppercase text-muted-foreground\">\n\t\t\t\t\t\t\t<th className=\"w-1/3 px-4 py-2 font-medium\">Label</th>\n\t\t\t\t\t\t\t<th className=\"w-16 py-2 font-medium\">Memories</th>\n\t\t\t\t\t\t\t<th className=\"w-40 py-2 font-medium\">Badges</th>\n\t\t\t\t\t\t\t<th className=\"w-40 py-2 font-medium\">Last updated</th>\n\t\t\t\t\t\t\t<th className=\"w-20 py-2\" />\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{filtered.map((t) => (\n\t\t\t\t\t\t\t<TopicRow key={t.id} entry={t} onOpen={setOpenId} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\tcolSpan={5}\n\t\t\t\t\t\t\t\t\tclassName=\"px-4 py-6 text-center text-muted-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tNo topics match \"{query}\".\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"names":["memberSnippet","id","method","base","WikiPageControls","topicId","others","members","onMutated","mode","setMode","useState","label","setLabel","target","setTarget","picked","setPicked","busy","setBusy","error","setError","open","m","submit","renameTopic","mergeTopics","splitTopic","e","jsxs","Fragment","jsx","Button","o","prev","x","W","H","BAR_W","GAP","fmtBucket","ts","TopicTimeline","data","useApi","useCallback","fetchTopicTimeline","buckets","total","max","b","totalWidth","scale","i","h","fmtTs","ms","METHOD_LABELS","WikiPage","onBack","dirty","setDirty","bump","d","page","loading","fetchWikiTopic","index","fetchWikiIndex","labelOf","useMemo","map","t","otherTopics","Badge","Card","CardContent","p","REPULSION","ATTRACTION","CENTER_GRAVITY","DAMPING","SPEED_LIMIT","MIN_VELOCITY","MAX_ITERATIONS","edgeColor","kind","initialLayout","nodes","n","angle","applyForces","sim","edges","fx","fy","j","dx","dy","distSq","dist","other","speed","TopicEvolutionGraph","simRef","useRef","animRef","setFrame","scrub","setScrub","useEffect","indexById","si","ti","timeByActivity","iter","tick","scrubMax","scrubBucket","idx","activeSet","a","active","r","isWikiRebuilt","TopicEvolutionView","refetch","fetchTopicEvolution","events","useSSE","lastRebuiltTs","rebuilt","KIND_BADGES","ViewToggle","view","onChange","Toggle","TopicRow","entry","onOpen","k","WikiTab","setView","query","setQuery","openId","setOpenId","filtered","q"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as o,j as s,n as i,Y as d}from"./index-DY81TY4f.js";const l=d("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90 glow-primary",outline:"border border-border bg-transparent hover:bg-bg-elevated hover:text-foreground",ghost:"hover:bg-bg-elevated hover:text-foreground",glass:"glass-panel electric-hover"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),u=o.forwardRef(({className:e,variant:r,size:t,...a},n)=>s.jsx("button",{ref:n,className:i(l({variant:r,size:t,className:e})),...a}));u.displayName="Button";export{u as B};
|
|
2
|
+
//# sourceMappingURL=button-CFt3e0yc.js.map
|
package/extensions/dashboard-client/dist/assets/{button-5fSU8BZj.js.map → button-CFt3e0yc.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button-
|
|
1
|
+
{"version":3,"file":"button-CFt3e0yc.js","sources":["../../src/components/ui/button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90 glow-primary\",\n outline: \"border border-border bg-transparent hover:bg-bg-elevated hover:text-foreground\",\n ghost: \"hover:bg-bg-elevated hover:text-foreground\",\n glass: \"glass-panel electric-hover\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => (\n <button\n ref={ref}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n ),\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n"],"names":["buttonVariants","cva","Button","React.forwardRef","className","variant","size","props","ref","jsx","cn"],"mappings":"6DAIA,MAAMA,EAAiBC,EACrB,2SACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,sEACT,QAAS,iFACT,MAAO,6CACP,MAAO,4BAAA,EAET,KAAM,CACJ,QAAS,gBACT,GAAI,8BACJ,GAAI,uBACJ,KAAM,SAAA,CACR,EAEF,gBAAiB,CACf,QAAS,UACT,KAAM,SAAA,CACR,CAEJ,EAMMC,EAASC,EAAAA,WACb,CAAC,CAAE,UAAAC,EAAW,QAAAC,EAAS,KAAAC,EAAM,GAAGC,CAAA,EAASC,IACvCC,EAAAA,IAAC,SAAA,CACC,IAAAD,EACA,UAAWE,EAAGV,EAAe,CAAE,QAAAK,EAAS,KAAAC,EAAM,UAAAF,CAAA,CAAW,CAAC,EACzD,GAAGG,CAAA,CAAA,CAGV,EACAL,EAAO,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r,j as t,n as d}from"./index-
|
|
2
|
-
//# sourceMappingURL=card-
|
|
1
|
+
import{r,j as t,n as d}from"./index-DY81TY4f.js";const o=r.forwardRef(({className:a,...s},e)=>t.jsx("div",{ref:e,className:d("glass-panel p-4",a),...s}));o.displayName="Card";const n=r.forwardRef(({className:a,...s},e)=>t.jsx("div",{ref:e,className:d("mb-3 flex flex-col space-y-1.5",a),...s}));n.displayName="CardHeader";const l=r.forwardRef(({className:a,...s},e)=>t.jsx("h3",{ref:e,className:d("font-heading text-sm font-semibold leading-none tracking-tight",a),...s}));l.displayName="CardTitle";const i=r.forwardRef(({className:a,...s},e)=>t.jsx("div",{ref:e,className:d("text-sm",a),...s}));i.displayName="CardContent";export{o as C,n as a,l as b,i as c};
|
|
2
|
+
//# sourceMappingURL=card-C6ZjsHrl.js.map
|
package/extensions/dashboard-client/dist/assets/{card-BFUnpXE_.js.map → card-C6ZjsHrl.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-
|
|
1
|
+
{"version":3,"file":"card-C6ZjsHrl.js","sources":["../../src/components/ui/card.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"glass-panel p-4\", className)} {...props} />\n ),\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"mb-3 flex flex-col space-y-1.5\", className)} {...props} />\n ),\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn(\"font-heading text-sm font-semibold leading-none tracking-tight\", className)} {...props} />\n ),\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"text-sm\", className)} {...props} />\n ),\n);\nCardContent.displayName = \"CardContent\";\n\nexport { Card, CardHeader, CardTitle, CardContent };\n"],"names":["Card","React.forwardRef","className","props","ref","jsx","cn","CardHeader","CardTitle","CardContent"],"mappings":"iDAGA,MAAMA,EAAOC,EAAAA,WACX,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,MAAA,CAAI,IAAAD,EAAU,UAAWE,EAAG,kBAAmBJ,CAAS,EAAI,GAAGC,CAAA,CAAO,CAE3E,EACAH,EAAK,YAAc,OAEnB,MAAMO,EAAaN,EAAAA,WACjB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,MAAA,CAAI,IAAAD,EAAU,UAAWE,EAAG,iCAAkCJ,CAAS,EAAI,GAAGC,CAAA,CAAO,CAE1F,EACAI,EAAW,YAAc,aAEzB,MAAMC,EAAYP,EAAAA,WAChB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,KAAA,CAAG,IAAAD,EAAU,UAAWE,EAAG,iEAAkEJ,CAAS,EAAI,GAAGC,CAAA,CAAO,CAEzH,EACAK,EAAU,YAAc,YAExB,MAAMC,EAAcR,EAAAA,WAClB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,MAAA,CAAI,IAAAD,EAAU,UAAWE,EAAG,UAAWJ,CAAS,EAAI,GAAGC,CAAA,CAAO,CAEnE,EACAM,EAAY,YAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a0 as r,a1 as t,a2 as s,a3 as n}from"./index-DY81TY4f.js";function h(){return r(t.modelThresholds.path)}function i(e){return s(t.modelThresholds.path,e)}async function d(e){const o=await fetch(`${t.modelThresholds.path}/${encodeURIComponent(e)}`,{method:"DELETE"});if(!o.ok)throw new Error(`deleteModelThreshold ${o.status}`);return o.json()}function l(e=50){return r(`${t.prefixStability.path}?limit=${e}`)}function p(){return n(t.improveCortex.path,{confirm:!0})}function u(e){return r(t.improveCortexStatus.path.replace(":jobId",encodeURIComponent(e)))}export{l as a,u as b,d,h as f,p as i,i as p};
|
|
2
|
+
//# sourceMappingURL=client-extra-DdEdGTIe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-extra-DdEdGTIe.js","sources":["../../src/api/client-extra.ts"],"sourcesContent":["/**\n * dashboard-client/src/api/client-extra.ts — newer dashboard API wrappers.\n *\n * Extracted from client.ts (delegate-shell split) so client.ts stays under the\n * 400-line extension soft limit. Holds the newest endpoint groups: per-model\n * compaction thresholds (S52) and the PC-C prefix-stability trend. client.ts\n * re-exports these so downstream imports are unchanged.\n */\n\nimport { ENDPOINTS } from \"@contracts\";\nimport type {\n\tModelThresholdsResponse,\n\tModelThresholdPutRequest,\n\tModelThresholdPutResponse,\n\tPrefixStabilityResponse,\n\tCortexImproveStart,\n\tCortexImproveStatus,\n} from \"@contracts\";\nimport { getJson, postJson, putJson } from \"./client-http.js\";\n\n/** GET /api/model-thresholds — list known models with their thresholds. */\nexport function fetchModelThresholds(): Promise<ModelThresholdsResponse> {\n\treturn getJson<ModelThresholdsResponse>(ENDPOINTS.modelThresholds.path);\n}\n\n/** PUT /api/model-thresholds — upsert a per-model override. */\nexport function putModelThreshold(\n\tbody: ModelThresholdPutRequest,\n): Promise<ModelThresholdPutResponse> {\n\treturn putJson<ModelThresholdPutResponse>(\n\t\tENDPOINTS.modelThresholds.path,\n\t\tbody,\n\t);\n}\n\n/** DELETE /api/model-thresholds/:modelId — delete an override (revert). */\nexport async function deleteModelThreshold(\n\tmodelId: string,\n): Promise<{ deleted: boolean }> {\n\tconst res = await fetch(\n\t\t`${ENDPOINTS.modelThresholds.path}/${encodeURIComponent(modelId)}`,\n\t\t{ method: \"DELETE\" },\n\t);\n\tif (!res.ok) throw new Error(`deleteModelThreshold ${res.status}`);\n\treturn res.json() as Promise<{ deleted: boolean }>;\n}\n\n/** Prompt-cache per-turn stable-prefix ratio trend (PC-C). */\nexport function fetchPrefixStability(\n\tlimit = 50,\n): Promise<PrefixStabilityResponse> {\n\treturn getJson<PrefixStabilityResponse>(\n\t\t`${ENDPOINTS.prefixStability.path}?limit=${limit}`,\n\t);\n}\n\n/** Launch a local ML5-A improve job (POST /api/cortex/improve, ML5-D). */\nexport function improveCortex(): Promise<CortexImproveStart> {\n\treturn postJson<CortexImproveStart>(ENDPOINTS.improveCortex.path, {\n\t\tconfirm: true,\n\t});\n}\n\n/** Poll an improve job (GET /api/cortex/improve/status/:jobId, ML5-D). */\nexport function fetchCortexImproveStatus(\n\tjobId: string,\n): Promise<CortexImproveStatus> {\n\treturn getJson<CortexImproveStatus>(\n\t\tENDPOINTS.improveCortexStatus.path.replace(\":jobId\", encodeURIComponent(jobId)),\n\t);\n}\n"],"names":["fetchModelThresholds","getJson","ENDPOINTS","putModelThreshold","body","putJson","deleteModelThreshold","modelId","res","fetchPrefixStability","limit","improveCortex","postJson","fetchCortexImproveStatus","jobId"],"mappings":"iEAqBO,SAASA,GAAyD,CACxE,OAAOC,EAAiCC,EAAU,gBAAgB,IAAI,CACvE,CAGO,SAASC,EACfC,EACqC,CACrC,OAAOC,EACNH,EAAU,gBAAgB,KAC1BE,CAAA,CAEF,CAGA,eAAsBE,EACrBC,EACgC,CAChC,MAAMC,EAAM,MAAM,MACjB,GAAGN,EAAU,gBAAgB,IAAI,IAAI,mBAAmBK,CAAO,CAAC,GAChE,CAAE,OAAQ,QAAA,CAAS,EAEpB,GAAI,CAACC,EAAI,GAAI,MAAM,IAAI,MAAM,wBAAwBA,EAAI,MAAM,EAAE,EACjE,OAAOA,EAAI,KAAA,CACZ,CAGO,SAASC,EACfC,EAAQ,GAC2B,CACnC,OAAOT,EACN,GAAGC,EAAU,gBAAgB,IAAI,UAAUQ,CAAK,EAAA,CAElD,CAGO,SAASC,GAA6C,CAC5D,OAAOC,EAA6BV,EAAU,cAAc,KAAM,CACjE,QAAS,EAAA,CACT,CACF,CAGO,SAASW,EACfC,EAC+B,CAC/B,OAAOb,EACNC,EAAU,oBAAoB,KAAK,QAAQ,SAAU,mBAAmBY,CAAK,CAAC,CAAA,CAEhF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{D as ai,E as ue,r as L,A as ee,R as _}from"./index-DY81TY4f.js";var Ny=Array.isArray,ke=Ny,Ly=typeof ai=="object"&&ai&&ai.Object===Object&&ai,sp=Ly,By=sp,Ry=typeof self=="object"&&self&&self.Object===Object&&self,Fy=By||Ry||Function("return this")(),ct=Fy,Wy=ct,zy=Wy.Symbol,Xn=zy,xs=Xn,lp=Object.prototype,Uy=lp.hasOwnProperty,Hy=lp.toString,Yr=xs?xs.toStringTag:void 0;function Gy(e){var t=Uy.call(e,Yr),r=e[Yr];try{e[Yr]=void 0;var n=!0}catch{}var i=Hy.call(e);return n&&(t?e[Yr]=r:delete e[Yr]),i}var qy=Gy,Ky=Object.prototype,Xy=Ky.toString;function Vy(e){return Xy.call(e)}var Yy=Vy,ws=Xn,Zy=qy,Jy=Yy,Qy="[object Null]",em="[object Undefined]",Os=ws?ws.toStringTag:void 0;function tm(e){return e==null?e===void 0?em:Qy:Os&&Os in Object(e)?Zy(e):Jy(e)}var wt=tm;function rm(e){return e!=null&&typeof e=="object"}var Ot=rm,nm=wt,im=Ot,am="[object Symbol]";function om(e){return typeof e=="symbol"||im(e)&&nm(e)==am}var Lr=om,um=ke,cm=Lr,sm=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,lm=/^\w*$/;function fm(e,t){if(um(e))return!1;var r=typeof e;return r=="number"||r=="symbol"||r=="boolean"||e==null||cm(e)?!0:lm.test(e)||!sm.test(e)||t!=null&&e in Object(t)}var lc=fm;function hm(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var jt=hm;const Br=ue(jt);var pm=wt,dm=jt,vm="[object AsyncFunction]",ym="[object Function]",mm="[object GeneratorFunction]",gm="[object Proxy]";function bm(e){if(!dm(e))return!1;var t=pm(e);return t==ym||t==mm||t==vm||t==gm}var fc=bm;const Y=ue(fc);var xm=ct,wm=xm["__core-js_shared__"],Om=wm,so=Om,Ss=function(){var e=/[^.]+$/.exec(so&&so.keys&&so.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function Sm(e){return!!Ss&&Ss in e}var Am=Sm,_m=Function.prototype,Pm=_m.toString;function $m(e){if(e!=null){try{return Pm.call(e)}catch{}try{return e+""}catch{}}return""}var fp=$m,Tm=fc,Em=Am,jm=jt,Mm=fp,Cm=/[\\^$.*+?()[\]{}|]/g,Im=/^\[object .+?Constructor\]$/,Dm=Function.prototype,km=Object.prototype,Nm=Dm.toString,Lm=km.hasOwnProperty,Bm=RegExp("^"+Nm.call(Lm).replace(Cm,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function Rm(e){if(!jm(e)||Em(e))return!1;var t=Tm(e)?Bm:Im;return t.test(Mm(e))}var Fm=Rm;function Wm(e,t){return e?.[t]}var zm=Wm,Um=Fm,Hm=zm;function Gm(e,t){var r=Hm(e,t);return Um(r)?r:void 0}var Qt=Gm,qm=Qt,Km=qm(Object,"create"),wa=Km,As=wa;function Xm(){this.__data__=As?As(null):{},this.size=0}var Vm=Xm;function Ym(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var Zm=Ym,Jm=wa,Qm="__lodash_hash_undefined__",eg=Object.prototype,tg=eg.hasOwnProperty;function rg(e){var t=this.__data__;if(Jm){var r=t[e];return r===Qm?void 0:r}return tg.call(t,e)?t[e]:void 0}var ng=rg,ig=wa,ag=Object.prototype,og=ag.hasOwnProperty;function ug(e){var t=this.__data__;return ig?t[e]!==void 0:og.call(t,e)}var cg=ug,sg=wa,lg="__lodash_hash_undefined__";function fg(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=sg&&t===void 0?lg:t,this}var hg=fg,pg=Vm,dg=Zm,vg=ng,yg=cg,mg=hg;function Rr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Rr.prototype.clear=pg;Rr.prototype.delete=dg;Rr.prototype.get=vg;Rr.prototype.has=yg;Rr.prototype.set=mg;var gg=Rr;function bg(){this.__data__=[],this.size=0}var xg=bg;function wg(e,t){return e===t||e!==e&&t!==t}var hc=wg,Og=hc;function Sg(e,t){for(var r=e.length;r--;)if(Og(e[r][0],t))return r;return-1}var Oa=Sg,Ag=Oa,_g=Array.prototype,Pg=_g.splice;function $g(e){var t=this.__data__,r=Ag(t,e);if(r<0)return!1;var n=t.length-1;return r==n?t.pop():Pg.call(t,r,1),--this.size,!0}var Tg=$g,Eg=Oa;function jg(e){var t=this.__data__,r=Eg(t,e);return r<0?void 0:t[r][1]}var Mg=jg,Cg=Oa;function Ig(e){return Cg(this.__data__,e)>-1}var Dg=Ig,kg=Oa;function Ng(e,t){var r=this.__data__,n=kg(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}var Lg=Ng,Bg=xg,Rg=Tg,Fg=Mg,Wg=Dg,zg=Lg;function Fr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Fr.prototype.clear=Bg;Fr.prototype.delete=Rg;Fr.prototype.get=Fg;Fr.prototype.has=Wg;Fr.prototype.set=zg;var Sa=Fr,Ug=Qt,Hg=ct,Gg=Ug(Hg,"Map"),pc=Gg,_s=gg,qg=Sa,Kg=pc;function Xg(){this.size=0,this.__data__={hash:new _s,map:new(Kg||qg),string:new _s}}var Vg=Xg;function Yg(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var Zg=Yg,Jg=Zg;function Qg(e,t){var r=e.__data__;return Jg(t)?r[typeof t=="string"?"string":"hash"]:r.map}var Aa=Qg,eb=Aa;function tb(e){var t=eb(this,e).delete(e);return this.size-=t?1:0,t}var rb=tb,nb=Aa;function ib(e){return nb(this,e).get(e)}var ab=ib,ob=Aa;function ub(e){return ob(this,e).has(e)}var cb=ub,sb=Aa;function lb(e,t){var r=sb(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var fb=lb,hb=Vg,pb=rb,db=ab,vb=cb,yb=fb;function Wr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Wr.prototype.clear=hb;Wr.prototype.delete=pb;Wr.prototype.get=db;Wr.prototype.has=vb;Wr.prototype.set=yb;var dc=Wr,hp=dc,mb="Expected a function";function vc(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(mb);var r=function(){var n=arguments,i=t?t.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var o=e.apply(this,n);return r.cache=a.set(i,o)||a,o};return r.cache=new(vc.Cache||hp),r}vc.Cache=hp;var pp=vc;const gb=ue(pp);var bb=pp,xb=500;function wb(e){var t=bb(e,function(n){return r.size===xb&&r.clear(),n}),r=t.cache;return t}var Ob=wb,Sb=Ob,Ab=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,_b=/\\(\\)?/g,Pb=Sb(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(Ab,function(r,n,i,a){t.push(i?a.replace(_b,"$1"):n||r)}),t}),$b=Pb;function Tb(e,t){for(var r=-1,n=e==null?0:e.length,i=Array(n);++r<n;)i[r]=t(e[r],r,e);return i}var yc=Tb,Ps=Xn,Eb=yc,jb=ke,Mb=Lr,$s=Ps?Ps.prototype:void 0,Ts=$s?$s.toString:void 0;function dp(e){if(typeof e=="string")return e;if(jb(e))return Eb(e,dp)+"";if(Mb(e))return Ts?Ts.call(e):"";var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}var Cb=dp,Ib=Cb;function Db(e){return e==null?"":Ib(e)}var vp=Db,kb=ke,Nb=lc,Lb=$b,Bb=vp;function Rb(e,t){return kb(e)?e:Nb(e,t)?[e]:Lb(Bb(e))}var yp=Rb,Fb=Lr;function Wb(e){if(typeof e=="string"||Fb(e))return e;var t=e+"";return t=="0"&&1/e==-1/0?"-0":t}var _a=Wb,zb=yp,Ub=_a;function Hb(e,t){t=zb(t,e);for(var r=0,n=t.length;e!=null&&r<n;)e=e[Ub(t[r++])];return r&&r==n?e:void 0}var mc=Hb,Gb=mc;function qb(e,t,r){var n=e==null?void 0:Gb(e,t);return n===void 0?r:n}var mp=qb;const qe=ue(mp);function Kb(e){return e==null}var Xb=Kb;const Z=ue(Xb);var Vb=wt,Yb=ke,Zb=Ot,Jb="[object String]";function Qb(e){return typeof e=="string"||!Yb(e)&&Zb(e)&&Vb(e)==Jb}var e0=Qb;const Xt=ue(e0);var gp={exports:{}},ne={};/**
|
|
2
2
|
* @license React
|
|
3
3
|
* react-is.production.min.js
|
|
4
4
|
*
|
|
@@ -67,4 +67,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
67
67
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function DF(e,t){if(e){if(typeof e=="string")return ac(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return ac(e,t)}}function kF(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function NF(e){if(Array.isArray(e))return ac(e)}function ac(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var oc=function(t,r,n,i,a){var o=Ke(t,ds),u=Ke(t,io),c=[].concat(tp(o),tp(u)),s=Ke(t,oo),f="".concat(i,"Id"),l=i[0],h=r;if(c.length&&(h=c.reduce(function(v,d){if(d.props[f]===n&&ot(d.props,"extendDomain")&&B(d.props[l])){var b=d.props[l];return[Math.min(v[0],b),Math.max(v[1],b)]}return v},h)),s.length){var p="".concat(l,"1"),y="".concat(l,"2");h=s.reduce(function(v,d){if(d.props[f]===n&&ot(d.props,"extendDomain")&&B(d.props[p])&&B(d.props[y])){var b=d.props[p],x=d.props[y];return[Math.min(v[0],b,x),Math.max(v[1],b,x)]}return v},h)}return a&&a.length&&(h=a.reduce(function(v,d){return B(d)?[Math.min(v[0],d),Math.max(v[1],d)]:v},h)),h},Ty={exports:{}};(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function i(c,s,f){this.fn=c,this.context=s,this.once=f||!1}function a(c,s,f,l,h){if(typeof f!="function")throw new TypeError("The listener must be a function");var p=new i(f,l||c,h),y=r?r+s:s;return c._events[y]?c._events[y].fn?c._events[y]=[c._events[y],p]:c._events[y].push(p):(c._events[y]=p,c._eventsCount++),c}function o(c,s){--c._eventsCount===0?c._events=new n:delete c._events[s]}function u(){this._events=new n,this._eventsCount=0}u.prototype.eventNames=function(){var s=[],f,l;if(this._eventsCount===0)return s;for(l in f=this._events)t.call(f,l)&&s.push(r?l.slice(1):l);return Object.getOwnPropertySymbols?s.concat(Object.getOwnPropertySymbols(f)):s},u.prototype.listeners=function(s){var f=r?r+s:s,l=this._events[f];if(!l)return[];if(l.fn)return[l.fn];for(var h=0,p=l.length,y=new Array(p);h<p;h++)y[h]=l[h].fn;return y},u.prototype.listenerCount=function(s){var f=r?r+s:s,l=this._events[f];return l?l.fn?1:l.length:0},u.prototype.emit=function(s,f,l,h,p,y){var v=r?r+s:s;if(!this._events[v])return!1;var d=this._events[v],b=arguments.length,x,w;if(d.fn){switch(d.once&&this.removeListener(s,d.fn,void 0,!0),b){case 1:return d.fn.call(d.context),!0;case 2:return d.fn.call(d.context,f),!0;case 3:return d.fn.call(d.context,f,l),!0;case 4:return d.fn.call(d.context,f,l,h),!0;case 5:return d.fn.call(d.context,f,l,h,p),!0;case 6:return d.fn.call(d.context,f,l,h,p,y),!0}for(w=1,x=new Array(b-1);w<b;w++)x[w-1]=arguments[w];d.fn.apply(d.context,x)}else{var O=d.length,m;for(w=0;w<O;w++)switch(d[w].once&&this.removeListener(s,d[w].fn,void 0,!0),b){case 1:d[w].fn.call(d[w].context);break;case 2:d[w].fn.call(d[w].context,f);break;case 3:d[w].fn.call(d[w].context,f,l);break;case 4:d[w].fn.call(d[w].context,f,l,h);break;default:if(!x)for(m=1,x=new Array(b-1);m<b;m++)x[m-1]=arguments[m];d[w].fn.apply(d[w].context,x)}}return!0},u.prototype.on=function(s,f,l){return a(this,s,f,l,!1)},u.prototype.once=function(s,f,l){return a(this,s,f,l,!0)},u.prototype.removeListener=function(s,f,l,h){var p=r?r+s:s;if(!this._events[p])return this;if(!f)return o(this,p),this;var y=this._events[p];if(y.fn)y.fn===f&&(!h||y.once)&&(!l||y.context===l)&&o(this,p);else{for(var v=0,d=[],b=y.length;v<b;v++)(y[v].fn!==f||h&&!y[v].once||l&&y[v].context!==l)&&d.push(y[v]);d.length?this._events[p]=d.length===1?d[0]:d:o(this,p)}return this},u.prototype.removeAllListeners=function(s){var f;return s?(f=r?r+s:s,this._events[f]&&o(this,f)):(this._events=new n,this._eventsCount=0),this},u.prototype.off=u.prototype.removeListener,u.prototype.addListener=u.prototype.on,u.prefixed=r,u.EventEmitter=u,e.exports=u})(Ty);var LF=Ty.exports;const BF=ue(LF);var No=new BF,Lo="recharts.syncMouseEvents";function qn(e){"@babel/helpers - typeof";return qn=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},qn(e)}function RF(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function FF(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,Ey(n.key),n)}}function WF(e,t,r){return t&&FF(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function Bo(e,t,r){return t=Ey(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Ey(e){var t=zF(e,"string");return qn(t)=="symbol"?t:t+""}function zF(e,t){if(qn(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(qn(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}var UF=function(){function e(){RF(this,e),Bo(this,"activeIndex",0),Bo(this,"coordinateList",[]),Bo(this,"layout","horizontal")}return WF(e,[{key:"setDetails",value:function(r){var n,i=r.coordinateList,a=i===void 0?null:i,o=r.container,u=o===void 0?null:o,c=r.layout,s=c===void 0?null:c,f=r.offset,l=f===void 0?null:f,h=r.mouseHandlerCallback,p=h===void 0?null:h;this.coordinateList=(n=a??this.coordinateList)!==null&&n!==void 0?n:[],this.container=u??this.container,this.layout=s??this.layout,this.offset=l??this.offset,this.mouseHandlerCallback=p??this.mouseHandlerCallback,this.activeIndex=Math.min(Math.max(this.activeIndex,0),this.coordinateList.length-1)}},{key:"focus",value:function(){this.spoofMouse()}},{key:"keyboardEvent",value:function(r){if(this.coordinateList.length!==0)switch(r.key){case"ArrowRight":{if(this.layout!=="horizontal")return;this.activeIndex=Math.min(this.activeIndex+1,this.coordinateList.length-1),this.spoofMouse();break}case"ArrowLeft":{if(this.layout!=="horizontal")return;this.activeIndex=Math.max(this.activeIndex-1,0),this.spoofMouse();break}}}},{key:"setIndex",value:function(r){this.activeIndex=r}},{key:"spoofMouse",value:function(){var r,n;if(this.layout==="horizontal"&&this.coordinateList.length!==0){var i=this.container.getBoundingClientRect(),a=i.x,o=i.y,u=i.height,c=this.coordinateList[this.activeIndex].coordinate,s=((r=window)===null||r===void 0?void 0:r.scrollX)||0,f=((n=window)===null||n===void 0?void 0:n.scrollY)||0,l=a+c+s,h=o+this.offset.top+u/2+f;this.mouseHandlerCallback({pageX:l,pageY:h})}}}])}();function HF(e,t,r){if(r==="number"&&t===!0&&Array.isArray(e)){var n=e?.[0],i=e?.[1];if(n&&i&&B(n)&&B(i))return!0}return!1}function GF(e,t,r,n){var i=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-i:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-i,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}function jy(e){var t=e.cx,r=e.cy,n=e.radius,i=e.startAngle,a=e.endAngle,o=$e(t,r,n,i),u=$e(t,r,n,a);return{points:[o,u],cx:t,cy:r,radius:n,startAngle:i,endAngle:a}}function qF(e,t,r){var n,i,a,o;if(e==="horizontal")n=t.x,a=n,i=r.top,o=r.top+r.height;else if(e==="vertical")i=t.y,o=i,n=r.left,a=r.left+r.width;else if(t.cx!=null&&t.cy!=null)if(e==="centric"){var u=t.cx,c=t.cy,s=t.innerRadius,f=t.outerRadius,l=t.angle,h=$e(u,c,s,l),p=$e(u,c,f,l);n=h.x,i=h.y,a=p.x,o=p.y}else return jy(t);return[{x:n,y:i},{x:a,y:o}]}function Kn(e){"@babel/helpers - typeof";return Kn=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Kn(e)}function rp(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function gi(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?rp(Object(r),!0).forEach(function(n){KF(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):rp(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function KF(e,t,r){return t=XF(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function XF(e){var t=VF(e,"string");return Kn(t)=="symbol"?t:t+""}function VF(e,t){if(Kn(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(Kn(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function YF(e){var t,r,n=e.element,i=e.tooltipEventType,a=e.isActive,o=e.activeCoordinate,u=e.activePayload,c=e.offset,s=e.activeTooltipIndex,f=e.tooltipAxisBandSize,l=e.layout,h=e.chartName,p=(t=n.props.cursor)!==null&&t!==void 0?t:(r=n.type.defaultProps)===null||r===void 0?void 0:r.cursor;if(!n||!p||!a||!o||h!=="ScatterChart"&&i!=="axis")return null;var y,v=Mu;if(h==="ScatterChart")y=o,v=Vk;else if(h==="BarChart")y=GF(l,o,c,f),v=os;else if(l==="radial"){var d=jy(o),b=d.cx,x=d.cy,w=d.radius,O=d.startAngle,m=d.endAngle;y={cx:b,cy:x,startAngle:O,endAngle:m,innerRadius:w,outerRadius:w},v=Cv}else y={points:qF(l,o,c)},v=Mu;var g=gi(gi(gi(gi({stroke:"#ccc",pointerEvents:"none"},c),y),J(p,!1)),{},{payload:u,payloadIndex:s,className:ee("recharts-tooltip-cursor",p.className)});return L.isValidElement(p)?L.cloneElement(p,g):L.createElement(v,g)}var ZF=["item"],JF=["children","className","width","height","style","compact","title","desc"];function kr(e){"@babel/helpers - typeof";return kr=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},kr(e)}function lr(){return lr=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},lr.apply(this,arguments)}function np(e,t){return t3(e)||e3(e,t)||Cy(e,t)||QF()}function QF(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
68
68
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function e3(e,t){var r=e==null?null:typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(r!=null){var n,i,a,o,u=[],c=!0,s=!1;try{if(a=(r=r.call(e)).next,t!==0)for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==t);c=!0);}catch(f){s=!0,i=f}finally{try{if(!c&&r.return!=null&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw i}}return u}}function t3(e){if(Array.isArray(e))return e}function ip(e,t){if(e==null)return{};var r=r3(e,t),n,i;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)n=a[i],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function r3(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function n3(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i3(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,Iy(n.key),n)}}function a3(e,t,r){return t&&i3(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function o3(e,t,r){return t=xa(t),u3(e,My()?Reflect.construct(t,r||[],xa(e).constructor):t.apply(e,r))}function u3(e,t){if(t&&(kr(t)==="object"||typeof t=="function"))return t;if(t!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return c3(e)}function c3(e){if(e===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function My(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(My=function(){return!!e})()}function xa(e){return xa=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(r){return r.__proto__||Object.getPrototypeOf(r)},xa(e)}function s3(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&uc(e,t)}function uc(e,t){return uc=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,i){return n.__proto__=i,n},uc(e,t)}function Nr(e){return h3(e)||f3(e)||Cy(e)||l3()}function l3(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
|
|
69
69
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Cy(e,t){if(e){if(typeof e=="string")return cc(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return cc(e,t)}}function f3(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function h3(e){if(Array.isArray(e))return cc(e)}function cc(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function ap(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function E(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?ap(Object(r),!0).forEach(function(n){G(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ap(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function G(e,t,r){return t=Iy(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Iy(e){var t=p3(e,"string");return kr(t)=="symbol"?t:t+""}function p3(e,t){if(kr(e)!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(kr(n)!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var d3={xAxis:["bottom","top"],yAxis:["left","right"]},v3={width:"100%",height:"100%"},Dy={x:0,y:0};function bi(e){return e}var y3=function(t,r){return r==="horizontal"?t.x:r==="vertical"?t.y:r==="centric"?t.angle:t.radius},m3=function(t,r,n,i){var a=r.find(function(f){return f&&f.index===n});if(a){if(t==="horizontal")return{x:a.coordinate,y:i.y};if(t==="vertical")return{x:i.x,y:a.coordinate};if(t==="centric"){var o=a.coordinate,u=i.radius;return E(E(E({},i),$e(i.cx,i.cy,u,o)),{},{angle:o,radius:u})}var c=a.coordinate,s=i.angle;return E(E(E({},i),$e(i.cx,i.cy,c,s)),{},{angle:s,radius:c})}return Dy},uo=function(t,r){var n=r.graphicalItems,i=r.dataStartIndex,a=r.dataEndIndex,o=(n??[]).reduce(function(u,c){var s=c.props.data;return s&&s.length?[].concat(Nr(u),Nr(s)):u},[]);return o.length>0?o:t&&t.length&&B(i)&&B(a)?t.slice(i,a+1):[]};function ky(e){return e==="number"?[0,"auto"]:void 0}var sc=function(t,r,n,i){var a=t.graphicalItems,o=t.tooltipAxis,u=uo(r,t);return n<0||!a||!a.length||n>=u.length?null:a.reduce(function(c,s){var f,l=(f=s.props.data)!==null&&f!==void 0?f:r;l&&t.dataStartIndex+t.dataEndIndex!==0&&t.dataEndIndex-t.dataStartIndex>=n&&(l=l.slice(t.dataStartIndex,t.dataEndIndex+1));var h;if(o.dataKey&&!o.allowDuplicatedCategory){var p=l===void 0?u:l;h=xi(p,o.dataKey,i)}else h=l&&l[n]||u[n];return h?[].concat(Nr(c),[Ev(s,h)]):c},[])},op=function(t,r,n,i){var a=i||{x:t.chartX,y:t.chartY},o=y3(a,n),u=t.orderedTooltipTicks,c=t.tooltipAxis,s=t.tooltipTicks,f=$I(o,u,s,c);if(f>=0&&s){var l=s[f]&&s[f].value,h=sc(t,r,f,l),p=m3(n,u,f,a);return{activeTooltipIndex:f,activeLabel:l,activePayload:h,activeCoordinate:p}}return null},g3=function(t,r){var n=r.axes,i=r.graphicalItems,a=r.axisType,o=r.axisIdKey,u=r.stackGroups,c=r.dataStartIndex,s=r.dataEndIndex,f=t.layout,l=t.children,h=t.stackOffset,p=Pv(f,a);return n.reduce(function(y,v){var d,b=v.type.defaultProps!==void 0?E(E({},v.type.defaultProps),v.props):v.props,x=b.type,w=b.dataKey,O=b.allowDataOverflow,m=b.allowDuplicatedCategory,g=b.scale,S=b.ticks,A=b.includeHidden,P=b[o];if(y[P])return y;var C=uo(t.data,{graphicalItems:i.filter(function(z){var K,ce=o in z.props?z.props[o]:(K=z.type.defaultProps)===null||K===void 0?void 0:K[o];return ce===P}),dataStartIndex:c,dataEndIndex:s}),T=C.length,$,D,M;HF(b.domain,O,x)&&($=Pu(b.domain,null,O),p&&(x==="number"||g!=="auto")&&(M=ln(C,w,"category")));var j=ky(x);if(!$||$.length===0){var I,k=(I=b.domain)!==null&&I!==void 0?I:j;if(w){if($=ln(C,w,x),x==="category"&&p){var R=d0($);m&&R?(D=$,$=ua(0,T)):m||($=Wf(k,$,v).reduce(function(z,K){return z.indexOf(K)>=0?z:[].concat(Nr(z),[K])},[]))}else if(x==="category")m?$=$.filter(function(z){return z!==""&&!Z(z)}):$=Wf(k,$,v).reduce(function(z,K){return z.indexOf(K)>=0||K===""||Z(K)?z:[].concat(Nr(z),[K])},[]);else if(x==="number"){var F=CI(C,i.filter(function(z){var K,ce,ve=o in z.props?z.props[o]:(K=z.type.defaultProps)===null||K===void 0?void 0:K[o],Ne="hide"in z.props?z.props.hide:(ce=z.type.defaultProps)===null||ce===void 0?void 0:ce.hide;return ve===P&&(A||!Ne)}),w,a,f);F&&($=F)}p&&(x==="number"||g!=="auto")&&(M=ln(C,w,"category"))}else p?$=ua(0,T):u&&u[P]&&u[P].hasStack&&x==="number"?$=h==="expand"?[0,1]:Tv(u[P].stackGroups,c,s):$=_v(C,i.filter(function(z){var K=o in z.props?z.props[o]:z.type.defaultProps[o],ce="hide"in z.props?z.props.hide:z.type.defaultProps.hide;return K===P&&(A||!ce)}),x,f,!0);if(x==="number")$=oc(l,$,P,a,S),k&&($=Pu(k,$,O));else if(x==="category"&&k){var H=k,q=$.every(function(z){return H.indexOf(z)>=0});q&&($=H)}}return E(E({},y),{},G({},P,E(E({},b),{},{axisType:a,domain:$,categoricalDomain:M,duplicateDomain:D,originalDomain:(d=b.domain)!==null&&d!==void 0?d:j,isCategorical:p,layout:f})))},{})},b3=function(t,r){var n=r.graphicalItems,i=r.Axis,a=r.axisType,o=r.axisIdKey,u=r.stackGroups,c=r.dataStartIndex,s=r.dataEndIndex,f=t.layout,l=t.children,h=uo(t.data,{graphicalItems:n,dataStartIndex:c,dataEndIndex:s}),p=h.length,y=Pv(f,a),v=-1;return n.reduce(function(d,b){var x=b.type.defaultProps!==void 0?E(E({},b.type.defaultProps),b.props):b.props,w=x[o],O=ky("number");if(!d[w]){v++;var m;return y?m=ua(0,p):u&&u[w]&&u[w].hasStack?(m=Tv(u[w].stackGroups,c,s),m=oc(l,m,w,a)):(m=Pu(O,_v(h,n.filter(function(g){var S,A,P=o in g.props?g.props[o]:(S=g.type.defaultProps)===null||S===void 0?void 0:S[o],C="hide"in g.props?g.props.hide:(A=g.type.defaultProps)===null||A===void 0?void 0:A.hide;return P===w&&!C}),"number",f),i.defaultProps.allowDataOverflow),m=oc(l,m,w,a)),E(E({},d),{},G({},w,E(E({axisType:a},i.defaultProps),{},{hide:!0,orientation:qe(d3,"".concat(a,".").concat(v%2),null),domain:m,originalDomain:O,isCategorical:y,layout:f})))}return d},{})},x3=function(t,r){var n=r.axisType,i=n===void 0?"xAxis":n,a=r.AxisComp,o=r.graphicalItems,u=r.stackGroups,c=r.dataStartIndex,s=r.dataEndIndex,f=t.children,l="".concat(i,"Id"),h=Ke(f,a),p={};return h&&h.length?p=g3(t,{axes:h,graphicalItems:o,axisType:i,axisIdKey:l,stackGroups:u,dataStartIndex:c,dataEndIndex:s}):o&&o.length&&(p=b3(t,{Axis:a,graphicalItems:o,axisType:i,axisIdKey:l,stackGroups:u,dataStartIndex:c,dataEndIndex:s})),p},w3=function(t){var r=Pt(t),n=pt(r,!1,!0);return{tooltipTicks:n,orderedTooltipTicks:Ic(n,function(i){return i.coordinate}),tooltipAxis:r,tooltipAxisBandSize:Zi(r,n)}},up=function(t){var r=t.children,n=t.defaultShowTooltip,i=Re(r,Pr),a=0,o=0;return t.data&&t.data.length!==0&&(o=t.data.length-1),i&&i.props&&(i.props.startIndex>=0&&(a=i.props.startIndex),i.props.endIndex>=0&&(o=i.props.endIndex)),{chartX:0,chartY:0,dataStartIndex:a,dataEndIndex:o,activeTooltipIndex:-1,isTooltipActive:!!n}},O3=function(t){return!t||!t.length?!1:t.some(function(r){var n=dt(r&&r.type);return n&&n.indexOf("Bar")>=0})},cp=function(t){return t==="horizontal"?{numericAxisName:"yAxis",cateAxisName:"xAxis"}:t==="vertical"?{numericAxisName:"xAxis",cateAxisName:"yAxis"}:t==="centric"?{numericAxisName:"radiusAxis",cateAxisName:"angleAxis"}:{numericAxisName:"angleAxis",cateAxisName:"radiusAxis"}},S3=function(t,r){var n=t.props,i=t.graphicalItems,a=t.xAxisMap,o=a===void 0?{}:a,u=t.yAxisMap,c=u===void 0?{}:u,s=n.width,f=n.height,l=n.children,h=n.margin||{},p=Re(l,Pr),y=Re(l,hr),v=Object.keys(c).reduce(function(m,g){var S=c[g],A=S.orientation;return!S.mirror&&!S.hide?E(E({},m),{},G({},A,m[A]+S.width)):m},{left:h.left||0,right:h.right||0}),d=Object.keys(o).reduce(function(m,g){var S=o[g],A=S.orientation;return!S.mirror&&!S.hide?E(E({},m),{},G({},A,qe(m,"".concat(A))+S.height)):m},{top:h.top||0,bottom:h.bottom||0}),b=E(E({},d),v),x=b.bottom;p&&(b.bottom+=p.props.height||Pr.defaultProps.height),y&&r&&(b=jI(b,i,n,r));var w=s-b.left-b.right,O=f-b.top-b.bottom;return E(E({brushBottom:x},b),{},{width:Math.max(w,0),height:Math.max(O,0)})},A3=function(t,r){if(r==="xAxis")return t[r].width;if(r==="yAxis")return t[r].height},T3=function(t){var r=t.chartName,n=t.GraphicalChild,i=t.defaultTooltipEventType,a=i===void 0?"axis":i,o=t.validateTooltipEventTypes,u=o===void 0?["axis"]:o,c=t.axisComponents,s=t.legendContent,f=t.formatAxisMap,l=t.defaultProps,h=function(b,x){var w=x.graphicalItems,O=x.stackGroups,m=x.offset,g=x.updateId,S=x.dataStartIndex,A=x.dataEndIndex,P=b.barSize,C=b.layout,T=b.barGap,$=b.barCategoryGap,D=b.maxBarSize,M=cp(C),j=M.numericAxisName,I=M.cateAxisName,k=O3(w),R=[];return w.forEach(function(F,H){var q=uo(b.data,{graphicalItems:[F],dataStartIndex:S,dataEndIndex:A}),z=F.type.defaultProps!==void 0?E(E({},F.type.defaultProps),F.props):F.props,K=z.dataKey,ce=z.maxBarSize,ve=z["".concat(j,"Id")],Ne=z["".concat(I,"Id")],kt={},Ce=c.reduce(function(Nt,Lt){var co=x["".concat(Lt.axisType,"Map")],gs=z["".concat(Lt.axisType,"Id")];co&&co[gs]||Lt.axisType==="zAxis"||Zt();var bs=co[gs];return E(E({},Nt),{},G(G({},Lt.axisType,bs),"".concat(Lt.axisType,"Ticks"),pt(bs)))},kt),W=Ce[I],X=Ce["".concat(I,"Ticks")],V=O&&O[ve]&&O[ve].hasStack&&HI(F,O[ve].stackGroups),N=dt(F.type).indexOf("Bar")>=0,he=Zi(W,X),Q=[],ge=k&&TI({barSize:P,stackGroups:O,totalSize:A3(Ce,I)});if(N){var be,Ie,At=Z(ce)?D:ce,nr=(be=(Ie=Zi(W,X,!0))!==null&&Ie!==void 0?Ie:At)!==null&&be!==void 0?be:0;Q=EI({barGap:T,barCategoryGap:$,bandSize:nr!==he?nr:he,sizeList:ge[Ne],maxBarSize:At}),nr!==he&&(Q=Q.map(function(Nt){return E(E({},Nt),{},{position:E(E({},Nt.position),{},{offset:Nt.position.offset-nr/2})})}))}var ii=F&&F.type&&F.type.getComposedData;ii&&R.push({props:E(E({},ii(E(E({},Ce),{},{displayedData:q,props:b,dataKey:K,item:F,bandSize:he,barPosition:Q,offset:m,stackedData:V,layout:C,dataStartIndex:S,dataEndIndex:A}))),{},G(G(G({key:F.key||"item-".concat(H)},j,Ce[j]),I,Ce[I]),"animationId",g)),childIndex:$0(F,b.children),item:F})}),R},p=function(b,x){var w=b.props,O=b.dataStartIndex,m=b.dataEndIndex,g=b.updateId;if(!Is({props:w}))return null;var S=w.children,A=w.layout,P=w.stackOffset,C=w.data,T=w.reverseStackOrder,$=cp(A),D=$.numericAxisName,M=$.cateAxisName,j=Ke(S,n),I=WI(C,j,"".concat(D,"Id"),"".concat(M,"Id"),P,T),k=c.reduce(function(z,K){var ce="".concat(K.axisType,"Map");return E(E({},z),{},G({},ce,x3(w,E(E({},K),{},{graphicalItems:j,stackGroups:K.axisType===D&&I,dataStartIndex:O,dataEndIndex:m}))))},{}),R=S3(E(E({},k),{},{props:w,graphicalItems:j}),x?.legendBBox);Object.keys(k).forEach(function(z){k[z]=f(w,k[z],R,z.replace("Map",""),r)});var F=k["".concat(M,"Map")],H=w3(F),q=h(w,E(E({},k),{},{dataStartIndex:O,dataEndIndex:m,updateId:g,graphicalItems:j,stackGroups:I,offset:R}));return E(E({formattedGraphicalItems:q,graphicalItems:j,offset:R,stackGroups:I},H),k)},y=function(d){function b(x){var w,O,m;return n3(this,b),m=o3(this,b,[x]),G(m,"eventEmitterSymbol",Symbol("rechartsEventEmitter")),G(m,"accessibilityManager",new UF),G(m,"handleLegendBBoxUpdate",function(g){if(g){var S=m.state,A=S.dataStartIndex,P=S.dataEndIndex,C=S.updateId;m.setState(E({legendBBox:g},p({props:m.props,dataStartIndex:A,dataEndIndex:P,updateId:C},E(E({},m.state),{},{legendBBox:g}))))}}),G(m,"handleReceiveSyncEvent",function(g,S,A){if(m.props.syncId===g){if(A===m.eventEmitterSymbol&&typeof m.props.syncMethod!="function")return;m.applySyncEvent(S)}}),G(m,"handleBrushChange",function(g){var S=g.startIndex,A=g.endIndex;if(S!==m.state.dataStartIndex||A!==m.state.dataEndIndex){var P=m.state.updateId;m.setState(function(){return E({dataStartIndex:S,dataEndIndex:A},p({props:m.props,dataStartIndex:S,dataEndIndex:A,updateId:P},m.state))}),m.triggerSyncEvent({dataStartIndex:S,dataEndIndex:A})}}),G(m,"handleMouseEnter",function(g){var S=m.getMouseInfo(g);if(S){var A=E(E({},S),{},{isTooltipActive:!0});m.setState(A),m.triggerSyncEvent(A);var P=m.props.onMouseEnter;Y(P)&&P(A,g)}}),G(m,"triggeredAfterMouseMove",function(g){var S=m.getMouseInfo(g),A=S?E(E({},S),{},{isTooltipActive:!0}):{isTooltipActive:!1};m.setState(A),m.triggerSyncEvent(A);var P=m.props.onMouseMove;Y(P)&&P(A,g)}),G(m,"handleItemMouseEnter",function(g){m.setState(function(){return{isTooltipActive:!0,activeItem:g,activePayload:g.tooltipPayload,activeCoordinate:g.tooltipPosition||{x:g.cx,y:g.cy}}})}),G(m,"handleItemMouseLeave",function(){m.setState(function(){return{isTooltipActive:!1}})}),G(m,"handleMouseMove",function(g){g.persist(),m.throttleTriggeredAfterMouseMove(g)}),G(m,"handleMouseLeave",function(g){m.throttleTriggeredAfterMouseMove.cancel();var S={isTooltipActive:!1};m.setState(S),m.triggerSyncEvent(S);var A=m.props.onMouseLeave;Y(A)&&A(S,g)}),G(m,"handleOuterEvent",function(g){var S=P0(g),A=qe(m.props,"".concat(S));if(S&&Y(A)){var P,C;/.*touch.*/i.test(S)?C=m.getMouseInfo(g.changedTouches[0]):C=m.getMouseInfo(g),A((P=C)!==null&&P!==void 0?P:{},g)}}),G(m,"handleClick",function(g){var S=m.getMouseInfo(g);if(S){var A=E(E({},S),{},{isTooltipActive:!0});m.setState(A),m.triggerSyncEvent(A);var P=m.props.onClick;Y(P)&&P(A,g)}}),G(m,"handleMouseDown",function(g){var S=m.props.onMouseDown;if(Y(S)){var A=m.getMouseInfo(g);S(A,g)}}),G(m,"handleMouseUp",function(g){var S=m.props.onMouseUp;if(Y(S)){var A=m.getMouseInfo(g);S(A,g)}}),G(m,"handleTouchMove",function(g){g.changedTouches!=null&&g.changedTouches.length>0&&m.throttleTriggeredAfterMouseMove(g.changedTouches[0])}),G(m,"handleTouchStart",function(g){g.changedTouches!=null&&g.changedTouches.length>0&&m.handleMouseDown(g.changedTouches[0])}),G(m,"handleTouchEnd",function(g){g.changedTouches!=null&&g.changedTouches.length>0&&m.handleMouseUp(g.changedTouches[0])}),G(m,"handleDoubleClick",function(g){var S=m.props.onDoubleClick;if(Y(S)){var A=m.getMouseInfo(g);S(A,g)}}),G(m,"handleContextMenu",function(g){var S=m.props.onContextMenu;if(Y(S)){var A=m.getMouseInfo(g);S(A,g)}}),G(m,"triggerSyncEvent",function(g){m.props.syncId!==void 0&&No.emit(Lo,m.props.syncId,g,m.eventEmitterSymbol)}),G(m,"applySyncEvent",function(g){var S=m.props,A=S.layout,P=S.syncMethod,C=m.state.updateId,T=g.dataStartIndex,$=g.dataEndIndex;if(g.dataStartIndex!==void 0||g.dataEndIndex!==void 0)m.setState(E({dataStartIndex:T,dataEndIndex:$},p({props:m.props,dataStartIndex:T,dataEndIndex:$,updateId:C},m.state)));else if(g.activeTooltipIndex!==void 0){var D=g.chartX,M=g.chartY,j=g.activeTooltipIndex,I=m.state,k=I.offset,R=I.tooltipTicks;if(!k)return;if(typeof P=="function")j=P(R,g);else if(P==="value"){j=-1;for(var F=0;F<R.length;F++)if(R[F].value===g.activeLabel){j=F;break}}var H=E(E({},k),{},{x:k.left,y:k.top}),q=Math.min(D,H.x+H.width),z=Math.min(M,H.y+H.height),K=R[j]&&R[j].value,ce=sc(m.state,m.props.data,j),ve=R[j]?{x:A==="horizontal"?R[j].coordinate:q,y:A==="horizontal"?z:R[j].coordinate}:Dy;m.setState(E(E({},g),{},{activeLabel:K,activeCoordinate:ve,activePayload:ce,activeTooltipIndex:j}))}else m.setState(g)}),G(m,"renderCursor",function(g){var S,A=m.state,P=A.isTooltipActive,C=A.activeCoordinate,T=A.activePayload,$=A.offset,D=A.activeTooltipIndex,M=A.tooltipAxisBandSize,j=m.getTooltipEventType(),I=(S=g.props.active)!==null&&S!==void 0?S:P,k=m.props.layout,R=g.key||"_recharts-cursor";return _.createElement(YF,{key:R,activeCoordinate:C,activePayload:T,activeTooltipIndex:D,chartName:r,element:g,isActive:I,layout:k,offset:$,tooltipAxisBandSize:M,tooltipEventType:j})}),G(m,"renderPolarAxis",function(g,S,A){var P=qe(g,"type.axisType"),C=qe(m.state,"".concat(P,"Map")),T=g.type.defaultProps,$=T!==void 0?E(E({},T),g.props):g.props,D=C&&C[$["".concat(P,"Id")]];return L.cloneElement(g,E(E({},D),{},{className:ee(P,D.className),key:g.key||"".concat(S,"-").concat(A),ticks:pt(D,!0)}))}),G(m,"renderPolarGrid",function(g){var S=g.props,A=S.radialLines,P=S.polarAngles,C=S.polarRadius,T=m.state,$=T.radiusAxisMap,D=T.angleAxisMap,M=Pt($),j=Pt(D),I=j.cx,k=j.cy,R=j.innerRadius,F=j.outerRadius;return L.cloneElement(g,{polarAngles:Array.isArray(P)?P:pt(j,!0).map(function(H){return H.coordinate}),polarRadius:Array.isArray(C)?C:pt(M,!0).map(function(H){return H.coordinate}),cx:I,cy:k,innerRadius:R,outerRadius:F,key:g.key||"polar-grid",radialLines:A})}),G(m,"renderLegend",function(){var g=m.state.formattedGraphicalItems,S=m.props,A=S.children,P=S.width,C=S.height,T=m.props.margin||{},$=P-(T.left||0)-(T.right||0),D=Sv({children:A,formattedGraphicalItems:g,legendWidth:$,legendContent:s});if(!D)return null;var M=D.item,j=ip(D,ZF);return L.cloneElement(M,E(E({},j),{},{chartWidth:P,chartHeight:C,margin:T,onBBoxUpdate:m.handleLegendBBoxUpdate}))}),G(m,"renderTooltip",function(){var g,S=m.props,A=S.children,P=S.accessibilityLayer,C=Re(A,lt);if(!C)return null;var T=m.state,$=T.isTooltipActive,D=T.activeCoordinate,M=T.activePayload,j=T.activeLabel,I=T.offset,k=(g=C.props.active)!==null&&g!==void 0?g:$;return L.cloneElement(C,{viewBox:E(E({},I),{},{x:I.left,y:I.top}),active:k,label:j,payload:k?M:[],coordinate:D,accessibilityLayer:P})}),G(m,"renderBrush",function(g){var S=m.props,A=S.margin,P=S.data,C=m.state,T=C.offset,$=C.dataStartIndex,D=C.dataEndIndex,M=C.updateId;return L.cloneElement(g,{key:g.key||"_recharts-brush",onChange:di(m.handleBrushChange,g.props.onChange),data:P,x:B(g.props.x)?g.props.x:T.left,y:B(g.props.y)?g.props.y:T.top+T.height+T.brushBottom-(A.bottom||0),width:B(g.props.width)?g.props.width:T.width,startIndex:$,endIndex:D,updateId:"brush-".concat(M)})}),G(m,"renderReferenceElement",function(g,S,A){if(!g)return null;var P=m,C=P.clipPathId,T=m.state,$=T.xAxisMap,D=T.yAxisMap,M=T.offset,j=g.type.defaultProps||{},I=g.props,k=I.xAxisId,R=k===void 0?j.xAxisId:k,F=I.yAxisId,H=F===void 0?j.yAxisId:F;return L.cloneElement(g,{key:g.key||"".concat(S,"-").concat(A),xAxis:$[R],yAxis:D[H],viewBox:{x:M.left,y:M.top,width:M.width,height:M.height},clipPathId:C})}),G(m,"renderActivePoints",function(g){var S=g.item,A=g.activePoint,P=g.basePoint,C=g.childIndex,T=g.isRange,$=[],D=S.props.key,M=S.item.type.defaultProps!==void 0?E(E({},S.item.type.defaultProps),S.item.props):S.item.props,j=M.activeDot,I=M.dataKey,k=E(E({index:C,dataKey:I,cx:A.x,cy:A.y,r:4,fill:as(S.item),strokeWidth:2,stroke:"#fff",payload:A.payload,value:A.value},J(j,!1)),wi(j));return $.push(b.renderActiveDot(j,k,"".concat(D,"-activePoint-").concat(C))),P?$.push(b.renderActiveDot(j,E(E({},k),{},{cx:P.x,cy:P.y}),"".concat(D,"-basePoint-").concat(C))):T&&$.push(null),$}),G(m,"renderGraphicChild",function(g,S,A){var P=m.filterFormatItem(g,S,A);if(!P)return null;var C=m.getTooltipEventType(),T=m.state,$=T.isTooltipActive,D=T.tooltipAxis,M=T.activeTooltipIndex,j=T.activeLabel,I=m.props.children,k=Re(I,lt),R=P.props,F=R.points,H=R.isRange,q=R.baseLine,z=P.item.type.defaultProps!==void 0?E(E({},P.item.type.defaultProps),P.item.props):P.item.props,K=z.activeDot,ce=z.hide,ve=z.activeBar,Ne=z.activeShape,kt=!!(!ce&&$&&k&&(K||ve||Ne)),Ce={};C!=="axis"&&k&&k.props.trigger==="click"?Ce={onClick:di(m.handleItemMouseEnter,g.props.onClick)}:C!=="axis"&&(Ce={onMouseLeave:di(m.handleItemMouseLeave,g.props.onMouseLeave),onMouseEnter:di(m.handleItemMouseEnter,g.props.onMouseEnter)});var W=L.cloneElement(g,E(E({},P.props),Ce));function X(Lt){return typeof D.dataKey=="function"?D.dataKey(Lt.payload):null}if(kt)if(M>=0){var V,N;if(D.dataKey&&!D.allowDuplicatedCategory){var he=typeof D.dataKey=="function"?X:"payload.".concat(D.dataKey.toString());V=xi(F,he,j),N=H&&q&&xi(q,he,j)}else V=F?.[M],N=H&&q&&q[M];if(Ne||ve){var Q=g.props.activeIndex!==void 0?g.props.activeIndex:M;return[L.cloneElement(g,E(E(E({},P.props),Ce),{},{activeIndex:Q})),null,null]}if(!Z(V))return[W].concat(Nr(m.renderActivePoints({item:P,activePoint:V,basePoint:N,childIndex:M,isRange:H})))}else{var ge,be=(ge=m.getItemByXY(m.state.activeCoordinate))!==null&&ge!==void 0?ge:{graphicalItem:W},Ie=be.graphicalItem,At=Ie.item,nr=At===void 0?g:At,ii=Ie.childIndex,Nt=E(E(E({},P.props),Ce),{},{activeIndex:ii});return[L.cloneElement(nr,Nt),null,null]}return H?[W,null,null]:[W,null]}),G(m,"renderCustomized",function(g,S,A){return L.cloneElement(g,E(E({key:"recharts-customized-".concat(A)},m.props),m.state))}),G(m,"renderMap",{CartesianGrid:{handler:bi,once:!0},ReferenceArea:{handler:m.renderReferenceElement},ReferenceLine:{handler:bi},ReferenceDot:{handler:m.renderReferenceElement},XAxis:{handler:bi},YAxis:{handler:bi},Brush:{handler:m.renderBrush,once:!0},Bar:{handler:m.renderGraphicChild},Line:{handler:m.renderGraphicChild},Area:{handler:m.renderGraphicChild},Radar:{handler:m.renderGraphicChild},RadialBar:{handler:m.renderGraphicChild},Scatter:{handler:m.renderGraphicChild},Pie:{handler:m.renderGraphicChild},Funnel:{handler:m.renderGraphicChild},Tooltip:{handler:m.renderCursor,once:!0},PolarGrid:{handler:m.renderPolarGrid,once:!0},PolarAngleAxis:{handler:m.renderPolarAxis},PolarRadiusAxis:{handler:m.renderPolarAxis},Customized:{handler:m.renderCustomized}}),m.clipPathId="".concat((w=x.id)!==null&&w!==void 0?w:Yn("recharts"),"-clip"),m.throttleTriggeredAfterMouseMove=Sd(m.triggeredAfterMouseMove,(O=x.throttleDelay)!==null&&O!==void 0?O:1e3/60),m.state={},m}return s3(b,d),a3(b,[{key:"componentDidMount",value:function(){var w,O;this.addListener(),this.accessibilityManager.setDetails({container:this.container,offset:{left:(w=this.props.margin.left)!==null&&w!==void 0?w:0,top:(O=this.props.margin.top)!==null&&O!==void 0?O:0},coordinateList:this.state.tooltipTicks,mouseHandlerCallback:this.triggeredAfterMouseMove,layout:this.props.layout}),this.displayDefaultTooltip()}},{key:"displayDefaultTooltip",value:function(){var w=this.props,O=w.children,m=w.data,g=w.height,S=w.layout,A=Re(O,lt);if(A){var P=A.props.defaultIndex;if(!(typeof P!="number"||P<0||P>this.state.tooltipTicks.length-1)){var C=this.state.tooltipTicks[P]&&this.state.tooltipTicks[P].value,T=sc(this.state,m,P,C),$=this.state.tooltipTicks[P].coordinate,D=(this.state.offset.top+g)/2,M=S==="horizontal",j=M?{x:$,y:D}:{y:$,x:D},I=this.state.formattedGraphicalItems.find(function(R){var F=R.item;return F.type.name==="Scatter"});I&&(j=E(E({},j),I.props.points[P].tooltipPosition),T=I.props.points[P].tooltipPayload);var k={activeTooltipIndex:P,isTooltipActive:!0,activeLabel:C,activePayload:T,activeCoordinate:j};this.setState(k),this.renderCursor(A),this.accessibilityManager.setIndex(P)}}}},{key:"getSnapshotBeforeUpdate",value:function(w,O){if(!this.props.accessibilityLayer)return null;if(this.state.tooltipTicks!==O.tooltipTicks&&this.accessibilityManager.setDetails({coordinateList:this.state.tooltipTicks}),this.props.layout!==w.layout&&this.accessibilityManager.setDetails({layout:this.props.layout}),this.props.margin!==w.margin){var m,g;this.accessibilityManager.setDetails({offset:{left:(m=this.props.margin.left)!==null&&m!==void 0?m:0,top:(g=this.props.margin.top)!==null&&g!==void 0?g:0}})}return null}},{key:"componentDidUpdate",value:function(w){Wo([Re(w.children,lt)],[Re(this.props.children,lt)])||this.displayDefaultTooltip()}},{key:"componentWillUnmount",value:function(){this.removeListener(),this.throttleTriggeredAfterMouseMove.cancel()}},{key:"getTooltipEventType",value:function(){var w=Re(this.props.children,lt);if(w&&typeof w.props.shared=="boolean"){var O=w.props.shared?"axis":"item";return u.indexOf(O)>=0?O:a}return a}},{key:"getMouseInfo",value:function(w){if(!this.container)return null;var O=this.container,m=O.getBoundingClientRect(),g=QT(m),S={chartX:Math.round(w.pageX-g.left),chartY:Math.round(w.pageY-g.top)},A=m.width/O.offsetWidth||1,P=this.inRange(S.chartX,S.chartY,A);if(!P)return null;var C=this.state,T=C.xAxisMap,$=C.yAxisMap,D=this.getTooltipEventType(),M=op(this.state,this.props.data,this.props.layout,P);if(D!=="axis"&&T&&$){var j=Pt(T).scale,I=Pt($).scale,k=j&&j.invert?j.invert(S.chartX):null,R=I&&I.invert?I.invert(S.chartY):null;return E(E({},S),{},{xValue:k,yValue:R},M)}return M?E(E({},S),M):null}},{key:"inRange",value:function(w,O){var m=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,g=this.props.layout,S=w/m,A=O/m;if(g==="horizontal"||g==="vertical"){var P=this.state.offset,C=S>=P.left&&S<=P.left+P.width&&A>=P.top&&A<=P.top+P.height;return C?{x:S,y:A}:null}var T=this.state,$=T.angleAxisMap,D=T.radiusAxisMap;if($&&D){var M=Pt($);return Hf({x:S,y:A},M)}return null}},{key:"parseEventsOfWrapper",value:function(){var w=this.props.children,O=this.getTooltipEventType(),m=Re(w,lt),g={};m&&O==="axis"&&(m.props.trigger==="click"?g={onClick:this.handleClick}:g={onMouseEnter:this.handleMouseEnter,onDoubleClick:this.handleDoubleClick,onMouseMove:this.handleMouseMove,onMouseLeave:this.handleMouseLeave,onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,onTouchEnd:this.handleTouchEnd,onContextMenu:this.handleContextMenu});var S=wi(this.props,this.handleOuterEvent);return E(E({},S),g)}},{key:"addListener",value:function(){No.on(Lo,this.handleReceiveSyncEvent)}},{key:"removeListener",value:function(){No.removeListener(Lo,this.handleReceiveSyncEvent)}},{key:"filterFormatItem",value:function(w,O,m){for(var g=this.state.formattedGraphicalItems,S=0,A=g.length;S<A;S++){var P=g[S];if(P.item===w||P.props.key===w.key||O===dt(P.item.type)&&m===P.childIndex)return P}return null}},{key:"renderClipPath",value:function(){var w=this.clipPathId,O=this.state.offset,m=O.left,g=O.top,S=O.height,A=O.width;return _.createElement("defs",null,_.createElement("clipPath",{id:w},_.createElement("rect",{x:m,y:g,height:S,width:A})))}},{key:"getXScales",value:function(){var w=this.state.xAxisMap;return w?Object.entries(w).reduce(function(O,m){var g=np(m,2),S=g[0],A=g[1];return E(E({},O),{},G({},S,A.scale))},{}):null}},{key:"getYScales",value:function(){var w=this.state.yAxisMap;return w?Object.entries(w).reduce(function(O,m){var g=np(m,2),S=g[0],A=g[1];return E(E({},O),{},G({},S,A.scale))},{}):null}},{key:"getXScaleByAxisId",value:function(w){var O;return(O=this.state.xAxisMap)===null||O===void 0||(O=O[w])===null||O===void 0?void 0:O.scale}},{key:"getYScaleByAxisId",value:function(w){var O;return(O=this.state.yAxisMap)===null||O===void 0||(O=O[w])===null||O===void 0?void 0:O.scale}},{key:"getItemByXY",value:function(w){var O=this.state,m=O.formattedGraphicalItems,g=O.activeItem;if(m&&m.length)for(var S=0,A=m.length;S<A;S++){var P=m[S],C=P.props,T=P.item,$=T.type.defaultProps!==void 0?E(E({},T.type.defaultProps),T.props):T.props,D=dt(T.type);if(D==="Bar"){var M=(C.data||[]).find(function(R){return Rk(w,R)});if(M)return{graphicalItem:P,payload:M}}else if(D==="RadialBar"){var j=(C.data||[]).find(function(R){return Hf(w,R)});if(j)return{graphicalItem:P,payload:j}}else if(eo(P,g)||to(P,g)||Wn(P,g)){var I=zN({graphicalItem:P,activeTooltipItem:g,itemData:$.data}),k=$.activeIndex===void 0?I:$.activeIndex;return{graphicalItem:E(E({},P),{},{childIndex:k}),payload:Wn(P,g)?$.data[I]:P.props.data[I]}}}return null}},{key:"render",value:function(){var w=this;if(!Is(this))return null;var O=this.props,m=O.children,g=O.className,S=O.width,A=O.height,P=O.style,C=O.compact,T=O.title,$=O.desc,D=ip(O,JF),M=J(D,!1);if(C)return _.createElement(Rh,{state:this.state,width:this.props.width,height:this.props.height,clipPathId:this.clipPathId},_.createElement(Uo,lr({},M,{width:S,height:A,title:T,desc:$}),this.renderClipPath(),ks(m,this.renderMap)));if(this.props.accessibilityLayer){var j,I;M.tabIndex=(j=this.props.tabIndex)!==null&&j!==void 0?j:0,M.role=(I=this.props.role)!==null&&I!==void 0?I:"application",M.onKeyDown=function(R){w.accessibilityManager.keyboardEvent(R)},M.onFocus=function(){w.accessibilityManager.focus()}}var k=this.parseEventsOfWrapper();return _.createElement(Rh,{state:this.state,width:this.props.width,height:this.props.height,clipPathId:this.clipPathId},_.createElement("div",lr({className:ee("recharts-wrapper",g),style:E({position:"relative",cursor:"default",width:S,height:A},P)},k,{ref:function(F){w.container=F}}),_.createElement(Uo,lr({},M,{width:S,height:A,title:T,desc:$,style:v3}),this.renderClipPath(),ks(m,this.renderMap)),this.renderLegend(),this.renderTooltip()))}}])}(L.Component);G(y,"displayName",r),G(y,"defaultProps",E({layout:"horizontal",stackOffset:"none",barCategoryGap:"10%",barGap:4,margin:{top:5,right:5,bottom:5,left:5},reverseStackOrder:!1,syncMethod:"index"},l)),G(y,"getDerivedStateFromProps",function(d,b){var x=d.dataKey,w=d.data,O=d.children,m=d.width,g=d.height,S=d.layout,A=d.stackOffset,P=d.margin,C=b.dataStartIndex,T=b.dataEndIndex;if(b.updateId===void 0){var $=up(d);return E(E(E({},$),{},{updateId:0},p(E(E({props:d},$),{},{updateId:0}),b)),{},{prevDataKey:x,prevData:w,prevWidth:m,prevHeight:g,prevLayout:S,prevStackOffset:A,prevMargin:P,prevChildren:O})}if(x!==b.prevDataKey||w!==b.prevData||m!==b.prevWidth||g!==b.prevHeight||S!==b.prevLayout||A!==b.prevStackOffset||!fr(P,b.prevMargin)){var D=up(d),M={chartX:b.chartX,chartY:b.chartY,isTooltipActive:b.isTooltipActive},j=E(E({},op(b,w,S)),{},{updateId:b.updateId+1}),I=E(E(E({},D),M),j);return E(E(E({},I),p(E({props:d},I),b)),{},{prevDataKey:x,prevData:w,prevWidth:m,prevHeight:g,prevLayout:S,prevStackOffset:A,prevMargin:P,prevChildren:O})}if(!Wo(O,b.prevChildren)){var k,R,F,H,q=Re(O,Pr),z=q&&(k=(R=q.props)===null||R===void 0?void 0:R.startIndex)!==null&&k!==void 0?k:C,K=q&&(F=(H=q.props)===null||H===void 0?void 0:H.endIndex)!==null&&F!==void 0?F:T,ce=z!==C||K!==T,ve=!Z(w),Ne=ve&&!ce?b.updateId:b.updateId+1;return E(E({updateId:Ne},p(E(E({props:d},b),{},{updateId:Ne,dataStartIndex:z,dataEndIndex:K}),b)),{},{prevChildren:O,dataStartIndex:z,dataEndIndex:K})}return null}),G(y,"renderActiveDot",function(d,b,x){var w;return L.isValidElement(d)?w=L.cloneElement(d,b):Y(d)?w=d(b):w=_.createElement(us,b),_.createElement(de,{className:"recharts-active-dot",key:x},w)});var v=L.forwardRef(function(b,x){return _.createElement(y,lr({},b,{ref:x}))});return v.displayName=y.displayName,v};export{xt as A,ni as B,eF as C,us as D,Gr as G,ms as L,P3 as R,lt as T,Sy as X,$y as Y,hr as a,J as b,de as c,Mu as d,et as e,$3 as f,T3 as g,Z as h,B as i,Vn as j,Za as k,A0 as l,Va as m,Et as n,Y as o,We as p,Lf as q,Yn as u};
|
|
70
|
-
//# sourceMappingURL=generateCategoricalChart-
|
|
70
|
+
//# sourceMappingURL=generateCategoricalChart-C9_fu2hc.js.map
|