opencami 1.9.1 → 2.1.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/dist/client/assets/{CSPContext-B3PAVjBL.js → CSPContext-CxrBvJ99.js} +1 -1
- package/dist/client/assets/{DirectionContext-CR5CCisG.js → DirectionContext-BOL0P_1j.js} +1 -1
- package/dist/client/assets/_sessionKey-CTtu2ipR.js +25 -0
- package/dist/client/assets/agents-D7JS19Lo.js +2 -0
- package/dist/client/assets/{agents-screen--ZMzN5cB.js → agents-screen-CqdzZKaR.js} +1 -1
- package/dist/client/assets/bots-DAInzfLx.js +2 -0
- package/dist/client/assets/{bots-screen-C_uJBNwI.js → bots-screen-RYovD6cu.js} +1 -1
- package/dist/client/assets/button-Bv-7bwZZ.js +1 -0
- package/dist/client/assets/{composite-DArWbFHm.js → composite-DwQIZFe9.js} +1 -1
- package/dist/client/assets/{connect-B48HecjN.js → connect-DZSrhhNT.js} +1 -1
- package/dist/client/assets/{dashboard-BVKx9FMy.js → dashboard-y8KVUVF-.js} +1 -1
- package/dist/client/assets/{event-BCwqPPkP.js → event-Cnr9OETn.js} +1 -1
- package/dist/client/assets/file-explorer-screen-C_mYUJsr.js +1 -0
- package/dist/client/assets/files-CG0jFYdO.js +2 -0
- package/dist/client/assets/follow-up-suggestions-C6RzpstA.js +2 -0
- package/dist/client/assets/{index-0gdwm1_H.js → index-3-ASY4Cl.js} +1 -1
- package/dist/client/assets/index-BZxJSF4T.js +3 -0
- package/dist/client/assets/{keyboard-shortcuts-dialog-CK_XTzLr.js → keyboard-shortcuts-dialog-jm4-DftO.js} +1 -1
- package/dist/client/assets/{main-B2CrcRuC.js → main-CbISK-pm.js} +3 -3
- package/dist/client/assets/{markdown-CdkuX06F.js → markdown-UD7RzskQ.js} +1 -1
- package/dist/client/assets/memory-BYRJ1l_4.js +2 -0
- package/dist/client/assets/{memory-screen-C1RfLy-d.js → memory-screen-BRsm-Q8A.js} +1 -1
- package/dist/client/assets/{menu-CIwnliij.js → menu-DRjoHFvG.js} +1 -1
- package/dist/client/assets/{opencami-logo-SVuYD55V.js → opencami-logo-D2mv84sX.js} +1 -1
- package/dist/client/assets/{proxy-BijR8W1L.js → proxy-DtxqfBHY.js} +1 -1
- package/dist/client/assets/{react-DWx7OvUo.js → react-C_7UlEtd.js} +1 -1
- package/dist/client/assets/{search-dialog-CB4KE8ec.js → search-dialog-lsT8JUtT.js} +1 -1
- package/dist/client/assets/{search-sources-badge-B8Z-8sSf.js → search-sources-badge-BnqKxoia.js} +1 -1
- package/dist/client/assets/{session-export-dialog-tDiFuv3a.js → session-export-dialog-DHHpvwI8.js} +1 -1
- package/dist/client/assets/settings-dialog-vrd0eJGw.js +1 -0
- package/dist/client/assets/skills-Svd-7oxQ.js +2 -0
- package/dist/client/assets/{skills-panel-fjJQVMog.js → skills-panel-Dkuo0yyD.js} +1 -1
- package/dist/client/assets/styles-CWabEzNU.css +1 -0
- package/dist/client/assets/{switch-Bn5uei2k.js → switch-BYFBYPmi.js} +1 -1
- package/dist/client/assets/{tabs-DOBNAUVE.js → tabs-1jrPkdUE.js} +1 -1
- package/dist/client/assets/{thinking-dfGrFAMV.js → thinking-D9BBn5kK.js} +1 -1
- package/dist/client/assets/{tooltip-DOKkNFvu.js → tooltip-DzFgDY86.js} +1 -1
- package/dist/client/assets/{use-file-explorer-state-BAa6Cxyr.js → use-file-explorer-state-Dwhw6Mpg.js} +2 -2
- package/dist/client/assets/{useBaseUiId-DFpBD0sg.js → useBaseUiId-BdQC9KF3.js} +1 -1
- package/dist/client/assets/useCompositeItem-BI09zNFD.js +1 -0
- package/dist/client/assets/{useControlled-CQHE0ITz.js → useControlled-Bc2Emhlx.js} +1 -1
- package/dist/client/assets/{useMutation-BFl-7GnD.js → useMutation-CMp81lDO.js} +1 -1
- package/dist/client/assets/{useOnFirstRender-DlXHIIGk.js → useOnFirstRender-DpB3w0o4.js} +1 -1
- package/dist/client/assets/{useQuery-D-sF8Tld.js → useQuery-_BEWdUe1.js} +1 -1
- package/dist/server/assets/{_sessionKey-D8TGrDRM.js → _sessionKey-COz7RLKC.js} +170 -279
- package/dist/server/assets/_tanstack-start-manifest_v-D0f-0Utn.js +4 -0
- package/dist/server/assets/{connect-CTVBm0Vc.js → connect-sd_NDvQN.js} +1 -1
- package/dist/server/assets/follow-up-suggestions-DRQqO8_S.js +183 -0
- package/dist/server/assets/{index-B_F4DTUu.js → index-197lqzv2.js} +2 -0
- package/dist/server/assets/{index-gRco4Ina.js → index-sXe2QC5V.js} +1 -1
- package/dist/server/assets/{markdown-CFdYXCRQ.js → markdown-Dk1YdosA.js} +1 -1
- package/dist/server/assets/{memory-screen-vqXczcVo.js → memory-screen-DA_o-N1Z.js} +2 -2
- package/dist/server/assets/{memory-rBB015W-.js → memory-woPzJFfs.js} +1 -1
- package/dist/server/assets/{router-DaKDqc9w.js → router-CZhxPkYW.js} +347 -355
- package/dist/server/assets/{search-dialog-DSSK93kq.js → search-dialog-DlvWfq1e.js} +5 -5
- package/dist/server/assets/{settings-dialog-DyWNblva.js → settings-dialog-BGtrS2RJ.js} +63 -255
- package/dist/server/assets/{thinking-CU0FRlzT.js → thinking-fzwT_aVT.js} +5 -5
- package/dist/server/server.js +2 -2
- package/package.json +1 -1
- package/dist/client/assets/_sessionKey-Bg_9uype.js +0 -23
- package/dist/client/assets/agents-BiTHBb6Z.js +0 -2
- package/dist/client/assets/bots-DxhRnQp5.js +0 -2
- package/dist/client/assets/button-BciDmec0.js +0 -1
- package/dist/client/assets/file-explorer-screen-DPs-FWeA.js +0 -1
- package/dist/client/assets/files-SEycwYCa.js +0 -2
- package/dist/client/assets/follow-up-suggestions-BPjWBpiy.js +0 -5
- package/dist/client/assets/index-CGeJcqZ3.js +0 -3
- package/dist/client/assets/memory-C7lKdkmc.js +0 -2
- package/dist/client/assets/settings-dialog-aL-AH4Rt.js +0 -1
- package/dist/client/assets/skills-D1T6uemU.js +0 -2
- package/dist/client/assets/styles-D0L88B64.css +0 -1
- package/dist/client/assets/useCompositeItem-B-Axq9-D.js +0 -1
- package/dist/server/assets/_tanstack-start-manifest_v-DalBo2bY.js +0 -4
- package/dist/server/assets/follow-up-suggestions-C65ptDij.js +0 -336
|
@@ -5,7 +5,7 @@ import { HugeiconsIcon } from "@hugeicons/react";
|
|
|
5
5
|
import { Search01Icon, Cancel01Icon, Loading03Icon } from "@hugeicons/core-free-icons";
|
|
6
6
|
import { D as DialogRoot, a as DialogContent } from "./use-file-explorer-state-E6cUvMva.js";
|
|
7
7
|
import { useQueryClient } from "@tanstack/react-query";
|
|
8
|
-
import { c as chatQueryKeys } from "./_sessionKey-
|
|
8
|
+
import { c as chatQueryKeys } from "./_sessionKey-COz7RLKC.js";
|
|
9
9
|
import { c as cn } from "./button-kI8fEIZQ.js";
|
|
10
10
|
import "@base-ui/react/dialog";
|
|
11
11
|
import "zustand";
|
|
@@ -18,15 +18,15 @@ import "@base-ui/react/scroll-area";
|
|
|
18
18
|
import "./menu-D8cKTpmN.js";
|
|
19
19
|
import "@base-ui/react/menu";
|
|
20
20
|
import "./opencami-logo-C-43FL3R.js";
|
|
21
|
-
import "./
|
|
21
|
+
import "./index-197lqzv2.js";
|
|
22
|
+
import "zustand/middleware";
|
|
23
|
+
import "./markdown-Dk1YdosA.js";
|
|
22
24
|
import "marked";
|
|
23
25
|
import "react-markdown";
|
|
24
26
|
import "remark-breaks";
|
|
25
27
|
import "remark-gfm";
|
|
26
|
-
import "./index-B_F4DTUu.js";
|
|
27
|
-
import "zustand/middleware";
|
|
28
28
|
import "react-dom";
|
|
29
|
-
import "./router-
|
|
29
|
+
import "./router-CZhxPkYW.js";
|
|
30
30
|
import "node:crypto";
|
|
31
31
|
import "node:fs";
|
|
32
32
|
import "node:os";
|
|
@@ -2,13 +2,12 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState, useEffect, useRef } from "react";
|
|
3
3
|
import { create } from "zustand";
|
|
4
4
|
import { HugeiconsIcon } from "@hugeicons/react";
|
|
5
|
-
import { Cancel01Icon, Link01Icon, PaintBoardIcon, MessageEdit01Icon, Settings02Icon, UserIcon, VoiceIcon,
|
|
5
|
+
import { Cancel01Icon, Link01Icon, PaintBoardIcon, MessageEdit01Icon, Settings02Icon, UserIcon, VoiceIcon, InformationCircleIcon, ComputerIcon, Sun01Icon, Moon01Icon, Leaf01Icon, DropletIcon } from "@hugeicons/core-free-icons";
|
|
6
6
|
import { B as Button, c as cn } from "./button-kI8fEIZQ.js";
|
|
7
7
|
import { D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./use-file-explorer-state-E6cUvMva.js";
|
|
8
8
|
import { S as Switch } from "./switch-BZzwkgAQ.js";
|
|
9
9
|
import { T as Tabs, a as TabsList, b as TabsTab } from "./tabs-CWbp3mT4.js";
|
|
10
|
-
import { u as useChatSettings } from "./index-
|
|
11
|
-
import { u as useLlmSettings, g as getLlmProviderDefaults } from "./_sessionKey-D8TGrDRM.js";
|
|
10
|
+
import { u as useChatSettings } from "./index-197lqzv2.js";
|
|
12
11
|
import "@base-ui/react/merge-props";
|
|
13
12
|
import "@base-ui/react/use-render";
|
|
14
13
|
import "class-variance-authority";
|
|
@@ -18,35 +17,6 @@ import "@base-ui/react/dialog";
|
|
|
18
17
|
import "@base-ui/react/switch";
|
|
19
18
|
import "@base-ui/react/tabs";
|
|
20
19
|
import "zustand/middleware";
|
|
21
|
-
import "@tanstack/react-router";
|
|
22
|
-
import "@tanstack/react-query";
|
|
23
|
-
import "./tooltip-DOvOrSSS.js";
|
|
24
|
-
import "@base-ui/react/tooltip";
|
|
25
|
-
import "motion/react";
|
|
26
|
-
import "@base-ui/react/alert-dialog";
|
|
27
|
-
import "@base-ui/react/collapsible";
|
|
28
|
-
import "@base-ui/react/scroll-area";
|
|
29
|
-
import "./menu-D8cKTpmN.js";
|
|
30
|
-
import "@base-ui/react/menu";
|
|
31
|
-
import "./opencami-logo-C-43FL3R.js";
|
|
32
|
-
import "./markdown-CFdYXCRQ.js";
|
|
33
|
-
import "marked";
|
|
34
|
-
import "react-markdown";
|
|
35
|
-
import "remark-breaks";
|
|
36
|
-
import "remark-gfm";
|
|
37
|
-
import "react-dom";
|
|
38
|
-
import "./router-DaKDqc9w.js";
|
|
39
|
-
import "node:crypto";
|
|
40
|
-
import "node:fs";
|
|
41
|
-
import "node:os";
|
|
42
|
-
import "node:path";
|
|
43
|
-
import "ws";
|
|
44
|
-
import "@tanstack/router-core/ssr/client";
|
|
45
|
-
import "node:stream";
|
|
46
|
-
import "node:child_process";
|
|
47
|
-
import "node:util";
|
|
48
|
-
import "node:fs/promises";
|
|
49
|
-
import "path";
|
|
50
20
|
function getInitialEnabled() {
|
|
51
21
|
if (typeof window === "undefined") return false;
|
|
52
22
|
try {
|
|
@@ -275,16 +245,9 @@ function SettingsDialog({
|
|
|
275
245
|
onClose
|
|
276
246
|
}) {
|
|
277
247
|
const { settings, updateSettings } = useChatSettings();
|
|
278
|
-
const {
|
|
279
|
-
settings: llmSettings,
|
|
280
|
-
updateSettings: updateLlmSettings,
|
|
281
|
-
status: llmStatus,
|
|
282
|
-
testApiKey
|
|
283
|
-
} = useLlmSettings();
|
|
284
248
|
const [activeTab, setActiveTab] = useState("appearance");
|
|
285
|
-
const [
|
|
286
|
-
const [
|
|
287
|
-
const [testResult, setTestResult] = useState(null);
|
|
249
|
+
const [llmModels, setLlmModels] = useState([]);
|
|
250
|
+
const [llmModelsLoading, setLlmModelsLoading] = useState(false);
|
|
288
251
|
const [textSize, setTextSize] = useState(() => {
|
|
289
252
|
if (typeof window === "undefined") return "16px";
|
|
290
253
|
try {
|
|
@@ -327,6 +290,29 @@ function SettingsDialog({
|
|
|
327
290
|
return "auto";
|
|
328
291
|
}
|
|
329
292
|
});
|
|
293
|
+
useEffect(() => {
|
|
294
|
+
let mounted = true;
|
|
295
|
+
async function loadLlmModels() {
|
|
296
|
+
setLlmModelsLoading(true);
|
|
297
|
+
try {
|
|
298
|
+
const res = await fetch("/api/llm-models");
|
|
299
|
+
const data = await res.json();
|
|
300
|
+
if (!mounted) return;
|
|
301
|
+
setLlmModels(data.models ?? []);
|
|
302
|
+
} catch {
|
|
303
|
+
if (!mounted) return;
|
|
304
|
+
setLlmModels([]);
|
|
305
|
+
} finally {
|
|
306
|
+
if (mounted) {
|
|
307
|
+
setLlmModelsLoading(false);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
loadLlmModels();
|
|
312
|
+
return () => {
|
|
313
|
+
mounted = false;
|
|
314
|
+
};
|
|
315
|
+
}, []);
|
|
330
316
|
useEffect(() => {
|
|
331
317
|
if (typeof window === "undefined") return;
|
|
332
318
|
try {
|
|
@@ -619,29 +605,6 @@ function SettingsDialog({
|
|
|
619
605
|
})
|
|
620
606
|
);
|
|
621
607
|
};
|
|
622
|
-
const handleTestApiKey = async () => {
|
|
623
|
-
if (!apiKeyInput.trim()) return;
|
|
624
|
-
setTestingKey(true);
|
|
625
|
-
setTestResult(null);
|
|
626
|
-
try {
|
|
627
|
-
const result = await testApiKey(apiKeyInput.trim());
|
|
628
|
-
setTestResult(result);
|
|
629
|
-
if (result.valid) {
|
|
630
|
-
updateLlmSettings({ llmApiKey: apiKeyInput.trim() });
|
|
631
|
-
}
|
|
632
|
-
} finally {
|
|
633
|
-
setTestingKey(false);
|
|
634
|
-
}
|
|
635
|
-
};
|
|
636
|
-
const handleSaveApiKey = () => {
|
|
637
|
-
updateLlmSettings({ llmApiKey: apiKeyInput.trim() });
|
|
638
|
-
setTestResult(null);
|
|
639
|
-
};
|
|
640
|
-
const handleClearApiKey = () => {
|
|
641
|
-
setApiKeyInput("");
|
|
642
|
-
updateLlmSettings({ llmApiKey: "" });
|
|
643
|
-
setTestResult(null);
|
|
644
|
-
};
|
|
645
608
|
const themeOptions = [
|
|
646
609
|
{ value: "system", label: "Auto", icon: ComputerIcon },
|
|
647
610
|
{ value: "light", label: "Light", icon: Sun01Icon },
|
|
@@ -721,7 +684,6 @@ function SettingsDialog({
|
|
|
721
684
|
{ id: "workspace", label: "Workspace", icon: Settings02Icon },
|
|
722
685
|
{ id: "personas", label: "Personas", icon: UserIcon },
|
|
723
686
|
{ id: "voice", label: "Voice", icon: VoiceIcon },
|
|
724
|
-
{ id: "llm", label: "LLM Features", icon: AiBrain01Icon },
|
|
725
687
|
{ id: "about", label: "About", icon: InformationCircleIcon }
|
|
726
688
|
].map((tab) => /* @__PURE__ */ jsxs(
|
|
727
689
|
"button",
|
|
@@ -941,6 +903,42 @@ function SettingsDialog({
|
|
|
941
903
|
onCheckedChange: (checked) => updateSettings({ showSearchSources: checked })
|
|
942
904
|
}
|
|
943
905
|
) }),
|
|
906
|
+
/* @__PURE__ */ jsx(SettingsRow, { inline: true, label: "Follow-up suggestions", children: /* @__PURE__ */ jsx(
|
|
907
|
+
Switch,
|
|
908
|
+
{
|
|
909
|
+
checked: settings.showFollowUps,
|
|
910
|
+
onCheckedChange: (checked) => updateSettings({ showFollowUps: checked })
|
|
911
|
+
}
|
|
912
|
+
) }),
|
|
913
|
+
/* @__PURE__ */ jsx(
|
|
914
|
+
SettingsRow,
|
|
915
|
+
{
|
|
916
|
+
inline: true,
|
|
917
|
+
label: "LLM Features Model",
|
|
918
|
+
description: "Used for smart titles and follow-up suggestions",
|
|
919
|
+
children: /* @__PURE__ */ jsxs(
|
|
920
|
+
"select",
|
|
921
|
+
{
|
|
922
|
+
value: settings.llmFeaturesModel || "gpt54mini",
|
|
923
|
+
onChange: (e) => updateSettings({ llmFeaturesModel: e.target.value }),
|
|
924
|
+
className: "rounded-md border border-primary-200 bg-surface px-2 py-1 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500",
|
|
925
|
+
children: [
|
|
926
|
+
llmModelsLoading && llmModels.length === 0 ? /* @__PURE__ */ jsx("option", { value: settings.llmFeaturesModel || "gpt54mini", children: settings.llmFeaturesModel || "gpt54mini" }) : null,
|
|
927
|
+
llmModels.length > 0 ? llmModels.map((model) => /* @__PURE__ */ jsx("option", { value: model.agentId, children: model.displayName }, model.id)) : settings.llmFeaturesModel ? [
|
|
928
|
+
/* @__PURE__ */ jsx(
|
|
929
|
+
"option",
|
|
930
|
+
{
|
|
931
|
+
value: settings.llmFeaturesModel,
|
|
932
|
+
children: settings.llmFeaturesModel
|
|
933
|
+
},
|
|
934
|
+
settings.llmFeaturesModel
|
|
935
|
+
)
|
|
936
|
+
] : null
|
|
937
|
+
]
|
|
938
|
+
}
|
|
939
|
+
)
|
|
940
|
+
}
|
|
941
|
+
),
|
|
944
942
|
/* @__PURE__ */ jsx(
|
|
945
943
|
SettingsRow,
|
|
946
944
|
{
|
|
@@ -1296,196 +1294,6 @@ function SettingsDialog({
|
|
|
1296
1294
|
)
|
|
1297
1295
|
}
|
|
1298
1296
|
),
|
|
1299
|
-
/* @__PURE__ */ jsxs(
|
|
1300
|
-
SettingsSection,
|
|
1301
|
-
{
|
|
1302
|
-
title: "LLM Features",
|
|
1303
|
-
tabId: "llm",
|
|
1304
|
-
activeTab,
|
|
1305
|
-
children: [
|
|
1306
|
-
/* @__PURE__ */ jsxs("div", { className: "text-xs text-primary-500 mb-3", children: [
|
|
1307
|
-
"Enhance session titles and follow-up suggestions using an LLM provider.",
|
|
1308
|
-
llmStatus.hasEnvKey && /* @__PURE__ */ jsx("span", { className: "block mt-1 text-green-600", children: "✓ Server has OPENAI_API_KEY configured" }),
|
|
1309
|
-
llmStatus.hasOpenRouterKey && /* @__PURE__ */ jsx("span", { className: "block mt-1 text-green-600", children: "✓ Server has OPENROUTER_API_KEY configured" }),
|
|
1310
|
-
llmStatus.hasKilocodeKey && /* @__PURE__ */ jsx("span", { className: "block mt-1 text-green-600", children: "✓ Server has KILOCODE_API_KEY configured" })
|
|
1311
|
-
] }),
|
|
1312
|
-
/* @__PURE__ */ jsx(
|
|
1313
|
-
SettingsRow,
|
|
1314
|
-
{
|
|
1315
|
-
inline: true,
|
|
1316
|
-
label: "Provider",
|
|
1317
|
-
description: "Choose LLM provider for titles & follow-ups",
|
|
1318
|
-
children: /* @__PURE__ */ jsxs(
|
|
1319
|
-
"select",
|
|
1320
|
-
{
|
|
1321
|
-
value: llmSettings.llmProvider,
|
|
1322
|
-
onChange: (e) => {
|
|
1323
|
-
const provider = e.target.value;
|
|
1324
|
-
updateLlmSettings({
|
|
1325
|
-
llmProvider: provider,
|
|
1326
|
-
llmBaseUrl: "",
|
|
1327
|
-
llmModel: ""
|
|
1328
|
-
});
|
|
1329
|
-
},
|
|
1330
|
-
className: "px-2 py-1 text-sm rounded-md border border-primary-200 bg-surface focus:outline-none focus:ring-2 focus:ring-primary-500",
|
|
1331
|
-
children: [
|
|
1332
|
-
/* @__PURE__ */ jsx("option", { value: "openai", children: "OpenAI" }),
|
|
1333
|
-
/* @__PURE__ */ jsx("option", { value: "openrouter", children: "OpenRouter" }),
|
|
1334
|
-
/* @__PURE__ */ jsx("option", { value: "kilocode", children: "Kilo Gateway" }),
|
|
1335
|
-
/* @__PURE__ */ jsx("option", { value: "ollama", children: "Ollama (local)" }),
|
|
1336
|
-
/* @__PURE__ */ jsx("option", { value: "custom", children: "Custom" })
|
|
1337
|
-
]
|
|
1338
|
-
}
|
|
1339
|
-
)
|
|
1340
|
-
}
|
|
1341
|
-
),
|
|
1342
|
-
/* @__PURE__ */ jsx(
|
|
1343
|
-
SettingsRow,
|
|
1344
|
-
{
|
|
1345
|
-
inline: true,
|
|
1346
|
-
label: "Smart session titles",
|
|
1347
|
-
description: "Generate concise titles using AI",
|
|
1348
|
-
children: /* @__PURE__ */ jsx(
|
|
1349
|
-
Switch,
|
|
1350
|
-
{
|
|
1351
|
-
checked: llmSettings.useLlmTitles,
|
|
1352
|
-
onCheckedChange: (checked) => updateLlmSettings({ useLlmTitles: checked }),
|
|
1353
|
-
disabled: !llmStatus.isAvailable
|
|
1354
|
-
}
|
|
1355
|
-
)
|
|
1356
|
-
}
|
|
1357
|
-
),
|
|
1358
|
-
/* @__PURE__ */ jsx(
|
|
1359
|
-
SettingsRow,
|
|
1360
|
-
{
|
|
1361
|
-
inline: true,
|
|
1362
|
-
label: "Smart follow-up suggestions",
|
|
1363
|
-
description: "AI-generated contextual follow-ups",
|
|
1364
|
-
children: /* @__PURE__ */ jsx(
|
|
1365
|
-
Switch,
|
|
1366
|
-
{
|
|
1367
|
-
checked: llmSettings.useLlmFollowUps,
|
|
1368
|
-
onCheckedChange: (checked) => updateLlmSettings({ useLlmFollowUps: checked }),
|
|
1369
|
-
disabled: !llmStatus.isAvailable
|
|
1370
|
-
}
|
|
1371
|
-
)
|
|
1372
|
-
}
|
|
1373
|
-
),
|
|
1374
|
-
/* @__PURE__ */ jsxs("div", { className: "mt-2 space-y-2", children: [
|
|
1375
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
1376
|
-
/* @__PURE__ */ jsx("div", { className: "text-xs text-primary-500 mb-1", children: "Model" }),
|
|
1377
|
-
/* @__PURE__ */ jsx(
|
|
1378
|
-
"input",
|
|
1379
|
-
{
|
|
1380
|
-
type: "text",
|
|
1381
|
-
value: llmSettings.llmModel,
|
|
1382
|
-
onChange: (e) => updateLlmSettings({ llmModel: e.target.value }),
|
|
1383
|
-
placeholder: getLlmProviderDefaults(llmSettings.llmProvider).model || "model-name",
|
|
1384
|
-
className: "w-full px-3 py-1.5 text-sm rounded-md border border-primary-200 bg-surface focus:outline-none focus:ring-2 focus:ring-primary-500"
|
|
1385
|
-
}
|
|
1386
|
-
)
|
|
1387
|
-
] }),
|
|
1388
|
-
(llmSettings.llmProvider === "custom" || llmSettings.llmProvider === "ollama") && /* @__PURE__ */ jsxs("div", { children: [
|
|
1389
|
-
/* @__PURE__ */ jsx("div", { className: "text-xs text-primary-500 mb-1", children: "Base URL" }),
|
|
1390
|
-
/* @__PURE__ */ jsx(
|
|
1391
|
-
"input",
|
|
1392
|
-
{
|
|
1393
|
-
type: "text",
|
|
1394
|
-
value: llmSettings.llmBaseUrl,
|
|
1395
|
-
onChange: (e) => updateLlmSettings({ llmBaseUrl: e.target.value }),
|
|
1396
|
-
placeholder: getLlmProviderDefaults(llmSettings.llmProvider).baseUrl || "https://...",
|
|
1397
|
-
className: "w-full px-3 py-1.5 text-sm rounded-md border border-primary-200 bg-surface focus:outline-none focus:ring-2 focus:ring-primary-500"
|
|
1398
|
-
}
|
|
1399
|
-
)
|
|
1400
|
-
] })
|
|
1401
|
-
] }),
|
|
1402
|
-
/* @__PURE__ */ jsxs("div", { className: "mt-4 pt-3 border-t border-primary-100", children: [
|
|
1403
|
-
/* @__PURE__ */ jsx("div", { className: "text-sm text-primary-800 mb-2", children: llmSettings.llmProvider === "ollama" ? "API Key (optional)" : "API Key" }),
|
|
1404
|
-
/* @__PURE__ */ jsx("div", { className: "text-xs text-primary-500 mb-2", children: llmSettings.llmProvider === "ollama" ? "Not required for local Ollama" : llmStatus.hasEnvKey && llmSettings.llmProvider === "openai" ? "Optional: Override server key with your own" : `Required for ${llmSettings.llmProvider === "openrouter" ? "OpenRouter" : llmSettings.llmProvider === "kilocode" ? "Kilo Gateway" : "LLM features"} (stored locally)` }),
|
|
1405
|
-
/* @__PURE__ */ jsxs("div", { className: "text-xs text-amber-600 bg-amber-50 border border-amber-200 rounded-md px-2 py-1.5 mb-2", children: [
|
|
1406
|
-
"⚠️ ",
|
|
1407
|
-
/* @__PURE__ */ jsx("strong", { children: "Security Note:" }),
|
|
1408
|
-
" API keys are stored in your browser's localStorage. This is convenient but not secure for shared computers. For production use, configure keys server-side via environment variables (OPENAI_API_KEY, OPENROUTER_API_KEY, KILOCODE_API_KEY)."
|
|
1409
|
-
] }),
|
|
1410
|
-
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
1411
|
-
/* @__PURE__ */ jsx(
|
|
1412
|
-
"input",
|
|
1413
|
-
{
|
|
1414
|
-
type: "password",
|
|
1415
|
-
value: apiKeyInput,
|
|
1416
|
-
onChange: (e) => {
|
|
1417
|
-
setApiKeyInput(e.target.value);
|
|
1418
|
-
setTestResult(null);
|
|
1419
|
-
},
|
|
1420
|
-
placeholder: "sk-...",
|
|
1421
|
-
className: "flex-1 px-3 py-1.5 text-sm rounded-md border border-primary-200 bg-surface focus:outline-none focus:ring-2 focus:ring-primary-500"
|
|
1422
|
-
}
|
|
1423
|
-
),
|
|
1424
|
-
/* @__PURE__ */ jsx(
|
|
1425
|
-
Button,
|
|
1426
|
-
{
|
|
1427
|
-
size: "sm",
|
|
1428
|
-
variant: "outline",
|
|
1429
|
-
onClick: handleTestApiKey,
|
|
1430
|
-
disabled: !apiKeyInput.trim() || testingKey,
|
|
1431
|
-
className: "min-w-[60px]",
|
|
1432
|
-
children: testingKey ? /* @__PURE__ */ jsx(
|
|
1433
|
-
HugeiconsIcon,
|
|
1434
|
-
{
|
|
1435
|
-
icon: Loading02Icon,
|
|
1436
|
-
size: 16,
|
|
1437
|
-
className: "animate-spin"
|
|
1438
|
-
}
|
|
1439
|
-
) : "Test"
|
|
1440
|
-
}
|
|
1441
|
-
)
|
|
1442
|
-
] }),
|
|
1443
|
-
testResult && /* @__PURE__ */ jsxs(
|
|
1444
|
-
"div",
|
|
1445
|
-
{
|
|
1446
|
-
className: `mt-2 flex items-center gap-1.5 text-xs ${testResult.valid ? "text-green-600" : "text-red-600"}`,
|
|
1447
|
-
children: [
|
|
1448
|
-
/* @__PURE__ */ jsx(
|
|
1449
|
-
HugeiconsIcon,
|
|
1450
|
-
{
|
|
1451
|
-
icon: testResult.valid ? Tick01Icon : Cancel02Icon,
|
|
1452
|
-
size: 14
|
|
1453
|
-
}
|
|
1454
|
-
),
|
|
1455
|
-
testResult.valid ? "API key is valid" : testResult.error || "Invalid API key"
|
|
1456
|
-
]
|
|
1457
|
-
}
|
|
1458
|
-
),
|
|
1459
|
-
llmSettings.llmApiKey && /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center justify-between", children: [
|
|
1460
|
-
/* @__PURE__ */ jsxs("span", { className: "text-xs text-green-600 flex items-center gap-1", children: [
|
|
1461
|
-
/* @__PURE__ */ jsx(HugeiconsIcon, { icon: Tick01Icon, size: 14 }),
|
|
1462
|
-
"Key saved"
|
|
1463
|
-
] }),
|
|
1464
|
-
/* @__PURE__ */ jsx(
|
|
1465
|
-
Button,
|
|
1466
|
-
{
|
|
1467
|
-
size: "sm",
|
|
1468
|
-
variant: "ghost",
|
|
1469
|
-
onClick: handleClearApiKey,
|
|
1470
|
-
className: "text-xs text-red-600 hover:text-red-700 hover:bg-red-50",
|
|
1471
|
-
children: "Clear"
|
|
1472
|
-
}
|
|
1473
|
-
)
|
|
1474
|
-
] }),
|
|
1475
|
-
apiKeyInput && apiKeyInput !== llmSettings.llmApiKey && !testResult?.valid && /* @__PURE__ */ jsx(
|
|
1476
|
-
Button,
|
|
1477
|
-
{
|
|
1478
|
-
size: "sm",
|
|
1479
|
-
variant: "outline",
|
|
1480
|
-
onClick: handleSaveApiKey,
|
|
1481
|
-
className: "mt-2 w-full",
|
|
1482
|
-
children: "Save without testing"
|
|
1483
|
-
}
|
|
1484
|
-
)
|
|
1485
|
-
] })
|
|
1486
|
-
]
|
|
1487
|
-
}
|
|
1488
|
-
),
|
|
1489
1297
|
/* @__PURE__ */ jsxs(
|
|
1490
1298
|
SettingsSection,
|
|
1491
1299
|
{
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect } from "react";
|
|
3
|
-
import { C as Collapsible,
|
|
3
|
+
import { C as Collapsible, a as CollapsibleTrigger, b as CollapsiblePanel } from "./_sessionKey-COz7RLKC.js";
|
|
4
4
|
import { HugeiconsIcon } from "@hugeicons/react";
|
|
5
5
|
import { ArrowDown01Icon } from "@hugeicons/core-free-icons";
|
|
6
6
|
import { B as Button } from "./button-kI8fEIZQ.js";
|
|
@@ -18,15 +18,15 @@ import "@base-ui/react/scroll-area";
|
|
|
18
18
|
import "./menu-D8cKTpmN.js";
|
|
19
19
|
import "@base-ui/react/menu";
|
|
20
20
|
import "./opencami-logo-C-43FL3R.js";
|
|
21
|
-
import "./
|
|
21
|
+
import "./index-197lqzv2.js";
|
|
22
|
+
import "zustand/middleware";
|
|
23
|
+
import "./markdown-Dk1YdosA.js";
|
|
22
24
|
import "marked";
|
|
23
25
|
import "react-markdown";
|
|
24
26
|
import "remark-breaks";
|
|
25
27
|
import "remark-gfm";
|
|
26
|
-
import "./index-B_F4DTUu.js";
|
|
27
|
-
import "zustand/middleware";
|
|
28
28
|
import "react-dom";
|
|
29
|
-
import "./router-
|
|
29
|
+
import "./router-CZhxPkYW.js";
|
|
30
30
|
import "node:crypto";
|
|
31
31
|
import "node:fs";
|
|
32
32
|
import "node:os";
|
package/dist/server/server.js
CHANGED
|
@@ -184,7 +184,7 @@ function getResponse() {
|
|
|
184
184
|
return event.res;
|
|
185
185
|
}
|
|
186
186
|
async function getStartManifest(matchedRoutes) {
|
|
187
|
-
const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-
|
|
187
|
+
const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-D0f-0Utn.js");
|
|
188
188
|
const startManifest = tsrStartManifest();
|
|
189
189
|
const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
|
|
190
190
|
rootRoute.assets = rootRoute.assets || [];
|
|
@@ -753,7 +753,7 @@ let entriesPromise;
|
|
|
753
753
|
let baseManifestPromise;
|
|
754
754
|
let cachedFinalManifestPromise;
|
|
755
755
|
async function loadEntries() {
|
|
756
|
-
const routerEntry = await import("./assets/router-
|
|
756
|
+
const routerEntry = await import("./assets/router-CZhxPkYW.js").then((n) => n.r);
|
|
757
757
|
const startEntry = await import("./assets/start-HYkvq4Ni.js");
|
|
758
758
|
return { startEntry, routerEntry };
|
|
759
759
|
}
|