@neuronection/assistant-ui 0.53.0 → 0.54.0
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/CHANGELOG.md +25 -0
- package/README.md +1 -0
- package/dist/chat-markdown.js +1 -1
- package/dist/chat-message.js +1 -1
- package/dist/chat-transcript.js +1 -1
- package/dist/{chunk-NOAKHVBJ.js → chunk-56QSIK4Y.js} +3 -3
- package/dist/{chunk-NOAKHVBJ.js.map → chunk-56QSIK4Y.js.map} +1 -1
- package/dist/chunk-65JY3ATO.js +94 -0
- package/dist/chunk-65JY3ATO.js.map +1 -0
- package/dist/chunk-6G7H6YP6.js +180 -0
- package/dist/chunk-6G7H6YP6.js.map +1 -0
- package/dist/chunk-7IP3JP3Z.js +54 -0
- package/dist/chunk-7IP3JP3Z.js.map +1 -0
- package/dist/{chunk-HXU6P5FD.js → chunk-E2NNTHFB.js} +4 -4
- package/dist/{chunk-HXU6P5FD.js.map → chunk-E2NNTHFB.js.map} +1 -1
- package/dist/chunk-FQXVZVA5.js +68 -0
- package/dist/chunk-FQXVZVA5.js.map +1 -0
- package/dist/chunk-FY3NCPFO.js +112 -0
- package/dist/chunk-FY3NCPFO.js.map +1 -0
- package/dist/chunk-KKZLR3YD.js +3 -0
- package/dist/chunk-KKZLR3YD.js.map +1 -0
- package/dist/{chunk-KQLKITZL.js → chunk-KLCULTOQ.js} +3 -3
- package/dist/chunk-KLCULTOQ.js.map +1 -0
- package/dist/chunk-RRT3DOPJ.js +3 -0
- package/dist/chunk-RRT3DOPJ.js.map +1 -0
- package/dist/{chunk-I4R5BRC7.js → chunk-TLFEVL42.js} +3 -3
- package/dist/{chunk-I4R5BRC7.js.map → chunk-TLFEVL42.js.map} +1 -1
- package/dist/chunk-YDQW2WJH.js +70 -0
- package/dist/chunk-YDQW2WJH.js.map +1 -0
- package/dist/index.d.ts +206 -1
- package/dist/index.js +18 -12
- package/dist/markdown-diff-view.js +1 -1
- package/dist/provider-logo.d.ts +16 -0
- package/dist/provider-logo.js +3 -0
- package/dist/provider-logo.js.map +1 -0
- package/dist/provider-setup-form.d.ts +74 -0
- package/dist/provider-setup-form.js +3 -0
- package/dist/provider-setup-form.js.map +1 -0
- package/dist/provider-setup-tiles.d.ts +41 -0
- package/dist/provider-setup-tiles.js +3 -0
- package/dist/provider-setup-tiles.js.map +1 -0
- package/dist/setup-first-run-card.d.ts +23 -0
- package/dist/setup-first-run-card.js +3 -0
- package/dist/setup-first-run-card.js.map +1 -0
- package/dist/setup-review.d.ts +51 -0
- package/dist/setup-review.js +3 -0
- package/dist/setup-review.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/switch-row.d.ts +19 -0
- package/dist/switch-row.js +3 -0
- package/dist/switch-row.js.map +1 -0
- package/package.json +25 -1
- package/dist/chunk-KQLKITZL.js.map +0 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { cn } from './chunk-RVVXVTH3.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var ICON_PATHS = {
|
|
6
|
+
gemini: "M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81",
|
|
7
|
+
openrouter: "M16.778 1.844v1.919q-.569-.026-1.138-.032-.708-.008-1.415.037c-1.93.126-4.023.728-6.149 2.237-2.911 2.066-2.731 1.95-4.14 2.75-.396.223-1.342.574-2.185.798-.841.225-1.753.333-1.751.333v4.229s.768.108 1.61.333c.842.224 1.789.575 2.185.799 1.41.798 1.228.683 4.14 2.75 2.126 1.509 4.22 2.11 6.148 2.236.88.058 1.716.041 2.555.005v1.918l7.222-4.168-7.222-4.17v2.176c-.86.038-1.611.065-2.278.021-1.364-.09-2.417-.357-3.979-1.465-2.244-1.593-2.866-2.027-3.68-2.508.889-.518 1.449-.906 3.822-2.59 1.56-1.109 2.614-1.377 3.978-1.466.667-.044 1.418-.017 2.278.02v2.176L24 6.014Z",
|
|
8
|
+
anthropic: "M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z",
|
|
9
|
+
mistral: "M17.143 3.429v3.428h-3.429v3.429h-3.428V6.857H6.857V3.43H3.43v13.714H0v3.428h10.286v-3.428H6.857v-3.429h3.429v3.429h3.429v-3.429h3.428v3.429h-3.428v3.428H24v-3.428h-3.43V3.429z",
|
|
10
|
+
deepseek: "M23.748 4.651c-.254-.124-.364.113-.512.233-.051.04-.094.09-.137.137-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.155-.708-.311-.955-.65-.172-.24-.219-.509-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.094.172.187.129.323-.082.28-.18.553-.266.833-.055.179-.137.218-.328.14a5.5 5.5 0 0 1-1.737-1.179c-.857-.828-1.631-1.743-2.597-2.46a12 12 0 0 0-.689-.47c-.985-.957.13-1.743.387-1.836.27-.098.094-.433-.778-.428-.872.003-1.67.295-2.687.685a3 3 0 0 1-.465.136 9.6 9.6 0 0 0-2.883-.101c-1.885.21-3.39 1.1-4.497 2.622C.082 8.776-.231 10.854.152 13.02c.403 2.284 1.568 4.175 3.36 5.653 1.857 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.132-.284 4.994-1.86.47.234.962.328 1.78.398.629.058 1.235-.031 1.705-.129.735-.155.684-.836.418-.961-2.155-1.004-1.682-.595-2.112-.926 1.095-1.295 2.768-3.598 3.284-6.733.05-.346.115-.834.108-1.114-.004-.171.035-.238.23-.257a4.2 4.2 0 0 0 1.545-.475c1.397-.763 1.96-2.016 2.093-3.517.02-.23-.004-.467-.247-.588M11.58 18.168c-2.088-1.642-3.101-2.183-3.52-2.16-.39.024-.32.472-.234.763.09.288.207.487.371.74.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.168-1.361-.801-2.5-1.86-3.301-3.306-.775-1.393-1.225-2.888-1.299-4.482-.02-.385.094-.522.477-.592a4.7 4.7 0 0 1 1.53-.038c2.131.311 3.946 1.264 5.467 2.774.868.86 1.525 1.887 2.202 2.89.72 1.066 1.494 2.082 2.48 2.915.348.291.626.513.892.677-.802.09-2.14.109-3.055-.615zm1.001-6.44a.306.306 0 0 1 .415-.287.3.3 0 0 1 .113.074.3.3 0 0 1 .086.214c0 .17-.136.307-.308.307a.303.303 0 0 1-.306-.307m3.11 1.596c-.2.081-.4.151-.591.16a1.25 1.25 0 0 1-.798-.254c-.274-.23-.47-.358-.551-.758a1.7 1.7 0 0 1 .015-.588c.07-.327-.007-.537-.238-.727-.188-.156-.426-.199-.689-.199a.6.6 0 0 1-.254-.078.253.253 0 0 1-.114-.358 1 1 0 0 1 .192-.21c.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.392.451.462.576.685.915.176.264.336.536.446.848.066.194-.02.353-.25.45",
|
|
11
|
+
ollama: "M16.361 10.26a.894.894 0 0 0-.558.47l-.072.148.001.207c0 .193.004.217.059.353.076.193.152.312.291.448.24.238.51.3.872.205a.86.86 0 0 0 .517-.436.752.752 0 0 0 .08-.498c-.064-.453-.33-.782-.724-.897a1.06 1.06 0 0 0-.466 0zm-9.203.005c-.305.096-.533.32-.65.639a1.187 1.187 0 0 0-.06.52c.057.309.31.59.598.667.362.095.632.033.872-.205.14-.136.215-.255.291-.448.055-.136.059-.16.059-.353l.001-.207-.072-.148a.894.894 0 0 0-.565-.472 1.02 1.02 0 0 0-.474.007zm4.184 2c-.131.071-.223.25-.195.383.031.143.157.288.353.407.105.063.112.072.117.136.004.038-.01.146-.029.243-.02.094-.036.194-.036.222.002.074.07.195.143.253.064.052.076.054.255.059.164.005.198.001.264-.03.169-.082.212-.234.15-.525-.052-.243-.042-.28.087-.355.137-.08.281-.219.324-.314a.365.365 0 0 0-.175-.48.394.394 0 0 0-.181-.033c-.126 0-.207.03-.355.124l-.085.053-.053-.032c-.219-.13-.259-.145-.391-.143a.396.396 0 0 0-.193.032zm.39-2.195c-.373.036-.475.05-.654.086-.291.06-.68.195-.951.328-.94.46-1.589 1.226-1.787 2.114-.04.176-.045.234-.045.53 0 .294.005.357.043.524.264 1.16 1.332 2.017 2.714 2.173.3.033 1.596.033 1.896 0 1.11-.125 2.064-.727 2.493-1.571.114-.226.169-.372.22-.602.039-.167.044-.23.044-.523 0-.297-.005-.355-.045-.531-.288-1.29-1.539-2.304-3.072-2.497a6.9 6.9 0 0 0-.855-.031zm.645.937a3.3 3.3 0 0 1 1.44.514c.223.148.537.458.671.662.166.251.26.508.303.82.02.143.01.251-.043.482-.08.345-.332.705-.672.957a3.1 3.1 0 0 1-.689.348c-.382.122-.632.144-1.525.138-.582-.006-.686-.01-.853-.042-.57-.107-1.022-.334-1.35-.68-.264-.28-.385-.535-.45-.946-.03-.192.025-.509.137-.776.136-.326.488-.73.836-.963.403-.269.934-.46 1.422-.512.187-.02.586-.02.773-.002zm-5.503-11a1.65 1.65 0 0 0-.683.298C5.617.74 5.173 1.666 4.985 2.819c-.07.436-.119 1.04-.119 1.503 0 .544.064 1.24.155 1.721.02.107.031.202.023.208a8 8 0 0 1-.187.152 5.3 5.3 0 0 0-.949 1.02 5.5 5.5 0 0 0-.94 2.339 6.6 6.6 0 0 0-.023 1.357c.091.78.325 1.438.727 2.04l.13.195-.037.064c-.269.452-.498 1.105-.605 1.732-.084.496-.095.629-.095 1.294 0 .67.009.803.088 1.266.095.555.288 1.143.503 1.534.071.128.243.393.264.407.007.003-.014.067-.046.141a7.4 7.4 0 0 0-.548 1.873c-.062.417-.071.552-.071.991 0 .56.031.832.148 1.279L3.42 24h1.478l-.05-.091c-.297-.552-.325-1.575-.068-2.597.117-.472.25-.819.498-1.296l.148-.29v-.177c0-.165-.003-.184-.057-.293a.9.9 0 0 0-.194-.25 1.74 1.74 0 0 1-.385-.543c-.424-.92-.506-2.286-.208-3.451.124-.486.329-.918.544-1.154a.79.79 0 0 0 .223-.531c0-.195-.07-.355-.224-.522a3.1 3.1 0 0 1-.817-1.729c-.14-.96.114-2.005.69-2.834.563-.814 1.353-1.336 2.237-1.475.199-.033.57-.028.776.01.226.04.367.028.512-.041.179-.085.268-.19.374-.431.093-.215.165-.333.36-.576.234-.29.46-.489.822-.729.413-.27.884-.467 1.352-.561.17-.035.25-.04.569-.04.319 0 .398.005.569.04a4.07 4.07 0 0 1 1.914.997c.117.109.398.457.488.602.034.057.095.177.132.267.105.241.195.346.374.43.14.068.286.082.503.045.343-.058.607-.053.943.016 1.144.23 2.14 1.173 2.581 2.437.385 1.108.276 2.267-.296 3.153-.097.15-.193.27-.333.419-.301.322-.301.722-.001 1.053.493.539.801 1.866.708 3.036-.062.772-.26 1.463-.533 1.854a2 2 0 0 1-.224.258.9.9 0 0 0-.194.25c-.054.109-.057.128-.057.293v.178l.148.29c.248.476.38.823.498 1.295.253 1.008.231 2.01-.059 2.581a.8.8 0 0 0-.044.098c0 .006.329.009.732.009h.73l.02-.074.036-.134c.019-.076.057-.3.088-.516.029-.217.029-1.016 0-1.258-.11-.875-.295-1.57-.597-2.226-.032-.074-.053-.138-.046-.141.008-.005.057-.074.108-.152.376-.569.607-1.284.724-2.228.031-.26.031-1.378 0-1.628-.083-.645-.182-1.082-.348-1.525a6 6 0 0 0-.329-.7l-.038-.064.131-.194c.402-.604.636-1.262.727-2.04a6.6 6.6 0 0 0-.024-1.358 5.5 5.5 0 0 0-.939-2.339 5.3 5.3 0 0 0-.95-1.02 8 8 0 0 1-.186-.152.7.7 0 0 1 .023-.208c.208-1.087.201-2.443-.017-3.503-.19-.924-.535-1.658-.98-2.082-.354-.338-.716-.482-1.15-.455-.996.059-1.8 1.205-2.116 3.01a6.8 6.8 0 0 0-.097.726c0 .036-.007.066-.015.066a1 1 0 0 1-.149-.078A4.9 4.9 0 0 0 12 3.03c-.832 0-1.687.243-2.456.698a1 1 0 0 1-.148.078c-.008 0-.015-.03-.015-.066a6.7 6.7 0 0 0-.097-.725C8.997 1.392 8.337.319 7.46.048a2 2 0 0 0-.585-.041zm.293 1.402c.248.197.523.759.682 1.388.03.113.06.244.069.292.007.047.026.152.041.233.067.365.098.76.102 1.24l.002.475-.12.175-.118.178h-.278c-.324 0-.646.041-.954.124l-.238.06c-.033.007-.038-.003-.057-.144a8.4 8.4 0 0 1 .016-2.323c.124-.788.413-1.501.696-1.711.067-.05.079-.049.157.013zm9.825-.012c.17.126.358.46.498.888.28.854.36 2.028.212 3.145-.019.14-.024.151-.057.144l-.238-.06a3.7 3.7 0 0 0-.954-.124h-.278l-.119-.178-.119-.175.002-.474c.004-.669.066-1.19.214-1.772.157-.623.434-1.185.68-1.382.078-.062.09-.063.159-.012z"
|
|
12
|
+
};
|
|
13
|
+
var ProviderLogo = React.forwardRef(
|
|
14
|
+
function ProviderLogo2({ preset, size = 20, className, style, ...props }, ref) {
|
|
15
|
+
const path = ICON_PATHS[preset];
|
|
16
|
+
return /* @__PURE__ */ jsx(
|
|
17
|
+
"span",
|
|
18
|
+
{
|
|
19
|
+
ref,
|
|
20
|
+
"data-as": "provider-logo",
|
|
21
|
+
"data-preset": preset,
|
|
22
|
+
"aria-hidden": "true",
|
|
23
|
+
className: cn(
|
|
24
|
+
"inline-flex shrink-0 items-center justify-center text-[var(--as-fg)]",
|
|
25
|
+
className
|
|
26
|
+
),
|
|
27
|
+
style: { width: size, height: size, ...style },
|
|
28
|
+
...props,
|
|
29
|
+
children: path ? /* @__PURE__ */ jsx(
|
|
30
|
+
"svg",
|
|
31
|
+
{
|
|
32
|
+
viewBox: "0 0 24 24",
|
|
33
|
+
width: size,
|
|
34
|
+
height: size,
|
|
35
|
+
fill: "currentColor",
|
|
36
|
+
focusable: "false",
|
|
37
|
+
children: /* @__PURE__ */ jsx("path", { d: path })
|
|
38
|
+
}
|
|
39
|
+
) : /* @__PURE__ */ jsx(
|
|
40
|
+
"span",
|
|
41
|
+
{
|
|
42
|
+
className: "flex h-full w-full items-center justify-center rounded-full border border-[var(--as-border)] font-semibold text-[var(--as-muted-fg)]",
|
|
43
|
+
style: { fontSize: Math.max(8, Math.round(size / 2)) },
|
|
44
|
+
children: preset.charAt(0).toUpperCase()
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
export { ProviderLogo };
|
|
53
|
+
//# sourceMappingURL=chunk-7IP3JP3Z.js.map
|
|
54
|
+
//# sourceMappingURL=chunk-7IP3JP3Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/provider-logo/ProviderLogo.tsx"],"names":["ProviderLogo"],"mappings":";;;;AASA,IAAM,UAAA,GAAqC;AAAA,EACzC,MAAA,EACE,8RAAA;AAAA,EACF,UAAA,EACE,4jBAAA;AAAA,EACF,SAAA,EACE,0KAAA;AAAA,EACF,OAAA,EACE,kLAAA;AAAA,EACF,QAAA,EACE,w7DAAA;AAAA,EACF,MAAA,EACE;AACJ,CAAA;AAcO,IAAM,YAAA,GAAqB,KAAA,CAAA,UAAA;AAAA,EAChC,SAASA,aAAAA,CAAa,EAAE,MAAA,EAAQ,IAAA,GAAO,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK;AAC5E,IAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,IAAA,uBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,eAAA;AAAA,QACR,aAAA,EAAa,MAAA;AAAA,QACb,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAW,EAAA;AAAA,UACT,sEAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,OAAO,EAAE,KAAA,EAAO,MAAM,MAAA,EAAQ,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,QAC5C,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA,IAAA,mBACC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,KAAA,EAAO,IAAA;AAAA,YACP,MAAA,EAAQ,IAAA;AAAA,YACR,IAAA,EAAK,cAAA;AAAA,YACL,SAAA,EAAU,OAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAG,IAAA,EAAM;AAAA;AAAA,SACjB,mBAEA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,sIAAA;AAAA,YACV,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAC,CAAA,EAAE;AAAA,YAEpD,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA;AAAY;AAAA;AAChC;AAAA,KAEJ;AAAA,EAEJ;AACF","file":"chunk-7IP3JP3Z.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\n\n/**\n * Simple-icons path data keyed by preset key (inline — no runtime\n * dependency). The openai and groq marks were removed upstream by their\n * brands, so those keys (and any unknown key) intentionally fall back to the\n * monogram.\n */\nconst ICON_PATHS: Record<string, string> = {\n gemini:\n 'M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81',\n openrouter:\n 'M16.778 1.844v1.919q-.569-.026-1.138-.032-.708-.008-1.415.037c-1.93.126-4.023.728-6.149 2.237-2.911 2.066-2.731 1.95-4.14 2.75-.396.223-1.342.574-2.185.798-.841.225-1.753.333-1.751.333v4.229s.768.108 1.61.333c.842.224 1.789.575 2.185.799 1.41.798 1.228.683 4.14 2.75 2.126 1.509 4.22 2.11 6.148 2.236.88.058 1.716.041 2.555.005v1.918l7.222-4.168-7.222-4.17v2.176c-.86.038-1.611.065-2.278.021-1.364-.09-2.417-.357-3.979-1.465-2.244-1.593-2.866-2.027-3.68-2.508.889-.518 1.449-.906 3.822-2.59 1.56-1.109 2.614-1.377 3.978-1.466.667-.044 1.418-.017 2.278.02v2.176L24 6.014Z',\n anthropic:\n 'M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z',\n mistral:\n 'M17.143 3.429v3.428h-3.429v3.429h-3.428V6.857H6.857V3.43H3.43v13.714H0v3.428h10.286v-3.428H6.857v-3.429h3.429v3.429h3.429v-3.429h3.428v3.429h-3.428v3.428H24v-3.428h-3.43V3.429z',\n deepseek:\n 'M23.748 4.651c-.254-.124-.364.113-.512.233-.051.04-.094.09-.137.137-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.155-.708-.311-.955-.65-.172-.24-.219-.509-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.094.172.187.129.323-.082.28-.18.553-.266.833-.055.179-.137.218-.328.14a5.5 5.5 0 0 1-1.737-1.179c-.857-.828-1.631-1.743-2.597-2.46a12 12 0 0 0-.689-.47c-.985-.957.13-1.743.387-1.836.27-.098.094-.433-.778-.428-.872.003-1.67.295-2.687.685a3 3 0 0 1-.465.136 9.6 9.6 0 0 0-2.883-.101c-1.885.21-3.39 1.1-4.497 2.622C.082 8.776-.231 10.854.152 13.02c.403 2.284 1.568 4.175 3.36 5.653 1.857 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.132-.284 4.994-1.86.47.234.962.328 1.78.398.629.058 1.235-.031 1.705-.129.735-.155.684-.836.418-.961-2.155-1.004-1.682-.595-2.112-.926 1.095-1.295 2.768-3.598 3.284-6.733.05-.346.115-.834.108-1.114-.004-.171.035-.238.23-.257a4.2 4.2 0 0 0 1.545-.475c1.397-.763 1.96-2.016 2.093-3.517.02-.23-.004-.467-.247-.588M11.58 18.168c-2.088-1.642-3.101-2.183-3.52-2.16-.39.024-.32.472-.234.763.09.288.207.487.371.74.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.168-1.361-.801-2.5-1.86-3.301-3.306-.775-1.393-1.225-2.888-1.299-4.482-.02-.385.094-.522.477-.592a4.7 4.7 0 0 1 1.53-.038c2.131.311 3.946 1.264 5.467 2.774.868.86 1.525 1.887 2.202 2.89.72 1.066 1.494 2.082 2.48 2.915.348.291.626.513.892.677-.802.09-2.14.109-3.055-.615zm1.001-6.44a.306.306 0 0 1 .415-.287.3.3 0 0 1 .113.074.3.3 0 0 1 .086.214c0 .17-.136.307-.308.307a.303.303 0 0 1-.306-.307m3.11 1.596c-.2.081-.4.151-.591.16a1.25 1.25 0 0 1-.798-.254c-.274-.23-.47-.358-.551-.758a1.7 1.7 0 0 1 .015-.588c.07-.327-.007-.537-.238-.727-.188-.156-.426-.199-.689-.199a.6.6 0 0 1-.254-.078.253.253 0 0 1-.114-.358 1 1 0 0 1 .192-.21c.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.392.451.462.576.685.915.176.264.336.536.446.848.066.194-.02.353-.25.45',\n ollama:\n 'M16.361 10.26a.894.894 0 0 0-.558.47l-.072.148.001.207c0 .193.004.217.059.353.076.193.152.312.291.448.24.238.51.3.872.205a.86.86 0 0 0 .517-.436.752.752 0 0 0 .08-.498c-.064-.453-.33-.782-.724-.897a1.06 1.06 0 0 0-.466 0zm-9.203.005c-.305.096-.533.32-.65.639a1.187 1.187 0 0 0-.06.52c.057.309.31.59.598.667.362.095.632.033.872-.205.14-.136.215-.255.291-.448.055-.136.059-.16.059-.353l.001-.207-.072-.148a.894.894 0 0 0-.565-.472 1.02 1.02 0 0 0-.474.007zm4.184 2c-.131.071-.223.25-.195.383.031.143.157.288.353.407.105.063.112.072.117.136.004.038-.01.146-.029.243-.02.094-.036.194-.036.222.002.074.07.195.143.253.064.052.076.054.255.059.164.005.198.001.264-.03.169-.082.212-.234.15-.525-.052-.243-.042-.28.087-.355.137-.08.281-.219.324-.314a.365.365 0 0 0-.175-.48.394.394 0 0 0-.181-.033c-.126 0-.207.03-.355.124l-.085.053-.053-.032c-.219-.13-.259-.145-.391-.143a.396.396 0 0 0-.193.032zm.39-2.195c-.373.036-.475.05-.654.086-.291.06-.68.195-.951.328-.94.46-1.589 1.226-1.787 2.114-.04.176-.045.234-.045.53 0 .294.005.357.043.524.264 1.16 1.332 2.017 2.714 2.173.3.033 1.596.033 1.896 0 1.11-.125 2.064-.727 2.493-1.571.114-.226.169-.372.22-.602.039-.167.044-.23.044-.523 0-.297-.005-.355-.045-.531-.288-1.29-1.539-2.304-3.072-2.497a6.9 6.9 0 0 0-.855-.031zm.645.937a3.3 3.3 0 0 1 1.44.514c.223.148.537.458.671.662.166.251.26.508.303.82.02.143.01.251-.043.482-.08.345-.332.705-.672.957a3.1 3.1 0 0 1-.689.348c-.382.122-.632.144-1.525.138-.582-.006-.686-.01-.853-.042-.57-.107-1.022-.334-1.35-.68-.264-.28-.385-.535-.45-.946-.03-.192.025-.509.137-.776.136-.326.488-.73.836-.963.403-.269.934-.46 1.422-.512.187-.02.586-.02.773-.002zm-5.503-11a1.65 1.65 0 0 0-.683.298C5.617.74 5.173 1.666 4.985 2.819c-.07.436-.119 1.04-.119 1.503 0 .544.064 1.24.155 1.721.02.107.031.202.023.208a8 8 0 0 1-.187.152 5.3 5.3 0 0 0-.949 1.02 5.5 5.5 0 0 0-.94 2.339 6.6 6.6 0 0 0-.023 1.357c.091.78.325 1.438.727 2.04l.13.195-.037.064c-.269.452-.498 1.105-.605 1.732-.084.496-.095.629-.095 1.294 0 .67.009.803.088 1.266.095.555.288 1.143.503 1.534.071.128.243.393.264.407.007.003-.014.067-.046.141a7.4 7.4 0 0 0-.548 1.873c-.062.417-.071.552-.071.991 0 .56.031.832.148 1.279L3.42 24h1.478l-.05-.091c-.297-.552-.325-1.575-.068-2.597.117-.472.25-.819.498-1.296l.148-.29v-.177c0-.165-.003-.184-.057-.293a.9.9 0 0 0-.194-.25 1.74 1.74 0 0 1-.385-.543c-.424-.92-.506-2.286-.208-3.451.124-.486.329-.918.544-1.154a.79.79 0 0 0 .223-.531c0-.195-.07-.355-.224-.522a3.1 3.1 0 0 1-.817-1.729c-.14-.96.114-2.005.69-2.834.563-.814 1.353-1.336 2.237-1.475.199-.033.57-.028.776.01.226.04.367.028.512-.041.179-.085.268-.19.374-.431.093-.215.165-.333.36-.576.234-.29.46-.489.822-.729.413-.27.884-.467 1.352-.561.17-.035.25-.04.569-.04.319 0 .398.005.569.04a4.07 4.07 0 0 1 1.914.997c.117.109.398.457.488.602.034.057.095.177.132.267.105.241.195.346.374.43.14.068.286.082.503.045.343-.058.607-.053.943.016 1.144.23 2.14 1.173 2.581 2.437.385 1.108.276 2.267-.296 3.153-.097.15-.193.27-.333.419-.301.322-.301.722-.001 1.053.493.539.801 1.866.708 3.036-.062.772-.26 1.463-.533 1.854a2 2 0 0 1-.224.258.9.9 0 0 0-.194.25c-.054.109-.057.128-.057.293v.178l.148.29c.248.476.38.823.498 1.295.253 1.008.231 2.01-.059 2.581a.8.8 0 0 0-.044.098c0 .006.329.009.732.009h.73l.02-.074.036-.134c.019-.076.057-.3.088-.516.029-.217.029-1.016 0-1.258-.11-.875-.295-1.57-.597-2.226-.032-.074-.053-.138-.046-.141.008-.005.057-.074.108-.152.376-.569.607-1.284.724-2.228.031-.26.031-1.378 0-1.628-.083-.645-.182-1.082-.348-1.525a6 6 0 0 0-.329-.7l-.038-.064.131-.194c.402-.604.636-1.262.727-2.04a6.6 6.6 0 0 0-.024-1.358 5.5 5.5 0 0 0-.939-2.339 5.3 5.3 0 0 0-.95-1.02 8 8 0 0 1-.186-.152.7.7 0 0 1 .023-.208c.208-1.087.201-2.443-.017-3.503-.19-.924-.535-1.658-.98-2.082-.354-.338-.716-.482-1.15-.455-.996.059-1.8 1.205-2.116 3.01a6.8 6.8 0 0 0-.097.726c0 .036-.007.066-.015.066a1 1 0 0 1-.149-.078A4.9 4.9 0 0 0 12 3.03c-.832 0-1.687.243-2.456.698a1 1 0 0 1-.148.078c-.008 0-.015-.03-.015-.066a6.7 6.7 0 0 0-.097-.725C8.997 1.392 8.337.319 7.46.048a2 2 0 0 0-.585-.041zm.293 1.402c.248.197.523.759.682 1.388.03.113.06.244.069.292.007.047.026.152.041.233.067.365.098.76.102 1.24l.002.475-.12.175-.118.178h-.278c-.324 0-.646.041-.954.124l-.238.06c-.033.007-.038-.003-.057-.144a8.4 8.4 0 0 1 .016-2.323c.124-.788.413-1.501.696-1.711.067-.05.079-.049.157.013zm9.825-.012c.17.126.358.46.498.888.28.854.36 2.028.212 3.145-.019.14-.024.151-.057.144l-.238-.06a3.7 3.7 0 0 0-.954-.124h-.278l-.119-.178-.119-.175.002-.474c.004-.669.066-1.19.214-1.772.157-.623.434-1.185.68-1.382.078-.062.09-.063.159-.012z',\n}\n\nexport interface ProviderLogoProps extends React.ComponentProps<'span'> {\n /** Preset key (`'openai'`, `'gemini'`, …) — unknown/unshipped marks fall\n * back to a monogram of the key's first letter. */\n preset: string\n /** Square icon size in px. */\n size?: number\n}\n\n/** Provider mark for setup tiles and rows: simple-icons path data keyed by\n * preset key, monogram fallback (openai/groq marks are gone upstream),\n * `currentColor` so it inherits app identity. Decorative by default\n * (`aria-hidden`) — name the tile/button it lives in. */\nexport const ProviderLogo = React.forwardRef<HTMLSpanElement, ProviderLogoProps>(\n function ProviderLogo({ preset, size = 20, className, style, ...props }, ref) {\n const path = ICON_PATHS[preset]\n return (\n <span\n ref={ref}\n data-as=\"provider-logo\"\n data-preset={preset}\n aria-hidden=\"true\"\n className={cn(\n 'inline-flex shrink-0 items-center justify-center text-[var(--as-fg)]',\n className,\n )}\n style={{ width: size, height: size, ...style }}\n {...props}\n >\n {path ? (\n <svg\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n fill=\"currentColor\"\n focusable=\"false\"\n >\n <path d={path} />\n </svg>\n ) : (\n <span\n className=\"flex h-full w-full items-center justify-center rounded-full border border-[var(--as-border)] font-semibold text-[var(--as-muted-fg)]\"\n style={{ fontSize: Math.max(8, Math.round(size / 2)) }}\n >\n {preset.charAt(0).toUpperCase()}\n </span>\n )}\n </span>\n )\n },\n)\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MarkdownSurface } from './chunk-
|
|
2
|
-
import { ChatMessage } from './chunk-
|
|
1
|
+
import { MarkdownSurface } from './chunk-KLCULTOQ.js';
|
|
2
|
+
import { ChatMessage } from './chunk-56QSIK4Y.js';
|
|
3
3
|
import { cn } from './chunk-RVVXVTH3.js';
|
|
4
4
|
import * as React2 from 'react';
|
|
5
5
|
import { Search, X, ChevronUp, ChevronDown, Square, ArrowDown } from 'lucide-react';
|
|
@@ -475,5 +475,5 @@ var ChatTranscript = React2.forwardRef(
|
|
|
475
475
|
);
|
|
476
476
|
|
|
477
477
|
export { ChatSearchField, ChatTranscript };
|
|
478
|
-
//# sourceMappingURL=chunk-
|
|
479
|
-
//# sourceMappingURL=chunk-
|
|
478
|
+
//# sourceMappingURL=chunk-E2NNTHFB.js.map
|
|
479
|
+
//# sourceMappingURL=chunk-E2NNTHFB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/chat-transcript/ChatSearchField.tsx","../src/components/chat-transcript/ChatTranscript.tsx"],"names":["React","ChatSearchField","jsx","ChatTranscript","jsxs"],"mappings":"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","file":"chunk-HXU6P5FD.js","sourcesContent":["import * as React from 'react'\nimport { ChevronDown, ChevronUp, Search, X } from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\n\nexport interface ChatSearchFieldLabels {\n search: string\n placeholder: string\n previous: string\n next: string\n clear: string\n matches: string\n}\n\nexport interface ChatSearchFieldProps {\n query: string\n onQueryChange: (query: string) => void\n /** Total matches in the transcript (drives the `n/N` readout). */\n matchCount?: number\n /** 0-based active match index. */\n activeIndex?: number\n onPrevious?: () => void\n onNext?: () => void\n labels?: Partial<ChatSearchFieldLabels>\n className?: string\n}\n\n/**\n * The in-conversation search field (plan 101 P2): controlled query input\n * with an `n/N` match readout and prev/next controls. Enter jumps to the\n * next match, Shift+Enter to the previous, Escape clears. Composed by\n * `ChatTranscript` when its `search` prop is given, or standalone.\n */\nexport const ChatSearchField = React.forwardRef<HTMLDivElement, ChatSearchFieldProps>(\n function ChatSearchField(\n { query, onQueryChange, matchCount, activeIndex, onPrevious, onNext, labels, className },\n ref,\n ) {\n const inputId = React.useId()\n\n const onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onQueryChange('')\n return\n }\n if (event.key === 'Enter') {\n event.preventDefault()\n if (event.shiftKey) {\n onPrevious?.()\n } else {\n onNext?.()\n }\n }\n }\n\n const hasMatches = matchCount !== undefined && matchCount > 0\n const readout =\n matchCount === undefined\n ? null\n : hasMatches\n ? `${(activeIndex ?? 0) + 1}/${matchCount}`\n : '0'\n\n return (\n <div\n ref={ref}\n data-as=\"chat-search-field\"\n className={cn(\n 'flex items-center gap-1 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-2 py-1',\n className,\n )}\n >\n <Search className=\"size-3.5 shrink-0 text-[var(--as-muted-fg)]\" aria-hidden />\n <input\n id={inputId}\n type=\"text\"\n value={query}\n placeholder={labels?.placeholder ?? 'Search conversation'}\n aria-label={labels?.search ?? 'Search conversation'}\n onChange={(event) => onQueryChange(event.target.value)}\n onKeyDown={onKeyDown}\n className=\"min-w-0 flex-1 bg-transparent text-xs text-[var(--as-fg)] placeholder:text-[var(--as-muted-fg)] focus-visible:outline-none\"\n />\n {readout !== null ? (\n <span\n aria-label={labels?.matches ?? 'matches'}\n className=\"shrink-0 font-mono text-[10px] tabular-nums text-[var(--as-muted-fg)]\"\n >\n {readout}\n </span>\n ) : null}\n {query !== '' ? (\n <button\n type=\"button\"\n aria-label={labels?.clear ?? 'Clear search'}\n onClick={() => onQueryChange('')}\n className=\"rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <X className=\"size-3.5\" aria-hidden />\n </button>\n ) : null}\n <button\n type=\"button\"\n aria-label={labels?.previous ?? 'Previous match'}\n disabled={!hasMatches}\n onClick={onPrevious}\n className=\"rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] disabled:pointer-events-none disabled:opacity-30 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </button>\n <button\n type=\"button\"\n aria-label={labels?.next ?? 'Next match'}\n disabled={!hasMatches}\n onClick={onNext}\n className=\"rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] disabled:pointer-events-none disabled:opacity-30 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <ChevronDown className=\"size-3.5\" aria-hidden />\n </button>\n </div>\n )\n },\n)\n","import * as React from 'react'\nimport { ArrowDown } from 'lucide-react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nimport { cn } from '../../lib/utils'\nimport { format } from 'date-fns'\nimport { Square } from 'lucide-react'\nimport { ChatMessage } from '../chat-message/ChatMessage'\nimport { MarkdownSurface } from '../chat-markdown/MarkdownSurface'\nimport type { ChatMessageView } from '../chat-core/types'\nimport { ChatSearchField, type ChatSearchFieldLabels } from './ChatSearchField'\n\nfunction toDate(value: string | number | Date | undefined): Date | undefined {\n if (value === undefined) {\n return undefined\n }\n if (value instanceof Date) {\n return value\n }\n if (typeof value === 'number') {\n return new Date(value)\n }\n const parsed = new Date(value)\n return Number.isNaN(parsed.getTime()) ? undefined : parsed\n}\n\nexport interface ChatTranscriptLabels {\n log: string\n scrollToBottom: string\n newMessages: string\n empty: string\n replied: string\n search: string\n searchPlaceholder: string\n previousMatch: string\n nextMatch: string\n clearSearch: string\n matches: string\n today: string\n yesterday: string\n stop: string\n}\n\nexport type ChatTranscriptGroupPos = 'single' | 'start' | 'mid' | 'end'\n\nexport interface ChatTranscriptSearch {\n query: string\n onQueryChange: (query: string) => void\n}\n\nexport interface ChatTranscriptProps {\n items: ChatMessageView[]\n /** Override the default `ChatMessage` + `MarkdownSurface` rendering (third arg: group position when `groupConsecutive`; fourth arg: active search query). */\n renderItem?: (message: ChatMessageView, index: number, groupPos?: ChatTranscriptGroupPos, query?: string) => React.ReactNode\n /** Streaming tail — the live turn bubble (or `ChatPending`) or any node. */\n live?: React.ReactNode\n emptyState?: React.ReactNode\n /** Stick to bottom while the user hasn't scrolled away. Default true. */\n autoScroll?: boolean\n /** Distance from the bottom that still counts as \"at the bottom\". Default 120 px. */\n scrollThresholdPx?: number\n /** Virtualize long transcripts (dynamic row measurement). Default false. */\n virtualized?: boolean\n /**\n * Tighten the spacing between consecutive same-role messages and tag\n * each row with `data-group-pos` (`single | start | mid | end`).\n * Default false.\n */\n groupConsecutive?: boolean\n /** Visual design for the default renderer: paired bubbles (default) or flat assistant prose over the panel surface. */\n design?: 'bubbles' | 'flat'\n /**\n * In-conversation search (plan 101 P2): renders `ChatSearchField`\n * above the log, highlights matches in the default renderer, and\n * jumps between them (Enter/Shift+Enter in the field, or the\n * prev/next buttons). Jump-scrolling requires a non-virtualized\n * transcript; virtualized transcripts highlight visible rows only.\n */\n search?: ChatTranscriptSearch\n /**\n * Today/Yesterday/date chips between day groups (reads\n * `ChatMessageView.createdAt`; rows without one join the previous\n * group). Default false.\n */\n showDateSeparators?: boolean\n /** Custom formatter for older-day chips (default `MMM d, yyyy`). */\n formatDate?: (date: Date) => string\n /** Scroll a message into view and flash it when this changes (branch-tree clicks, citations, deep links). */\n focusMessageId?: string | null\n /** Show a floating stop pill beside the jump pill while a live turn streams and the user scrolled away. */\n onStop?: () => void\n labels?: Partial<ChatTranscriptLabels & ChatSearchFieldLabels>\n className?: string\n}\n\nfunction defaultRenderItem(message: ChatMessageView, design: 'bubbles' | 'flat', query?: string) {\n return (\n <ChatMessage\n role={message.role}\n status={message.status}\n design={design}\n content={<MarkdownSurface value={message.content} streaming={message.status === 'streaming'} query={query} />}\n variants={message.variants}\n />\n )\n}\n\n/**\n * The conversation list: `role=\"log\"` with polite turn-completion\n * announcements, stick-to-bottom auto-scroll with an unread-counting\n * jump-to-latest pill, optional consecutive-message grouping, a top\n * fade mask while scrolled into the thread, thin themed scrollbars,\n * and optional virtualization for thousand-message threads.\n */\nexport const ChatTranscript = React.forwardRef<HTMLDivElement, ChatTranscriptProps>(\n function ChatTranscript(\n {\n items,\n renderItem,\n live,\n emptyState,\n autoScroll = true,\n scrollThresholdPx = 120,\n virtualized = false,\n groupConsecutive = false,\n design = 'bubbles',\n search,\n showDateSeparators = false,\n formatDate,\n focusMessageId,\n onStop,\n labels,\n className,\n },\n ref,\n ) {\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const atBottomRef = React.useRef(true)\n const lastScrollTopRef = React.useRef(0)\n const lastTouchYRef = React.useRef<number | null>(null)\n const [showJump, setShowJump] = React.useState(false)\n const [fadeTop, setFadeTop] = React.useState(false)\n const [unread, setUnread] = React.useState(0)\n const [announcement, setAnnouncement] = React.useState('')\n const previousCountRef = React.useRef(-1)\n const [searchActive, setSearchActive] = React.useState(0)\n const [flashId, setFlashId] = React.useState<string | null>(null)\n\n const searchNeedle = search?.query.trim().toLowerCase() ?? ''\n const searchMatches = React.useMemo(() => {\n if (searchNeedle === '') {\n return []\n }\n return items\n .map((message, index) =>\n message.content.toLowerCase().includes(searchNeedle) ? index : -1,\n )\n .filter((index) => index >= 0)\n }, [items, searchNeedle])\n\n React.useEffect(() => {\n setSearchActive(0)\n if (searchMatches.length > 0) {\n jumpToMatch(0)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchNeedle])\n\n React.useEffect(() => {\n if (flashId === null) {\n return\n }\n const id = window.setTimeout(() => setFlashId(null), 1200)\n return () => window.clearTimeout(id)\n }, [flashId])\n\n const jumpToMatch = (index: number) => {\n if (searchMatches.length === 0) {\n return\n }\n const bounded = ((index % searchMatches.length) + searchMatches.length) % searchMatches.length\n setSearchActive(bounded)\n const messageIndex = searchMatches[bounded]\n const messageId = messageIndex !== undefined ? items[messageIndex]?.id : undefined\n if (messageId === undefined) {\n return\n }\n setFlashId(messageId)\n if (!virtualized) {\n const row = scrollRef.current?.querySelector(`[data-message-id=\"${messageId}\"]`)\n row?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n }\n }\n\n React.useEffect(() => {\n if (focusMessageId === null || focusMessageId === undefined) {\n return\n }\n setFlashId(focusMessageId)\n if (!virtualized) {\n const row = scrollRef.current?.querySelector(`[data-message-id=\"${focusMessageId}\"]`)\n row?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n }\n }, [focusMessageId, virtualized])\n\n const dayKey = (message: ChatMessageView): string | null => {\n if (message.createdAt === undefined) {\n return null\n }\n const date = toDate(message.createdAt)\n return date === undefined\n ? null\n : `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`\n }\n\n const dayLabel = (message: ChatMessageView): string | null => {\n if (message.createdAt === undefined) {\n return null\n }\n const date = toDate(message.createdAt)\n if (date === undefined) {\n return null\n }\n const now = new Date()\n const startOf = (value: Date) => new Date(value.getFullYear(), value.getMonth(), value.getDate()).getTime()\n const dayDiff = Math.round((startOf(now) - startOf(date)) / 86_400_000)\n if (dayDiff === 0) {\n return labels?.today ?? 'Today'\n }\n if (dayDiff === 1) {\n return labels?.yesterday ?? 'Yesterday'\n }\n return formatDate !== undefined ? formatDate(date) : format(date, 'MMM d, yyyy')\n }\n\n const onScroll = () => {\n const element = scrollRef.current\n if (element === null) {\n return\n }\n const distance = element.scrollHeight - element.scrollTop - element.clientHeight\n const goingUp = element.scrollTop < lastScrollTopRef.current\n lastScrollTopRef.current = element.scrollTop\n const atBottom = distance <= scrollThresholdPx && !(goingUp && distance > 0)\n atBottomRef.current = atBottom\n setShowJump(element.scrollHeight > element.clientHeight && !atBottom)\n setFadeTop(element.scrollTop > 8)\n if (atBottom) {\n setUnread(0)\n }\n }\n\n /**\n * Fast streams re-pin the bottom on every render (rAF), which erases\n * a partial upward scroll before it can cross `scrollThresholdPx` —\n * so user scroll-up INTENT cancels stickiness synchronously here\n * (wheel up, touch drag up, scroll-up keys), and any upward scroll\n * event with distance left also breaks it. Scrolling back to the\n * bottom (or the jump pill) re-arms the follow.\n */\n const cancelStick = () => {\n const element = scrollRef.current\n if (element === null) {\n return\n }\n atBottomRef.current = false\n setShowJump(element.scrollHeight > element.clientHeight)\n }\n\n const onWheel = (event: React.WheelEvent<HTMLDivElement>) => {\n if (event.deltaY < 0) {\n cancelStick()\n }\n }\n\n const onTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n lastTouchYRef.current = event.touches[0]?.clientY ?? null\n }\n\n const onTouchMove = (event: React.TouchEvent<HTMLDivElement>) => {\n const y = event.touches[0]?.clientY\n if (y === undefined) {\n return\n }\n if (lastTouchYRef.current !== null && y > lastTouchYRef.current) {\n cancelStick()\n }\n lastTouchYRef.current = y\n }\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (\n event.key === 'ArrowUp' ||\n event.key === 'PageUp' ||\n event.key === 'Home' ||\n (event.key === ' ' && event.shiftKey)\n ) {\n cancelStick()\n }\n }\n\n React.useEffect(() => {\n const element = scrollRef.current\n if (element === null || !autoScroll || !atBottomRef.current) {\n return\n }\n const frame = requestAnimationFrame(() => {\n element.scrollTop = element.scrollHeight\n })\n return () => cancelAnimationFrame(frame)\n })\n\n React.useEffect(() => {\n if (previousCountRef.current === -1) {\n previousCountRef.current = items.length\n return\n }\n if (items.length > previousCountRef.current) {\n const added = items.slice(previousCountRef.current)\n previousCountRef.current = items.length\n const assistantAdded = added.filter((message) => message.role !== 'user').length\n if (assistantAdded > 0 && !atBottomRef.current) {\n setUnread((count) => count + assistantAdded)\n }\n if (added[added.length - 1]?.role !== 'user') {\n setAnnouncement(labels?.replied ?? 'Assistant replied')\n }\n return\n }\n previousCountRef.current = items.length\n }, [items, labels])\n\n const scrollToBottom = () => {\n const element = scrollRef.current\n if (element !== null) {\n setUnread(0)\n element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' })\n }\n }\n\n const groupPos = (index: number): ChatTranscriptGroupPos => {\n const role = items[index]?.role\n if (role === undefined || role === 'system') {\n return 'single'\n }\n const prevSame = index > 0 && items[index - 1]?.role === role && items[index - 1]?.role !== 'system'\n const nextSame = index < items.length - 1 && items[index + 1]?.role === role && items[index + 1]?.role !== 'system'\n if (prevSame && nextSame) {\n return 'mid'\n }\n if (prevSame) {\n return 'end'\n }\n if (nextSame) {\n return 'start'\n }\n return 'single'\n }\n\n const renderRow = (message: ChatMessageView, index: number) => {\n const pos = groupConsecutive ? groupPos(index) : undefined\n const node = renderItem\n ? renderItem(message, index, pos, searchNeedle === '' ? undefined : search?.query.trim())\n : defaultRenderItem(message, design, searchNeedle === '' ? undefined : search?.query.trim())\n const grouped = pos === 'mid' || pos === 'end'\n return (\n <div\n key={message.id}\n data-message-id={message.id}\n data-group-pos={pos}\n data-search-flash={message.id === flashId || undefined}\n className={cn(groupConsecutive && grouped && '-mt-2')}\n >\n {node}\n </div>\n )\n }\n\n const rowCount = items.length + (live !== undefined ? 1 : 0)\n const virtualizer = useVirtualizer({\n count: virtualized ? rowCount : 0,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => 120,\n overscan: 8,\n initialRect: { width: 480, height: 600 },\n })\n\n const jumpLabel = labels?.scrollToBottom ?? 'Scroll to latest'\n const jumpFullLabel =\n unread > 0 ? `${jumpLabel} — ${unread} ${labels?.newMessages ?? 'new messages'}` : jumpLabel\n\n return (\n <div\n ref={ref}\n data-as=\"chat-transcript\"\n data-grouped={groupConsecutive || undefined}\n data-fade-top={fadeTop || undefined}\n className={cn('relative flex min-h-0 flex-1 flex-col', className)}\n >\n {search ? (\n <ChatSearchField\n query={search.query}\n onQueryChange={search.onQueryChange}\n matchCount={searchMatches.length}\n activeIndex={searchActive}\n onPrevious={() => jumpToMatch(searchActive - 1)}\n onNext={() => jumpToMatch(searchActive + 1)}\n labels={\n labels\n ? ({\n search: labels.search,\n placeholder: labels.searchPlaceholder,\n previous: labels.previousMatch,\n next: labels.nextMatch,\n clear: labels.clearSearch,\n matches: labels.matches,\n } satisfies Partial<ChatSearchFieldLabels>)\n : undefined\n }\n className=\"mx-1 mb-1 shrink-0\"\n />\n ) : null}\n <div\n ref={scrollRef}\n onScroll={onScroll}\n onWheel={onWheel}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onKeyDown={onKeyDown}\n role=\"log\"\n aria-label={labels?.log ?? 'Conversation'}\n aria-busy={live !== undefined}\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-1 py-2\"\n >\n {items.length === 0 && live === undefined ? (\n <div className=\"flex h-full min-h-40 items-center justify-center p-4 text-sm text-[var(--as-muted-fg)]\">\n {emptyState ?? (labels?.empty ?? 'Start the conversation')}\n </div>\n ) : virtualized ? (\n <div style={{ height: virtualizer.getTotalSize(), position: 'relative' }}>\n {virtualizer.getVirtualItems().map((row) => {\n const isLive = row.index >= items.length\n const node = isLive ? live : renderRow(items[row.index]!, row.index)\n return (\n <div\n key={row.key}\n data-index={row.index}\n ref={virtualizer.measureElement}\n style={{ position: 'absolute', top: 0, left: 0, width: '100%', transform: `translateY(${row.start}px)` }}\n className=\"px-2 py-1.5\"\n >\n {node}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"flex flex-col gap-3 px-2\">\n {items.map((message, index) => {\n const rows: React.ReactNode[] = []\n if (showDateSeparators && index > 0) {\n const key = dayKey(message)\n const previousKey = dayKey(items[index - 1]!)\n if (key !== null && key !== previousKey) {\n const label = dayLabel(message)\n if (label !== null) {\n rows.push(\n <div key={`day-${key}-${message.id}`} data-as=\"chat-date-separator\" className=\"flex items-center gap-2 py-1\" role=\"separator\" aria-label={label}>\n <span className=\"h-px flex-1 bg-[var(--as-border)]\" aria-hidden />\n <span className=\"text-[10px] font-medium uppercase tracking-wide text-[var(--as-muted-fg)]\">{label}</span>\n <span className=\"h-px flex-1 bg-[var(--as-border)]\" aria-hidden />\n </div>,\n )\n }\n }\n }\n rows.push(renderRow(message, index))\n return <React.Fragment key={message.id}>{rows}</React.Fragment>\n })}\n {live !== undefined ? <div data-as=\"chat-transcript-live\">{live}</div> : null}\n </div>\n )}\n </div>\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n {showJump && live !== undefined && onStop !== undefined ? (\n <button\n type=\"button\"\n onClick={onStop}\n aria-label={labels?.stop ?? 'Stop generating'}\n title={labels?.stop ?? 'Stop generating'}\n className=\"as-anim-slide-up absolute bottom-3 right-3 flex size-8 items-center justify-center rounded-full border border-[var(--as-border)] bg-[var(--as-surface-raised)] text-[var(--as-fg)] shadow-[var(--as-shadow-2)] transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <Square className=\"size-3.5\" aria-hidden />\n </button>\n ) : null}\n {showJump ? (\n <button\n type=\"button\"\n onClick={scrollToBottom}\n aria-label={jumpFullLabel}\n title={jumpFullLabel}\n className=\"as-anim-slide-up absolute bottom-3 left-1/2 -ml-4 flex size-8 items-center justify-center rounded-full border border-[var(--as-border)] bg-[var(--as-surface-raised)] text-[var(--as-fg)] shadow-[var(--as-shadow-2)] transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <ArrowDown className=\"size-4\" aria-hidden />\n {unread > 0 ? (\n <span\n aria-hidden\n className=\"absolute -right-1.5 -top-1.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-[var(--as-primary)] px-1 text-[10px] font-semibold leading-none text-[var(--as-primary-fg)]\"\n >\n {unread > 9 ? '9+' : unread}\n </span>\n ) : null}\n </button>\n ) : null}\n </div>\n )\n },\n)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/chat-transcript/ChatSearchField.tsx","../src/components/chat-transcript/ChatTranscript.tsx"],"names":["React","ChatSearchField","jsx","ChatTranscript","jsxs"],"mappings":";;;;;;;;;AAiCO,IAAM,eAAA,GAAwBA,MAAA,CAAA,UAAA;AAAA,EACnC,SAASC,gBAAAA,CACP,EAAE,KAAA,EAAO,aAAA,EAAe,UAAA,EAAY,WAAA,EAAa,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAU,EACvF,GAAA,EACA;AACA,IAAA,MAAM,UAAgBD,MAAA,CAAA,KAAA,EAAM;AAE5B,IAAA,MAAM,SAAA,GAA0D,CAAC,KAAA,KAAU;AACzE,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,aAAA,CAAc,EAAE,CAAA;AAChB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,UAAA,IAAa;AAAA,QACf,CAAA,MAAO;AACL,UAAA,MAAA,IAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,UAAA,KAAe,MAAA,IAAa,UAAA,GAAa,CAAA;AAC5D,IAAA,MAAM,OAAA,GACJ,UAAA,KAAe,MAAA,GACX,IAAA,GACA,UAAA,GACE,CAAA,EAAA,CAAI,WAAA,IAAe,CAAA,IAAK,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,GACvC,GAAA;AAER,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,mBAAA;AAAA,QACR,SAAA,EAAW,EAAA;AAAA,UACT,sHAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,6CAAA,EAA8C,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,0BAC5E,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,OAAA;AAAA,cACJ,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,QAAQ,WAAA,IAAe,qBAAA;AAAA,cACpC,YAAA,EAAY,QAAQ,MAAA,IAAU,qBAAA;AAAA,cAC9B,UAAU,CAAC,KAAA,KAAU,aAAA,CAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACrD,SAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,UACC,YAAY,IAAA,mBACX,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAY,QAAQ,OAAA,IAAW,SAAA;AAAA,cAC/B,SAAA,EAAU,uEAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WACH,GACE,IAAA;AAAA,UACH,UAAU,EAAA,mBACT,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAY,QAAQ,KAAA,IAAS,cAAA;AAAA,cAC7B,OAAA,EAAS,MAAM,aAAA,CAAc,EAAE,CAAA;AAAA,cAC/B,SAAA,EAAU,+MAAA;AAAA,cAEV,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA,WACtC,GACE,IAAA;AAAA,0BACJ,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAY,QAAQ,QAAA,IAAY,gBAAA;AAAA,cAChC,UAAU,CAAC,UAAA;AAAA,cACX,OAAA,EAAS,UAAA;AAAA,cACT,SAAA,EAAU,gQAAA;AAAA,cAEV,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA,WAC9C;AAAA,0BACA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAY,QAAQ,IAAA,IAAQ,YAAA;AAAA,cAC5B,UAAU,CAAC,UAAA;AAAA,cACX,OAAA,EAAS,MAAA;AAAA,cACT,SAAA,EAAU,gQAAA;AAAA,cAEV,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA;AAChD;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AC/GA,SAAS,OAAO,KAAA,EAA6D;AAC3E,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AAAA,EACvB;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,KAAK,CAAA;AAC7B,EAAA,OAAO,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,IAAI,MAAA,GAAY,MAAA;AACtD;AAuEA,SAAS,iBAAA,CAAkB,OAAA,EAA0B,MAAA,EAA4B,KAAA,EAAgB;AAC/F,EAAA,uBACEE,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAA;AAAA,MACA,OAAA,kBAASA,GAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,MAAA,KAAW,WAAA,EAAa,KAAA,EAAc,CAAA;AAAA,MAC3G,UAAU,OAAA,CAAQ;AAAA;AAAA,GACpB;AAEJ;AASO,IAAM,cAAA,GAAuB,MAAA,CAAA,UAAA;AAAA,EAClC,SAASC,eAAAA,CACP;AAAA,IACE,KAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA,GAAa,IAAA;AAAA,IACb,iBAAA,GAAoB,GAAA;AAAA,IACpB,WAAA,GAAc,KAAA;AAAA,IACd,gBAAA,GAAmB,KAAA;AAAA,IACnB,MAAA,GAAS,SAAA;AAAA,IACT,MAAA;AAAA,IACA,kBAAA,GAAqB,KAAA;AAAA,IACrB,UAAA;AAAA,IACA,cAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,KAEF,GAAA,EACA;AACA,IAAA,MAAM,SAAA,GAAkB,cAA8B,IAAI,CAAA;AAC1D,IAAA,MAAM,WAAA,GAAoB,cAAO,IAAI,CAAA;AACrC,IAAA,MAAM,gBAAA,GAAyB,cAAO,CAAC,CAAA;AACvC,IAAA,MAAM,aAAA,GAAsB,cAAsB,IAAI,CAAA;AACtD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAU,gBAAS,KAAK,CAAA;AACpD,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,gBAAS,KAAK,CAAA;AAClD,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,gBAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,gBAAS,EAAE,CAAA;AACzD,IAAA,MAAM,gBAAA,GAAyB,cAAO,EAAE,CAAA;AACxC,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,gBAAS,CAAC,CAAA;AACxD,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAEhE,IAAA,MAAM,eAAe,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,aAAY,IAAK,EAAA;AAC3D,IAAA,MAAM,aAAA,GAAsB,eAAQ,MAAM;AACxC,MAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,OAAO,KAAA,CACJ,GAAA;AAAA,QAAI,CAAC,OAAA,EAAS,KAAA,KACb,OAAA,CAAQ,OAAA,CAAQ,aAAY,CAAE,QAAA,CAAS,YAAY,CAAA,GAAI,KAAA,GAAQ;AAAA,OACjE,CACC,MAAA,CAAO,CAAC,KAAA,KAAU,SAAS,CAAC,CAAA;AAAA,IACjC,CAAA,EAAG,CAAC,KAAA,EAAO,YAAY,CAAC,CAAA;AAExB,IAAM,iBAAU,MAAM;AACpB,MAAA,eAAA,CAAgB,CAAC,CAAA;AACjB,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,QAAA,WAAA,CAAY,CAAC,CAAA;AAAA,MACf;AAAA,IAEF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,IAAM,iBAAU,MAAM;AACpB,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,UAAA,CAAW,IAAI,GAAG,IAAI,CAAA;AACzD,MAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AAAA,IACrC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAkB;AACrC,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,WAAY,KAAA,GAAQ,aAAA,CAAc,MAAA,GAAU,aAAA,CAAc,UAAU,aAAA,CAAc,MAAA;AACxF,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,MAAM,YAAA,GAAe,cAAc,OAAO,CAAA;AAC1C,MAAA,MAAM,YAAY,YAAA,KAAiB,MAAA,GAAY,KAAA,CAAM,YAAY,GAAG,EAAA,GAAK,MAAA;AACzE,MAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,UAAA,CAAW,SAAS,CAAA;AACpB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,MAAM,SAAA,CAAU,OAAA,EAAS,aAAA,CAAc,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,CAAI,CAAA;AAC/E,QAAA,GAAA,EAAK,eAAe,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA;AAEA,IAAM,iBAAU,MAAM;AACpB,MAAA,IAAI,cAAA,KAAmB,IAAA,IAAQ,cAAA,KAAmB,MAAA,EAAW;AAC3D,QAAA;AAAA,MACF;AACA,MAAA,UAAA,CAAW,cAAc,CAAA;AACzB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,MAAM,SAAA,CAAU,OAAA,EAAS,aAAA,CAAc,CAAA,kBAAA,EAAqB,cAAc,CAAA,EAAA,CAAI,CAAA;AACpF,QAAA,GAAA,EAAK,eAAe,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA,EAAG,CAAC,cAAA,EAAgB,WAAW,CAAC,CAAA;AAEhC,IAAA,MAAM,MAAA,GAAS,CAAC,OAAA,KAA4C;AAC1D,MAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AACrC,MAAA,OAAO,IAAA,KAAS,MAAA,GACZ,IAAA,GACA,CAAA,EAAG,KAAK,WAAA,EAAa,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,EAAU,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,IAChE,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAA4C;AAC5D,MAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AACrC,MAAA,IAAI,SAAS,MAAA,EAAW;AACtB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAgB,IAAI,KAAK,KAAA,CAAM,WAAA,EAAY,EAAG,KAAA,CAAM,UAAS,EAAG,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAQ;AAC1G,MAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,OAAA,CAAQ,IAAI,CAAA,IAAK,KAAU,CAAA;AACtE,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,OAAO,QAAQ,KAAA,IAAS,OAAA;AAAA,MAC1B;AACA,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,OAAO,QAAQ,SAAA,IAAa,WAAA;AAAA,MAC9B;AACA,MAAA,OAAO,eAAe,MAAA,GAAY,UAAA,CAAW,IAAI,CAAA,GAAI,MAAA,CAAO,MAAM,aAAa,CAAA;AAAA,IACjF,CAAA;AAEA,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,YAAA,GAAe,OAAA,CAAQ,YAAY,OAAA,CAAQ,YAAA;AACpE,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,SAAA,GAAY,gBAAA,CAAiB,OAAA;AACrD,MAAA,gBAAA,CAAiB,UAAU,OAAA,CAAQ,SAAA;AACnC,MAAA,MAAM,QAAA,GAAW,QAAA,IAAY,iBAAA,IAAqB,EAAE,WAAW,QAAA,GAAW,CAAA,CAAA;AAC1E,MAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,MAAA,WAAA,CAAY,OAAA,CAAQ,YAAA,GAAe,OAAA,CAAQ,YAAA,IAAgB,CAAC,QAAQ,CAAA;AACpE,MAAA,UAAA,CAAW,OAAA,CAAQ,YAAY,CAAC,CAAA;AAChC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,SAAA,CAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AAUA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA,WAAA,CAAY,OAAA,CAAQ,YAAA,GAAe,OAAA,CAAQ,YAAY,CAAA;AAAA,IACzD,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAA4C;AAC3D,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,WAAA,EAAY;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA4C;AAChE,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,OAAA,IAAW,IAAA;AAAA,IACvD,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA4C;AAC/D,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAA;AAC5B,MAAA,IAAI,MAAM,MAAA,EAAW;AACnB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,aAAA,CAAc,OAAA,KAAY,IAAA,IAAQ,CAAA,GAAI,cAAc,OAAA,EAAS;AAC/D,QAAA,WAAA,EAAY;AAAA,MACd;AACA,MAAA,aAAA,CAAc,OAAA,GAAU,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA+C;AAChE,MAAA,IACE,KAAA,CAAM,GAAA,KAAQ,SAAA,IACd,KAAA,CAAM,GAAA,KAAQ,QAAA,IACd,KAAA,CAAM,GAAA,KAAQ,MAAA,IACb,KAAA,CAAM,GAAA,KAAQ,GAAA,IAAO,MAAM,QAAA,EAC5B;AACA,QAAA,WAAA,EAAY;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAM,iBAAU,MAAM;AACpB,MAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,MAAA,IAAI,YAAY,IAAA,IAAQ,CAAC,UAAA,IAAc,CAAC,YAAY,OAAA,EAAS;AAC3D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,sBAAsB,MAAM;AACxC,QAAA,OAAA,CAAQ,YAAY,OAAA,CAAQ,YAAA;AAAA,MAC9B,CAAC,CAAA;AACD,MAAA,OAAO,MAAM,qBAAqB,KAAK,CAAA;AAAA,IACzC,CAAC,CAAA;AAED,IAAM,iBAAU,MAAM;AACpB,MAAA,IAAI,gBAAA,CAAiB,YAAY,EAAA,EAAI;AACnC,QAAA,gBAAA,CAAiB,UAAU,KAAA,CAAM,MAAA;AACjC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,MAAA,GAAS,gBAAA,CAAiB,OAAA,EAAS;AAC3C,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,gBAAA,CAAiB,OAAO,CAAA;AAClD,QAAA,gBAAA,CAAiB,UAAU,KAAA,CAAM,MAAA;AACjC,QAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,CAAC,YAAY,OAAA,CAAQ,IAAA,KAAS,MAAM,CAAA,CAAE,MAAA;AAC1E,QAAA,IAAI,cAAA,GAAiB,CAAA,IAAK,CAAC,WAAA,CAAY,OAAA,EAAS;AAC9C,UAAA,SAAA,CAAU,CAAC,KAAA,KAAU,KAAA,GAAQ,cAAc,CAAA;AAAA,QAC7C;AACA,QAAA,IAAI,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,EAAG,SAAS,MAAA,EAAQ;AAC5C,UAAA,eAAA,CAAgB,MAAA,EAAQ,WAAW,mBAAmB,CAAA;AAAA,QACxD;AACA,QAAA;AAAA,MACF;AACA,MAAA,gBAAA,CAAiB,UAAU,KAAA,CAAM,MAAA;AAAA,IACnC,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,SAAA,CAAU,CAAC,CAAA;AACX,QAAA,OAAA,CAAQ,SAAS,EAAE,GAAA,EAAK,QAAQ,YAAA,EAAc,QAAA,EAAU,UAAU,CAAA;AAAA,MACpE;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAA0C;AAC1D,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA;AAC3B,MAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,QAAA,EAAU;AAC3C,QAAA,OAAO,QAAA;AAAA,MACT;AACA,MAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,CAAA,IAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,IAAA,KAAS,IAAA,IAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,GAAG,IAAA,KAAS,QAAA;AAC5F,MAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,KAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,SAAS,IAAA,IAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,GAAG,IAAA,KAAS,QAAA;AAC3G,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,OAAA,EAA0B,KAAA,KAAkB;AAC7D,MAAA,MAAM,GAAA,GAAM,gBAAA,GAAmB,QAAA,CAAS,KAAK,CAAA,GAAI,MAAA;AACjD,MAAA,MAAM,IAAA,GAAO,aACT,UAAA,CAAW,OAAA,EAAS,OAAO,GAAA,EAAK,YAAA,KAAiB,EAAA,GAAK,MAAA,GAAY,MAAA,EAAQ,KAAA,CAAM,MAAM,CAAA,GACtF,iBAAA,CAAkB,OAAA,EAAS,MAAA,EAAQ,YAAA,KAAiB,KAAK,MAAA,GAAY,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,CAAA;AAC7F,MAAA,MAAM,OAAA,GAAU,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,KAAA;AACzC,MAAA,uBACED,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,mBAAiB,OAAA,CAAQ,EAAA;AAAA,UACzB,gBAAA,EAAgB,GAAA;AAAA,UAChB,mBAAA,EAAmB,OAAA,CAAQ,EAAA,KAAO,OAAA,IAAW,MAAA;AAAA,UAC7C,SAAA,EAAW,EAAA,CAAG,gBAAA,IAAoB,OAAA,IAAW,OAAO,CAAA;AAAA,UAEnD,QAAA,EAAA;AAAA,SAAA;AAAA,QANI,OAAA,CAAQ;AAAA,OAOf;AAAA,IAEJ,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,IAAU,IAAA,KAAS,SAAY,CAAA,GAAI,CAAA,CAAA;AAC1D,IAAA,MAAM,cAAc,cAAA,CAAe;AAAA,MACjC,KAAA,EAAO,cAAc,QAAA,GAAW,CAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,SAAA,CAAU,OAAA;AAAA,MAClC,cAAc,MAAM,GAAA;AAAA,MACpB,QAAA,EAAU,CAAA;AAAA,MACV,WAAA,EAAa,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA;AAAI,KACxC,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,QAAQ,cAAA,IAAkB,kBAAA;AAC5C,IAAA,MAAM,aAAA,GACJ,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,SAAS,CAAA,QAAA,EAAM,MAAM,CAAA,CAAA,EAAI,MAAA,EAAQ,WAAA,IAAe,cAAc,CAAA,CAAA,GAAK,SAAA;AAErF,IAAA,uBACEE,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,iBAAA;AAAA,QACR,gBAAc,gBAAA,IAAoB,MAAA;AAAA,QAClC,iBAAe,OAAA,IAAW,MAAA;AAAA,QAC1B,SAAA,EAAW,EAAA,CAAG,uCAAA,EAAyC,SAAS,CAAA;AAAA,QAE/D,QAAA,EAAA;AAAA,UAAA,MAAA,mBACCF,GAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,eAAe,MAAA,CAAO,aAAA;AAAA,cACtB,YAAY,aAAA,CAAc,MAAA;AAAA,cAC1B,WAAA,EAAa,YAAA;AAAA,cACb,UAAA,EAAY,MAAM,WAAA,CAAY,YAAA,GAAe,CAAC,CAAA;AAAA,cAC9C,MAAA,EAAQ,MAAM,WAAA,CAAY,YAAA,GAAe,CAAC,CAAA;AAAA,cAC1C,QACE,MAAA,GACK;AAAA,gBACC,QAAQ,MAAA,CAAO,MAAA;AAAA,gBACf,aAAa,MAAA,CAAO,iBAAA;AAAA,gBACpB,UAAU,MAAA,CAAO,aAAA;AAAA,gBACjB,MAAM,MAAA,CAAO,SAAA;AAAA,gBACb,OAAO,MAAA,CAAO,WAAA;AAAA,gBACd,SAAS,MAAA,CAAO;AAAA,eAClB,GACA,MAAA;AAAA,cAEN,SAAA,EAAU;AAAA;AAAA,WACZ,GACE,IAAA;AAAA,0BACJA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,SAAA;AAAA,cACL,QAAA;AAAA,cACA,OAAA;AAAA,cACA,YAAA;AAAA,cACA,WAAA;AAAA,cACA,SAAA;AAAA,cACA,IAAA,EAAK,KAAA;AAAA,cACL,YAAA,EAAY,QAAQ,GAAA,IAAO,cAAA;AAAA,cAC3B,aAAW,IAAA,KAAS,MAAA;AAAA,cACpB,SAAA,EAAU,6DAAA;AAAA,cAET,QAAA,EAAA,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,IAAA,KAAS,yBAC9BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACZ,QAAA,EAAA,UAAA,KAAe,MAAA,EAAQ,KAAA,IAAS,2BACnC,CAAA,GACE,WAAA,mBACFA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,YAAY,YAAA,EAAa,EAAG,QAAA,EAAU,UAAA,IACzD,QAAA,EAAA,WAAA,CAAY,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC1C,gBAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,IAAS,KAAA,CAAM,MAAA;AAClC,gBAAA,MAAM,IAAA,GAAO,SAAS,IAAA,GAAO,SAAA,CAAU,MAAM,GAAA,CAAI,KAAK,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA;AACnE,gBAAA,uBACEA,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBAEC,cAAY,GAAA,CAAI,KAAA;AAAA,oBAChB,KAAK,WAAA,CAAY,cAAA;AAAA,oBACjB,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,CAAA,WAAA,EAAc,GAAA,CAAI,KAAK,CAAA,GAAA,CAAA,EAAM;AAAA,oBACvG,SAAA,EAAU,aAAA;AAAA,oBAET,QAAA,EAAA;AAAA,mBAAA;AAAA,kBANI,GAAA,CAAI;AAAA,iBAOX;AAAA,cAEJ,CAAC,CAAA,EACH,CAAA,mBAEAE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,KAAA,CAAM,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AAC7B,kBAAA,MAAM,OAA0B,EAAC;AACjC,kBAAA,IAAI,kBAAA,IAAsB,QAAQ,CAAA,EAAG;AACnC,oBAAA,MAAM,GAAA,GAAM,OAAO,OAAO,CAAA;AAC1B,oBAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAE,CAAA;AAC5C,oBAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,WAAA,EAAa;AACvC,sBAAA,MAAM,KAAA,GAAQ,SAAS,OAAO,CAAA;AAC9B,sBAAA,IAAI,UAAU,IAAA,EAAM;AAClB,wBAAA,IAAA,CAAK,IAAA;AAAA,0CACHA,IAAAA,CAAC,KAAA,EAAA,EAAqC,SAAA,EAAQ,qBAAA,EAAsB,WAAU,8BAAA,EAA+B,IAAA,EAAK,WAAA,EAAY,YAAA,EAAY,KAAA,EACxI,QAAA,EAAA;AAAA,4CAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC,eAAW,IAAA,EAAC,CAAA;AAAA,4CAChEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6EAA6E,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,4CACnGA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC,eAAW,IAAA,EAAC;AAAA,2BAAA,EAAA,EAHxD,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,EAAI,OAAA,CAAQ,EAAE,CAAA,CAIlC;AAAA,yBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AACA,kBAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,KAAK,CAAC,CAAA;AACnC,kBAAA,uBAAOA,GAAAA,CAAO,MAAA,CAAA,QAAA,EAAN,EAAiC,QAAA,EAAA,IAAA,EAAA,EAAb,QAAQ,EAAU,CAAA;AAAA,gBAChD,CAAC,CAAA;AAAA,gBACA,IAAA,KAAS,yBAAYA,GAAAA,CAAC,SAAI,SAAA,EAAQ,sBAAA,EAAwB,gBAAK,CAAA,GAAS;AAAA,eAAA,EAC3E;AAAA;AAAA,WAEJ;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,aAAU,QAAA,EAAS,SAAA,EAAU,WAC/B,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,UACC,QAAA,IAAY,IAAA,KAAS,MAAA,IAAa,MAAA,KAAW,yBAC5CA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAA;AAAA,cACT,YAAA,EAAY,QAAQ,IAAA,IAAQ,iBAAA;AAAA,cAC5B,KAAA,EAAO,QAAQ,IAAA,IAAQ,iBAAA;AAAA,cACvB,SAAA,EAAU,qWAAA;AAAA,cAEV,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA,WAC3C,GACE,IAAA;AAAA,UACH,2BACCE,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,cAAA;AAAA,cACT,YAAA,EAAY,aAAA;AAAA,cACZ,KAAA,EAAO,aAAA;AAAA,cACP,SAAA,EAAU,4WAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAF,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,gBACzC,MAAA,GAAS,oBACRA,GAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAW,IAAA;AAAA,oBACX,SAAA,EAAU,uLAAA;AAAA,oBAET,QAAA,EAAA,MAAA,GAAS,IAAI,IAAA,GAAO;AAAA;AAAA,iBACvB,GACE;AAAA;AAAA;AAAA,WACN,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF","file":"chunk-E2NNTHFB.js","sourcesContent":["import * as React from 'react'\nimport { ChevronDown, ChevronUp, Search, X } from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\n\nexport interface ChatSearchFieldLabels {\n search: string\n placeholder: string\n previous: string\n next: string\n clear: string\n matches: string\n}\n\nexport interface ChatSearchFieldProps {\n query: string\n onQueryChange: (query: string) => void\n /** Total matches in the transcript (drives the `n/N` readout). */\n matchCount?: number\n /** 0-based active match index. */\n activeIndex?: number\n onPrevious?: () => void\n onNext?: () => void\n labels?: Partial<ChatSearchFieldLabels>\n className?: string\n}\n\n/**\n * The in-conversation search field (plan 101 P2): controlled query input\n * with an `n/N` match readout and prev/next controls. Enter jumps to the\n * next match, Shift+Enter to the previous, Escape clears. Composed by\n * `ChatTranscript` when its `search` prop is given, or standalone.\n */\nexport const ChatSearchField = React.forwardRef<HTMLDivElement, ChatSearchFieldProps>(\n function ChatSearchField(\n { query, onQueryChange, matchCount, activeIndex, onPrevious, onNext, labels, className },\n ref,\n ) {\n const inputId = React.useId()\n\n const onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onQueryChange('')\n return\n }\n if (event.key === 'Enter') {\n event.preventDefault()\n if (event.shiftKey) {\n onPrevious?.()\n } else {\n onNext?.()\n }\n }\n }\n\n const hasMatches = matchCount !== undefined && matchCount > 0\n const readout =\n matchCount === undefined\n ? null\n : hasMatches\n ? `${(activeIndex ?? 0) + 1}/${matchCount}`\n : '0'\n\n return (\n <div\n ref={ref}\n data-as=\"chat-search-field\"\n className={cn(\n 'flex items-center gap-1 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-2 py-1',\n className,\n )}\n >\n <Search className=\"size-3.5 shrink-0 text-[var(--as-muted-fg)]\" aria-hidden />\n <input\n id={inputId}\n type=\"text\"\n value={query}\n placeholder={labels?.placeholder ?? 'Search conversation'}\n aria-label={labels?.search ?? 'Search conversation'}\n onChange={(event) => onQueryChange(event.target.value)}\n onKeyDown={onKeyDown}\n className=\"min-w-0 flex-1 bg-transparent text-xs text-[var(--as-fg)] placeholder:text-[var(--as-muted-fg)] focus-visible:outline-none\"\n />\n {readout !== null ? (\n <span\n aria-label={labels?.matches ?? 'matches'}\n className=\"shrink-0 font-mono text-[10px] tabular-nums text-[var(--as-muted-fg)]\"\n >\n {readout}\n </span>\n ) : null}\n {query !== '' ? (\n <button\n type=\"button\"\n aria-label={labels?.clear ?? 'Clear search'}\n onClick={() => onQueryChange('')}\n className=\"rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <X className=\"size-3.5\" aria-hidden />\n </button>\n ) : null}\n <button\n type=\"button\"\n aria-label={labels?.previous ?? 'Previous match'}\n disabled={!hasMatches}\n onClick={onPrevious}\n className=\"rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] disabled:pointer-events-none disabled:opacity-30 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </button>\n <button\n type=\"button\"\n aria-label={labels?.next ?? 'Next match'}\n disabled={!hasMatches}\n onClick={onNext}\n className=\"rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] disabled:pointer-events-none disabled:opacity-30 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <ChevronDown className=\"size-3.5\" aria-hidden />\n </button>\n </div>\n )\n },\n)\n","import * as React from 'react'\nimport { ArrowDown } from 'lucide-react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nimport { cn } from '../../lib/utils'\nimport { format } from 'date-fns'\nimport { Square } from 'lucide-react'\nimport { ChatMessage } from '../chat-message/ChatMessage'\nimport { MarkdownSurface } from '../chat-markdown/MarkdownSurface'\nimport type { ChatMessageView } from '../chat-core/types'\nimport { ChatSearchField, type ChatSearchFieldLabels } from './ChatSearchField'\n\nfunction toDate(value: string | number | Date | undefined): Date | undefined {\n if (value === undefined) {\n return undefined\n }\n if (value instanceof Date) {\n return value\n }\n if (typeof value === 'number') {\n return new Date(value)\n }\n const parsed = new Date(value)\n return Number.isNaN(parsed.getTime()) ? undefined : parsed\n}\n\nexport interface ChatTranscriptLabels {\n log: string\n scrollToBottom: string\n newMessages: string\n empty: string\n replied: string\n search: string\n searchPlaceholder: string\n previousMatch: string\n nextMatch: string\n clearSearch: string\n matches: string\n today: string\n yesterday: string\n stop: string\n}\n\nexport type ChatTranscriptGroupPos = 'single' | 'start' | 'mid' | 'end'\n\nexport interface ChatTranscriptSearch {\n query: string\n onQueryChange: (query: string) => void\n}\n\nexport interface ChatTranscriptProps {\n items: ChatMessageView[]\n /** Override the default `ChatMessage` + `MarkdownSurface` rendering (third arg: group position when `groupConsecutive`; fourth arg: active search query). */\n renderItem?: (message: ChatMessageView, index: number, groupPos?: ChatTranscriptGroupPos, query?: string) => React.ReactNode\n /** Streaming tail — the live turn bubble (or `ChatPending`) or any node. */\n live?: React.ReactNode\n emptyState?: React.ReactNode\n /** Stick to bottom while the user hasn't scrolled away. Default true. */\n autoScroll?: boolean\n /** Distance from the bottom that still counts as \"at the bottom\". Default 120 px. */\n scrollThresholdPx?: number\n /** Virtualize long transcripts (dynamic row measurement). Default false. */\n virtualized?: boolean\n /**\n * Tighten the spacing between consecutive same-role messages and tag\n * each row with `data-group-pos` (`single | start | mid | end`).\n * Default false.\n */\n groupConsecutive?: boolean\n /** Visual design for the default renderer: paired bubbles (default) or flat assistant prose over the panel surface. */\n design?: 'bubbles' | 'flat'\n /**\n * In-conversation search (plan 101 P2): renders `ChatSearchField`\n * above the log, highlights matches in the default renderer, and\n * jumps between them (Enter/Shift+Enter in the field, or the\n * prev/next buttons). Jump-scrolling requires a non-virtualized\n * transcript; virtualized transcripts highlight visible rows only.\n */\n search?: ChatTranscriptSearch\n /**\n * Today/Yesterday/date chips between day groups (reads\n * `ChatMessageView.createdAt`; rows without one join the previous\n * group). Default false.\n */\n showDateSeparators?: boolean\n /** Custom formatter for older-day chips (default `MMM d, yyyy`). */\n formatDate?: (date: Date) => string\n /** Scroll a message into view and flash it when this changes (branch-tree clicks, citations, deep links). */\n focusMessageId?: string | null\n /** Show a floating stop pill beside the jump pill while a live turn streams and the user scrolled away. */\n onStop?: () => void\n labels?: Partial<ChatTranscriptLabels & ChatSearchFieldLabels>\n className?: string\n}\n\nfunction defaultRenderItem(message: ChatMessageView, design: 'bubbles' | 'flat', query?: string) {\n return (\n <ChatMessage\n role={message.role}\n status={message.status}\n design={design}\n content={<MarkdownSurface value={message.content} streaming={message.status === 'streaming'} query={query} />}\n variants={message.variants}\n />\n )\n}\n\n/**\n * The conversation list: `role=\"log\"` with polite turn-completion\n * announcements, stick-to-bottom auto-scroll with an unread-counting\n * jump-to-latest pill, optional consecutive-message grouping, a top\n * fade mask while scrolled into the thread, thin themed scrollbars,\n * and optional virtualization for thousand-message threads.\n */\nexport const ChatTranscript = React.forwardRef<HTMLDivElement, ChatTranscriptProps>(\n function ChatTranscript(\n {\n items,\n renderItem,\n live,\n emptyState,\n autoScroll = true,\n scrollThresholdPx = 120,\n virtualized = false,\n groupConsecutive = false,\n design = 'bubbles',\n search,\n showDateSeparators = false,\n formatDate,\n focusMessageId,\n onStop,\n labels,\n className,\n },\n ref,\n ) {\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const atBottomRef = React.useRef(true)\n const lastScrollTopRef = React.useRef(0)\n const lastTouchYRef = React.useRef<number | null>(null)\n const [showJump, setShowJump] = React.useState(false)\n const [fadeTop, setFadeTop] = React.useState(false)\n const [unread, setUnread] = React.useState(0)\n const [announcement, setAnnouncement] = React.useState('')\n const previousCountRef = React.useRef(-1)\n const [searchActive, setSearchActive] = React.useState(0)\n const [flashId, setFlashId] = React.useState<string | null>(null)\n\n const searchNeedle = search?.query.trim().toLowerCase() ?? ''\n const searchMatches = React.useMemo(() => {\n if (searchNeedle === '') {\n return []\n }\n return items\n .map((message, index) =>\n message.content.toLowerCase().includes(searchNeedle) ? index : -1,\n )\n .filter((index) => index >= 0)\n }, [items, searchNeedle])\n\n React.useEffect(() => {\n setSearchActive(0)\n if (searchMatches.length > 0) {\n jumpToMatch(0)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchNeedle])\n\n React.useEffect(() => {\n if (flashId === null) {\n return\n }\n const id = window.setTimeout(() => setFlashId(null), 1200)\n return () => window.clearTimeout(id)\n }, [flashId])\n\n const jumpToMatch = (index: number) => {\n if (searchMatches.length === 0) {\n return\n }\n const bounded = ((index % searchMatches.length) + searchMatches.length) % searchMatches.length\n setSearchActive(bounded)\n const messageIndex = searchMatches[bounded]\n const messageId = messageIndex !== undefined ? items[messageIndex]?.id : undefined\n if (messageId === undefined) {\n return\n }\n setFlashId(messageId)\n if (!virtualized) {\n const row = scrollRef.current?.querySelector(`[data-message-id=\"${messageId}\"]`)\n row?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n }\n }\n\n React.useEffect(() => {\n if (focusMessageId === null || focusMessageId === undefined) {\n return\n }\n setFlashId(focusMessageId)\n if (!virtualized) {\n const row = scrollRef.current?.querySelector(`[data-message-id=\"${focusMessageId}\"]`)\n row?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n }\n }, [focusMessageId, virtualized])\n\n const dayKey = (message: ChatMessageView): string | null => {\n if (message.createdAt === undefined) {\n return null\n }\n const date = toDate(message.createdAt)\n return date === undefined\n ? null\n : `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`\n }\n\n const dayLabel = (message: ChatMessageView): string | null => {\n if (message.createdAt === undefined) {\n return null\n }\n const date = toDate(message.createdAt)\n if (date === undefined) {\n return null\n }\n const now = new Date()\n const startOf = (value: Date) => new Date(value.getFullYear(), value.getMonth(), value.getDate()).getTime()\n const dayDiff = Math.round((startOf(now) - startOf(date)) / 86_400_000)\n if (dayDiff === 0) {\n return labels?.today ?? 'Today'\n }\n if (dayDiff === 1) {\n return labels?.yesterday ?? 'Yesterday'\n }\n return formatDate !== undefined ? formatDate(date) : format(date, 'MMM d, yyyy')\n }\n\n const onScroll = () => {\n const element = scrollRef.current\n if (element === null) {\n return\n }\n const distance = element.scrollHeight - element.scrollTop - element.clientHeight\n const goingUp = element.scrollTop < lastScrollTopRef.current\n lastScrollTopRef.current = element.scrollTop\n const atBottom = distance <= scrollThresholdPx && !(goingUp && distance > 0)\n atBottomRef.current = atBottom\n setShowJump(element.scrollHeight > element.clientHeight && !atBottom)\n setFadeTop(element.scrollTop > 8)\n if (atBottom) {\n setUnread(0)\n }\n }\n\n /**\n * Fast streams re-pin the bottom on every render (rAF), which erases\n * a partial upward scroll before it can cross `scrollThresholdPx` —\n * so user scroll-up INTENT cancels stickiness synchronously here\n * (wheel up, touch drag up, scroll-up keys), and any upward scroll\n * event with distance left also breaks it. Scrolling back to the\n * bottom (or the jump pill) re-arms the follow.\n */\n const cancelStick = () => {\n const element = scrollRef.current\n if (element === null) {\n return\n }\n atBottomRef.current = false\n setShowJump(element.scrollHeight > element.clientHeight)\n }\n\n const onWheel = (event: React.WheelEvent<HTMLDivElement>) => {\n if (event.deltaY < 0) {\n cancelStick()\n }\n }\n\n const onTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n lastTouchYRef.current = event.touches[0]?.clientY ?? null\n }\n\n const onTouchMove = (event: React.TouchEvent<HTMLDivElement>) => {\n const y = event.touches[0]?.clientY\n if (y === undefined) {\n return\n }\n if (lastTouchYRef.current !== null && y > lastTouchYRef.current) {\n cancelStick()\n }\n lastTouchYRef.current = y\n }\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (\n event.key === 'ArrowUp' ||\n event.key === 'PageUp' ||\n event.key === 'Home' ||\n (event.key === ' ' && event.shiftKey)\n ) {\n cancelStick()\n }\n }\n\n React.useEffect(() => {\n const element = scrollRef.current\n if (element === null || !autoScroll || !atBottomRef.current) {\n return\n }\n const frame = requestAnimationFrame(() => {\n element.scrollTop = element.scrollHeight\n })\n return () => cancelAnimationFrame(frame)\n })\n\n React.useEffect(() => {\n if (previousCountRef.current === -1) {\n previousCountRef.current = items.length\n return\n }\n if (items.length > previousCountRef.current) {\n const added = items.slice(previousCountRef.current)\n previousCountRef.current = items.length\n const assistantAdded = added.filter((message) => message.role !== 'user').length\n if (assistantAdded > 0 && !atBottomRef.current) {\n setUnread((count) => count + assistantAdded)\n }\n if (added[added.length - 1]?.role !== 'user') {\n setAnnouncement(labels?.replied ?? 'Assistant replied')\n }\n return\n }\n previousCountRef.current = items.length\n }, [items, labels])\n\n const scrollToBottom = () => {\n const element = scrollRef.current\n if (element !== null) {\n setUnread(0)\n element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' })\n }\n }\n\n const groupPos = (index: number): ChatTranscriptGroupPos => {\n const role = items[index]?.role\n if (role === undefined || role === 'system') {\n return 'single'\n }\n const prevSame = index > 0 && items[index - 1]?.role === role && items[index - 1]?.role !== 'system'\n const nextSame = index < items.length - 1 && items[index + 1]?.role === role && items[index + 1]?.role !== 'system'\n if (prevSame && nextSame) {\n return 'mid'\n }\n if (prevSame) {\n return 'end'\n }\n if (nextSame) {\n return 'start'\n }\n return 'single'\n }\n\n const renderRow = (message: ChatMessageView, index: number) => {\n const pos = groupConsecutive ? groupPos(index) : undefined\n const node = renderItem\n ? renderItem(message, index, pos, searchNeedle === '' ? undefined : search?.query.trim())\n : defaultRenderItem(message, design, searchNeedle === '' ? undefined : search?.query.trim())\n const grouped = pos === 'mid' || pos === 'end'\n return (\n <div\n key={message.id}\n data-message-id={message.id}\n data-group-pos={pos}\n data-search-flash={message.id === flashId || undefined}\n className={cn(groupConsecutive && grouped && '-mt-2')}\n >\n {node}\n </div>\n )\n }\n\n const rowCount = items.length + (live !== undefined ? 1 : 0)\n const virtualizer = useVirtualizer({\n count: virtualized ? rowCount : 0,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => 120,\n overscan: 8,\n initialRect: { width: 480, height: 600 },\n })\n\n const jumpLabel = labels?.scrollToBottom ?? 'Scroll to latest'\n const jumpFullLabel =\n unread > 0 ? `${jumpLabel} — ${unread} ${labels?.newMessages ?? 'new messages'}` : jumpLabel\n\n return (\n <div\n ref={ref}\n data-as=\"chat-transcript\"\n data-grouped={groupConsecutive || undefined}\n data-fade-top={fadeTop || undefined}\n className={cn('relative flex min-h-0 flex-1 flex-col', className)}\n >\n {search ? (\n <ChatSearchField\n query={search.query}\n onQueryChange={search.onQueryChange}\n matchCount={searchMatches.length}\n activeIndex={searchActive}\n onPrevious={() => jumpToMatch(searchActive - 1)}\n onNext={() => jumpToMatch(searchActive + 1)}\n labels={\n labels\n ? ({\n search: labels.search,\n placeholder: labels.searchPlaceholder,\n previous: labels.previousMatch,\n next: labels.nextMatch,\n clear: labels.clearSearch,\n matches: labels.matches,\n } satisfies Partial<ChatSearchFieldLabels>)\n : undefined\n }\n className=\"mx-1 mb-1 shrink-0\"\n />\n ) : null}\n <div\n ref={scrollRef}\n onScroll={onScroll}\n onWheel={onWheel}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onKeyDown={onKeyDown}\n role=\"log\"\n aria-label={labels?.log ?? 'Conversation'}\n aria-busy={live !== undefined}\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-1 py-2\"\n >\n {items.length === 0 && live === undefined ? (\n <div className=\"flex h-full min-h-40 items-center justify-center p-4 text-sm text-[var(--as-muted-fg)]\">\n {emptyState ?? (labels?.empty ?? 'Start the conversation')}\n </div>\n ) : virtualized ? (\n <div style={{ height: virtualizer.getTotalSize(), position: 'relative' }}>\n {virtualizer.getVirtualItems().map((row) => {\n const isLive = row.index >= items.length\n const node = isLive ? live : renderRow(items[row.index]!, row.index)\n return (\n <div\n key={row.key}\n data-index={row.index}\n ref={virtualizer.measureElement}\n style={{ position: 'absolute', top: 0, left: 0, width: '100%', transform: `translateY(${row.start}px)` }}\n className=\"px-2 py-1.5\"\n >\n {node}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"flex flex-col gap-3 px-2\">\n {items.map((message, index) => {\n const rows: React.ReactNode[] = []\n if (showDateSeparators && index > 0) {\n const key = dayKey(message)\n const previousKey = dayKey(items[index - 1]!)\n if (key !== null && key !== previousKey) {\n const label = dayLabel(message)\n if (label !== null) {\n rows.push(\n <div key={`day-${key}-${message.id}`} data-as=\"chat-date-separator\" className=\"flex items-center gap-2 py-1\" role=\"separator\" aria-label={label}>\n <span className=\"h-px flex-1 bg-[var(--as-border)]\" aria-hidden />\n <span className=\"text-[10px] font-medium uppercase tracking-wide text-[var(--as-muted-fg)]\">{label}</span>\n <span className=\"h-px flex-1 bg-[var(--as-border)]\" aria-hidden />\n </div>,\n )\n }\n }\n }\n rows.push(renderRow(message, index))\n return <React.Fragment key={message.id}>{rows}</React.Fragment>\n })}\n {live !== undefined ? <div data-as=\"chat-transcript-live\">{live}</div> : null}\n </div>\n )}\n </div>\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n {showJump && live !== undefined && onStop !== undefined ? (\n <button\n type=\"button\"\n onClick={onStop}\n aria-label={labels?.stop ?? 'Stop generating'}\n title={labels?.stop ?? 'Stop generating'}\n className=\"as-anim-slide-up absolute bottom-3 right-3 flex size-8 items-center justify-center rounded-full border border-[var(--as-border)] bg-[var(--as-surface-raised)] text-[var(--as-fg)] shadow-[var(--as-shadow-2)] transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <Square className=\"size-3.5\" aria-hidden />\n </button>\n ) : null}\n {showJump ? (\n <button\n type=\"button\"\n onClick={scrollToBottom}\n aria-label={jumpFullLabel}\n title={jumpFullLabel}\n className=\"as-anim-slide-up absolute bottom-3 left-1/2 -ml-4 flex size-8 items-center justify-center rounded-full border border-[var(--as-border)] bg-[var(--as-surface-raised)] text-[var(--as-fg)] shadow-[var(--as-shadow-2)] transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n >\n <ArrowDown className=\"size-4\" aria-hidden />\n {unread > 0 ? (\n <span\n aria-hidden\n className=\"absolute -right-1.5 -top-1.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-[var(--as-primary)] px-1 text-[10px] font-semibold leading-none text-[var(--as-primary-fg)]\"\n >\n {unread > 9 ? '9+' : unread}\n </span>\n ) : null}\n </button>\n ) : null}\n </div>\n )\n },\n)\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { cn } from './chunk-RVVXVTH3.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var SwitchRow = React.forwardRef(
|
|
6
|
+
function SwitchRow2({
|
|
7
|
+
label,
|
|
8
|
+
checked,
|
|
9
|
+
onCheckedChange,
|
|
10
|
+
currentValue,
|
|
11
|
+
disabled = false,
|
|
12
|
+
className,
|
|
13
|
+
onClick,
|
|
14
|
+
...props
|
|
15
|
+
}, ref) {
|
|
16
|
+
return /* @__PURE__ */ jsxs(
|
|
17
|
+
"button",
|
|
18
|
+
{
|
|
19
|
+
ref,
|
|
20
|
+
type: "button",
|
|
21
|
+
role: "switch",
|
|
22
|
+
"aria-checked": checked,
|
|
23
|
+
disabled,
|
|
24
|
+
"data-as": "switch-row",
|
|
25
|
+
"data-state": checked ? "checked" : "unchecked",
|
|
26
|
+
onClick: (event) => {
|
|
27
|
+
onClick?.(event);
|
|
28
|
+
if (event.defaultPrevented) return;
|
|
29
|
+
onCheckedChange(!checked);
|
|
30
|
+
},
|
|
31
|
+
className: cn(
|
|
32
|
+
"flex w-full cursor-pointer items-center justify-between gap-3 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-left text-sm text-[var(--as-fg)] transition-colors hover:bg-[var(--as-muted)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none disabled:opacity-50",
|
|
33
|
+
className
|
|
34
|
+
),
|
|
35
|
+
...props,
|
|
36
|
+
children: [
|
|
37
|
+
/* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col gap-0.5", children: [
|
|
38
|
+
/* @__PURE__ */ jsx("span", { className: "truncate font-medium", children: label }),
|
|
39
|
+
currentValue != null && currentValue !== "" ? /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-[var(--as-muted-fg)]", children: currentValue }) : null
|
|
40
|
+
] }),
|
|
41
|
+
/* @__PURE__ */ jsx(
|
|
42
|
+
"span",
|
|
43
|
+
{
|
|
44
|
+
"aria-hidden": "true",
|
|
45
|
+
className: cn(
|
|
46
|
+
"relative h-5 w-9 shrink-0 rounded-full transition-colors duration-150",
|
|
47
|
+
checked ? "bg-[var(--as-primary)]" : "bg-[var(--as-border)]"
|
|
48
|
+
),
|
|
49
|
+
children: /* @__PURE__ */ jsx(
|
|
50
|
+
"span",
|
|
51
|
+
{
|
|
52
|
+
className: cn(
|
|
53
|
+
"absolute top-0.5 h-4 w-4 rounded-full bg-[var(--as-surface-raised)] shadow transition-all duration-150",
|
|
54
|
+
checked ? "left-[1.125rem]" : "left-0.5"
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
export { SwitchRow };
|
|
67
|
+
//# sourceMappingURL=chunk-FQXVZVA5.js.map
|
|
68
|
+
//# sourceMappingURL=chunk-FQXVZVA5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/switch-row/SwitchRow.tsx"],"names":["SwitchRow"],"mappings":";;;;AAmBO,IAAM,SAAA,GAAkB,KAAA,CAAA,UAAA;AAAA,EAC7B,SAASA,UAAAA,CACP;AAAA,IACE,KAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,EACA;AACA,IAAA,uBACE,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,cAAA,EAAc,OAAA;AAAA,QACd,QAAA;AAAA,QACA,SAAA,EAAQ,YAAA;AAAA,QACR,YAAA,EAAY,UAAU,SAAA,GAAY,WAAA;AAAA,QAClC,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,UAAA,OAAA,GAAU,KAAK,CAAA;AACf,UAAA,IAAI,MAAM,gBAAA,EAAkB;AAC5B,UAAA,eAAA,CAAgB,CAAC,OAAO,CAAA;AAAA,QAC1B,CAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,oYAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EACd,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,YAC7C,YAAA,IAAgB,QAAQ,YAAA,KAAiB,EAAA,uBACvC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA,YAAA,EACH,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAW,EAAA;AAAA,gBACT,uEAAA;AAAA,gBACA,UAAU,wBAAA,GAA2B;AAAA,eACvC;AAAA,cAEA,QAAA,kBAAA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,wGAAA;AAAA,oBACA,UAAU,iBAAA,GAAoB;AAAA;AAChC;AAAA;AACF;AAAA;AACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF","file":"chunk-FQXVZVA5.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\n\nexport interface SwitchRowProps\n extends Omit<React.ComponentProps<'button'>, 'onChange'> {\n /** Visible row label — doubles as the switch's accessible name. */\n label: React.ReactNode\n /** Controlled on/off state. */\n checked: boolean\n /** Controlled toggle. */\n onCheckedChange: (checked: boolean) => void\n /** Sub-line under the label — apps pass the current value (\"now: gpt-5\"). */\n currentValue?: React.ReactNode\n disabled?: boolean\n}\n\n/** Labeled `role=\"switch\"` row with an animated knob — the standalone\n * settings toggle the family's setup surfaces (desktop/study/health)\n * previously hand-rolled. */\nexport const SwitchRow = React.forwardRef<HTMLButtonElement, SwitchRowProps>(\n function SwitchRow(\n {\n label,\n checked,\n onCheckedChange,\n currentValue,\n disabled = false,\n className,\n onClick,\n ...props\n },\n ref,\n ) {\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n data-as=\"switch-row\"\n data-state={checked ? 'checked' : 'unchecked'}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n onCheckedChange(!checked)\n }}\n className={cn(\n 'flex w-full cursor-pointer items-center justify-between gap-3 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 text-left text-sm text-[var(--as-fg)] transition-colors hover:bg-[var(--as-muted)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none disabled:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"truncate font-medium\">{label}</span>\n {currentValue != null && currentValue !== '' ? (\n <span className=\"truncate text-xs text-[var(--as-muted-fg)]\">\n {currentValue}\n </span>\n ) : null}\n </span>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'relative h-5 w-9 shrink-0 rounded-full transition-colors duration-150',\n checked ? 'bg-[var(--as-primary)]' : 'bg-[var(--as-border)]',\n )}\n >\n <span\n className={cn(\n 'absolute top-0.5 h-4 w-4 rounded-full bg-[var(--as-surface-raised)] shadow transition-all duration-150',\n checked ? 'left-[1.125rem]' : 'left-0.5',\n )}\n />\n </span>\n </button>\n )\n },\n)\n"]}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { SwitchRow } from './chunk-FQXVZVA5.js';
|
|
2
|
+
import { cn } from './chunk-RVVXVTH3.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Scale, Database, Volume2, Mic, Wrench, Eye, Type, Check } from 'lucide-react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var DEFAULT_CAP_ICONS = {
|
|
8
|
+
text: Type,
|
|
9
|
+
vision: Eye,
|
|
10
|
+
tools: Wrench,
|
|
11
|
+
stt: Mic,
|
|
12
|
+
tts: Volume2,
|
|
13
|
+
embeddings: Database,
|
|
14
|
+
decision: Scale
|
|
15
|
+
};
|
|
16
|
+
var SetupReview = React.forwardRef(
|
|
17
|
+
function SetupReview2({
|
|
18
|
+
models,
|
|
19
|
+
slots,
|
|
20
|
+
onOptionsChange,
|
|
21
|
+
capIcons,
|
|
22
|
+
modelsLabel = "Models to save",
|
|
23
|
+
footnote = "Existing assignments and models are never removed.",
|
|
24
|
+
className,
|
|
25
|
+
...props
|
|
26
|
+
}, ref) {
|
|
27
|
+
const icons = { ...DEFAULT_CAP_ICONS, ...capIcons };
|
|
28
|
+
const body = (curatedIds, slotOverrides = {}) => ({
|
|
29
|
+
curatedIds,
|
|
30
|
+
bindChat: slotOverrides.bindChat ?? slots.some((slot) => slot.optionsKey === "bindChat" && slot.bind),
|
|
31
|
+
bindVision: slotOverrides.bindVision ?? slots.some((slot) => slot.optionsKey === "bindVision" && slot.bind),
|
|
32
|
+
bindStt: slotOverrides.bindStt ?? slots.some((slot) => slot.optionsKey === "bindStt" && slot.bind),
|
|
33
|
+
bindDecision: slotOverrides.bindDecision ?? slots.some((slot) => slot.optionsKey === "bindDecision" && slot.bind)
|
|
34
|
+
});
|
|
35
|
+
const toggleModel = (id) => {
|
|
36
|
+
const next = models.filter(
|
|
37
|
+
(model) => model.selected !== (model.id === id)
|
|
38
|
+
);
|
|
39
|
+
onOptionsChange(body(next.map((model) => model.id)));
|
|
40
|
+
};
|
|
41
|
+
const toggleSlot = (slot) => {
|
|
42
|
+
onOptionsChange(
|
|
43
|
+
body(
|
|
44
|
+
models.filter((model) => model.selected).map((model) => model.id),
|
|
45
|
+
{ [slot.optionsKey]: !slot.bind }
|
|
46
|
+
)
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
return /* @__PURE__ */ jsxs(
|
|
50
|
+
"div",
|
|
51
|
+
{
|
|
52
|
+
ref,
|
|
53
|
+
"data-as": "setup-review",
|
|
54
|
+
className: cn("flex w-full flex-col gap-4", className),
|
|
55
|
+
...props,
|
|
56
|
+
children: [
|
|
57
|
+
models.length > 0 ? /* @__PURE__ */ jsx(
|
|
58
|
+
"div",
|
|
59
|
+
{
|
|
60
|
+
role: "group",
|
|
61
|
+
"aria-label": modelsLabel,
|
|
62
|
+
className: "grid grid-cols-1 gap-2 sm:grid-cols-2",
|
|
63
|
+
children: models.map((model) => {
|
|
64
|
+
const selected = model.selected;
|
|
65
|
+
const caps = model.caps ?? [];
|
|
66
|
+
return /* @__PURE__ */ jsxs(
|
|
67
|
+
"button",
|
|
68
|
+
{
|
|
69
|
+
type: "button",
|
|
70
|
+
"aria-pressed": selected,
|
|
71
|
+
"data-model-id": model.id,
|
|
72
|
+
onClick: () => toggleModel(model.id),
|
|
73
|
+
className: cn(
|
|
74
|
+
"flex cursor-pointer items-center justify-between gap-2 rounded-[var(--as-radius)] border px-3 py-2 text-left text-sm text-[var(--as-fg)] transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]",
|
|
75
|
+
selected ? "border-[var(--as-focus-ring)] bg-[var(--as-muted)]" : "border-[var(--as-border)] opacity-70 hover:opacity-100"
|
|
76
|
+
),
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col gap-1", children: [
|
|
79
|
+
/* @__PURE__ */ jsx("span", { className: "truncate font-medium", children: model.name }),
|
|
80
|
+
caps.length > 0 ? /* @__PURE__ */ jsx("span", { className: "flex items-center gap-2 text-xs text-[var(--as-muted-fg)]", children: caps.map((cap) => {
|
|
81
|
+
const Icon = icons[cap];
|
|
82
|
+
return Icon ? /* @__PURE__ */ jsx(Icon, { className: "size-3.5", "aria-hidden": true }, cap) : null;
|
|
83
|
+
}) }) : null
|
|
84
|
+
] }),
|
|
85
|
+
selected ? /* @__PURE__ */ jsx(Check, { className: "size-4 shrink-0", "aria-hidden": true }) : null
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
model.id
|
|
89
|
+
);
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
) : null,
|
|
93
|
+
slots.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: slots.map((slot) => /* @__PURE__ */ jsx(
|
|
94
|
+
SwitchRow,
|
|
95
|
+
{
|
|
96
|
+
label: slot.label,
|
|
97
|
+
checked: slot.bind,
|
|
98
|
+
currentValue: slot.currentValue,
|
|
99
|
+
onCheckedChange: () => toggleSlot(slot)
|
|
100
|
+
},
|
|
101
|
+
slot.id
|
|
102
|
+
)) }) : null,
|
|
103
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--as-muted-fg)]", children: footnote })
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
export { SetupReview };
|
|
111
|
+
//# sourceMappingURL=chunk-FY3NCPFO.js.map
|
|
112
|
+
//# sourceMappingURL=chunk-FY3NCPFO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/setup-review/SetupReview.tsx"],"names":["SetupReview"],"mappings":"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","file":"chunk-FY3NCPFO.js","sourcesContent":["import * as React from 'react'\nimport {\n Check,\n Database,\n Eye,\n Mic,\n Scale,\n Type,\n Volume2,\n Wrench,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { SwitchRow } from '../switch-row/SwitchRow'\n\n/** One curated model card (capability icons render from `caps`). */\nexport interface SetupReviewModel {\n id: string\n name: string\n caps?: string[]\n selected: boolean\n}\n\n/** The five-bind option keys of the §15 options body (camelCase — desktop\n * IPC; Python apps convert to snake_case app-side). */\nexport type SetupReviewOptionsKey =\n | 'bindChat'\n | 'bindVision'\n | 'bindStt'\n | 'bindDecision'\n\n/** One gap-fill switch. Pass one slot per `optionsKey` — chat presets show\n * text/vision/stt slots, decision-only presets show the decision slot only;\n * the current value of every slot the bind would fill rides `currentValue`. */\nexport interface SetupReviewSlot {\n id: string\n label: string\n bind: boolean\n currentValue?: string\n optionsKey: SetupReviewOptionsKey\n}\n\n/** The options body a setup run carries (plan 26 D14) — `curatedIds` in the\n * order the cards are given, one bind flag per capability group. */\nexport interface SetupReviewOptions {\n curatedIds: string[]\n bindChat: boolean\n bindVision: boolean\n bindStt: boolean\n bindDecision: boolean\n}\n\nconst DEFAULT_CAP_ICONS: Record<string, LucideIcon> = {\n text: Type,\n vision: Eye,\n tools: Wrench,\n stt: Mic,\n tts: Volume2,\n embeddings: Database,\n decision: Scale,\n}\n\nexport interface SetupReviewProps extends React.ComponentProps<'div'> {\n models: SetupReviewModel[]\n slots: SetupReviewSlot[]\n /** Emits the full options body on every card/switch edit — controlled:\n * feed the changed state back through `models`/`slots`. */\n onOptionsChange: (options: SetupReviewOptions) => void\n /** Per-capability icon override (capability string → icon). */\n capIcons?: Partial<Record<string, LucideIcon>>\n modelsLabel?: string\n footnote?: string\n}\n\n/** Editable pre-flight review (plan 26 §6): model-select cards with\n * capability icons plus gap-fill switch rows with `now:` sub-lines and the\n * never-removes footnote. Emits the five-bind options body\n * `{curatedIds, bindChat, bindVision, bindStt, bindDecision}` — append\n * semantics mean nothing existing is ever removed. */\nexport const SetupReview = React.forwardRef<HTMLDivElement, SetupReviewProps>(\n function SetupReview(\n {\n models,\n slots,\n onOptionsChange,\n capIcons,\n modelsLabel = 'Models to save',\n footnote = 'Existing assignments and models are never removed.',\n className,\n ...props\n },\n ref,\n ) {\n const icons = { ...DEFAULT_CAP_ICONS, ...capIcons }\n const body = (\n curatedIds: string[],\n slotOverrides: Partial<Record<SetupReviewOptionsKey, boolean>> = {},\n ): SetupReviewOptions => ({\n curatedIds,\n bindChat: slotOverrides.bindChat ?? slots.some((slot) => slot.optionsKey === 'bindChat' && slot.bind),\n bindVision: slotOverrides.bindVision ?? slots.some((slot) => slot.optionsKey === 'bindVision' && slot.bind),\n bindStt: slotOverrides.bindStt ?? slots.some((slot) => slot.optionsKey === 'bindStt' && slot.bind),\n bindDecision: slotOverrides.bindDecision ?? slots.some((slot) => slot.optionsKey === 'bindDecision' && slot.bind),\n })\n\n const toggleModel = (id: string): void => {\n const next = models.filter(\n (model) => model.selected !== (model.id === id),\n )\n onOptionsChange(body(next.map((model) => model.id)))\n }\n\n const toggleSlot = (slot: SetupReviewSlot): void => {\n onOptionsChange(\n body(\n models.filter((model) => model.selected).map((model) => model.id),\n { [slot.optionsKey]: !slot.bind },\n ),\n )\n }\n\n return (\n <div\n ref={ref}\n data-as=\"setup-review\"\n className={cn('flex w-full flex-col gap-4', className)}\n {...props}\n >\n {models.length > 0 ? (\n <div\n role=\"group\"\n aria-label={modelsLabel}\n className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\"\n >\n {models.map((model) => {\n const selected = model.selected\n const caps = model.caps ?? []\n return (\n <button\n key={model.id}\n type=\"button\"\n aria-pressed={selected}\n data-model-id={model.id}\n onClick={() => toggleModel(model.id)}\n className={cn(\n 'flex cursor-pointer items-center justify-between gap-2 rounded-[var(--as-radius)] border px-3 py-2 text-left text-sm text-[var(--as-fg)] transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]',\n selected\n ? 'border-[var(--as-focus-ring)] bg-[var(--as-muted)]'\n : 'border-[var(--as-border)] opacity-70 hover:opacity-100',\n )}\n >\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"truncate font-medium\">{model.name}</span>\n {caps.length > 0 ? (\n <span className=\"flex items-center gap-2 text-xs text-[var(--as-muted-fg)]\">\n {caps.map((cap) => {\n const Icon = icons[cap]\n return Icon ? (\n <Icon key={cap} className=\"size-3.5\" aria-hidden />\n ) : null\n })}\n </span>\n ) : null}\n </span>\n {selected ? (\n <Check className=\"size-4 shrink-0\" aria-hidden />\n ) : null}\n </button>\n )\n })}\n </div>\n ) : null}\n\n {slots.length > 0 ? (\n <div className=\"flex flex-col gap-2\">\n {slots.map((slot) => (\n <SwitchRow\n key={slot.id}\n label={slot.label}\n checked={slot.bind}\n currentValue={slot.currentValue}\n onCheckedChange={() => toggleSlot(slot)}\n />\n ))}\n </div>\n ) : null}\n\n <p className=\"text-xs text-[var(--as-muted-fg)]\">{footnote}</p>\n </div>\n )\n },\n)\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-KKZLR3YD.js"}
|
|
@@ -266,7 +266,7 @@ var MarkdownSurface = React3.memo(
|
|
|
266
266
|
ref,
|
|
267
267
|
"data-as": "chat-markdown",
|
|
268
268
|
"data-streaming": streaming || void 0,
|
|
269
|
-
className: cn("min-w-0
|
|
269
|
+
className: cn("min-w-0", className),
|
|
270
270
|
children: [
|
|
271
271
|
/* @__PURE__ */ jsx(
|
|
272
272
|
ReactMarkdown,
|
|
@@ -286,5 +286,5 @@ var MarkdownSurface = React3.memo(
|
|
|
286
286
|
);
|
|
287
287
|
|
|
288
288
|
export { MarkdownCodeBlock, MarkdownSurface, MermaidDiagram };
|
|
289
|
-
//# sourceMappingURL=chunk-
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
289
|
+
//# sourceMappingURL=chunk-KLCULTOQ.js.map
|
|
290
|
+
//# sourceMappingURL=chunk-KLCULTOQ.js.map
|