opencami 1.5.1 → 1.6.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/README.md +4 -1
- package/dist/client/assets/{CSPContext-BBLAL_m_.js → CSPContext-Bq8j4nl9.js} +1 -1
- package/dist/client/assets/DirectionContext-BdX86BHP.js +1 -0
- package/dist/client/assets/_sessionKey-DsjnpErt.js +14 -0
- package/dist/client/assets/agents-DwxKcpP6.js +2 -0
- package/dist/client/assets/agents-screen-DwIY8hze.js +1 -0
- package/dist/client/assets/bots-CRlm-3-d.js +2 -0
- package/dist/client/assets/bots-screen-c78I920d.js +1 -0
- package/dist/client/assets/button-Dg7VFQQn.js +1 -0
- package/dist/client/assets/composite-DBl8R3ae.js +1 -0
- package/dist/client/assets/{connect-DHr3hhUR.js → connect-NYvOqiBJ.js} +1 -1
- package/dist/client/assets/file-explorer-screen-BSMbs0vi.js +1 -0
- package/dist/client/assets/files-BJbMx0_w.js +2 -0
- package/dist/client/assets/{index-B2iG4EM1.js → index-CMATW8VA.js} +1 -1
- package/dist/client/assets/{index-GTR-Xzl2.js → index-rOIRO-8E.js} +1 -1
- package/dist/client/assets/keyboard-shortcuts-dialog-BTGWdJMl.js +1 -0
- package/dist/client/assets/{main-mIHr_ble.js → main-B_dlfHME.js} +9 -9
- package/dist/client/assets/markdown-BVzT7z4x.js +87 -0
- package/dist/client/assets/memory-S3Yws6a5.js +2 -0
- package/dist/client/assets/memory-screen-C-Z9o31m.js +1 -0
- package/dist/client/assets/menu-DHNgWk_8.js +1 -0
- package/dist/client/assets/{opencami-logo-CRIdKbbZ.js → opencami-logo-BQQETnJG.js} +1 -1
- package/dist/client/assets/owner-CpRnf1fI.js +1 -0
- package/dist/client/assets/popupStateMapping-BRPDXnjv.js +1 -0
- package/dist/client/assets/proxy-BcUh9kMA.js +9 -0
- package/dist/client/assets/{react-Cfq4ot0g.js → react-irH8OzhB.js} +1 -1
- package/dist/client/assets/search-dialog-B96zx_ng.js +1 -0
- package/dist/client/assets/session-export-dialog-DPuHnhgv.js +1 -0
- package/dist/client/assets/settings-dialog-DZcRCaPj.js +1 -0
- package/dist/client/assets/skills-YZe3I63y.js +2 -0
- package/dist/client/assets/{skills-panel-Cv-N_MDk.js → skills-panel-WDUfIwnI.js} +2 -2
- package/dist/client/assets/styles-Bwo-K6Y4.css +1 -0
- package/dist/client/assets/{switch-Bh9tVOYh.js → switch-DPocNFRG.js} +1 -1
- package/dist/client/assets/tabs-B0cro1hL.js +1 -0
- package/dist/client/assets/tooltip-Dg9fy-vT.js +1 -0
- package/dist/client/assets/use-file-explorer-state-DzT0bksg.js +12 -0
- package/dist/client/assets/{useButton-DsMdJPGn.js → useButton-Cbl_9oFG.js} +1 -1
- package/dist/client/assets/useCompositeItem-BDAzTxVe.js +1 -0
- package/dist/client/assets/{useControlled-wOKVgKF4.js → useControlled-Dscz_s4f.js} +1 -1
- package/dist/client/assets/{useMutation-fJnleJAb.js → useMutation-B1FlDsNN.js} +1 -1
- package/dist/client/assets/visuallyHidden-ONmQ-0U2.js +1 -0
- package/dist/server/assets/{_sessionKey-B5UHBd2U.js → _sessionKey-B0ZlLAjH.js} +172 -567
- package/dist/server/assets/_tanstack-start-manifest_v-D5UVTs1o.js +4 -0
- package/dist/server/assets/{file-explorer-screen-CVlFiAFu.js → file-explorer-screen-DH4UFK03.js} +3 -2
- package/dist/server/assets/{files-BIEcSPGp.js → files-DYdXlQDr.js} +1 -1
- package/dist/server/assets/{index--_jH_0mX.js → index-CiUjUD0t.js} +1 -1
- package/dist/server/assets/{keyboard-shortcuts-dialog-CsNP85q8.js → keyboard-shortcuts-dialog-Cr6fOqHz.js} +1 -2
- package/dist/server/assets/markdown-BFE5y9YH.js +565 -0
- package/dist/server/assets/memory-BqZOoD7Q.js +11 -0
- package/dist/server/assets/memory-screen-BK5phS8K.js +235 -0
- package/dist/server/assets/menu-D90CDTi2.js +45 -0
- package/dist/server/assets/{router-DJA7GtMo.js → router-Uuagl6O7.js} +55 -45
- package/dist/server/assets/{search-dialog-C2a3OYm_.js → search-dialog-DZTS5SEi.js} +6 -4
- package/dist/server/assets/{session-export-dialog-CwclV0Aj.js → session-export-dialog-C53RRAah.js} +1 -2
- package/dist/server/assets/{settings-dialog-CHVzrou9.js → settings-dialog-CSYDj2qm.js} +75 -20
- package/dist/server/assets/{use-file-explorer-state-Il1LlBAe.js → use-file-explorer-state-s7CS50ho.js} +0 -41
- package/dist/server/server.js +2 -2
- package/package.json +1 -1
- package/dist/client/assets/DirectionContext-DXnZc0zz.js +0 -1
- package/dist/client/assets/_sessionKey-BidmO1-D.js +0 -100
- package/dist/client/assets/agents-CtZs_u1j.js +0 -2
- package/dist/client/assets/agents-screen-Basce5qo.js +0 -1
- package/dist/client/assets/bots-C_dWjy3z.js +0 -2
- package/dist/client/assets/bots-screen-n_xhYOEE.js +0 -1
- package/dist/client/assets/button-BaHefIXU.js +0 -1
- package/dist/client/assets/file-explorer-screen-8t6M4Xco.js +0 -1
- package/dist/client/assets/files-BdlpK3Cy.js +0 -2
- package/dist/client/assets/keyboard-shortcuts-dialog-CcKSlK52.js +0 -1
- package/dist/client/assets/search-dialog-D19x_xaG.js +0 -1
- package/dist/client/assets/session-export-dialog-DRlJwhMa.js +0 -1
- package/dist/client/assets/settings-dialog-BA5FjiyP.js +0 -1
- package/dist/client/assets/skills-lmNPZksG.js +0 -2
- package/dist/client/assets/styles-JgjN_ZCd.css +0 -1
- package/dist/client/assets/tabs-BfaEc9zS.js +0 -1
- package/dist/client/assets/tooltip-w9D-e_R-.js +0 -1
- package/dist/client/assets/use-file-explorer-state-CLaDuI9X.js +0 -12
- package/dist/client/assets/useCompositeItem-CaYygSfB.js +0 -1
- package/dist/client/assets/visuallyHidden-CqGRL_Oq.js +0 -9
- package/dist/server/assets/_tanstack-start-manifest_v-D11xMFUx.js +0 -4
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useCallback } from "react";
|
|
3
|
+
import { useQueryClient, useQuery, useMutation } from "@tanstack/react-query";
|
|
4
|
+
import { Link } from "@tanstack/react-router";
|
|
5
|
+
import { c as cn, B as Button, b as buttonVariants } from "./button-CwY2OHFj.js";
|
|
6
|
+
import { M as Markdown } from "./markdown-BFE5y9YH.js";
|
|
7
|
+
import "@base-ui/react/merge-props";
|
|
8
|
+
import "@base-ui/react/use-render";
|
|
9
|
+
import "class-variance-authority";
|
|
10
|
+
import "clsx";
|
|
11
|
+
import "tailwind-merge";
|
|
12
|
+
import "marked";
|
|
13
|
+
import "react-markdown";
|
|
14
|
+
import "remark-breaks";
|
|
15
|
+
import "remark-gfm";
|
|
16
|
+
import "./index-Dl2BOKP7.js";
|
|
17
|
+
import "@hugeicons/react";
|
|
18
|
+
import "@hugeicons/core-free-icons";
|
|
19
|
+
import "zustand";
|
|
20
|
+
import "zustand/middleware";
|
|
21
|
+
import "./use-file-explorer-state-s7CS50ho.js";
|
|
22
|
+
import "@base-ui/react/dialog";
|
|
23
|
+
const DATE_RE$1 = /\/(\d{4}-\d{2}-\d{2})/;
|
|
24
|
+
function FileButton({
|
|
25
|
+
path,
|
|
26
|
+
label,
|
|
27
|
+
selected,
|
|
28
|
+
onSelect
|
|
29
|
+
}) {
|
|
30
|
+
return /* @__PURE__ */ jsx(
|
|
31
|
+
"button",
|
|
32
|
+
{
|
|
33
|
+
type: "button",
|
|
34
|
+
onClick: () => onSelect(path),
|
|
35
|
+
className: cn(
|
|
36
|
+
"w-full text-left px-2.5 py-1.5 rounded-md text-sm transition-colors",
|
|
37
|
+
selected ? "text-primary-900" : "text-primary-600 hover:text-primary-900 hover:bg-primary-50"
|
|
38
|
+
),
|
|
39
|
+
style: selected ? { backgroundColor: "var(--opencami-accent-light)" } : void 0,
|
|
40
|
+
children: label
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
function formatLabel(path) {
|
|
45
|
+
if (path === "/MEMORY.md") return "📋 MEMORY.md";
|
|
46
|
+
const dateMatch = path.match(DATE_RE$1);
|
|
47
|
+
if (dateMatch) {
|
|
48
|
+
const name = path.replace(/^\/?memory\//, "");
|
|
49
|
+
return `📅 ${name}`;
|
|
50
|
+
}
|
|
51
|
+
return `📄 ${path.replace(/^\/?memory\//, "")}`;
|
|
52
|
+
}
|
|
53
|
+
function MemorySidebar({ files, selectedPath, onSelect, loading }) {
|
|
54
|
+
const memoryMd = files.filter((p) => p === "/MEMORY.md");
|
|
55
|
+
const daily = files.filter((p) => p !== "/MEMORY.md" && DATE_RE$1.test(p));
|
|
56
|
+
const other = files.filter((p) => p !== "/MEMORY.md" && !DATE_RE$1.test(p));
|
|
57
|
+
return /* @__PURE__ */ jsxs("aside", { className: "border-r border-primary-200 bg-primary-100 md:w-72 w-full md:h-full h-auto overflow-y-auto", children: [
|
|
58
|
+
/* @__PURE__ */ jsx("div", { className: "px-4 py-3 border-b border-primary-200", children: /* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-primary-800", children: "Memory Files" }) }),
|
|
59
|
+
/* @__PURE__ */ jsx("div", { className: "p-2 space-y-0.5", children: loading ? /* @__PURE__ */ jsx("div", { className: "px-2 py-2 text-sm text-primary-500", children: "Loading files…" }) : files.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-2 py-2 text-sm text-primary-500", children: "No memory files found." }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
60
|
+
memoryMd.map((p) => /* @__PURE__ */ jsx(FileButton, { path: p, label: formatLabel(p), selected: selectedPath === p, onSelect }, p)),
|
|
61
|
+
daily.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
62
|
+
/* @__PURE__ */ jsx("div", { className: "px-2.5 pt-3 pb-1 text-xs font-medium text-primary-400 uppercase tracking-wider", children: "Daily" }),
|
|
63
|
+
daily.map((p) => /* @__PURE__ */ jsx(FileButton, { path: p, label: formatLabel(p), selected: selectedPath === p, onSelect }, p))
|
|
64
|
+
] }),
|
|
65
|
+
other.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
66
|
+
/* @__PURE__ */ jsx("div", { className: "px-2.5 pt-3 pb-1 text-xs font-medium text-primary-400 uppercase tracking-wider", children: "Notes" }),
|
|
67
|
+
other.map((p) => /* @__PURE__ */ jsx(FileButton, { path: p, label: formatLabel(p), selected: selectedPath === p, onSelect }, p))
|
|
68
|
+
] })
|
|
69
|
+
] }) })
|
|
70
|
+
] });
|
|
71
|
+
}
|
|
72
|
+
function MemoryEditor({ filePath, content, isLoading, onSave, onBack }) {
|
|
73
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
74
|
+
const [draft, setDraft] = useState(content);
|
|
75
|
+
const [saving, setSaving] = useState(false);
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
setDraft(content);
|
|
78
|
+
setIsEditing(false);
|
|
79
|
+
}, [filePath, content]);
|
|
80
|
+
const handleSave = async () => {
|
|
81
|
+
setSaving(true);
|
|
82
|
+
try {
|
|
83
|
+
await onSave(draft);
|
|
84
|
+
setIsEditing(false);
|
|
85
|
+
} finally {
|
|
86
|
+
setSaving(false);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
return /* @__PURE__ */ jsxs("section", { className: "flex-1 min-h-0 flex flex-col", children: [
|
|
90
|
+
/* @__PURE__ */ jsxs("header", { className: "border-b border-primary-100 px-4 py-3 flex items-center justify-between gap-2", children: [
|
|
91
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
92
|
+
onBack ? /* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", onClick: onBack, children: "Back" }) : null,
|
|
93
|
+
/* @__PURE__ */ jsx("h1", { className: "text-sm font-semibold text-primary-800 truncate", children: filePath })
|
|
94
|
+
] }),
|
|
95
|
+
!isLoading && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: isEditing ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
96
|
+
/* @__PURE__ */ jsx(Button, { size: "sm", variant: "outline", onClick: () => setIsEditing(false), children: "Cancel" }),
|
|
97
|
+
/* @__PURE__ */ jsx(Button, { size: "sm", onClick: () => void handleSave(), disabled: saving, children: saving ? "Saving…" : "Save" })
|
|
98
|
+
] }) : /* @__PURE__ */ jsx(Button, { size: "sm", variant: "outline", onClick: () => setIsEditing(true), children: "Edit" }) })
|
|
99
|
+
] }),
|
|
100
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 min-h-0 overflow-auto p-4", children: isLoading ? /* @__PURE__ */ jsx("div", { className: "text-sm text-primary-500", children: "Loading content…" }) : isEditing ? /* @__PURE__ */ jsx(
|
|
101
|
+
"textarea",
|
|
102
|
+
{
|
|
103
|
+
value: draft,
|
|
104
|
+
onChange: (e) => setDraft(e.target.value),
|
|
105
|
+
className: "w-full min-h-[60vh] rounded-md border border-primary-200 bg-surface px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500"
|
|
106
|
+
}
|
|
107
|
+
) : /* @__PURE__ */ jsx(Markdown, { className: "prose prose-invert max-w-none", children: content || "_Empty file_" }) })
|
|
108
|
+
] });
|
|
109
|
+
}
|
|
110
|
+
const DATE_RE = /\/(\d{4}-\d{2}-\d{2})/;
|
|
111
|
+
function sortMemoryFiles(paths) {
|
|
112
|
+
const memoryMd = paths.includes("/MEMORY.md") ? ["/MEMORY.md"] : [];
|
|
113
|
+
const mdFiles = paths.filter(
|
|
114
|
+
(p) => p !== "/MEMORY.md" && (p.startsWith("memory/") || p.startsWith("/memory/")) && p.endsWith(".md")
|
|
115
|
+
);
|
|
116
|
+
const daily = [];
|
|
117
|
+
const other = [];
|
|
118
|
+
for (const p of mdFiles) {
|
|
119
|
+
if (DATE_RE.test(p)) {
|
|
120
|
+
daily.push(p);
|
|
121
|
+
} else {
|
|
122
|
+
other.push(p);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
daily.sort((a, b) => b.localeCompare(a));
|
|
126
|
+
other.sort((a, b) => a.localeCompare(b));
|
|
127
|
+
return [...memoryMd, ...daily, ...other];
|
|
128
|
+
}
|
|
129
|
+
function MemoryScreen() {
|
|
130
|
+
const queryClient = useQueryClient();
|
|
131
|
+
const [selectedPath, setSelectedPath] = useState("/MEMORY.md");
|
|
132
|
+
const filesQuery = useQuery({
|
|
133
|
+
queryKey: ["memory", "files"],
|
|
134
|
+
queryFn: async ({ signal }) => {
|
|
135
|
+
const [memoryRootRes, dailyRes] = await Promise.all([
|
|
136
|
+
fetch("/api/files/read?path=/MEMORY.md", { signal }),
|
|
137
|
+
fetch("/api/files/list?path=/memory", { signal })
|
|
138
|
+
]);
|
|
139
|
+
const paths = [];
|
|
140
|
+
if (memoryRootRes.ok) paths.push("/MEMORY.md");
|
|
141
|
+
if (dailyRes.ok) {
|
|
142
|
+
const daily = await dailyRes.json();
|
|
143
|
+
for (const item of daily.items) {
|
|
144
|
+
if (!item.isDir && item.path.endsWith(".md")) {
|
|
145
|
+
paths.push(item.path);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return sortMemoryFiles(paths);
|
|
150
|
+
},
|
|
151
|
+
staleTime: 3e4
|
|
152
|
+
});
|
|
153
|
+
const selectedFile = selectedPath ?? filesQuery.data?.[0] ?? null;
|
|
154
|
+
const contentQuery = useQuery({
|
|
155
|
+
queryKey: ["memory", "content", selectedFile],
|
|
156
|
+
queryFn: async ({ signal }) => {
|
|
157
|
+
const filePath = selectedFile.startsWith("/") ? selectedFile : `/${selectedFile}`;
|
|
158
|
+
const res = await fetch(`/api/files/read?path=${encodeURIComponent(filePath)}`, { signal });
|
|
159
|
+
if (!res.ok) throw new Error("Failed to read memory file");
|
|
160
|
+
return res.json();
|
|
161
|
+
},
|
|
162
|
+
enabled: !!selectedFile
|
|
163
|
+
});
|
|
164
|
+
const saveMutation = useMutation({
|
|
165
|
+
mutationFn: async (payload) => {
|
|
166
|
+
const savePath = payload.path.startsWith("/") ? payload.path : `/${payload.path}`;
|
|
167
|
+
const res = await fetch("/api/files/save", {
|
|
168
|
+
method: "POST",
|
|
169
|
+
headers: { "content-type": "application/json" },
|
|
170
|
+
body: JSON.stringify({ ...payload, path: savePath })
|
|
171
|
+
});
|
|
172
|
+
if (!res.ok) throw new Error("Failed to save memory file");
|
|
173
|
+
return res.json();
|
|
174
|
+
},
|
|
175
|
+
onSuccess: async (_, variables) => {
|
|
176
|
+
await queryClient.invalidateQueries({ queryKey: ["memory", "content", variables.path] });
|
|
177
|
+
await queryClient.invalidateQueries({ queryKey: ["memory", "files"] });
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
const [isMobile, setIsMobile] = useState(() => typeof window !== "undefined" ? window.innerWidth < 768 : false);
|
|
181
|
+
useEffect(() => {
|
|
182
|
+
if (typeof window === "undefined") return;
|
|
183
|
+
const onResize = () => setIsMobile(window.innerWidth < 768);
|
|
184
|
+
window.addEventListener("resize", onResize);
|
|
185
|
+
return () => window.removeEventListener("resize", onResize);
|
|
186
|
+
}, []);
|
|
187
|
+
const showSidebarOnMobile = isMobile && !selectedFile;
|
|
188
|
+
const handleSelect = useCallback((path) => {
|
|
189
|
+
setSelectedPath(path);
|
|
190
|
+
}, []);
|
|
191
|
+
return /* @__PURE__ */ jsxs("div", { className: "h-screen bg-surface text-primary-900", children: [
|
|
192
|
+
/* @__PURE__ */ jsxs("div", { className: "h-12 border-b border-primary-100 px-3 flex items-center justify-between", children: [
|
|
193
|
+
/* @__PURE__ */ jsx("h1", { className: "text-sm font-semibold", children: "Memory Viewer" }),
|
|
194
|
+
/* @__PURE__ */ jsx(
|
|
195
|
+
Link,
|
|
196
|
+
{
|
|
197
|
+
to: "/chat/$sessionKey",
|
|
198
|
+
params: { sessionKey: "main" },
|
|
199
|
+
className: cn(buttonVariants({ variant: "ghost", size: "sm" })),
|
|
200
|
+
children: "Back to Chat"
|
|
201
|
+
}
|
|
202
|
+
)
|
|
203
|
+
] }),
|
|
204
|
+
/* @__PURE__ */ jsxs("div", { className: "h-[calc(100vh-48px)] md:grid md:grid-cols-[18rem_1fr]", children: [
|
|
205
|
+
(!isMobile || showSidebarOnMobile) && /* @__PURE__ */ jsx(
|
|
206
|
+
MemorySidebar,
|
|
207
|
+
{
|
|
208
|
+
files: filesQuery.data ?? [],
|
|
209
|
+
selectedPath: selectedFile,
|
|
210
|
+
onSelect: handleSelect,
|
|
211
|
+
loading: filesQuery.isLoading
|
|
212
|
+
}
|
|
213
|
+
),
|
|
214
|
+
selectedFile && (!isMobile || !showSidebarOnMobile) ? /* @__PURE__ */ jsx(
|
|
215
|
+
MemoryEditor,
|
|
216
|
+
{
|
|
217
|
+
filePath: selectedFile,
|
|
218
|
+
content: contentQuery.data?.content ?? "",
|
|
219
|
+
isLoading: contentQuery.isLoading,
|
|
220
|
+
onBack: isMobile ? () => setSelectedPath(null) : void 0,
|
|
221
|
+
onSave: async (content) => {
|
|
222
|
+
await saveMutation.mutateAsync({ path: selectedFile, content });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
) : /* @__PURE__ */ jsx("div", { className: "p-4 text-sm text-primary-500", children: "Select a file to view." })
|
|
226
|
+
] }),
|
|
227
|
+
(filesQuery.isError || contentQuery.isError || saveMutation.isError) && /* @__PURE__ */ jsxs("div", { className: "fixed bottom-4 right-4 rounded-md border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-700", children: [
|
|
228
|
+
"Something went wrong. ",
|
|
229
|
+
/* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", onClick: () => void filesQuery.refetch(), children: "Retry" })
|
|
230
|
+
] })
|
|
231
|
+
] });
|
|
232
|
+
}
|
|
233
|
+
export {
|
|
234
|
+
MemoryScreen
|
|
235
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Menu } from "@base-ui/react/menu";
|
|
3
|
+
import { c as cn } from "./button-CwY2OHFj.js";
|
|
4
|
+
function MenuRoot({ children, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(Menu.Root, { ...props, children });
|
|
6
|
+
}
|
|
7
|
+
function MenuTrigger({ className, ...props }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(Menu.Trigger, { className: cn(className), ...props });
|
|
9
|
+
}
|
|
10
|
+
function MenuContent({
|
|
11
|
+
className,
|
|
12
|
+
side = "bottom",
|
|
13
|
+
align = "end",
|
|
14
|
+
children
|
|
15
|
+
}) {
|
|
16
|
+
return /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, { side, align, children: /* @__PURE__ */ jsx(
|
|
17
|
+
Menu.Popup,
|
|
18
|
+
{
|
|
19
|
+
className: cn(
|
|
20
|
+
"min-w-[110px] rounded-lg bg-primary-50 p-1 text-sm text-primary-900 shadow-lg outline outline-primary-900/10",
|
|
21
|
+
className
|
|
22
|
+
),
|
|
23
|
+
children
|
|
24
|
+
}
|
|
25
|
+
) }) });
|
|
26
|
+
}
|
|
27
|
+
function MenuItem({ className, ...props }) {
|
|
28
|
+
return /* @__PURE__ */ jsx(
|
|
29
|
+
Menu.Item,
|
|
30
|
+
{
|
|
31
|
+
className: cn(
|
|
32
|
+
"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-primary-900 hover:bg-primary-100 data-highlighted:bg-primary-100",
|
|
33
|
+
"select-none font-[450]",
|
|
34
|
+
className
|
|
35
|
+
),
|
|
36
|
+
...props
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
MenuRoot as M,
|
|
42
|
+
MenuTrigger as a,
|
|
43
|
+
MenuContent as b,
|
|
44
|
+
MenuItem as c
|
|
45
|
+
};
|
|
@@ -10,7 +10,7 @@ import { json } from "@tanstack/router-core/ssr/client";
|
|
|
10
10
|
import { execSync } from "node:child_process";
|
|
11
11
|
import { readFile, mkdir, writeFile, rename, stat, readdir, rm, realpath, lstat } from "node:fs/promises";
|
|
12
12
|
import { posix } from "path";
|
|
13
|
-
const appCss = "/assets/styles-
|
|
13
|
+
const appCss = "/assets/styles-Bwo-K6Y4.css";
|
|
14
14
|
const swRegisterScript = `
|
|
15
15
|
(() => {
|
|
16
16
|
// Skip PWA service worker inside Capacitor native shell — they conflict
|
|
@@ -202,7 +202,7 @@ function NotFoundRedirect() {
|
|
|
202
202
|
}
|
|
203
203
|
return null;
|
|
204
204
|
}
|
|
205
|
-
const Route$
|
|
205
|
+
const Route$x = createRootRoute({
|
|
206
206
|
notFoundComponent: NotFoundRedirect,
|
|
207
207
|
head: () => ({
|
|
208
208
|
meta: [
|
|
@@ -310,12 +310,12 @@ function RootDocument({ children }) {
|
|
|
310
310
|
] })
|
|
311
311
|
] });
|
|
312
312
|
}
|
|
313
|
-
const $$splitComponentImporter$
|
|
314
|
-
const Route$
|
|
315
|
-
component: lazyRouteComponent($$splitComponentImporter$
|
|
313
|
+
const $$splitComponentImporter$8 = () => import("./skills-Cy8xclXY.js");
|
|
314
|
+
const Route$w = createFileRoute("/skills")({
|
|
315
|
+
component: lazyRouteComponent($$splitComponentImporter$8, "component")
|
|
316
316
|
});
|
|
317
|
-
const $$splitComponentImporter$
|
|
318
|
-
const Route$
|
|
317
|
+
const $$splitComponentImporter$7 = () => import("./new-Dzk5YxE9.js");
|
|
318
|
+
const Route$v = createFileRoute("/new")({
|
|
319
319
|
beforeLoad: function redirectToNewChat() {
|
|
320
320
|
throw redirect({
|
|
321
321
|
to: "/chat/$sessionKey",
|
|
@@ -325,9 +325,13 @@ const Route$u = createFileRoute("/new")({
|
|
|
325
325
|
replace: true
|
|
326
326
|
});
|
|
327
327
|
},
|
|
328
|
+
component: lazyRouteComponent($$splitComponentImporter$7, "component")
|
|
329
|
+
});
|
|
330
|
+
const $$splitComponentImporter$6 = () => import("./memory-BqZOoD7Q.js");
|
|
331
|
+
const Route$u = createFileRoute("/memory")({
|
|
328
332
|
component: lazyRouteComponent($$splitComponentImporter$6, "component")
|
|
329
333
|
});
|
|
330
|
-
const $$splitComponentImporter$5 = () => import("./files-
|
|
334
|
+
const $$splitComponentImporter$5 = () => import("./files-DYdXlQDr.js");
|
|
331
335
|
const Route$t = createFileRoute("/files")({
|
|
332
336
|
component: lazyRouteComponent($$splitComponentImporter$5, "component")
|
|
333
337
|
});
|
|
@@ -343,11 +347,11 @@ const $$splitComponentImporter$2 = () => import("./agents-CmQ4vvXm.js");
|
|
|
343
347
|
const Route$q = createFileRoute("/agents")({
|
|
344
348
|
component: lazyRouteComponent($$splitComponentImporter$2, "component")
|
|
345
349
|
});
|
|
346
|
-
const $$splitComponentImporter$1 = () => import("./index
|
|
350
|
+
const $$splitComponentImporter$1 = () => import("./index-CiUjUD0t.js");
|
|
347
351
|
const Route$p = createFileRoute("/")({
|
|
348
352
|
component: lazyRouteComponent($$splitComponentImporter$1, "component")
|
|
349
353
|
});
|
|
350
|
-
const $$splitComponentImporter = () => import("./_sessionKey-
|
|
354
|
+
const $$splitComponentImporter = () => import("./_sessionKey-B0ZlLAjH.js").then((n) => n.$);
|
|
351
355
|
const Route$o = createFileRoute("/chat/$sessionKey")({
|
|
352
356
|
component: lazyRouteComponent($$splitComponentImporter, "component")
|
|
353
357
|
});
|
|
@@ -3273,165 +3277,170 @@ const Route = createFileRoute("/api/files/delete")({
|
|
|
3273
3277
|
}
|
|
3274
3278
|
}
|
|
3275
3279
|
});
|
|
3276
|
-
const SkillsRoute = Route$
|
|
3280
|
+
const SkillsRoute = Route$w.update({
|
|
3277
3281
|
id: "/skills",
|
|
3278
3282
|
path: "/skills",
|
|
3279
|
-
getParentRoute: () => Route$
|
|
3283
|
+
getParentRoute: () => Route$x
|
|
3280
3284
|
});
|
|
3281
|
-
const NewRoute = Route$
|
|
3285
|
+
const NewRoute = Route$v.update({
|
|
3282
3286
|
id: "/new",
|
|
3283
3287
|
path: "/new",
|
|
3284
|
-
getParentRoute: () => Route$
|
|
3288
|
+
getParentRoute: () => Route$x
|
|
3289
|
+
});
|
|
3290
|
+
const MemoryRoute = Route$u.update({
|
|
3291
|
+
id: "/memory",
|
|
3292
|
+
path: "/memory",
|
|
3293
|
+
getParentRoute: () => Route$x
|
|
3285
3294
|
});
|
|
3286
3295
|
const FilesRoute = Route$t.update({
|
|
3287
3296
|
id: "/files",
|
|
3288
3297
|
path: "/files",
|
|
3289
|
-
getParentRoute: () => Route$
|
|
3298
|
+
getParentRoute: () => Route$x
|
|
3290
3299
|
});
|
|
3291
3300
|
const ConnectRoute = Route$s.update({
|
|
3292
3301
|
id: "/connect",
|
|
3293
3302
|
path: "/connect",
|
|
3294
|
-
getParentRoute: () => Route$
|
|
3303
|
+
getParentRoute: () => Route$x
|
|
3295
3304
|
});
|
|
3296
3305
|
const BotsRoute = Route$r.update({
|
|
3297
3306
|
id: "/bots",
|
|
3298
3307
|
path: "/bots",
|
|
3299
|
-
getParentRoute: () => Route$
|
|
3308
|
+
getParentRoute: () => Route$x
|
|
3300
3309
|
});
|
|
3301
3310
|
const AgentsRoute = Route$q.update({
|
|
3302
3311
|
id: "/agents",
|
|
3303
3312
|
path: "/agents",
|
|
3304
|
-
getParentRoute: () => Route$
|
|
3313
|
+
getParentRoute: () => Route$x
|
|
3305
3314
|
});
|
|
3306
3315
|
const IndexRoute = Route$p.update({
|
|
3307
3316
|
id: "/",
|
|
3308
3317
|
path: "/",
|
|
3309
|
-
getParentRoute: () => Route$
|
|
3318
|
+
getParentRoute: () => Route$x
|
|
3310
3319
|
});
|
|
3311
3320
|
const ChatSessionKeyRoute = Route$o.update({
|
|
3312
3321
|
id: "/chat/$sessionKey",
|
|
3313
3322
|
path: "/chat/$sessionKey",
|
|
3314
|
-
getParentRoute: () => Route$
|
|
3323
|
+
getParentRoute: () => Route$x
|
|
3315
3324
|
});
|
|
3316
3325
|
const ApiTtsRoute = Route$n.update({
|
|
3317
3326
|
id: "/api/tts",
|
|
3318
3327
|
path: "/api/tts",
|
|
3319
|
-
getParentRoute: () => Route$
|
|
3328
|
+
getParentRoute: () => Route$x
|
|
3320
3329
|
});
|
|
3321
3330
|
const ApiSttRoute = Route$m.update({
|
|
3322
3331
|
id: "/api/stt",
|
|
3323
3332
|
path: "/api/stt",
|
|
3324
|
-
getParentRoute: () => Route$
|
|
3333
|
+
getParentRoute: () => Route$x
|
|
3325
3334
|
});
|
|
3326
3335
|
const ApiStreamRoute = Route$l.update({
|
|
3327
3336
|
id: "/api/stream",
|
|
3328
3337
|
path: "/api/stream",
|
|
3329
|
-
getParentRoute: () => Route$
|
|
3338
|
+
getParentRoute: () => Route$x
|
|
3330
3339
|
});
|
|
3331
3340
|
const ApiSkillsRoute = Route$k.update({
|
|
3332
3341
|
id: "/api/skills",
|
|
3333
3342
|
path: "/api/skills",
|
|
3334
|
-
getParentRoute: () => Route$
|
|
3343
|
+
getParentRoute: () => Route$x
|
|
3335
3344
|
});
|
|
3336
3345
|
const ApiSessionsRoute = Route$j.update({
|
|
3337
3346
|
id: "/api/sessions",
|
|
3338
3347
|
path: "/api/sessions",
|
|
3339
|
-
getParentRoute: () => Route$
|
|
3348
|
+
getParentRoute: () => Route$x
|
|
3340
3349
|
});
|
|
3341
3350
|
const ApiSendRoute = Route$i.update({
|
|
3342
3351
|
id: "/api/send",
|
|
3343
3352
|
path: "/api/send",
|
|
3344
|
-
getParentRoute: () => Route$
|
|
3353
|
+
getParentRoute: () => Route$x
|
|
3345
3354
|
});
|
|
3346
3355
|
const ApiPingRoute = Route$h.update({
|
|
3347
3356
|
id: "/api/ping",
|
|
3348
3357
|
path: "/api/ping",
|
|
3349
|
-
getParentRoute: () => Route$
|
|
3358
|
+
getParentRoute: () => Route$x
|
|
3350
3359
|
});
|
|
3351
3360
|
const ApiPersonasRoute = Route$g.update({
|
|
3352
3361
|
id: "/api/personas",
|
|
3353
3362
|
path: "/api/personas",
|
|
3354
|
-
getParentRoute: () => Route$
|
|
3363
|
+
getParentRoute: () => Route$x
|
|
3355
3364
|
});
|
|
3356
3365
|
const ApiPathsRoute = Route$f.update({
|
|
3357
3366
|
id: "/api/paths",
|
|
3358
3367
|
path: "/api/paths",
|
|
3359
|
-
getParentRoute: () => Route$
|
|
3368
|
+
getParentRoute: () => Route$x
|
|
3360
3369
|
});
|
|
3361
3370
|
const ApiModelsRoute = Route$e.update({
|
|
3362
3371
|
id: "/api/models",
|
|
3363
3372
|
path: "/api/models",
|
|
3364
|
-
getParentRoute: () => Route$
|
|
3373
|
+
getParentRoute: () => Route$x
|
|
3365
3374
|
});
|
|
3366
3375
|
const ApiLlmFeaturesRoute = Route$d.update({
|
|
3367
3376
|
id: "/api/llm-features",
|
|
3368
3377
|
path: "/api/llm-features",
|
|
3369
|
-
getParentRoute: () => Route$
|
|
3378
|
+
getParentRoute: () => Route$x
|
|
3370
3379
|
});
|
|
3371
3380
|
const ApiHistoryRoute = Route$c.update({
|
|
3372
3381
|
id: "/api/history",
|
|
3373
3382
|
path: "/api/history",
|
|
3374
|
-
getParentRoute: () => Route$
|
|
3383
|
+
getParentRoute: () => Route$x
|
|
3375
3384
|
});
|
|
3376
3385
|
const ApiFollowUpsRoute = Route$b.update({
|
|
3377
3386
|
id: "/api/follow-ups",
|
|
3378
3387
|
path: "/api/follow-ups",
|
|
3379
|
-
getParentRoute: () => Route$
|
|
3388
|
+
getParentRoute: () => Route$x
|
|
3380
3389
|
});
|
|
3381
3390
|
const ApiCronRoute = Route$a.update({
|
|
3382
3391
|
id: "/api/cron",
|
|
3383
3392
|
path: "/api/cron",
|
|
3384
|
-
getParentRoute: () => Route$
|
|
3393
|
+
getParentRoute: () => Route$x
|
|
3385
3394
|
});
|
|
3386
3395
|
const ApiAgentsRoute = Route$9.update({
|
|
3387
3396
|
id: "/api/agents",
|
|
3388
3397
|
path: "/api/agents",
|
|
3389
|
-
getParentRoute: () => Route$
|
|
3398
|
+
getParentRoute: () => Route$x
|
|
3390
3399
|
});
|
|
3391
3400
|
const ApiFilesUploadRoute = Route$8.update({
|
|
3392
3401
|
id: "/api/files/upload",
|
|
3393
3402
|
path: "/api/files/upload",
|
|
3394
|
-
getParentRoute: () => Route$
|
|
3403
|
+
getParentRoute: () => Route$x
|
|
3395
3404
|
});
|
|
3396
3405
|
const ApiFilesSaveRoute = Route$7.update({
|
|
3397
3406
|
id: "/api/files/save",
|
|
3398
3407
|
path: "/api/files/save",
|
|
3399
|
-
getParentRoute: () => Route$
|
|
3408
|
+
getParentRoute: () => Route$x
|
|
3400
3409
|
});
|
|
3401
3410
|
const ApiFilesRenameRoute = Route$6.update({
|
|
3402
3411
|
id: "/api/files/rename",
|
|
3403
3412
|
path: "/api/files/rename",
|
|
3404
|
-
getParentRoute: () => Route$
|
|
3413
|
+
getParentRoute: () => Route$x
|
|
3405
3414
|
});
|
|
3406
3415
|
const ApiFilesReadRoute = Route$5.update({
|
|
3407
3416
|
id: "/api/files/read",
|
|
3408
3417
|
path: "/api/files/read",
|
|
3409
|
-
getParentRoute: () => Route$
|
|
3418
|
+
getParentRoute: () => Route$x
|
|
3410
3419
|
});
|
|
3411
3420
|
const ApiFilesMkdirRoute = Route$4.update({
|
|
3412
3421
|
id: "/api/files/mkdir",
|
|
3413
3422
|
path: "/api/files/mkdir",
|
|
3414
|
-
getParentRoute: () => Route$
|
|
3423
|
+
getParentRoute: () => Route$x
|
|
3415
3424
|
});
|
|
3416
3425
|
const ApiFilesListRoute = Route$3.update({
|
|
3417
3426
|
id: "/api/files/list",
|
|
3418
3427
|
path: "/api/files/list",
|
|
3419
|
-
getParentRoute: () => Route$
|
|
3428
|
+
getParentRoute: () => Route$x
|
|
3420
3429
|
});
|
|
3421
3430
|
const ApiFilesInfoRoute = Route$2.update({
|
|
3422
3431
|
id: "/api/files/info",
|
|
3423
3432
|
path: "/api/files/info",
|
|
3424
|
-
getParentRoute: () => Route$
|
|
3433
|
+
getParentRoute: () => Route$x
|
|
3425
3434
|
});
|
|
3426
3435
|
const ApiFilesDownloadRoute = Route$1.update({
|
|
3427
3436
|
id: "/api/files/download",
|
|
3428
3437
|
path: "/api/files/download",
|
|
3429
|
-
getParentRoute: () => Route$
|
|
3438
|
+
getParentRoute: () => Route$x
|
|
3430
3439
|
});
|
|
3431
3440
|
const ApiFilesDeleteRoute = Route.update({
|
|
3432
3441
|
id: "/api/files/delete",
|
|
3433
3442
|
path: "/api/files/delete",
|
|
3434
|
-
getParentRoute: () => Route$
|
|
3443
|
+
getParentRoute: () => Route$x
|
|
3435
3444
|
});
|
|
3436
3445
|
const rootRouteChildren = {
|
|
3437
3446
|
IndexRoute,
|
|
@@ -3439,6 +3448,7 @@ const rootRouteChildren = {
|
|
|
3439
3448
|
BotsRoute,
|
|
3440
3449
|
ConnectRoute,
|
|
3441
3450
|
FilesRoute,
|
|
3451
|
+
MemoryRoute,
|
|
3442
3452
|
NewRoute,
|
|
3443
3453
|
SkillsRoute,
|
|
3444
3454
|
ApiAgentsRoute,
|
|
@@ -3467,7 +3477,7 @@ const rootRouteChildren = {
|
|
|
3467
3477
|
ApiFilesSaveRoute,
|
|
3468
3478
|
ApiFilesUploadRoute
|
|
3469
3479
|
};
|
|
3470
|
-
const routeTree = Route$
|
|
3480
|
+
const routeTree = Route$x._addFileChildren(rootRouteChildren)._addFileTypes();
|
|
3471
3481
|
const getRouter = () => {
|
|
3472
3482
|
const router2 = createRouter({
|
|
3473
3483
|
routeTree,
|
|
@@ -3,12 +3,11 @@ import { useState, useRef, useEffect, useCallback, useMemo } from "react";
|
|
|
3
3
|
import { useNavigate } from "@tanstack/react-router";
|
|
4
4
|
import { HugeiconsIcon } from "@hugeicons/react";
|
|
5
5
|
import { Search01Icon, Cancel01Icon, Loading03Icon } from "@hugeicons/core-free-icons";
|
|
6
|
-
import { D as DialogRoot, a as DialogContent } from "./use-file-explorer-state-
|
|
6
|
+
import { D as DialogRoot, a as DialogContent } from "./use-file-explorer-state-s7CS50ho.js";
|
|
7
7
|
import { useQueryClient } from "@tanstack/react-query";
|
|
8
|
-
import { c as chatQueryKeys } from "./_sessionKey-
|
|
8
|
+
import { c as chatQueryKeys } from "./_sessionKey-B0ZlLAjH.js";
|
|
9
9
|
import { c as cn } from "./button-CwY2OHFj.js";
|
|
10
10
|
import "@base-ui/react/dialog";
|
|
11
|
-
import "@base-ui/react/menu";
|
|
12
11
|
import "zustand";
|
|
13
12
|
import "./tooltip-DgsSPocE.js";
|
|
14
13
|
import "@base-ui/react/tooltip";
|
|
@@ -16,7 +15,10 @@ import "motion/react";
|
|
|
16
15
|
import "@base-ui/react/alert-dialog";
|
|
17
16
|
import "@base-ui/react/collapsible";
|
|
18
17
|
import "@base-ui/react/scroll-area";
|
|
18
|
+
import "./menu-D90CDTi2.js";
|
|
19
|
+
import "@base-ui/react/menu";
|
|
19
20
|
import "./opencami-logo-C-43FL3R.js";
|
|
21
|
+
import "./markdown-BFE5y9YH.js";
|
|
20
22
|
import "marked";
|
|
21
23
|
import "react-markdown";
|
|
22
24
|
import "remark-breaks";
|
|
@@ -24,7 +26,7 @@ import "remark-gfm";
|
|
|
24
26
|
import "./index-Dl2BOKP7.js";
|
|
25
27
|
import "zustand/middleware";
|
|
26
28
|
import "react-dom";
|
|
27
|
-
import "./router-
|
|
29
|
+
import "./router-Uuagl6O7.js";
|
|
28
30
|
import "node:crypto";
|
|
29
31
|
import "ws";
|
|
30
32
|
import "node:fs";
|
package/dist/server/assets/{session-export-dialog-CwclV0Aj.js → session-export-dialog-C53RRAah.js}
RENAMED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
import { D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./use-file-explorer-state-
|
|
3
|
+
import { D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./use-file-explorer-state-s7CS50ho.js";
|
|
4
4
|
import { B as Button } from "./button-CwY2OHFj.js";
|
|
5
5
|
import "@base-ui/react/dialog";
|
|
6
|
-
import "@base-ui/react/menu";
|
|
7
6
|
import "zustand";
|
|
8
7
|
import "@base-ui/react/merge-props";
|
|
9
8
|
import "@base-ui/react/use-render";
|