@marimo-team/frontend 0.23.17-dev43 → 0.23.17-dev46

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.
Files changed (51) hide show
  1. package/dist/assets/{JsonOutput-CWfu9qbN.js → JsonOutput-W3f6H6VQ.js} +1 -1
  2. package/dist/assets/{MarimoErrorOutput-B9QSRg6T.js → MarimoErrorOutput-COZo8cfk.js} +3 -3
  3. package/dist/assets/{add-cell-with-ai-GZi9Icll.js → add-cell-with-ai-CuLILhtV.js} +1 -1
  4. package/dist/assets/{add-connection-dialog-D2WiF1f8.js → add-connection-dialog-Dld_PDdZ.js} +1 -1
  5. package/dist/assets/{agent-panel-BWIkm6ln.js → agent-panel-3Ta5EPgw.js} +1 -1
  6. package/dist/assets/{ai-model-dropdown-BmcXWjub.js → ai-model-dropdown-CIqhiHxf.js} +1 -1
  7. package/dist/assets/{app-config-button-QHaORuxs.js → app-config-button-EyzXs1Nt.js} +1 -1
  8. package/dist/assets/{cell-editor-Cwor7oUx.js → cell-editor-C5qD14SG.js} +1 -1
  9. package/dist/assets/{chat-display-CH-dFAC3.js → chat-display-CBpsXLHT.js} +1 -1
  10. package/dist/assets/chat-panel-VAvLxFDw.js +4 -0
  11. package/dist/assets/{chat-ui-DDkwFM3p.js → chat-ui-BcI4PAQ1.js} +1 -1
  12. package/dist/assets/{column-preview-Dw1ASLnm.js → column-preview-Dxxs9Brz.js} +1 -1
  13. package/dist/assets/{command-palette--Mo9OaH2.js → command-palette-B1EO8oVR.js} +1 -1
  14. package/dist/assets/{components-BQ3c1B_F.js → components-RV25kGIW.js} +1 -1
  15. package/dist/assets/config-BVfo0E1-.js +1 -0
  16. package/dist/assets/{datasource-DfQvKiJ1.js → datasource-D0eBPOXe.js} +1 -1
  17. package/dist/assets/{dependency-graph-panel-gbgUGtYS.js → dependency-graph-panel-BKWUzXHX.js} +1 -1
  18. package/dist/assets/{edit-page-DhZPSJ6P.js → edit-page-GtsW1Yeh.js} +4 -4
  19. package/dist/assets/{error-panel-Upmm4kG5.js → error-panel-v0YdlA0h.js} +1 -1
  20. package/dist/assets/{file-explorer-panel-BulU96v_.js → file-explorer-panel-DSZY0Q7h.js} +1 -1
  21. package/dist/assets/{form-D-Bo8F9Q.js → form-BGoLLcgk.js} +1 -1
  22. package/dist/assets/{home-page-Dvm2dFdU.js → home-page-DLeE6pH_.js} +1 -1
  23. package/dist/assets/{index-BPwg3EAk.js → index-C_pCjmat.js} +3 -3
  24. package/dist/assets/index-WoaGtlKd.css +2 -0
  25. package/dist/assets/{layout-D7Yzn4XY.js → layout-QkEddeXT.js} +3 -3
  26. package/dist/assets/{packages-panel-IN-yS3e2.js → packages-panel-CiKYP9Ij.js} +1 -1
  27. package/dist/assets/{panels-C5PIEySE.js → panels-Swk0l08v.js} +1 -1
  28. package/dist/assets/{reveal-component-BPaqYFXU.js → reveal-component-De_cjq3p.js} +1 -1
  29. package/dist/assets/{run-page-kWVbQ6KV.js → run-page-DmXT_-MQ.js} +1 -1
  30. package/dist/assets/{scratchpad-panel-l1iGto9s.js → scratchpad-panel-BtGHIRdJ.js} +1 -1
  31. package/dist/assets/{session-panel-CBmLYzFL.js → session-panel-kBLydN0h.js} +1 -1
  32. package/dist/assets/{skeleton-DhhF_mJP.js → skeleton-CJymG2v3.js} +1 -1
  33. package/dist/assets/state-DDimGh2o.js +1 -0
  34. package/dist/assets/{useCellActionButton-CrFbi8en.js → useCellActionButton-n2-2xb-5.js} +1 -1
  35. package/dist/assets/{useDependencyPanelTab-OeFV2bye.js → useDependencyPanelTab-DQZmbkd-.js} +1 -1
  36. package/dist/assets/{useNotebookActions-CylmZilh.js → useNotebookActions-BUQta3nX.js} +1 -1
  37. package/dist/index.html +9 -9
  38. package/package.json +1 -1
  39. package/src/components/ai/ai-model-dropdown.tsx +2 -2
  40. package/src/components/chat/__tests__/capabilities-popover.test.tsx +38 -0
  41. package/src/components/chat/capabilities-popover.tsx +68 -0
  42. package/src/components/chat/chat-panel.tsx +17 -12
  43. package/src/components/editor/chrome/wrapper/useOpenAiAssistant.ts +2 -2
  44. package/src/core/ai/__tests__/config.test.tsx +96 -0
  45. package/src/core/ai/config.ts +16 -22
  46. package/src/core/ai/state.ts +10 -0
  47. package/src/core/network/types.ts +1 -0
  48. package/dist/assets/chat-panel-DLgorYjE.js +0 -4
  49. package/dist/assets/config-Cbkt6Rb1.js +0 -1
  50. package/dist/assets/index-Dttsymhw.css +0 -2
  51. package/dist/assets/state-COqqdiUM.js +0 -1
@@ -36,7 +36,7 @@ import {
36
36
  SelectTrigger,
37
37
  } from "@/components/ui/select";
38
38
  import { replaceMessagesInChat } from "@/core/ai/chat-utils";
39
- import { useModelChange } from "@/core/ai/config";
39
+ import { useAIConfigActions } from "@/core/ai/config";
40
40
  import { AI_SDK_UI_THROTTLE_MS } from "@/core/ai/constants";
41
41
  import { AiModelId } from "@/core/ai/ids/ids";
42
42
  import { useStagedAICellsActions } from "@/core/ai/staged-cells";
@@ -44,6 +44,7 @@ import {
44
44
  activeChatAtom,
45
45
  type Chat,
46
46
  type ChatId,
47
+ chatOptionsAtom,
47
48
  chatStateAtom,
48
49
  pendingAiPromptAtom,
49
50
  } from "@/core/ai/state";
@@ -91,6 +92,7 @@ import {
91
92
  } from "./chat-abort";
92
93
  import { renderUIMessage } from "./chat-display";
93
94
  import { ChatHistoryPopover } from "./chat-history-popover";
95
+ import { CapabilitiesPopover } from "./capabilities-popover";
94
96
  import {
95
97
  type ChatMessagePart,
96
98
  convertToFileUIPart,
@@ -298,7 +300,7 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
298
300
  const currentModel = ai?.models?.chat_model || DEFAULT_AI_MODEL;
299
301
  const currentProvider = AiModelId.parse(currentModel).providerId;
300
302
 
301
- const { saveModeChange } = useModelChange();
303
+ const { saveModeChange } = useAIConfigActions();
302
304
 
303
305
  const modeOptions: {
304
306
  value: CopilotMode;
@@ -326,8 +328,9 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
326
328
  },
327
329
  {
328
330
  value: "code_mode",
329
- label: "Code Mode (experimental)",
330
- subtitle: "AI with access to the notebook's kernel. Use with caution.",
331
+ label: "Code Mode",
332
+ subtitle:
333
+ "AI with access to the notebook's kernel. Can overwrite changes.",
331
334
  Icon: CodeIcon,
332
335
  },
333
336
  ];
@@ -341,12 +344,12 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
341
344
 
342
345
  return (
343
346
  <TooltipProvider>
344
- <div className="px-3 py-2 border-t border-border/20 flex flex-row flex-wrap items-center justify-between gap-1">
345
- <div className="flex items-center gap-2">
347
+ <div className="px-3 py-2 border-t border-border/20 flex flex-wrap items-center gap-1">
348
+ <div className="flex flex-wrap items-center gap-1">
346
349
  <Select value={currentMode} onValueChange={saveModeChange}>
347
- <SelectTrigger className="h-6 text-xs border-border shadow-none! ring-0! bg-muted hover:bg-muted/30 py-0 px-2 gap-1.5">
350
+ <SelectTrigger className="h-6 text-xs border-border shadow-none! ring-0! bg-muted hover:bg-muted/30 py-0 px-2 gap-1.5 shrink-0">
348
351
  {CurrentModeIcon && <CurrentModeIcon className="h-3 w-3" />}
349
- <span>{CurrentModeLabel}</span>
352
+ <span className="text-nowrap">{CurrentModeLabel}</span>
350
353
  </SelectTrigger>
351
354
  <SelectContent>
352
355
  <SelectGroup>
@@ -377,13 +380,14 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
377
380
  </Select>
378
381
  <AIModelDropdown
379
382
  placeholder="Model"
380
- triggerClassName="h-6 text-xs shadow-none! ring-0! bg-muted hover:bg-muted/30 rounded-sm"
383
+ triggerClassName="h-6 text-xs shadow-none! ring-0! bg-muted hover:bg-muted/30 rounded-sm max-w-[200px]"
381
384
  iconSize="small"
382
385
  showAddCustomModelDocs={true}
383
386
  forRole="chat"
384
387
  />
388
+ <CapabilitiesPopover />
385
389
  </div>
386
- <div className="flex flex-row">
390
+ <div className="flex flex-row ml-auto">
387
391
  <AddContextButton
388
392
  handleAddContext={onAddContext}
389
393
  isLoading={isLoading}
@@ -445,8 +449,8 @@ const ChatInput: React.FC<ChatInputProps> = memo(
445
449
  });
446
450
 
