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.
Files changed (79) hide show
  1. package/README.md +4 -1
  2. package/dist/client/assets/{CSPContext-BBLAL_m_.js → CSPContext-Bq8j4nl9.js} +1 -1
  3. package/dist/client/assets/DirectionContext-BdX86BHP.js +1 -0
  4. package/dist/client/assets/_sessionKey-DsjnpErt.js +14 -0
  5. package/dist/client/assets/agents-DwxKcpP6.js +2 -0
  6. package/dist/client/assets/agents-screen-DwIY8hze.js +1 -0
  7. package/dist/client/assets/bots-CRlm-3-d.js +2 -0
  8. package/dist/client/assets/bots-screen-c78I920d.js +1 -0
  9. package/dist/client/assets/button-Dg7VFQQn.js +1 -0
  10. package/dist/client/assets/composite-DBl8R3ae.js +1 -0
  11. package/dist/client/assets/{connect-DHr3hhUR.js → connect-NYvOqiBJ.js} +1 -1
  12. package/dist/client/assets/file-explorer-screen-BSMbs0vi.js +1 -0
  13. package/dist/client/assets/files-BJbMx0_w.js +2 -0
  14. package/dist/client/assets/{index-B2iG4EM1.js → index-CMATW8VA.js} +1 -1
  15. package/dist/client/assets/{index-GTR-Xzl2.js → index-rOIRO-8E.js} +1 -1
  16. package/dist/client/assets/keyboard-shortcuts-dialog-BTGWdJMl.js +1 -0
  17. package/dist/client/assets/{main-mIHr_ble.js → main-B_dlfHME.js} +9 -9
  18. package/dist/client/assets/markdown-BVzT7z4x.js +87 -0
  19. package/dist/client/assets/memory-S3Yws6a5.js +2 -0
  20. package/dist/client/assets/memory-screen-C-Z9o31m.js +1 -0
  21. package/dist/client/assets/menu-DHNgWk_8.js +1 -0
  22. package/dist/client/assets/{opencami-logo-CRIdKbbZ.js → opencami-logo-BQQETnJG.js} +1 -1
  23. package/dist/client/assets/owner-CpRnf1fI.js +1 -0
  24. package/dist/client/assets/popupStateMapping-BRPDXnjv.js +1 -0
  25. package/dist/client/assets/proxy-BcUh9kMA.js +9 -0
  26. package/dist/client/assets/{react-Cfq4ot0g.js → react-irH8OzhB.js} +1 -1
  27. package/dist/client/assets/search-dialog-B96zx_ng.js +1 -0
  28. package/dist/client/assets/session-export-dialog-DPuHnhgv.js +1 -0
  29. package/dist/client/assets/settings-dialog-DZcRCaPj.js +1 -0
  30. package/dist/client/assets/skills-YZe3I63y.js +2 -0
  31. package/dist/client/assets/{skills-panel-Cv-N_MDk.js → skills-panel-WDUfIwnI.js} +2 -2
  32. package/dist/client/assets/styles-Bwo-K6Y4.css +1 -0
  33. package/dist/client/assets/{switch-Bh9tVOYh.js → switch-DPocNFRG.js} +1 -1
  34. package/dist/client/assets/tabs-B0cro1hL.js +1 -0
  35. package/dist/client/assets/tooltip-Dg9fy-vT.js +1 -0
  36. package/dist/client/assets/use-file-explorer-state-DzT0bksg.js +12 -0
  37. package/dist/client/assets/{useButton-DsMdJPGn.js → useButton-Cbl_9oFG.js} +1 -1
  38. package/dist/client/assets/useCompositeItem-BDAzTxVe.js +1 -0
  39. package/dist/client/assets/{useControlled-wOKVgKF4.js → useControlled-Dscz_s4f.js} +1 -1
  40. package/dist/client/assets/{useMutation-fJnleJAb.js → useMutation-B1FlDsNN.js} +1 -1
  41. package/dist/client/assets/visuallyHidden-ONmQ-0U2.js +1 -0
  42. package/dist/server/assets/{_sessionKey-B5UHBd2U.js → _sessionKey-B0ZlLAjH.js} +172 -567
  43. package/dist/server/assets/_tanstack-start-manifest_v-D5UVTs1o.js +4 -0
  44. package/dist/server/assets/{file-explorer-screen-CVlFiAFu.js → file-explorer-screen-DH4UFK03.js} +3 -2
  45. package/dist/server/assets/{files-BIEcSPGp.js → files-DYdXlQDr.js} +1 -1
  46. package/dist/server/assets/{index--_jH_0mX.js → index-CiUjUD0t.js} +1 -1
  47. package/dist/server/assets/{keyboard-shortcuts-dialog-CsNP85q8.js → keyboard-shortcuts-dialog-Cr6fOqHz.js} +1 -2
  48. package/dist/server/assets/markdown-BFE5y9YH.js +565 -0
  49. package/dist/server/assets/memory-BqZOoD7Q.js +11 -0
  50. package/dist/server/assets/memory-screen-BK5phS8K.js +235 -0
  51. package/dist/server/assets/menu-D90CDTi2.js +45 -0
  52. package/dist/server/assets/{router-DJA7GtMo.js → router-Uuagl6O7.js} +55 -45
  53. package/dist/server/assets/{search-dialog-C2a3OYm_.js → search-dialog-DZTS5SEi.js} +6 -4
  54. package/dist/server/assets/{session-export-dialog-CwclV0Aj.js → session-export-dialog-C53RRAah.js} +1 -2
  55. package/dist/server/assets/{settings-dialog-CHVzrou9.js → settings-dialog-CSYDj2qm.js} +75 -20
  56. package/dist/server/assets/{use-file-explorer-state-Il1LlBAe.js → use-file-explorer-state-s7CS50ho.js} +0 -41
  57. package/dist/server/server.js +2 -2
  58. package/package.json +1 -1
  59. package/dist/client/assets/DirectionContext-DXnZc0zz.js +0 -1
  60. package/dist/client/assets/_sessionKey-BidmO1-D.js +0 -100
  61. package/dist/client/assets/agents-CtZs_u1j.js +0 -2
  62. package/dist/client/assets/agents-screen-Basce5qo.js +0 -1
  63. package/dist/client/assets/bots-C_dWjy3z.js +0 -2
  64. package/dist/client/assets/bots-screen-n_xhYOEE.js +0 -1
  65. package/dist/client/assets/button-BaHefIXU.js +0 -1
  66. package/dist/client/assets/file-explorer-screen-8t6M4Xco.js +0 -1
  67. package/dist/client/assets/files-BdlpK3Cy.js +0 -2
  68. package/dist/client/assets/keyboard-shortcuts-dialog-CcKSlK52.js +0 -1
  69. package/dist/client/assets/search-dialog-D19x_xaG.js +0 -1
  70. package/dist/client/assets/session-export-dialog-DRlJwhMa.js +0 -1
  71. package/dist/client/assets/settings-dialog-BA5FjiyP.js +0 -1
  72. package/dist/client/assets/skills-lmNPZksG.js +0 -2
  73. package/dist/client/assets/styles-JgjN_ZCd.css +0 -1
  74. package/dist/client/assets/tabs-BfaEc9zS.js +0 -1
  75. package/dist/client/assets/tooltip-w9D-e_R-.js +0 -1
  76. package/dist/client/assets/use-file-explorer-state-CLaDuI9X.js +0 -12
  77. package/dist/client/assets/useCompositeItem-CaYygSfB.js +0 -1
  78. package/dist/client/assets/visuallyHidden-CqGRL_Oq.js +0 -9
  79. 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-JgjN_ZCd.css";
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$w = createRootRoute({
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$7 = () => import("./skills-Cy8xclXY.js");
314
- const Route$v = createFileRoute("/skills")({
315
- component: lazyRouteComponent($$splitComponentImporter$7, "component")
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$6 = () => import("./new-Dzk5YxE9.js");
318
- const Route$u = createFileRoute("/new")({
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-BIEcSPGp.js");
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--_jH_0mX.js");
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-B5UHBd2U.js").then((n) => n.$);
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$v.update({
3280
+ const SkillsRoute = Route$w.update({
3277
3281
  id: "/skills",
3278
3282
  path: "/skills",
3279
- getParentRoute: () => Route$w
3283
+ getParentRoute: () => Route$x
3280
3284
  });
3281
- const NewRoute = Route$u.update({
3285
+ const NewRoute = Route$v.update({
3282
3286
  id: "/new",
3283
3287
  path: "/new",
3284
- getParentRoute: () => Route$w
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$w
3298
+ getParentRoute: () => Route$x
3290
3299
  });
3291
3300
  const ConnectRoute = Route$s.update({
3292
3301
  id: "/connect",
3293
3302
  path: "/connect",
3294
- getParentRoute: () => Route$w
3303
+ getParentRoute: () => Route$x
3295
3304
  });
3296
3305
  const BotsRoute = Route$r.update({
3297
3306
  id: "/bots",
3298
3307
  path: "/bots",
3299
- getParentRoute: () => Route$w
3308
+ getParentRoute: () => Route$x
3300
3309
  });
3301
3310
  const AgentsRoute = Route$q.update({
3302
3311
  id: "/agents",
3303
3312
  path: "/agents",
3304
- getParentRoute: () => Route$w
3313
+ getParentRoute: () => Route$x
3305
3314
  });
3306
3315
  const IndexRoute = Route$p.update({
3307
3316
  id: "/",
3308
3317
  path: "/",
3309
- getParentRoute: () => Route$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w
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$w._addFileChildren(rootRouteChildren)._addFileTypes();
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-Il1LlBAe.js";
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-B5UHBd2U.js";
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-DJA7GtMo.js";
29
+ import "./router-Uuagl6O7.js";
28
30
  import "node:crypto";
29
31
  import "ws";
30
32
  import "node:fs";
@@ -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-Il1LlBAe.js";
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";