447
451
  return (
448
- <div className="relative shrink-0 min-h-[80px] flex flex-col border-t">
449
- <div className={cn("px-2 py-3 flex-1", inputClassName)}>
452
+ <div className="relative shrink-0 flex flex-col border-t">
453
+ <div className={cn("px-2 py-1.5", inputClassName)}>
450
454
  <PromptInput
451
455
  className="max-h-[400px]"
452
456
  inputRef={inputRef}
@@ -598,6 +602,7 @@ const ChatPanelBody = () => {
598
602
  const completionBody = {
599
603
  uiMessages: options.messages,
600
604
  includeOtherCode: getCodes(""),
605
+ options: store.get(chatOptionsAtom),
601
606
  };
602
607
 
603
608
  // Call this here to ensure the value is not stale
@@ -4,7 +4,7 @@ import { useSetAtom, useStore } from "jotai";
4
4
  import useEvent from "react-use-event-hook";
5
5
  import { agentSessionStateAtom } from "@/components/chat/acp/state";
6
6
  import { toast } from "@/components/ui/use-toast";
7
- import { useModelChange } from "@/core/ai/config";
7
+ import { useAIConfigActions } from "@/core/ai/config";
8
8
  import { pendingAiPromptAtom } from "@/core/ai/state";
9
9
  import type { CopilotMode } from "@/core/ai/tools/registry";
10
10
  import { aiModelConfiguredAtom } from "@/core/config/config";
@@ -43,7 +43,7 @@ export function resolveAiPanelTab(
43
43
  export function useOpenAiAssistant() {
44
44
  const { openApplication } = useChromeActions();
45
45
  const { setAiPanelTab } = useAiPanelTab();
46
- const { saveModeChange } = useModelChange();
46
+ const { saveModeChange } = useAIConfigActions();
47
47
  const setPendingPrompt = useSetAtom(pendingAiPromptAtom);
48
48
  const store = useStore();
49
49
 
@@ -0,0 +1,96 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { act, renderHook } from "@testing-library/react";
4
+ import { createStore, Provider } from "jotai";
5
+ import type { ReactNode } from "react";
6
+ import { describe, expect, it, vi } from "vitest";
7
+ import { userConfigAtom } from "@/core/config/config";
8
+ import { defaultUserConfig } from "@/core/config/config-schema";
9
+ import { requestClientAtom } from "@/core/network/requests";
10
+ import type { EditRequests, RunRequests } from "@/core/network/types";
11
+ import { AiModelId } from "../ids/ids";
12
+ import { useAIConfigActions } from "../config";
13
+
14
+ describe("useAIConfigActions", () => {
15
+ it("persists a model change without overwriting newer AI config", async () => {
16
+ const store = createStore();
17
+ const saveUserConfig = vi.fn().mockResolvedValue(null);
18
+ store.set(userConfigAtom, defaultUserConfig());
19
+ store.set(requestClientAtom, {
20
+ saveUserConfig,
21
+ } as unknown as EditRequests & RunRequests);
22
+
23
+ const wrapper = ({ children }: { children: ReactNode }) => (
24
+ <Provider store={store}>{children}</Provider>
25
+ );
26
+ const { result } = renderHook(() => useAIConfigActions(), { wrapper });
27
+
28
+ store.set(userConfigAtom, (config) => ({
29
+ ...config,
30
+ ai: {
31
+ ...config.ai,
32
+ mode: "agent",
33
+ },
34
+ }));
35
+
36
+ await act(async () => {
37
+ await result.current.saveModelChange(
38
+ AiModelId.parse("openai/gpt-4o").id,
39
+ "chat",
40
+ );
41
+ });
42
+
43
+ expect(saveUserConfig).toHaveBeenCalledWith({
44
+ config: { ai: { models: { chat_model: "openai/gpt-4o" } } },
45
+ });
46
+ expect(store.get(userConfigAtom).ai).toMatchObject({
47
+ mode: "agent",
48
+ models: { chat_model: "openai/gpt-4o" },
49
+ });
50
+ });
51
+
52
+ it("preserves concurrent AI changes when saves resolve out of order", async () => {
53
+ const store = createStore();
54
+ const resolvers: Array<() => void> = [];
55
+ const saveUserConfig = vi.fn(
56
+ () =>
57
+ new Promise<null>((resolve) => {
58
+ resolvers.push(() => resolve(null));
59
+ }),
60
+ );
61
+ store.set(userConfigAtom, defaultUserConfig());
62
+ store.set(requestClientAtom, {
63
+ saveUserConfig,
64
+ } as unknown as EditRequests & RunRequests);
65
+
66
+ const wrapper = ({ children }: { children: ReactNode }) => (
67
+ <Provider store={store}>{children}</Provider>
68
+ );
69
+ const { result } = renderHook(() => useAIConfigActions(), { wrapper });
70
+
71
+ const modelChange = result.current.saveModelChange(
72
+ AiModelId.parse("openai/gpt-4o").id,
73
+ "chat",
74
+ );
75
+ const modeChange = result.current.saveModeChange("agent");
76
+
77
+ expect(saveUserConfig).toHaveBeenNthCalledWith(1, {
78
+ config: { ai: { models: { chat_model: "openai/gpt-4o" } } },
79
+ });
80
+ expect(saveUserConfig).toHaveBeenNthCalledWith(2, {
81
+ config: { ai: { mode: "agent" } },
82
+ });
83
+
84
+ await act(async () => {
85
+ resolvers[1]();
86
+ await modeChange;
87
+ resolvers[0]();
88
+ await modelChange;
89
+ });
90
+
91
+ expect(store.get(userConfigAtom).ai).toMatchObject({
92
+ mode: "agent",
93
+ models: { chat_model: "openai/gpt-4o" },
94
+ });
95
+ });
96
+ });
@@ -1,7 +1,8 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import type { Role } from "@marimo-team/llm-info";
4
- import { useAtom } from "jotai";
4
+ import { useSetAtom } from "jotai";
5
+ import { merge } from "lodash-es";
5
6
  import type { QualifiedModelId } from "@/core/ai/ids/ids";
6
7
  import { userConfigAtom } from "@/core/config/config";
7
8
  import type {
@@ -14,6 +15,11 @@ import { useRequestClient } from "@/core/network/requests";
14
15
  // Extract only the supported roles from the Role type
15
16
  export type SupportedRole = Extract<Role, "chat" | "autocomplete" | "edit">;
16
17
 
18
+ interface AiConfigPatch {
19
+ mode?: CopilotMode;
20
+ models?: Partial<NonNullable<NonNullable<UserConfig["ai"]>["models"]>>;
21
+ }
22
+
17
23
  const getModelKeyForRole = (forRole: SupportedRole): AIModelKey | null => {
18
24
  switch (forRole) {
19
25
  case "chat":
@@ -26,15 +32,16 @@ const getModelKeyForRole = (forRole: SupportedRole): AIModelKey | null => {
26
32
  };
27
33
 
28
34
  /**
29
- * Hook for saving model and mode changes.
35
+ * Hook for saving AI config changes
30
36
  */
31
- export const useModelChange = () => {
32
- const [userConfig, setUserConfig] = useAtom(userConfigAtom);
37
+ export const useAIConfigActions = () => {
38
+ const setUserConfig = useSetAtom(userConfigAtom);
33
39
  const { saveUserConfig } = useRequestClient();
34
40
 
35
- const saveConfig = async (newConfig: Partial<UserConfig>) => {
41
+ const saveConfig = async (aiConfig: AiConfigPatch) => {
42
+ const newConfig = { ai: aiConfig };
36
43
  await saveUserConfig({ config: newConfig }).then(() => {
37
- setUserConfig((prev) => ({ ...prev, ...newConfig }));
44
+ setUserConfig((prev) => merge({}, prev, newConfig));
38
45
  });
39
46
  };
40
47
 
@@ -48,28 +55,15 @@ export const useModelChange = () => {
48
55
  return;
49
56
  }
50
57
 
51
- const newConfig: Partial<UserConfig> = {
52
- ai: {
53
- ...userConfig.ai,
54
- models: {
55
- custom_models: userConfig.ai?.models?.custom_models ?? [],
56
- displayed_models: userConfig.ai?.models?.displayed_models ?? [],
57
- ...userConfig.ai?.models,
58
- [modelKey]: model,
59
- },
60
- },
58
+ const newConfig: AiConfigPatch = {
59
+ models: { [modelKey]: model },
61
60
  };
62
61
 
63
62
  await saveConfig(newConfig);
64
63
  };
65
64
 
66
65
  const saveModeChange = async (newMode: CopilotMode) => {
67
- const newConfig: Partial<UserConfig> = {
68
- ai: {
69
- ...userConfig.ai,
70
- mode: newMode,
71
- },
72
- };
66
+ const newConfig: AiConfigPatch = { mode: newMode };
73
67
 
74
68
  await saveConfig(newConfig);
75
69
  };
@@ -8,6 +8,7 @@ import { uniqueBy } from "@/utils/arrays";
8
8
  import { adaptForLocalStorage, jotaiJsonStorage } from "@/utils/storage/jotai";
9
9
  import type { TypedString } from "@/utils/typed";
10
10
  import type { CellId } from "../cells/ids";
11
+ import type { ChatOptions } from "../network/types";
11
12
 
12
13
  const KEY = "marimo:ai:chatState:v5";
13
14
 
@@ -32,6 +33,15 @@ export interface PendingAiPrompt {
32
33
 
33
34
  export const pendingAiPromptAtom = atom<PendingAiPrompt | null>(null);
34
35
 
36
+ const CHAT_OPTIONS_KEY = "marimo:ai:chatOptions";
37
+ export const chatOptionsAtom = atomWithStorage<Required<ChatOptions>>(
38
+ CHAT_OPTIONS_KEY,
39
+ {
40
+ webSearch: false,
41
+ },
42
+ jotaiJsonStorage,
43
+ );
44
+
35
45
  const INCLUDE_OTHER_CELLS_KEY = "marimo:ai:includeOtherCells";
36
46
  export const includeOtherCellsAtom = atomWithStorage<boolean>(
37
47
  INCLUDE_OTHER_CELLS_KEY,
@@ -131,6 +131,7 @@ export type OpenTutorialRequest = schemas["OpenTutorialRequest"];
131
131
  export type TutorialId = OpenTutorialRequest["tutorialId"];
132
132
  export type InvokeAiToolRequest = schemas["InvokeAiToolRequest"];
133
133
  export type InvokeAiToolResponse = schemas["InvokeAiToolResponse"];
134
+ export type ChatOptions = schemas["ChatOptions"];
134
135
  export type ClearCacheRequest = schemas["ClearCacheRequest"];
135
136
  export type GetCacheInfoRequest = schemas["GetCacheInfoRequest"];
136
137
  export type LspHealthResponse = schemas["LspHealthResponse"];
@@ -1,4 +0,0 @@
1
- import{s as Pe}from"./chunk-LvLJmgfZ.js";import{d as Pt,f as Dt,l as De,n as D,u as xe}from"./useEvent-D91BmmQi.js";import{t as Mt}from"./react-Bj1aDYRI.js";import{Br as zt,E as Ft,Wt as Ht,mn as Me}from"./cells-DxL32Atg.js";import"./react-dom-CSu739Rf.js";import{t as ze}from"./compiler-runtime-B3qBwwSJ.js";import{T as Wt,o as Ot,r as Fe,t as Ut}from"./ai-model-dropdown-BmcXWjub.js";import{g as oe,o as G}from"./useEventListener-B_wSLgFR.js";import{a as Yt,n as He}from"./utils-C5VWChv9.js";import{N as Xt,o as Vt}from"./config-Bm5B9wGP.js";import{t as Z}from"./cn-DYvqRARy.js";import{t as qt}from"./jsx-runtime-Blw4afVn.js";import{C as Bt,b as $t,g as B,v as ae,w as se,x as $}from"./fullscreen-B51geQ_6.js";import{u as Jt}from"./menu-items-Db-bgz92.js";import{t as Kt}from"./config-Cbkt6Rb1.js";import{i as Qt,r as Gt,t as Zt}from"./popover-DHbixh3D.js";import{a as er,i as tr,n as rr,p as or,r as sr,s as ar,t as lr}from"./select-Clmc8Hw2.js";import{i as We,t as ve}from"./tooltip-BcgbFR7q.js";import{t as J}from"./button-BB1AV4Rb.js";import"./dist-gUHullA_.js";import"./cjs-D5tzp-Y6.js";import"./main-BNL5rxQw.js";import"./useNonce-CbdaHKzX.js";import{r as nr}from"./requests-9-v2bhoi.js";import{t as ir}from"./createLucideIcon-w-Qo9n0R.js";import{t as cr}from"./scroll-to-bottom-button-CRMPUjYZ.js";import{t as dr}from"./arrow-right-C1pQZGqv.js";import{t as Oe}from"./bot-message-square-DTHo_4sQ.js";import"./markdown-renderer-DpskAUxO.js";import{i as ur,n as mr,r as pr,t as hr}from"./chat-display-CH-dFAC3.js";import{A as fr,C as xr,D as vr,F as Ue,I as gr,M as wr,N as le,S as br,T as yr,V as jr,_ as Sr,b as Cr,d as Ye,f as Nr,g as Xe,h as Ar,l as Rr,n as Ve,p as Tr,r as Er,u as _r,v as kr,w as Ir,x as Lr,y as qe}from"./add-cell-with-ai-GZi9Icll.js";import{t as Pr}from"./code-B2aKtXoe.js";import{t as Dr}from"./hat-glasses-BttHlyvs.js";import{n as Be}from"./spinner-D-V4psAa.js";import{t as Mr}from"./message-circle-dL5J5ZsZ.js";import{t as zr}from"./plus-AgXtozBz.js";import{dt as Fr,r as Hr}from"./input-_AaMXWgD.js";import{t as Wr}from"./settings-D_PiwXwo.js";import{t as Or}from"./sparkles-DUCpRFlS.js";import"./dist-Jbd9zUbK.js";import"./dist-BWXIz8tq.js";import"./dist-DX04AOlt.js";import"./dist-D5nYeU7Q.js";import"./dist-6qzebh8f.js";import"./session-BtBr2zr3.js";import"./purify.es-CWmnYhGI.js";import{s as Ur}from"./dates-BzOh4kS_.js";import{t as Yr}from"./copy-icon-DWG8Y-xW.js";import{t as Xr}from"./context-BFPaAUK_.js";import{n as Vr}from"./ImperativeModal-Ci0icDPt.js";import{a as qr,r as $e,t as Br}from"./state-COqqdiUM.js";import{n as $r}from"./error-banner-BkIr-0dH.js";import"./chunk-5FQGJX7Z-CYQpNADu.js";import"./html-to-image-ChNWEUlR.js";import"./esm-Bmzgrl_5.js";import{t as ge}from"./empty-state-JOk_hLQe.js";import{t as Jr}from"./pair-with-agent-modal-1b5Eh8Xo.js";var p=Pe(Mt(),1),o=Pe(qt(),1);function Kr(r,e){return p.useReducer((t,l)=>e[t][l]??t,r)}var we="ScrollArea",[Je,Hs]=Bt(we),[Qr,z]=Je(we),Ke=p.forwardRef((r,e)=>{let{__scopeScrollArea:t,type:l="hover",dir:s,scrollHideDelay:a=600,...n}=r,[i,u]=p.useState(null),[c,d]=p.useState(null),[m,f]=p.useState(null),[x,g]=p.useState(null),[w,T]=p.useState(null),[b,S]=p.useState(0),[R,C]=p.useState(0),[j,N]=p.useState(!1),[L,I]=p.useState(!1),y=G(e,P=>u(P)),E=Jt(s);return(0,o.jsx)(Qr,{scope:t,type:l,dir:E,scrollHideDelay:a,scrollArea:i,viewport:c,onViewportChange:d,content:m,onContentChange:f,scrollbarX:x,onScrollbarXChange:g,scrollbarXEnabled:j,onScrollbarXEnabledChange:N,scrollbarY:w,onScrollbarYChange:T,scrollbarYEnabled:L,onScrollbarYEnabledChange:I,onCornerWidthChange:S,onCornerHeightChange:C,children:(0,o.jsx)(se.div,{dir:E,...n,ref:y,style:{position:"relative","--radix-scroll-area-corner-width":b+"px","--radix-scroll-area-corner-height":R+"px",...r.style}})})});Ke.displayName=we;var Qe="ScrollAreaViewport",Ge=p.forwardRef((r,e)=>{let{__scopeScrollArea:t,children:l,nonce:s,...a}=r,n=z(Qe,t),i=G(e,p.useRef(null),n.onViewportChange);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:s}),(0,o.jsx)(se.div,{"data-radix-scroll-area-viewport":"",...a,ref:i,style:{overflowX:n.scrollbarXEnabled?"scroll":"hidden",overflowY:n.scrollbarYEnabled?"scroll":"hidden",...r.style},children:(0,o.jsx)("div",{ref:n.onContentChange,style:{minWidth:"100%",display:"table"},children:l})})]})});Ge.displayName=Qe;var W="ScrollAreaScrollbar",be=p.forwardRef((r,e)=>{let{forceMount:t,...l}=r,s=z(W,r.__scopeScrollArea),{onScrollbarXEnabledChange:a,onScrollbarYEnabledChange:n}=s,i=r.orientation==="horizontal";return p.useEffect(()=>(i?a(!0):n(!0),()=>{i?a(!1):n(!1)}),[i,a,n]),s.type==="hover"?(0,o.jsx)(Gr,{...l,ref:e,forceMount:t}):s.type==="scroll"?(0,o.jsx)(Zr,{...l,ref:e,forceMount:t}):s.type==="auto"?(0,o.jsx)(Ze,{...l,ref:e,forceMount:t}):s.type==="always"?(0,o.jsx)(ye,{...l,ref:e}):null});be.displayName=W;var Gr=p.forwardRef((r,e)=>{let{forceMount:t,...l}=r,s=z(W,r.__scopeScrollArea),[a,n]=p.useState(!1);return p.useEffect(()=>{let i=s.scrollArea,u=0;if(i){let c=()=>{window.clearTimeout(u),n(!0)},d=()=>{u=window.setTimeout(()=>n(!1),s.scrollHideDelay)};return i.addEventListener("pointerenter",c),i.addEventListener("pointerleave",d),()=>{window.clearTimeout(u),i.removeEventListener("pointerenter",c),i.removeEventListener("pointerleave",d)}}},[s.scrollArea,s.scrollHideDelay]),(0,o.jsx)(ae,{present:t||a,children:(0,o.jsx)(Ze,{"data-state":a?"visible":"hidden",...l,ref:e})})}),Zr=p.forwardRef((r,e)=>{let{forceMount:t,...l}=r,s=z(W,r.__scopeScrollArea),a=r.orientation==="horizontal",n=de(()=>u("SCROLL_END"),100),[i,u]=Kr("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return p.useEffect(()=>{if(i==="idle"){let c=window.setTimeout(()=>u("HIDE"),s.scrollHideDelay);return()=>window.clearTimeout(c)}},[i,s.scrollHideDelay,u]),p.useEffect(()=>{let c=s.viewport,d=a?"scrollLeft":"scrollTop";if(c){let m=c[d],f=()=>{let x=c[d];m!==x&&(u("SCROLL"),n()),m=x};return c.addEventListener("scroll",f),()=>c.removeEventListener("scroll",f)}},[s.viewport,a,u,n]),(0,o.jsx)(ae,{present:t||i!=="hidden",children:(0,o.jsx)(ye,{"data-state":i==="hidden"?"hidden":"visible",...l,ref:e,onPointerEnter:$(r.onPointerEnter,()=>u("POINTER_ENTER")),onPointerLeave:$(r.onPointerLeave,()=>u("POINTER_LEAVE"))})})}),Ze=p.forwardRef((r,e)=>{let t=z(W,r.__scopeScrollArea),{forceMount:l,...s}=r,[a,n]=p.useState(!1),i=r.orientation==="horizontal",u=de(()=>{if(t.viewport){let c=t.viewport.offsetWidth<t.viewport.scrollWidth,d=t.viewport.offsetHeight<t.viewport.scrollHeight;n(i?c:d)}},10);return ee(t.viewport,u),ee(t.content,u),(0,o.jsx)(ae,{present:l||a,children:(0,o.jsx)(ye,{"data-state":a?"visible":"hidden",...s,ref:e})})}),ye=p.forwardRef((r,e)=>{let{orientation:t="vertical",...l}=r,s=z(W,r.__scopeScrollArea),a=p.useRef(null),n=p.useRef(0),[i,u]=p.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),c=st(i.viewport,i.content),d={...l,sizes:i,onSizesChange:u,hasThumb:c>0&&c<1,onThumbChange:f=>a.current=f,onThumbPointerUp:()=>n.current=0,onThumbPointerDown:f=>n.current=f};function m(f,x){return ao(f,n.current,i,x)}return t==="horizontal"?(0,o.jsx)(eo,{...d,ref:e,onThumbPositionChange:()=>{if(s.viewport&&a.current){let f=s.viewport.scrollLeft,x=at(f,i,s.dir);a.current.style.transform=`translate3d(${x}px, 0, 0)`}},onWheelScroll:f=>{s.viewport&&(s.viewport.scrollLeft=f)},onDragScroll:f=>{s.viewport&&(s.viewport.scrollLeft=m(f,s.dir))}}):t==="vertical"?(0,o.jsx)(to,{...d,ref:e,onThumbPositionChange:()=>{if(s.viewport&&a.current){let f=s.viewport.scrollTop,x=at(f,i);a.current.style.transform=`translate3d(0, ${x}px, 0)`}},onWheelScroll:f=>{s.viewport&&(s.viewport.scrollTop=f)},onDragScroll:f=>{s.viewport&&(s.viewport.scrollTop=m(f))}}):null}),eo=p.forwardRef((r,e)=>{let{sizes:t,onSizesChange:l,...s}=r,a=z(W,r.__scopeScrollArea),[n,i]=p.useState(),u=p.useRef(null),c=G(e,u,a.onScrollbarXChange);return p.useEffect(()=>{u.current&&i(getComputedStyle(u.current))},[u]),(0,o.jsx)(tt,{"data-orientation":"horizontal",...s,ref:c,sizes:t,style:{bottom:0,left:a.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:a.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":ce(t)+"px",...r.style},onThumbPointerDown:d=>r.onThumbPointerDown(d.x),onDragScroll:d=>r.onDragScroll(d.x),onWheelScroll:(d,m)=>{if(a.viewport){let f=a.viewport.scrollLeft+d.deltaX;r.onWheelScroll(f),nt(f,m)&&d.preventDefault()}},onResize:()=>{u.current&&a.viewport&&n&&l({content:a.viewport.scrollWidth,viewport:a.viewport.offsetWidth,scrollbar:{size:u.current.clientWidth,paddingStart:ie(n.paddingLeft),paddingEnd:ie(n.paddingRight)}})}})}),to=p.forwardRef((r,e)=>{let{sizes:t,onSizesChange:l,...s}=r,a=z(W,r.__scopeScrollArea),[n,i]=p.useState(),u=p.useRef(null),c=G(e,u,a.onScrollbarYChange);return p.useEffect(()=>{u.current&&i(getComputedStyle(u.current))},[u]),(0,o.jsx)(tt,{"data-orientation":"vertical",...s,ref:c,sizes:t,style:{top:0,right:a.dir==="ltr"?0:void 0,left:a.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":ce(t)+"px",...r.style},onThumbPointerDown:d=>r.onThumbPointerDown(d.y),onDragScroll:d=>r.onDragScroll(d.y),onWheelScroll:(d,m)=>{if(a.viewport){let f=a.viewport.scrollTop+d.deltaY;r.onWheelScroll(f),nt(f,m)&&d.preventDefault()}},onResize:()=>{u.current&&a.viewport&&n&&l({content:a.viewport.scrollHeight,viewport:a.viewport.offsetHeight,scrollbar:{size:u.current.clientHeight,paddingStart:ie(n.paddingTop),paddingEnd:ie(n.paddingBottom)}})}})}),[ro,et]=Je(W),tt=p.forwardRef((r,e)=>{let{__scopeScrollArea:t,sizes:l,hasThumb:s,onThumbChange:a,onThumbPointerUp:n,onThumbPointerDown:i,onThumbPositionChange:u,onDragScroll:c,onWheelScroll:d,onResize:m,...f}=r,x=z(W,t),[g,w]=p.useState(null),T=G(e,y=>w(y)),b=p.useRef(null),S=p.useRef(""),R=x.viewport,C=l.content-l.viewport,j=B(d),N=B(u),L=de(m,10);function I(y){b.current&&c({x:y.clientX-b.current.left,y:y.clientY-b.current.top})}return p.useEffect(()=>{let y=E=>{let P=E.target;g!=null&&g.contains(P)&&j(E,C)};return document.addEventListener("wheel",y,{passive:!1}),()=>document.removeEventListener("wheel",y,{passive:!1})},[R,g,C,j]),p.useEffect(N,[l,N]),ee(g,L),ee(x.content,L),(0,o.jsx)(ro,{scope:t,scrollbar:g,hasThumb:s,onThumbChange:B(a),onThumbPointerUp:B(n),onThumbPositionChange:N,onThumbPointerDown:B(i),children:(0,o.jsx)(se.div,{...f,ref:T,style:{position:"absolute",...f.style},onPointerDown:$(r.onPointerDown,y=>{y.button===0&&(y.target.setPointerCapture(y.pointerId),b.current=g.getBoundingClientRect(),S.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",x.viewport&&(x.viewport.style.scrollBehavior="auto"),I(y))}),onPointerMove:$(r.onPointerMove,I),onPointerUp:$(r.onPointerUp,y=>{let E=y.target;E.hasPointerCapture(y.pointerId)&&E.releasePointerCapture(y.pointerId),document.body.style.webkitUserSelect=S.current,x.viewport&&(x.viewport.style.scrollBehavior=""),b.current=null})})})}),ne="ScrollAreaThumb",rt=p.forwardRef((r,e)=>{let{forceMount:t,...l}=r,s=et(ne,r.__scopeScrollArea);return(0,o.jsx)(ae,{present:t||s.hasThumb,children:(0,o.jsx)(oo,{ref:e,...l})})}),oo=p.forwardRef((r,e)=>{let{__scopeScrollArea:t,style:l,...s}=r,a=z(ne,t),n=et(ne,t),{onThumbPositionChange:i}=n,u=G(e,m=>n.onThumbChange(m)),c=p.useRef(void 0),d=de(()=>{c.current&&(c.current=(c.current(),void 0))},100);return p.useEffect(()=>{let m=a.viewport;if(m){let f=()=>{d(),c.current||(c.current=lo(m,i),i())};return i(),m.addEventListener("scroll",f),()=>m.removeEventListener("scroll",f)}},[a.viewport,d,i]),(0,o.jsx)(se.div,{"data-state":n.hasThumb?"visible":"hidden",...s,ref:u,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...l},onPointerDownCapture:$(r.onPointerDownCapture,m=>{let f=m.target.getBoundingClientRect(),x=m.clientX-f.left,g=m.clientY-f.top;n.onThumbPointerDown({x,y:g})}),onPointerUp:$(r.onPointerUp,n.onThumbPointerUp)})});rt.displayName=ne;var je="ScrollAreaCorner",ot=p.forwardRef((r,e)=>{let t=z(je,r.__scopeScrollArea),l=!!(t.scrollbarX&&t.scrollbarY);return t.type!=="scroll"&&l?(0,o.jsx)(so,{...r,ref:e}):null});ot.displayName=je;var so=p.forwardRef((r,e)=>{let{__scopeScrollArea:t,...l}=r,s=z(je,t),[a,n]=p.useState(0),[i,u]=p.useState(0),c=!!(a&&i);return ee(s.scrollbarX,()=>{var m;let d=((m=s.scrollbarX)==null?void 0:m.offsetHeight)||0;s.onCornerHeightChange(d),u(d)}),ee(s.scrollbarY,()=>{var m;let d=((m=s.scrollbarY)==null?void 0:m.offsetWidth)||0;s.onCornerWidthChange(d),n(d)}),c?(0,o.jsx)(se.div,{...l,ref:e,style:{width:a,height:i,position:"absolute",right:s.dir==="ltr"?0:void 0,left:s.dir==="rtl"?0:void 0,bottom:0,...r.style}}):null});function ie(r){return r?parseInt(r,10):0}function st(r,e){let t=r/e;return isNaN(t)?0:t}function ce(r){let e=st(r.viewport,r.content),t=r.scrollbar.paddingStart+r.scrollbar.paddingEnd,l=(r.scrollbar.size-t)*e;return Math.max(l,18)}function ao(r,e,t,l="ltr"){let s=ce(t),a=s/2,n=e||a,i=s-n,u=t.scrollbar.paddingStart+n,c=t.scrollbar.size-t.scrollbar.paddingEnd-i,d=t.content-t.viewport,m=l==="ltr"?[0,d]:[d*-1,0];return lt([u,c],m)(r)}function at(r,e,t="ltr"){let l=ce(e),s=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,a=e.scrollbar.size-s,n=e.content-e.viewport,i=a-l,u=or(r,t==="ltr"?[0,n]:[n*-1,0]);return lt([0,n],[0,i])(u)}function lt(r,e){return t=>{if(r[0]===r[1]||e[0]===e[1])return e[0];let l=(e[1]-e[0])/(r[1]-r[0]);return e[0]+l*(t-r[0])}}function nt(r,e){return r>0&&r<e}var lo=(r,e=()=>{})=>{let t={left:r.scrollLeft,top:r.scrollTop},l=0;return(function s(){let a={left:r.scrollLeft,top:r.scrollTop},n=t.left!==a.left,i=t.top!==a.top;(n||i)&&e(),t=a,l=window.requestAnimationFrame(s)})(),()=>window.cancelAnimationFrame(l)};function de(r,e){let t=B(r),l=p.useRef(0);return p.useEffect(()=>()=>window.clearTimeout(l.current),[]),p.useCallback(()=>{window.clearTimeout(l.current),l.current=window.setTimeout(t,e)},[t,e])}function ee(r,e){let t=B(e);$t(()=>{let l=0;if(r){let s=new ResizeObserver(()=>{cancelAnimationFrame(l),l=window.requestAnimationFrame(t)});return s.observe(r),()=>{window.cancelAnimationFrame(l),s.unobserve(r)}}},[r,t])}var it=Ke,no=Ge,io=ot,co=ir("notebook-text",[["path",{d:"M2 6h4",key:"aawbzj"}],["path",{d:"M2 10h4",key:"l0bgd4"}],["path",{d:"M2 14h4",key:"1gsvsf"}],["path",{d:"M2 18h4",key:"1bu2t1"}],["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["path",{d:"M9.5 8h5",key:"11mslq"}],["path",{d:"M9.5 12H16",key:"ktog6x"}],["path",{d:"M9.5 16H14",key:"p1seyn"}]]),ct=ze();const uo=({chatState:r,chatId:e,messages:t})=>{if(!e)return oe.warn("No active chat"),r;let l=r.chats.get(e);if(!l)return oe.warn("No active chat"),r;let s=new Map(r.chats),a=Date.now();return s.set(l.id,{...l,messages:t,updatedAt:a}),{...r,chats:s}};var dt=p.forwardRef((r,e)=>{let t=(0,ct.c)(15),l,s,a;t[0]===r?(l=t[1],s=t[2],a=t[3]):({className:s,children:l,...a}=r,t[0]=r,t[1]=l,t[2]=s,t[3]=a);let n;t[4]===s?n=t[5]:(n=Z("relative overflow-hidden",s),t[4]=s,t[5]=n);let i;t[6]===l?i=t[7]:(i=(0,o.jsx)(no,{className:"h-full w-full rounded-[inherit]",children:l}),t[6]=l,t[7]=i);let u,c;t[8]===Symbol.for("react.memo_cache_sentinel")?(u=(0,o.jsx)(ut,{}),c=(0,o.jsx)(io,{}),t[8]=u,t[9]=c):(u=t[8],c=t[9]);let d;return t[10]!==a||t[11]!==e||t[12]!==n||t[13]!==i?(d=(0,o.jsxs)(it,{ref:e,className:n,...a,children:[i,u,c]}),t[10]=a,t[11]=e,t[12]=n,t[13]=i,t[14]=d):d=t[14],d});dt.displayName=it.displayName;var ut=p.forwardRef((r,e)=>{let t=(0,ct.c)(14),l,s,a;t[0]===r?(l=t[1],s=t[2],a=t[3]):({className:l,orientation:a,...s}=r,t[0]=r,t[1]=l,t[2]=s,t[3]=a);let n=a===void 0?"vertical":a,i=n==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-px",u=n==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-px",c;t[4]!==l||t[5]!==i||t[6]!==u?(c=Z("flex touch-none select-none transition-colors",i,u,l),t[4]=l,t[5]=i,t[6]=u,t[7]=c):c=t[7];let d;t[8]===Symbol.for("react.memo_cache_sentinel")?(d=(0,o.jsx)(rt,{className:"relative flex-1 rounded-full bg-border"}),t[8]=d):d=t[8];let m;return t[9]!==n||t[10]!==s||t[11]!==e||t[12]!==c?(m=(0,o.jsx)(be,{ref:e,orientation:n,className:c,...s,children:d}),t[9]=n,t[10]=s,t[11]=e,t[12]=c,t[13]=m):m=t[13],m});ut.displayName=be.displayName;var mo=[{label:"Today",days:0},{label:"Yesterday",days:1},{label:"2d ago",days:2},{label:"3d ago",days:3},{label:"This week",days:7},{label:"This month",days:30}];const po=r=>{let e=Date.now(),t=mo.map(a=>({...a,chats:[]})),l={label:"Older",days:1/0,chats:[]},s=a=>{switch(a){case 0:return t[0];case 1:return t[1];case 2:return t[2];case 3:return t[3];default:return a>=4&&a<=7?t[4]:a>=8&&a<=30?t[5]:l}};for(let a of r)s(Math.floor((e-a.updatedAt)/864e5)).chats.push(a);return[...t,l].filter(a=>a.chats.length>0)},ho=({activeChatId:r,setActiveChat:e})=>{let t=xe($e),{locale:l}=Xr(),[s,a]=(0,p.useState)(""),n=(0,p.useMemo)(()=>[...t.chats.values()].toSorted((c,d)=>d.updatedAt-c.updatedAt),[t.chats]),i=(0,p.useMemo)(()=>s.trim()?n.filter(c=>c.title.toLowerCase().includes(s.toLowerCase())):n,[n,s]),u=(0,p.useMemo)(()=>po(i),[i]);return(0,o.jsxs)(Zt,{children:[(0,o.jsx)(ve,{content:"Previous chats",children:(0,o.jsx)(Qt,{asChild:!0,children:(0,o.jsx)(J,{variant:"text",size:"icon",children:(0,o.jsx)(zt,{className:"h-4 w-4"})})})}),(0,o.jsxs)(Gt,{className:"w-[480px] p-0",align:"start",side:"right",children:[(0,o.jsx)("div",{className:"pt-3 px-3 w-full",children:(0,o.jsx)(Hr,{placeholder:"Search chat history...",value:s,onChange:c=>a(c.target.value),className:"text-xs"})}),(0,o.jsx)(dt,{className:"h-[450px] p-2",children:(0,o.jsxs)("div",{className:"space-y-3",children:[n.length===0&&(0,o.jsx)(ge,{title:"No chats yet",description:"Start a new chat to get started",icon:(0,o.jsx)(Oe,{})}),i.length===0&&s&&n.length>0&&(0,o.jsx)(ge,{title:"No chats found",description:`No chats match "${s}"`,icon:(0,o.jsx)(Fr,{})}),u.map((c,d)=>(0,o.jsxs)("div",{className:"space-y-2",children:[(0,o.jsx)("div",{className:"text-xs px-1 text-muted-foreground/60",children:c.label}),(0,o.jsx)("div",{children:c.chats.map(m=>(0,o.jsxs)("button",{className:Z("w-full p-1 rounded-md cursor-pointer text-left flex items-center justify-between",m.id===r&&"bg-accent",m.id!==r&&"hover:bg-muted/20"),onClick:()=>{e(m.id)},type:"button",children:[(0,o.jsx)("div",{className:"flex-1 min-w-0",children:(0,o.jsx)("div",{className:"text-sm truncate",children:m.title})}),(0,o.jsx)("div",{className:"text-xs text-muted-foreground/60 ml-2 shrink-0",children:Ur(m.updatedAt,l)})]},m.id))}),d!==u.length-1&&(0,o.jsx)("hr",{})]},c.label))]})})]})]})};var K=ze(),mt="manual",pt=(0,p.memo)(r=>{let e=(0,K.c)(18),{message:t}=r,l;e[0]===t.parts?l=e[1]:(l=t.parts.filter(bo).map(yo).join(`
2
- `),e[0]=t.parts,e[1]=l);let s=l,a,n,i;if(e[2]!==t.parts){let x=t.parts.filter(jo);i="flex justify-end",a="w-[95%] bg-background border border-dashed p-2 rounded-sm opacity-70",n=x.map(So),e[2]=t.parts,e[3]=a,e[4]=n,e[5]=i}else a=e[3],n=e[4],i=e[5];let u;e[6]===s?u=e[7]:(u=(0,o.jsx)("span",{className:"wrap-break-word",children:s}),e[6]=s,e[7]=u);let c;e[8]===Symbol.for("react.memo_cache_sentinel")?(c=(0,o.jsx)(Be,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),e[8]=c):c=e[8];let d;e[9]===u?d=e[10]:(d=(0,o.jsxs)("div",{className:"flex items-center justify-end gap-2 text-sm text-muted-foreground",children:[u,c]}),e[9]=u,e[10]=d);let m;e[11]!==a||e[12]!==n||e[13]!==d?(m=(0,o.jsxs)("div",{className:a,children:[n,d]}),e[11]=a,e[12]=n,e[13]=d,e[14]=m):m=e[14];let f;return e[15]!==i||e[16]!==m?(f=(0,o.jsx)("div",{className:i,children:m}),e[15]=i,e[16]=m,e[17]=f):f=e[17],f});pt.displayName="QueuedMessageDisplay";var fo=r=>{let e=(0,K.c)(18),{onNewChat:t,activeChatId:l,setActiveChat:s}=r,{handleClick:a}=Fe(),n;e[0]===Symbol.for("react.memo_cache_sentinel")?(n=(0,o.jsx)(zr,{className:"h-4 w-4"}),e[0]=n):n=e[0];let i;e[1]===t?i=e[2]:(i=(0,o.jsx)(ve,{content:"New chat",children:(0,o.jsx)(J,{variant:"text",size:"icon",onClick:t,children:n})}),e[1]=t,e[2]=i);let u;e[3]===Symbol.for("react.memo_cache_sentinel")?(u=(0,o.jsx)(Ot,{}),e[3]=u):u=e[3];let c;e[4]===a?c=e[5]:(c=()=>a("ai"),e[4]=a,e[5]=c);let d;e[6]===Symbol.for("react.memo_cache_sentinel")?(d=(0,o.jsx)(Wr,{className:"h-4 w-4"}),e[6]=d):d=e[6];let m;e[7]===c?m=e[8]:(m=(0,o.jsx)(ve,{content:"AI Settings",children:(0,o.jsx)(J,{variant:"text",size:"xs",className:"hover:bg-foreground/10 py-2",onClick:c,children:d})}),e[7]=c,e[8]=m);let f;e[9]!==l||e[10]!==s?(f=(0,o.jsx)(ho,{activeChatId:l,setActiveChat:s}),e[9]=l,e[10]=s,e[11]=f):f=e[11];let x;e[12]!==m||e[13]!==f?(x=(0,o.jsxs)("div",{className:"flex items-center gap-2",children:[u,m,f]}),e[12]=m,e[13]=f,e[14]=x):x=e[14];let g;return e[15]!==i||e[16]!==x?(g=(0,o.jsxs)("div",{className:"flex border-b px-2 py-1 justify-between shrink-0 items-center",children:[i,x]}),e[15]=i,e[16]=x,e[17]=g):g=e[17],g},ht=(0,p.memo)(r=>{let e=(0,K.c)(17),{message:t,index:l,onEdit:s,isStreamingReasoning:a,isLast:n,isActive:i,addToolApprovalResponse:u}=r,c;e[0]!==l||e[1]!==s?(c=b=>{var C,j,N;let S=(j=(C=b.parts)==null?void 0:C.filter(Co))==null?void 0:j.map(No).join(`
3
- `),R=(N=b.parts)==null?void 0:N.filter(Ao);return(0,o.jsxs)("div",{className:"w-[95%] bg-background border p-1 rounded-sm",children:[R==null?void 0:R.map(Ro),(0,o.jsx)(Ve,{value:S,placeholder:"Type your message...",onChange:To,onSubmit:(L,I)=>{I.trim()&&s(l,I)},onClose:Eo},b.id)]})},e[0]=l,e[1]=s,e[2]=c):c=e[2];let d=c,m;e[3]!==u||e[4]!==i||e[5]!==n||e[6]!==a?(m=b=>(0,o.jsxs)("div",{className:"w-[95%] wrap-break-word",children:[(0,o.jsx)("div",{className:"absolute right-1 top-1 opacity-0 group-hover:opacity-100 transition-opacity",children:(0,o.jsx)(Yr,{className:"h-3 w-3",value:b.parts.filter(_o).map(ko).join(`
4
- `)||""})}),hr({message:b,isStreamingReasoning:a,isLast:n,isActive:i,addToolApprovalResponse:u})]}),e[3]=u,e[4]=i,e[5]=n,e[6]=a,e[7]=m):m=e[7];let f=m,x=t.role==="user"?"justify-end":"justify-start",g;e[8]===x?g=e[9]:(g=Z("flex group relative",x),e[8]=x,e[9]=g);let w;e[10]!==t||e[11]!==f||e[12]!==d?(w=t.role==="user"?d(t):f(t),e[10]=t,e[11]=f,e[12]=d,e[13]=w):w=e[13];let T;return e[14]!==g||e[15]!==w?(T=(0,o.jsx)("div",{className:g,children:w}),e[14]=g,e[15]=w,e[16]=T):T=e[16],T});ht.displayName="ChatMessage";var ft=(0,p.memo)(r=>{var te;let e=(0,K.c)(42),{isEmpty:t,onSendClick:l,isLoading:s,onStop:a,fileInputRef:n,onAddFiles:i,onAddContext:u}=r,c=xe(He),d=(c==null?void 0:c.mode)||mt,m=((te=c==null?void 0:c.models)==null?void 0:te.chat_model)||"openai/gpt-4o",f=Wt.parse(m).providerId,{saveModeChange:x}=Kt(),g;e[0]===Symbol.for("react.memo_cache_sentinel")?(g=[{value:"manual",label:"Manual",subtitle:"Pure chat, no tool usage",Icon:Mr},{value:"ask",label:"Ask",subtitle:"AI with access to read-only tools like documentation search",Icon:co},{value:"agent",label:"Agent",subtitle:"AI with access to read and write tools",Icon:Dr},{value:"code_mode",label:"Code Mode (experimental)",subtitle:"AI with access to the notebook's kernel. Use with caution.",Icon:Pr}],e[0]=g):g=e[0];let w=g,T=Ar.has(f),b;e[1]!==d||e[2]!==w?(b=w.find(ue=>ue.value===d),e[1]=d,e[2]=w,e[3]=b):b=e[3];let S=b,R=S==null?void 0:S.Icon,C=S==null?void 0:S.label,j;e[4]===R?j=e[5]:(j=R&&(0,o.jsx)(R,{className:"h-3 w-3"}),e[4]=R,e[5]=j);let N;e[6]===C?N=e[7]:(N=(0,o.jsx)("span",{children:C}),e[6]=C,e[7]=N);let L;e[8]!==j||e[9]!==N?(L=(0,o.jsxs)(ar,{className:"h-6 text-xs border-border shadow-none! ring-0! bg-muted hover:bg-muted/30 py-0 px-2 gap-1.5",children:[j,N]}),e[8]=j,e[9]=N,e[10]=L):L=e[10];let I;e[11]===Symbol.for("react.memo_cache_sentinel")?(I=(0,o.jsx)(er,{className:"text-xs uppercase tracking-wider text-muted-foreground/70 font-medium",children:"AI Mode"}),e[11]=I):I=e[11];let y;e[12]===w?y=e[13]:(y=(0,o.jsx)(rr,{children:(0,o.jsxs)(sr,{children:[I,w.map(Io)]})}),e[12]=w,e[13]=y);let E;e[14]!==d||e[15]!==x||e[16]!==L||e[17]!==y?(E=(0,o.jsxs)(lr,{value:d,onValueChange:x,children:[L,y]}),e[14]=d,e[15]=x,e[16]=L,e[17]=y,e[18]=E):E=e[18];let P;e[19]===Symbol.for("react.memo_cache_sentinel")?(P=(0,o.jsx)(Ut,{placeholder:"Model",triggerClassName:"h-6 text-xs shadow-none! ring-0! bg-muted hover:bg-muted/30 rounded-sm",iconSize:"small",showAddCustomModelDocs:!0,forRole:"chat"}),e[19]=P):P=e[19];let F;e[20]===E?F=e[21]:(F=(0,o.jsxs)("div",{className:"flex items-center gap-2",children:[E,P]}),e[20]=E,e[21]=F);let U;e[22]!==s||e[23]!==u?(U=(0,o.jsx)(Rr,{handleAddContext:u,isLoading:s}),e[22]=s,e[23]=u,e[24]=U):U=e[24];let Y;e[25]!==n||e[26]!==T||e[27]!==s||e[28]!==i?(Y=T&&(0,o.jsx)(_r,{fileInputRef:n,isLoading:s,onAddFiles:i}),e[25]=n,e[26]=T,e[27]=s,e[28]=i,e[29]=Y):Y=e[29];let X;e[30]!==t||e[31]!==s||e[32]!==l||e[33]!==a?(X=(0,o.jsx)(Tr,{isLoading:s,onStop:a,onSendClick:l,isEmpty:t}),e[30]=t,e[31]=s,e[32]=l,e[33]=a,e[34]=X):X=e[34];let V;e[35]!==U||e[36]!==Y||e[37]!==X?(V=(0,o.jsxs)("div",{className:"flex flex-row",children:[U,Y,X]}),e[35]=U,e[36]=Y,e[37]=X,e[38]=V):V=e[38];let q;return e[39]!==F||e[40]!==V?(q=(0,o.jsx)(We,{children:(0,o.jsxs)("div",{className:"px-3 py-2 border-t border-border/20 flex flex-row flex-wrap items-center justify-between gap-1",children:[F,V]})}),e[39]=F,e[40]=V,e[41]=q):q=e[41],q});ft.displayName="ChatInputFooter";var Se=(0,p.memo)(r=>{let e=(0,K.c)(29),{placeholder:t,input:l,inputClassName:s,setInput:a,onSubmit:n,inputRef:i,isLoading:u,onStop:c,fileInputRef:d,onAddFiles:m,onClose:f}=r,x;e[0]!==l||e[1]!==n?(x=()=>{l.trim()&&n(void 0,l)},e[0]=l,e[1]=n,e[2]=x):x=e[2];let g=D(x),w;e[3]===s?w=e[4]:(w=Z("px-2 py-3 flex-1",s),e[3]=s,e[4]=w);let T=t||"Type your message...",b;e[5]!==l||e[6]!==i||e[7]!==m||e[8]!==f||e[9]!==n||e[10]!==a||e[11]!==T?(b=(0,o.jsx)(Ve,{className:"max-h-[400px]",inputRef:i,value:l,onChange:a,onSubmit:n,onClose:f,onAddFiles:m,placeholder:T}),e[5]=l,e[6]=i,e[7]=m,e[8]=f,e[9]=n,e[10]=a,e[11]=T,e[12]=b):b=e[12];let S;e[13]!==w||e[14]!==b?(S=(0,o.jsx)("div",{className:w,children:b}),e[13]=w,e[14]=b,e[15]=S):S=e[15];let R=!l.trim(),C;e[16]===i?C=e[17]:(C=()=>fr(i),e[16]=i,e[17]=C);let j;e[18]!==d||e[19]!==g||e[20]!==u||e[21]!==m||e[22]!==c||e[23]!==R||e[24]!==C?(j=(0,o.jsx)(ft,{isEmpty:R,onAddContext:C,onSendClick:g,isLoading:u,onStop:c,fileInputRef:d,onAddFiles:m}),e[18]=d,e[19]=g,e[20]=u,e[21]=m,e[22]=c,e[23]=R,e[24]=C,e[25]=j):j=e[25];let N;return e[26]!==S||e[27]!==j?(N=(0,o.jsxs)("div",{className:"relative shrink-0 min-h-[80px] flex flex-col border-t",children:[S,j]}),e[26]=S,e[27]=j,e[28]=N):N=e[28],N});Se.displayName="ChatInput";var xo=r=>{let e=(0,K.c)(5),{onPairWithAgent:t}=r;if(Xt())return null;let l,s,a;e[0]===Symbol.for("react.memo_cache_sentinel")?(l=(0,o.jsx)(Or,{className:"h-3.5 w-3.5 shrink-0"}),s=(0,o.jsx)("span",{children:"Work on this notebook with your own agent"}),a=(0,o.jsx)(dr,{className:"h-3 w-3 shrink-0"}),e[0]=l,e[1]=s,e[2]=a):(l=e[0],s=e[1],a=e[2]);let n;return e[3]===t?n=e[4]:(n=(0,o.jsxs)(J,{variant:"text",className:"gap-1.5 text-sm text-link hover:underline",onClick:t,children:[l,s,a]}),e[3]=t,e[4]=n),n},vo=()=>{let r=(0,K.c)(6),e=xe(Yt),{handleClick:t}=Fe();if(!e){let s;r[0]===t?s=r[1]:(s=(0,o.jsx)(J,{variant:"outline",size:"sm",onClick:()=>t("ai","ai-providers"),children:"Edit AI settings"}),r[0]=t,r[1]=s);let a;r[2]===Symbol.for("react.memo_cache_sentinel")?(a=(0,o.jsx)(Oe,{}),r[2]=a):a=r[2];let n;return r[3]===s?n=r[4]:(n=(0,o.jsx)(ge,{title:"Chat with AI",description:"No AI provider configured or Chat model not selected",action:s,icon:a}),r[3]=s,r[4]=n),n}let l;return r[5]===Symbol.for("react.memo_cache_sentinel")?(l=(0,o.jsx)(go,{}),r[5]=l):l=r[5],l},go=()=>{let r=Pt($e),[e,t]=De(Br),[l,s]=De(qr),[a,n]=(0,p.useState)(""),[i,u]=(0,p.useState)(""),[c,d]=(0,p.useState)(!0),{files:m,addFiles:f,clearFiles:x,removeFile:g}=xr(),{messages:w,enqueue:T,flushNext:b,clear:S,hasQueuedRef:R}=Ir(),C=(0,p.useRef)(null),j=(0,p.useRef)(null),N=(0,p.useRef)(null),L=(0,p.useRef)(null),I=(0,p.useRef)(null),[y,E]=(0,p.useState)(null),P=D(()=>{I.current=null,E(null)}),F=Vt(),{invokeAiTool:U,sendRun:Y}=nr(),{openModal:X,closeModal:V}=Vr(),q=e==null?void 0:e.id,te=Dt(),{addStagedCell:ue}=vr(),{createNewCell:xt,prepareForRun:vt}=Ft(),gt={addStagedCell:ue,createNewCell:xt,prepareForRun:vt,sendRun:Y,store:te},{messages:H,sendMessage:me,error:re,status:Ce,regenerate:wt,stop:pe,addToolOutput:bt,addToolApprovalResponse:yt,id:jt}=gr({id:q,throttle:100,sendAutomaticallyWhen:({messages:h})=>qe(h),messages:(e==null?void 0:e.messages)||[],transport:new Er({api:F.getAiURL("chat").toString(),headers:()=>F.headers(),prepareSendMessagesRequest:async h=>{var O;let v=await jr({messages:h.messages});v.success||oe.debug("Outgoing chat messages failed AI SDK schema validation",v.error);let A={uiMessages:h.messages,includeOtherCode:Ht("")},k=((O=te.get(He))==null?void 0:O.mode)||mt,_=yr.getToolSchemas(k);return{api:F.getAiURL("chat").toString(),body:{tools:_,...h,...A}}}},h=>{let v=pr(h);v!==void 0&&(I.current=v)}),onFinish:({messages:h,isError:v,isAbort:A,finishReason:k})=>{if(r(_=>uo({chatState:_,chatId:_.activeChatId,messages:h})),A){let _=ur({isAbort:!0,streamReason:I.current});if(P(),_!=null){let O=mr(_);oe.debug("Chat stream aborted",{reason:_,finishReason:k}),E(O)}}else P();he(h,{isError:v,isAbort:A})},onToolCall:async({toolCall:h})=>{await kr({invokeAiTool:U,addToolOutput:bt,toolCall:{toolName:h.toolName,toolCallId:h.toolCallId,input:h.input},toolContext:gt})},onError:h=>{oe.error("An error occurred:",h)}}),Ne=D(h=>{P(),me({role:"user",parts:h})}),he=D((h,v)=>{R.current&&br({isError:v.isError,isAbort:v.isAbort,hasPendingToolCalls:qe(h),hasUnresolvedToolCalls:Cr(h)})&&b(Ne)}),M=Ce==="submitted"||Ce==="streaming",Ae=(0,p.useRef)(M);Ae.current=M;let Re=D(h=>{Ae.current||R.current?T(h):Ne(h)}),St=D(()=>{let h=N.current;if(!h)return;let{scrollTop:v,scrollHeight:A,clientHeight:k}=h;d(A>k?Math.abs(A-k-v)<5:!0)}),fe=D((h=!1)=>{let v=N.current;v&&v.scrollTo({top:v.scrollHeight,behavior:h?"smooth":"auto"})}),Ct=M&&H.length>0&&Lr(H);(0,p.useEffect)(()=>{d(!0),S(),P()},[q,S,P]),(0,p.useEffect)(()=>{if(!c)return;let h=requestAnimationFrame(()=>{fe()});return()=>cancelAnimationFrame(h)},[H,w,M,c,fe]),(0,p.useEffect)(()=>{M||he(H,{isError:re!=null,isAbort:!1})},[H,M,re,he]);let Te=D(h=>{let v=Date.now(),A={id:jt,title:Sr(h),messages:[],createdAt:v,updatedAt:v};r(k=>{let _=new Map(k.chats);return _.set(A.id,A),{...k,chats:_,activeChatId:A.id}})}),Nt=D(async(h,v)=>{Te(h);let A=v&&v.length>0?await Xe(v):void 0,{contextPart:k,attachments:_}=await le(h);me({role:"user",parts:[{type:"text",text:h},...k?[k]:[],...A??[],..._]}),x(),n("")}),At=D(()=>{t(null),n(""),u(""),S(),x()}),Rt=D(()=>{X((0,o.jsx)(Jr,{onClose:V}))}),Tt=D(async(h,v)=>{var Ie;let A=H[h],k=((Ie=A.parts)==null?void 0:Ie.filter(Le=>Le.type==="file"&&!wr(Le)))??[],{contextPart:_,attachments:O}=await le(v),Lt=A.id;me({messageId:Lt,role:"user",parts:[{type:"text",text:v},..._?[_]:[],...k,...O]})}),Et=D(async(h,v)=>{var O;if(!v.trim())return;(O=j.current)!=null&&O.view&&Ue(j.current.view);let A=m?await Xe(m):void 0,{contextPart:k,attachments:_}=await le(v);h==null||h.preventDefault(),Re([{type:"text",text:v},...k?[k]:[],...A??[],..._]),n(""),x()}),_t=()=>{P(),wt()},kt=D(()=>{var h;i.trim()&&((h=C.current)!=null&&h.view&&Ue(C.current.view),Nt(i.trim(),m))}),It=()=>{var h,v;return(v=(h=C.current)==null?void 0:h.editor)==null?void 0:v.blur()},Ee=D(async h=>{q??(Te(h),n(i));let{contextPart:v,attachments:A}=await le(h);Re([{type:"text",text:h},...v?[v]:[],...A])}),Q=H.length===0;(0,p.useEffect)(()=>{if(!l)return;s(null);let{prompt:h,submit:v}=l;v?Ee(h):Q?(u(h),Me(C)):(n(h),Me(j))},[l,s,Q,Ee]);let _e=Q?(0,o.jsx)(Se,{placeholder:"Ask anything, @ to include context about tables or dataframes",input:i,inputRef:C,inputClassName:"px-1 py-0",setInput:u,onSubmit:kt,isLoading:M,onStop:pe,fileInputRef:L,onAddFiles:f,onClose:It},"new-thread-input"):(0,o.jsx)(Se,{input:a,setInput:n,onSubmit:Et,inputRef:j,isLoading:M,onStop:pe,onClose:()=>{var h,v;return(v=(h=j.current)==null?void 0:h.editor)==null?void 0:v.blur()},fileInputRef:L,onAddFiles:f}),ke=m&&m.length>0&&(0,o.jsx)("div",{className:Z("flex flex-row gap-1 flex-wrap p-1",Q&&"py-2 px-1"),children:m==null?void 0:m.map(h=>(0,o.jsx)(Nr,{file:h,onRemove:()=>g(h)},h.name))});return(0,o.jsxs)("div",{className:"flex flex-col h-[calc(100%-53px)]",children:[(0,o.jsx)(We,{children:(0,o.jsx)(fo,{onNewChat:At,activeChatId:e==null?void 0:e.id,setActiveChat:t})}),(0,o.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden relative min-h-0",children:[(0,o.jsxs)("div",{className:"flex-1 px-3 bg-(--slate-1) gap-4 py-3 flex flex-col overflow-y-auto",ref:N,onScroll:St,children:[Q&&(0,o.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,o.jsxs)("div",{className:"rounded-md border bg-background",children:[ke,_e]}),(0,o.jsx)(xo,{onPairWithAgent:Rt})]}),H.map((h,v)=>(0,o.jsx)(ht,{message:h,index:v,onEdit:Tt,isStreamingReasoning:Ct,isLast:v===H.length-1,isActive:M,addToolApprovalResponse:yt},h.id)),w.map(h=>(0,o.jsx)(pt,{message:h},h.id)),M&&(0,o.jsx)("div",{className:"flex justify-center py-4",children:(0,o.jsx)(Be,{className:"h-4 w-4 animate-spin"})}),re&&(0,o.jsxs)("div",{className:"flex items-center justify-center space-x-2 mb-4",children:[(0,o.jsx)($r,{error:re||Error("Unknown error")}),(0,o.jsx)(J,{variant:"outline",size:"sm",onClick:_t,children:"Retry"})]}),y&&!M&&!re&&(0,o.jsx)("div",{className:"flex justify-center py-2",children:(0,o.jsx)("span",{className:"text-xs text-muted-foreground",children:y})})]}),(0,o.jsx)(cr,{isVisible:!c&&(H.length>0||w.length>0),onScrollToBottom:()=>fe(!0)})]}),M&&(0,o.jsx)("div",{className:"w-full flex justify-center items-center z-20 border-t",children:(0,o.jsx)(J,{variant:"linkDestructive",size:"sm",onClick:pe,children:"Stop"})}),!Q&&(0,o.jsxs)(o.Fragment,{children:[ke,_e]})]})},wo=vo;function bo(r){return r.type==="text"}function yo(r){return r.text}function jo(r){return r.type==="file"}function So(r,e){return(0,o.jsx)(Ye,{attachment:r},e)}function Co(r){return r.type==="text"}function No(r){return r.text}function Ao(r){return r.type==="file"}function Ro(r,e){return(0,o.jsx)(Ye,{attachment:r},e)}function To(){}function Eo(){}function _o(r){return r.type==="text"}function ko(r){return r.text}function Io(r){return(0,o.jsx)(tr,{value:r.value,className:"text-xs py-1",children:(0,o.jsxs)("div",{className:"flex items-start gap-2.5",children:[(0,o.jsx)("span",{className:"mt-1 text-muted-foreground",children:(0,o.jsx)(r.Icon,{className:"h-3 w-3"})}),(0,o.jsxs)("div",{className:"flex flex-col gap-0.5",children:[(0,o.jsx)("span",{className:"font-semibold",children:r.label}),(0,o.jsx)("span",{className:"text-muted-foreground",children:r.subtitle})]})]})},r.value)}export{wo as default};
@@ -1 +0,0 @@
1
- var ve=Object.defineProperty;var xe=(a,r,e)=>r in a?ve(a,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[r]=e;var L=(a,r,e)=>xe(a,typeof r!="symbol"?r+"":r,e);import{s as $}from"./chunk-LvLJmgfZ.js";import{l as we}from"./useEvent-D91BmmQi.js";import{t as ge}from"./react-Bj1aDYRI.js";import{t as q}from"./compiler-runtime-B3qBwwSJ.js";import{o as B}from"./useEventListener-B_wSLgFR.js";import{E as ye}from"./utils-C5VWChv9.js";import{t as j}from"./cn-DYvqRARy.js";import{t as _e}from"./jsx-runtime-Blw4afVn.js";import{C as G,_ as J,b as Ce,v as je,w as C,x as Q,y as D}from"./fullscreen-B51geQ_6.js";import{d as Ne,u as Ae}from"./menu-items-Db-bgz92.js";import{r as Re}from"./requests-9-v2bhoi.js";import{r as ke}from"./x-C-Eq0ag8.js";var c=$(ge(),1),d=$(_e(),1),N="Collapsible",[Ie,W]=G(N),[De,O]=Ie(N),X=c.forwardRef((a,r)=>{let{__scopeCollapsible:e,open:o,defaultOpen:n,disabled:t,onOpenChange:s,...i}=a,[l,p]=D({prop:o,defaultProp:n??!1,onChange:s,caller:N});return(0,d.jsx)(De,{scope:e,disabled:t,contentId:J(),open:l,onOpenToggle:c.useCallback(()=>p(m=>!m),[p]),children:(0,d.jsx)(C.div,{"data-state":S(l),"data-disabled":t?"":void 0,...i,ref:r})})});X.displayName=N;var Y="CollapsibleTrigger",Z=c.forwardRef((a,r)=>{let{__scopeCollapsible:e,...o}=a,n=O(Y,e);return(0,d.jsx)(C.button,{type:"button","aria-controls":n.contentId,"aria-expanded":n.open||!1,"data-state":S(n.open),"data-disabled":n.disabled?"":void 0,disabled:n.disabled,...o,ref:r,onClick:Q(a.onClick,n.onOpenToggle)})});Z.displayName=Y;var E="CollapsibleContent",ee=c.forwardRef((a,r)=>{let{forceMount:e,...o}=a,n=O(E,a.__scopeCollapsible);return(0,d.jsx)(je,{present:e||n.open,children:({present:t})=>(0,d.jsx)(Oe,{...o,ref:r,present:t})})});ee.displayName=E;var Oe=c.forwardRef((a,r)=>{let{__scopeCollapsible:e,present:o,children:n,...t}=a,s=O(E,e),[i,l]=c.useState(o),p=c.useRef(null),m=B(r,p),u=c.useRef(0),x=u.current,g=c.useRef(0),w=g.current,y=s.open||i,h=c.useRef(y),b=c.useRef(void 0);return c.useEffect(()=>{let f=requestAnimationFrame(()=>h.current=!1);return()=>cancelAnimationFrame(f)},[]),Ce(()=>{let f=p.current;if(f){b.current=b.current||{transitionDuration:f.style.transitionDuration,animationName:f.style.animationName},f.style.transitionDuration="0s",f.style.animationName="none";let _=f.getBoundingClientRect();u.current=_.height,g.current=_.width,h.current||(f.style.transitionDuration=b.current.transitionDuration,f.style.animationName=b.current.animationName),l(o)}},[s.open,o]),(0,d.jsx)(C.div,{"data-state":S(s.open),"data-disabled":s.disabled?"":void 0,id:s.contentId,hidden:!y,...t,ref:m,style:{"--radix-collapsible-content-height":x?`${x}px`:void 0,"--radix-collapsible-content-width":w?`${w}px`:void 0,...a.style},children:y&&n})});function S(a){return a?"open":"closed"}var Ee=X,Se=Z,Me=ee,v="Accordion",Ve=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[M,ze,Pe]=Ne(v),[A,da]=G(v,[Pe,W]),V=W(),ae=c.forwardRef((a,r)=>{let{type:e,...o}=a,n=o,t=o;return(0,d.jsx)(M.Provider,{scope:a.__scopeAccordion,children:e==="multiple"?(0,d.jsx)(Fe,{...t,ref:r}):(0,d.jsx)(Ue,{...n,ref:r})})});ae.displayName=v;var[re,Te]=A(v),[te,He]=A(v,{collapsible:!1}),Ue=c.forwardRef((a,r)=>{let{value:e,defaultValue:o,onValueChange:n=()=>{},collapsible:t=!1,...s}=a,[i,l]=D({prop:e,defaultProp:o??"",onChange:n,caller:v});return(0,d.jsx)(re,{scope:a.__scopeAccordion,value:c.useMemo(()=>i?[i]:[],[i]),onItemOpen:l,onItemClose:c.useCallback(()=>t&&l(""),[t,l]),children:(0,d.jsx)(te,{scope:a.__scopeAccordion,collapsible:t,children:(0,d.jsx)(oe,{...s,ref:r})})})}),Fe=c.forwardRef((a,r)=>{let{value:e,defaultValue:o,onValueChange:n=()=>{},...t}=a,[s,i]=D({prop:e,defaultProp:o??[],onChange:n,caller:v}),l=c.useCallback(m=>i((u=[])=>[...u,m]),[i]),p=c.useCallback(m=>i((u=[])=>u.filter(x=>x!==m)),[i]);return(0,d.jsx)(re,{scope:a.__scopeAccordion,value:s,onItemOpen:l,onItemClose:p,children:(0,d.jsx)(te,{scope:a.__scopeAccordion,collapsible:!0,children:(0,d.jsx)(oe,{...t,ref:r})})})}),[Ke,R]=A(v),oe=c.forwardRef((a,r)=>{let{__scopeAccordion:e,disabled:o,dir:n,orientation:t="vertical",...s}=a,i=B(c.useRef(null),r),l=ze(e),p=Ae(n)==="ltr",m=Q(a.onKeyDown,u=>{var F;if(!Ve.includes(u.key))return;let x=u.target,g=l().filter(I=>{var K;return!((K=I.ref.current)!=null&&K.disabled)}),w=g.findIndex(I=>I.ref.current===x),y=g.length;if(w===-1)return;u.preventDefault();let h=w,b=y-1,f=()=>{h=w+1,h>b&&(h=0)},_=()=>{h=w-1,h<0&&(h=b)};switch(u.key){case"Home":h=0;break;case"End":h=b;break;case"ArrowRight":t==="horizontal"&&(p?f():_());break;case"ArrowDown":t==="vertical"&&f();break;case"ArrowLeft":t==="horizontal"&&(p?_():f());break;case"ArrowUp":t==="vertical"&&_();break}(F=g[h%y].ref.current)==null||F.focus()});return(0,d.jsx)(Ke,{scope:e,disabled:o,direction:n,orientation:t,children:(0,d.jsx)(M.Slot,{scope:e,children:(0,d.jsx)(C.div,{...s,"data-orientation":t,ref:i,onKeyDown:o?void 0:m})})})}),k="AccordionItem",[Le,z]=A(k),ne=c.forwardRef((a,r)=>{let{__scopeAccordion:e,value:o,...n}=a,t=R(k,e),s=Te(k,e),i=V(e),l=J(),p=o&&s.value.includes(o)||!1,m=t.disabled||a.disabled;return(0,d.jsx)(Le,{scope:e,open:p,disabled:m,triggerId:l,children:(0,d.jsx)(Ee,{"data-orientation":t.orientation,"data-state":pe(p),...i,...n,ref:r,disabled:m,open:p,onOpenChange:u=>{u?s.onItemOpen(o):s.onItemClose(o)}})})});ne.displayName=k;var se="AccordionHeader",ie=c.forwardRef((a,r)=>{let{__scopeAccordion:e,...o}=a,n=R(v,e),t=z(se,e);return(0,d.jsx)(C.h3,{"data-orientation":n.orientation,"data-state":pe(t.open),"data-disabled":t.disabled?"":void 0,...o,ref:r})});ie.displayName=se;var P="AccordionTrigger",le=c.forwardRef((a,r)=>{let{__scopeAccordion:e,...o}=a,n=R(v,e),t=z(P,e),s=He(P,e),i=V(e);return(0,d.jsx)(M.ItemSlot,{scope:e,children:(0,d.jsx)(Se,{"aria-disabled":t.open&&!s.collapsible||void 0,"data-orientation":n.orientation,id:t.triggerId,...i,...o,ref:r})})});le.displayName=P;var de="AccordionContent",ce=c.forwardRef((a,r)=>{let{__scopeAccordion:e,...o}=a,n=R(v,e),t=z(de,e),s=V(e);return(0,d.jsx)(Me,{role:"region","aria-labelledby":t.triggerId,"data-orientation":n.orientation,...s,...o,ref:r,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...a.style}})});ce.displayName=de;function pe(a){return a?"open":"closed"}var me=ae,ue=ne,$e=ie,T=le,H=ce,U=q(),qe=me,fe=c.forwardRef((a,r)=>{let e=(0,U.c)(9),o,n;e[0]===a?(o=e[1],n=e[2]):({className:o,...n}=a,e[0]=a,e[1]=o,e[2]=n);let t;e[3]===o?t=e[4]:(t=j("border-b",o),e[3]=o,e[4]=t);let s;return e[5]!==n||e[6]!==r||e[7]!==t?(s=(0,d.jsx)(ue,{ref:r,className:t,...n}),e[5]=n,e[6]=r,e[7]=t,e[8]=s):s=e[8],s});fe.displayName="AccordionItem";var he=c.forwardRef((a,r)=>{let e=(0,U.c)(12),o,n,t;e[0]===a?(o=e[1],n=e[2],t=e[3]):({className:n,children:o,...t}=a,e[0]=a,e[1]=o,e[2]=n,e[3]=t);let s;e[4]===n?s=e[5]:(s=j("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180 text-start",n),e[4]=n,e[5]=s);let i;e[6]===Symbol.for("react.memo_cache_sentinel")?(i=(0,d.jsx)(ke,{className:"h-4 w-4 transition-transform duration-200"}),e[6]=i):i=e[6];let l;return e[7]!==o||e[8]!==t||e[9]!==r||e[10]!==s?(l=(0,d.jsx)($e,{className:"flex",children:(0,d.jsxs)(T,{ref:r,className:s,...t,children:[o,i]})}),e[7]=o,e[8]=t,e[9]=r,e[10]=s,e[11]=l):l=e[11],l});he.displayName=T.displayName;var be=c.forwardRef((a,r)=>{let e=(0,U.c)(17),o,n,t,s;e[0]===a?(o=e[1],n=e[2],t=e[3],s=e[4]):({className:n,children:o,wrapperClassName:s,...t}=a,e[0]=a,e[1]=o,e[2]=n,e[3]=t,e[4]=s);let i;e[5]===n?i=e[6]:(i=j("overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",n),e[5]=n,e[6]=i);let l;e[7]===s?l=e[8]:(l=j("pb-4 pt-0",s),e[7]=s,e[8]=l);let p;e[9]!==o||e[10]!==l?(p=(0,d.jsx)("div",{className:l,children:o}),e[9]=o,e[10]=l,e[11]=p):p=e[11];let m;return e[12]!==t||e[13]!==r||e[14]!==i||e[15]!==p?(m=(0,d.jsx)(H,{ref:r,className:i,...t,children:p}),e[12]=t,e[13]=r,e[14]=i,e[15]=p,e[16]=m):m=e[16],m});be.displayName=H.displayName;var Be=class{constructor(){L(this,"map",new Map)}get(a){return this.map.get(a)??[]}set(a,r){this.map.set(a,r)}add(a,r){this.map.has(a)?this.map.get(a).push(r):this.map.set(a,[r])}has(a){return this.map.has(a)}delete(a){return this.map.delete(a)}clear(){this.map.clear()}keys(){return this.map.keys()}values(){return this.map.values()}entries(){return this.map.entries()}forEach(a){this.map.forEach(a)}flatValues(){let a=[];for(let r of this.map.values())a.push(...r);return a}get size(){return this.map.size}},Ge=q(),Je=a=>{switch(a){case"chat":return"chat_model";case"autocomplete":return"autocomplete_model";case"edit":return"edit_model"}};const Qe=()=>{let a=(0,Ge.c)(12),[r,e]=we(ye),{saveUserConfig:o}=Re(),n;a[0]!==o||a[1]!==e?(n=async u=>{await o({config:u}).then(()=>{e(x=>({...x,...u}))})},a[0]=o,a[1]=e,a[2]=n):n=a[2];let t=n,s;a[3]!==t||a[4]!==r?(s=async(u,x)=>{var w,y,h,b,f;let g=Je(x);g&&await t({ai:{...r.ai,models:{custom_models:((y=(w=r.ai)==null?void 0:w.models)==null?void 0:y.custom_models)??[],displayed_models:((b=(h=r.ai)==null?void 0:h.models)==null?void 0:b.displayed_models)??[],...(f=r.ai)==null?void 0:f.models,[g]:u}}})},a[3]=t,a[4]=r,a[5]=s):s=a[5];let i=s,l;a[6]!==t||a[7]!==r?(l=async u=>{await t({ai:{...r.ai,mode:u}})},a[6]=t,a[7]=r,a[8]=l):l=a[8];let p=l,m;return a[9]!==p||a[10]!==i?(m={saveModelChange:i,saveModeChange:p},a[9]=p,a[10]=i,a[11]=m):m=a[11],m};export{fe as a,ue as c,be as i,me as l,Be as n,he as o,qe as r,H as s,Qe as t,T as u};