-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx b/surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx
index 2038f7a0e..c30357fb6 100644
--- a/surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx
+++ b/surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -241,7 +241,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/dropbox/create-file.tsx b/surfsense_web/components/tool-ui/dropbox/create-file.tsx
index 02eae2c83..f76a45f62 100644
--- a/surfsense_web/components/tool-ui/dropbox/create-file.tsx
+++ b/surfsense_web/components/tool-ui/dropbox/create-file.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, FileIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, FileIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -224,7 +224,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/generate-resume.tsx b/surfsense_web/components/tool-ui/generate-resume.tsx
index f329ff95d..1290a70ea 100644
--- a/surfsense_web/components/tool-ui/generate-resume.tsx
+++ b/surfsense_web/components/tool-ui/generate-resume.tsx
@@ -20,6 +20,7 @@ const GenerateResumeArgsSchema = z.object({
user_info: z.string(),
user_instructions: z.string().nullish(),
parent_report_id: z.number().nullish(),
+ max_pages: z.number().int().min(1).max(5).optional(),
});
const GenerateResumeResultSchema = z.object({
diff --git a/surfsense_web/components/tool-ui/generic-hitl-approval.tsx b/surfsense_web/components/tool-ui/generic-hitl-approval.tsx
index 809b76c38..c83bf55d5 100644
--- a/surfsense_web/components/tool-ui/generic-hitl-approval.tsx
+++ b/surfsense_web/components/tool-ui/generic-hitl-approval.tsx
@@ -1,8 +1,9 @@
"use client";
import type { ToolCallMessagePartComponent } from "@assistant-ui/react";
-import { CornerDownLeftIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
+import { toast } from "sonner";
import { TextShimmerLoader } from "@/components/prompt-kit/loader";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
@@ -116,8 +117,8 @@ function GenericApprovalCard({
if (phase !== "pending" || !isMCPTool) return;
setProcessing();
onDecision({ type: "approve" });
- connectorsApiService.trustMCPTool(mcpConnectorId, toolName).catch((err) => {
- console.error("Failed to trust MCP tool:", err);
+ connectorsApiService.trustMCPTool(mcpConnectorId, toolName).catch(() => {
+ toast.error("Failed to save 'Always Allow' preference. The tool will still require approval next time.");
});
}, [phase, setProcessing, onDecision, isMCPTool, mcpConnectorId, toolName]);
@@ -167,7 +168,7 @@ function GenericApprovalCard({
className="rounded-lg text-muted-foreground -mt-1 -mr-2"
onClick={() => setIsEditing(true)}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/gmail/create-draft.tsx b/surfsense_web/components/tool-ui/gmail/create-draft.tsx
index cfe61351a..a00760ca3 100644
--- a/surfsense_web/components/tool-ui/gmail/create-draft.tsx
+++ b/surfsense_web/components/tool-ui/gmail/create-draft.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, Pen, UserIcon, UsersIcon } from "lucide-react";
+import { CornerDownLeftIcon, Pencil, UserIcon, UsersIcon } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import type { ExtraField } from "@/atoms/chat/hitl-edit-panel.atom";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
@@ -251,7 +251,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/gmail/send-email.tsx b/surfsense_web/components/tool-ui/gmail/send-email.tsx
index a21ece7b3..c22045fa1 100644
--- a/surfsense_web/components/tool-ui/gmail/send-email.tsx
+++ b/surfsense_web/components/tool-ui/gmail/send-email.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, MailIcon, Pen, UserIcon, UsersIcon } from "lucide-react";
+import { CornerDownLeftIcon, MailIcon, Pencil, UserIcon, UsersIcon } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import type { ExtraField } from "@/atoms/chat/hitl-edit-panel.atom";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
@@ -250,7 +250,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/gmail/update-draft.tsx b/surfsense_web/components/tool-ui/gmail/update-draft.tsx
index 0cbf338d7..b8c8c10f6 100644
--- a/surfsense_web/components/tool-ui/gmail/update-draft.tsx
+++ b/surfsense_web/components/tool-ui/gmail/update-draft.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, MailIcon, Pen, UserIcon, UsersIcon } from "lucide-react";
+import { CornerDownLeftIcon, MailIcon, Pencil, UserIcon, UsersIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react";
import type { ExtraField } from "@/atoms/chat/hitl-edit-panel.atom";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
@@ -283,7 +283,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/google-calendar/create-event.tsx b/surfsense_web/components/tool-ui/google-calendar/create-event.tsx
index 40a9f0106..9427c989b 100644
--- a/surfsense_web/components/tool-ui/google-calendar/create-event.tsx
+++ b/surfsense_web/components/tool-ui/google-calendar/create-event.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { ClockIcon, CornerDownLeftIcon, GlobeIcon, MapPinIcon, Pen, UsersIcon } from "lucide-react";
+import { ClockIcon, CornerDownLeftIcon, GlobeIcon, MapPinIcon, Pencil, UsersIcon } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import type { ExtraField } from "@/atoms/chat/hitl-edit-panel.atom";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
@@ -332,7 +332,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/google-calendar/update-event.tsx b/surfsense_web/components/tool-ui/google-calendar/update-event.tsx
index cd6ec0618..649174245 100644
--- a/surfsense_web/components/tool-ui/google-calendar/update-event.tsx
+++ b/surfsense_web/components/tool-ui/google-calendar/update-event.tsx
@@ -7,7 +7,7 @@ import {
ClockIcon,
CornerDownLeftIcon,
MapPinIcon,
- Pen,
+ Pencil,
UsersIcon,
} from "lucide-react";
import { useCallback, useEffect, useState } from "react";
@@ -415,7 +415,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/google-drive/create-file.tsx b/surfsense_web/components/tool-ui/google-drive/create-file.tsx
index 638db3db9..b13089877 100644
--- a/surfsense_web/components/tool-ui/google-drive/create-file.tsx
+++ b/surfsense_web/components/tool-ui/google-drive/create-file.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, FileIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, FileIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -240,7 +240,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/jira/create-jira-issue.tsx b/surfsense_web/components/tool-ui/jira/create-jira-issue.tsx
index 91041d15e..6916f9fa0 100644
--- a/surfsense_web/components/tool-ui/jira/create-jira-issue.tsx
+++ b/surfsense_web/components/tool-ui/jira/create-jira-issue.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -257,7 +257,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/jira/update-jira-issue.tsx b/surfsense_web/components/tool-ui/jira/update-jira-issue.tsx
index f377563da..72e697532 100644
--- a/surfsense_web/components/tool-ui/jira/update-jira-issue.tsx
+++ b/surfsense_web/components/tool-ui/jira/update-jira-issue.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -273,7 +273,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/linear/create-linear-issue.tsx b/surfsense_web/components/tool-ui/linear/create-linear-issue.tsx
index 8abc7b50b..7d5098c3e 100644
--- a/surfsense_web/components/tool-ui/linear/create-linear-issue.tsx
+++ b/surfsense_web/components/tool-ui/linear/create-linear-issue.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -269,7 +269,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/linear/update-linear-issue.tsx b/surfsense_web/components/tool-ui/linear/update-linear-issue.tsx
index daadfbc63..2d6846cea 100644
--- a/surfsense_web/components/tool-ui/linear/update-linear-issue.tsx
+++ b/surfsense_web/components/tool-ui/linear/update-linear-issue.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -332,7 +332,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/notion/create-notion-page.tsx b/surfsense_web/components/tool-ui/notion/create-notion-page.tsx
index 8c93c7648..b16a1d8cd 100644
--- a/surfsense_web/components/tool-ui/notion/create-notion-page.tsx
+++ b/surfsense_web/components/tool-ui/notion/create-notion-page.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -219,7 +219,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/notion/update-notion-page.tsx b/surfsense_web/components/tool-ui/notion/update-notion-page.tsx
index cf714b1b4..ef75c5d92 100644
--- a/surfsense_web/components/tool-ui/notion/update-notion-page.tsx
+++ b/surfsense_web/components/tool-ui/notion/update-notion-page.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -196,7 +196,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/tool-ui/onedrive/create-file.tsx b/surfsense_web/components/tool-ui/onedrive/create-file.tsx
index 8a64a6cf8..7621f152f 100644
--- a/surfsense_web/components/tool-ui/onedrive/create-file.tsx
+++ b/surfsense_web/components/tool-ui/onedrive/create-file.tsx
@@ -2,7 +2,7 @@
import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai";
-import { CornerDownLeftIcon, FileIcon, Pen } from "lucide-react";
+import { CornerDownLeftIcon, FileIcon, Pencil } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { openHitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom";
import { PlateEditor } from "@/components/editor/plate-editor";
@@ -209,7 +209,7 @@ function ApprovalCard({
});
}}
>
-
+
Edit
)}
diff --git a/surfsense_web/components/ui/mode-toolbar-button.tsx b/surfsense_web/components/ui/mode-toolbar-button.tsx
index 37231991f..394eaf97c 100644
--- a/surfsense_web/components/ui/mode-toolbar-button.tsx
+++ b/surfsense_web/components/ui/mode-toolbar-button.tsx
@@ -1,6 +1,6 @@
"use client";
-import { BookOpenIcon, PenLineIcon } from "lucide-react";
+import { BookOpenIcon, Pencil } from "lucide-react";
import { usePlateState } from "platejs/react";
import { ToolbarButton } from "./toolbar";
@@ -13,7 +13,7 @@ export function ModeToolbarButton() {
tooltip={readOnly ? "Click to edit" : "Click to view"}
onClick={() => setReadOnly(!readOnly)}
>
- {readOnly ?
:
}
+ {readOnly ?
:
}
);
}
diff --git a/surfsense_web/content/docs/how-to/meta.json b/surfsense_web/content/docs/how-to/meta.json
index 477fcafc4..329b7172e 100644
--- a/surfsense_web/content/docs/how-to/meta.json
+++ b/surfsense_web/content/docs/how-to/meta.json
@@ -1,6 +1,6 @@
{
"title": "How to",
- "pages": ["zero-sync", "realtime-collaboration", "web-search"],
+ "pages": ["zero-sync", "realtime-collaboration", "web-search", "ollama"],
"icon": "Compass",
"defaultOpen": false
}
diff --git a/surfsense_web/content/docs/how-to/ollama.mdx b/surfsense_web/content/docs/how-to/ollama.mdx
new file mode 100644
index 000000000..48b231705
--- /dev/null
+++ b/surfsense_web/content/docs/how-to/ollama.mdx
@@ -0,0 +1,90 @@
+---
+title: Connect Ollama
+description: Simple setup guide for using Ollama with SurfSense across local, Docker, remote, and cloud setups
+---
+
+# Connect Ollama
+
+Use this page to choose the correct **API Base URL** when adding an Ollama provider in SurfSense.
+
+## 1) Pick your API Base URL
+
+| Ollama location | SurfSense location | API Base URL |
+|---|---|---|
+| Same machine | No Docker | `http://localhost:11434` |
+| Host machine (macOS/Windows) | Docker Desktop | `http://host.docker.internal:11434` |
+| Host machine (Linux) | Docker Compose | `http://host.docker.internal:11434` |
+| Same Docker Compose stack | Docker Compose | `http://ollama:11434` |
+| Another machine in your network | Any | `http://
:11434` |
+| Public Ollama endpoint / proxy / cloud | Any | `http(s)://` |
+
+If SurfSense runs in Docker, do not use `localhost` unless Ollama is in the same container.
+
+## 2) Add Ollama in SurfSense
+
+Go to **Search Space Settings -> Agent Models -> Add Model** and set:
+
+- Provider: `OLLAMA`
+- Model name: your model tag, for example `llama3.2` or `qwen3:8b`
+- API Base URL: from the table above
+- API key:
+ - local/self-hosted Ollama: any non-empty value
+ - Ollama cloud/proxied auth: real key or token required by that endpoint
+
+Save. SurfSense validates the connection immediately.
+
+## 3) Common setups
+
+### A) SurfSense in Docker Desktop, Ollama on your host
+
+Use:
+
+```text
+http://host.docker.internal:11434
+```
+
+### B) Ollama as a service in the same Compose
+
+Use API Base URL:
+
+```text
+http://ollama:11434
+```
+
+Minimal service example:
+
+```yaml
+ollama:
+ image: ollama/ollama:latest
+ volumes:
+ - ollama_data:/root/.ollama
+ ports:
+ - "11434:11434"
+```
+
+### C) Ollama on another machine
+
+Ollama binds to `127.0.0.1` by default. Make it reachable on the network:
+
+- Set `OLLAMA_HOST=0.0.0.0:11434` on the machine/service running Ollama
+- Open firewall port `11434`
+- Use `http://:11434` in SurfSense's API Base URL
+
+## 4) Quick troubleshooting
+
+| Error | Cause | Fix |
+|---|---|---|
+| `Cannot connect to host localhost:11434` | Wrong URL from Dockerized backend | Use `host.docker.internal` or `ollama` |
+| `Cannot connect to host :11434` | Ollama not exposed on network or firewall blocked | Set `OLLAMA_HOST=0.0.0.0:11434`, allow port 11434 |
+| URL starts with `/%20http://...` | Leading space in URL | Re-enter API Base URL without spaces |
+| `model not found` | Model not pulled on Ollama | Run `ollama pull ` |
+
+If needed, test from the backend container using the same host you put in **API Base URL**:
+
+```bash
+docker compose exec backend curl -v /api/tags
+```
+
+## See also
+
+- [Docker Installation](/docs/docker-installation/docker-compose)
\ No newline at end of file
diff --git a/surfsense_web/contracts/enums/toolIcons.tsx b/surfsense_web/contracts/enums/toolIcons.tsx
index fd12aaa9c..3bc639d33 100644
--- a/surfsense_web/contracts/enums/toolIcons.tsx
+++ b/surfsense_web/contracts/enums/toolIcons.tsx
@@ -1,6 +1,7 @@
import {
BookOpen,
Brain,
+ FileUser,
FileText,
Film,
Globe,
@@ -15,6 +16,7 @@ const TOOL_ICONS: Record = {
generate_podcast: Podcast,
generate_video_presentation: Film,
generate_report: FileText,
+ generate_resume: FileUser,
generate_image: ImageIcon,
scrape_webpage: ScanLine,
web_search: Globe,
diff --git a/surfsense_web/lib/agent-filesystem.ts b/surfsense_web/lib/agent-filesystem.ts
new file mode 100644
index 000000000..91c366d43
--- /dev/null
+++ b/surfsense_web/lib/agent-filesystem.ts
@@ -0,0 +1,61 @@
+export type AgentFilesystemMode = "cloud" | "desktop_local_folder";
+export type ClientPlatform = "web" | "desktop";
+
+export interface AgentFilesystemMountSelection {
+ mount_id: string;
+ root_path: string;
+}
+
+export interface AgentFilesystemSelection {
+ filesystem_mode: AgentFilesystemMode;
+ client_platform: ClientPlatform;
+ local_filesystem_mounts?: AgentFilesystemMountSelection[];
+}
+
+const DEFAULT_SELECTION: AgentFilesystemSelection = {
+ filesystem_mode: "cloud",
+ client_platform: "web",
+};
+
+export function getClientPlatform(): ClientPlatform {
+ if (typeof window === "undefined") return "web";
+ return window.electronAPI ? "desktop" : "web";
+}
+
+export async function getAgentFilesystemSelection(): Promise {
+ const platform = getClientPlatform();
+ if (platform !== "desktop" || !window.electronAPI?.getAgentFilesystemSettings) {
+ return { ...DEFAULT_SELECTION, client_platform: platform };
+ }
+ try {
+ const settings = await window.electronAPI.getAgentFilesystemSettings();
+ if (settings.mode === "desktop_local_folder") {
+ const mounts = await window.electronAPI.getAgentFilesystemMounts?.();
+ const localFilesystemMounts =
+ mounts?.map((entry) => ({
+ mount_id: entry.mount,
+ root_path: entry.rootPath,
+ })) ?? [];
+ if (localFilesystemMounts.length === 0) {
+ return {
+ filesystem_mode: "cloud",
+ client_platform: "desktop",
+ };
+ }
+ return {
+ filesystem_mode: "desktop_local_folder",
+ client_platform: "desktop",
+ local_filesystem_mounts: localFilesystemMounts,
+ };
+ }
+ return {
+ filesystem_mode: "cloud",
+ client_platform: "desktop",
+ };
+ } catch {
+ return {
+ filesystem_mode: "cloud",
+ client_platform: "desktop",
+ };
+ }
+}
diff --git a/surfsense_web/lib/apis/anonymous-chat-api.service.ts b/surfsense_web/lib/apis/anonymous-chat-api.service.ts
index 968f58be2..843576a50 100644
--- a/surfsense_web/lib/apis/anonymous-chat-api.service.ts
+++ b/surfsense_web/lib/apis/anonymous-chat-api.service.ts
@@ -12,6 +12,10 @@ import { ValidationError } from "../error";
const BASE = "/api/v1/public/anon-chat";
+export type AnonUploadResult =
+ | { ok: true; data: { filename: string; size_bytes: number } }
+ | { ok: false; reason: "quota_exceeded" };
+
class AnonymousChatApiService {
private baseUrl: string;
@@ -71,7 +75,7 @@ class AnonymousChatApiService {
});
};
- uploadDocument = async (file: File): Promise<{ filename: string; size_bytes: number }> => {
+ uploadDocument = async (file: File): Promise => {
const formData = new FormData();
formData.append("file", file);
const res = await fetch(this.fullUrl("/upload"), {
@@ -79,11 +83,15 @@ class AnonymousChatApiService {
credentials: "include",
body: formData,
});
+ if (res.status === 409) {
+ return { ok: false, reason: "quota_exceeded" };
+ }
if (!res.ok) {
const body = await res.json().catch(() => ({}));
throw new Error(body.detail || `Upload failed: ${res.status}`);
}
- return res.json();
+ const data = await res.json();
+ return { ok: true, data };
};
getDocument = async (): Promise<{ filename: string; size_bytes: number } | null> => {
diff --git a/surfsense_web/lib/apis/base-api.service.ts b/surfsense_web/lib/apis/base-api.service.ts
index 04e9fad54..269fd916c 100644
--- a/surfsense_web/lib/apis/base-api.service.ts
+++ b/surfsense_web/lib/apis/base-api.service.ts
@@ -1,4 +1,5 @@
import type { ZodType } from "zod";
+import { getClientPlatform } from "../agent-filesystem";
import { getBearerToken, handleUnauthorized, refreshAccessToken } from "../auth-utils";
import {
AbortedError,
@@ -75,6 +76,8 @@ class BaseApiService {
const defaultOptions: RequestOptions = {
headers: {
Authorization: `Bearer ${this.bearerToken || ""}`,
+ "X-SurfSense-Client-Platform":
+ typeof window === "undefined" ? "web" : getClientPlatform(),
},
method: "GET",
responseType: ResponseType.JSON,
diff --git a/surfsense_web/lib/apis/connectors-api.service.ts b/surfsense_web/lib/apis/connectors-api.service.ts
index 2b9846249..a35e731a4 100644
--- a/surfsense_web/lib/apis/connectors-api.service.ts
+++ b/surfsense_web/lib/apis/connectors-api.service.ts
@@ -414,16 +414,8 @@ class ConnectorsApiService {
* Subsequent calls to this tool will skip HITL approval.
*/
trustMCPTool = async (connectorId: number, toolName: string): Promise => {
- const backendUrl = process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL || "http://localhost:8000";
- const token =
- typeof window !== "undefined" ? document.cookie.match(/fapiToken=([^;]+)/)?.[1] : undefined;
- await fetch(`${backendUrl}/api/v1/connectors/mcp/${connectorId}/trust-tool`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- ...(token ? { Authorization: `Bearer ${token}` } : {}),
- },
- body: JSON.stringify({ tool_name: toolName }),
+ await baseApiService.post(`/api/v1/connectors/mcp/${connectorId}/trust-tool`, undefined, {
+ body: { tool_name: toolName },
});
};
@@ -431,16 +423,8 @@ class ConnectorsApiService {
* Remove a tool from the MCP connector's "Always Allow" list.
*/
untrustMCPTool = async (connectorId: number, toolName: string): Promise => {
- const backendUrl = process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL || "http://localhost:8000";
- const token =
- typeof window !== "undefined" ? document.cookie.match(/fapiToken=([^;]+)/)?.[1] : undefined;
- await fetch(`${backendUrl}/api/v1/connectors/mcp/${connectorId}/untrust-tool`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- ...(token ? { Authorization: `Bearer ${token}` } : {}),
- },
- body: JSON.stringify({ tool_name: toolName }),
+ await baseApiService.post(`/api/v1/connectors/mcp/${connectorId}/untrust-tool`, undefined, {
+ body: { tool_name: toolName },
});
};
diff --git a/surfsense_web/lib/editor-language.ts b/surfsense_web/lib/editor-language.ts
new file mode 100644
index 000000000..17227c15d
--- /dev/null
+++ b/surfsense_web/lib/editor-language.ts
@@ -0,0 +1,34 @@
+const EXTENSION_TO_MONACO_LANGUAGE: Record = {
+ css: "css",
+ csv: "plaintext",
+ cjs: "javascript",
+ html: "html",
+ htm: "html",
+ ini: "ini",
+ js: "javascript",
+ json: "json",
+ markdown: "markdown",
+ md: "markdown",
+ mjs: "javascript",
+ py: "python",
+ sql: "sql",
+ toml: "plaintext",
+ ts: "typescript",
+ tsx: "typescript",
+ xml: "xml",
+ yaml: "yaml",
+ yml: "yaml",
+};
+
+export function inferMonacoLanguageFromPath(filePath: string | null | undefined): string {
+ if (!filePath) return "plaintext";
+
+ const fileName = filePath.split("/").pop() ?? filePath;
+ const extensionIndex = fileName.lastIndexOf(".");
+ if (extensionIndex <= 0 || extensionIndex === fileName.length - 1) {
+ return "plaintext";
+ }
+
+ const extension = fileName.slice(extensionIndex + 1).toLowerCase();
+ return EXTENSION_TO_MONACO_LANGUAGE[extension] ?? "plaintext";
+}
diff --git a/surfsense_web/package.json b/surfsense_web/package.json
index a98c21f83..41175daeb 100644
--- a/surfsense_web/package.json
+++ b/surfsense_web/package.json
@@ -28,6 +28,7 @@
"@babel/standalone": "^7.29.2",
"@hookform/resolvers": "^5.2.2",
"@marsidev/react-turnstile": "^1.5.0",
+ "@monaco-editor/react": "^4.7.0",
"@number-flow/react": "^0.5.10",
"@platejs/autoformat": "^52.0.11",
"@platejs/basic-nodes": "^52.0.11",
@@ -106,6 +107,7 @@
"lenis": "^1.3.17",
"lowlight": "^3.3.0",
"lucide-react": "^0.577.0",
+ "monaco-editor": "^0.55.1",
"motion": "^12.23.22",
"next": "^16.1.0",
"next-intl": "^4.6.1",
diff --git a/surfsense_web/pnpm-lock.yaml b/surfsense_web/pnpm-lock.yaml
index 7cb492a05..b1730e842 100644
--- a/surfsense_web/pnpm-lock.yaml
+++ b/surfsense_web/pnpm-lock.yaml
@@ -29,6 +29,9 @@ importers:
'@marsidev/react-turnstile':
specifier: ^1.5.0
version: 1.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@monaco-editor/react':
+ specifier: ^4.7.0
+ version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@number-flow/react':
specifier: ^0.5.10
version: 0.5.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -263,6 +266,9 @@ importers:
lucide-react:
specifier: ^0.577.0
version: 0.577.0(react@19.2.4)
+ monaco-editor:
+ specifier: ^0.55.1
+ version: 0.55.1
motion:
specifier: ^12.23.22
version: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -1088,10 +1094,6 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/runtime@7.28.6':
- resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
- engines: {node: '>=6.9.0'}
-
'@babel/runtime@7.29.2':
resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
engines: {node: '>=6.9.0'}
@@ -1984,6 +1986,16 @@ packages:
peerDependencies:
mediabunny: ^1.0.0
+ '@monaco-editor/loader@1.7.0':
+ resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==}
+
+ '@monaco-editor/react@4.7.0':
+ resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==}
+ peerDependencies:
+ monaco-editor: '>= 0.25.0 < 1'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@napi-rs/canvas-android-arm64@0.1.97':
resolution: {integrity: sha512-V1c/WVw+NzH8vk7ZK/O8/nyBSCQimU8sfMsB/9qeSvdkGKNU7+mxy/bIF0gTgeBFmHpj30S4E9WHMSrxXGQuVQ==}
engines: {node: '>= 10'}
@@ -2188,12 +2200,6 @@ packages:
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
- '@opentelemetry/core@2.5.1':
- resolution: {integrity: sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==}
- engines: {node: ^18.19.0 || >=20.6.0}
- peerDependencies:
- '@opentelemetry/api': '>=1.0.0 <1.10.0'
-
'@opentelemetry/core@2.6.0':
resolution: {integrity: sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==}
engines: {node: ^18.19.0 || >=20.6.0}
@@ -2606,12 +2612,6 @@ packages:
peerDependencies:
'@opentelemetry/api': '>=1.3.0 <1.10.0'
- '@opentelemetry/resources@2.5.1':
- resolution: {integrity: sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==}
- engines: {node: ^18.19.0 || >=20.6.0}
- peerDependencies:
- '@opentelemetry/api': '>=1.3.0 <1.10.0'
-
'@opentelemetry/resources@2.6.0':
resolution: {integrity: sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==}
engines: {node: ^18.19.0 || >=20.6.0}
@@ -4372,8 +4372,8 @@ packages:
peerDependencies:
react: '>= 16'
- '@tabler/icons@3.37.1':
- resolution: {integrity: sha512-neLCWkuyNHEPXCyYu6nbN4S3g/59BTa4qyITAugYVpq1YzYNDOZooW7/vRWH98ZItXAudxdKU8muFT7y1PqzuA==}
+ '@tabler/icons@3.41.1':
+ resolution: {integrity: sha512-OaRnVbRmH2nHtFeg+RmMJ/7m2oBIF9XCJAUD5gQnMrpK9f05ydj8MZrAf3NZQqOXyxGN1UBL0D5IKLLEUfr74Q==}
'@tailwindcss/node@4.2.1':
resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==}
@@ -4814,6 +4814,7 @@ packages:
'@xmldom/xmldom@0.8.11':
resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==}
engines: {node: '>=10.0.0'}
+ deprecated: this version has critical issues, please update to the latest version
abstract-logging@2.0.1:
resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==}
@@ -5383,6 +5384,9 @@ packages:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
+ dompurify@3.2.7:
+ resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==}
+
dompurify@3.3.1:
resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==}
@@ -6760,6 +6764,11 @@ packages:
markdown-table@3.0.4:
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+ marked@14.0.0:
+ resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==}
+ engines: {node: '>= 18'}
+ hasBin: true
+
marked@15.0.12:
resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==}
engines: {node: '>= 18'}
@@ -6980,6 +6989,9 @@ packages:
module-details-from-path@1.0.4:
resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==}
+ monaco-editor@0.55.1:
+ resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==}
+
motion-dom@12.34.3:
resolution: {integrity: sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ==}
@@ -7012,11 +7024,6 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nanoid@5.1.6:
- resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==}
- engines: {node: ^18 || >=20}
- hasBin: true
-
nanoid@5.1.7:
resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==}
engines: {node: ^18 || >=20}
@@ -7421,8 +7428,8 @@ packages:
property-information@7.1.0:
resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
- protobufjs@7.5.4:
- resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
+ protobufjs@7.5.5:
+ resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==}
engines: {node: '>=12.0.0'}
proxy-compare@2.6.0:
@@ -7963,6 +7970,9 @@ packages:
stable-hash@0.0.5:
resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+ state-local@1.0.7:
+ resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
+
stop-iteration-iterator@1.1.0:
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
engines: {node: '>= 0.4'}
@@ -9387,8 +9397,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/runtime@7.28.6': {}
-
'@babel/runtime@7.29.2': {}
'@babel/standalone@7.29.2': {}
@@ -9886,7 +9894,7 @@ snapshots:
dependencies:
lodash.camelcase: 4.3.0
long: 5.3.2
- protobufjs: 7.5.4
+ protobufjs: 7.5.5
yargs: 17.7.2
'@hookform/resolvers@5.2.2(react-hook-form@7.71.2(react@19.2.4))':
@@ -10072,6 +10080,17 @@ snapshots:
dependencies:
mediabunny: 1.39.2
+ '@monaco-editor/loader@1.7.0':
+ dependencies:
+ state-local: 1.0.7
+
+ '@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+ dependencies:
+ '@monaco-editor/loader': 1.7.0
+ monaco-editor: 0.55.1
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
'@napi-rs/canvas-android-arm64@0.1.97':
optional: true
@@ -10246,7 +10265,7 @@ snapshots:
'@opentelemetry/resource-detector-azure': 0.10.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resource-detector-container': 0.7.11(@opentelemetry/api@1.9.0)
'@opentelemetry/resource-detector-gcp': 0.37.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- encoding
@@ -10270,11 +10289,6 @@ snapshots:
'@opentelemetry/api': 1.9.0
'@opentelemetry/semantic-conventions': 1.39.0
- '@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0)':
- dependencies:
- '@opentelemetry/api': 1.9.0
- '@opentelemetry/semantic-conventions': 1.39.0
-
'@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@@ -10397,7 +10411,7 @@ snapshots:
'@opentelemetry/instrumentation-amqplib@0.50.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
transitivePeerDependencies:
@@ -10415,7 +10429,7 @@ snapshots:
'@opentelemetry/instrumentation-aws-sdk@0.58.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
transitivePeerDependencies:
@@ -10441,7 +10455,7 @@ snapshots:
'@opentelemetry/instrumentation-connect@0.47.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
'@types/connect': 3.4.38
@@ -10473,7 +10487,7 @@ snapshots:
'@opentelemetry/instrumentation-express@0.52.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
transitivePeerDependencies:
@@ -10482,7 +10496,7 @@ snapshots:
'@opentelemetry/instrumentation-fastify@0.48.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
transitivePeerDependencies:
@@ -10491,7 +10505,7 @@ snapshots:
'@opentelemetry/instrumentation-fs@0.23.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
@@ -10521,7 +10535,7 @@ snapshots:
'@opentelemetry/instrumentation-hapi@0.50.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
transitivePeerDependencies:
@@ -10565,7 +10579,7 @@ snapshots:
'@opentelemetry/instrumentation-koa@0.51.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
transitivePeerDependencies:
@@ -10598,7 +10612,7 @@ snapshots:
'@opentelemetry/instrumentation-mongoose@0.50.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
transitivePeerDependencies:
@@ -10650,7 +10664,7 @@ snapshots:
'@opentelemetry/instrumentation-pg@0.56.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
'@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0)
@@ -10663,7 +10677,7 @@ snapshots:
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.203.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
@@ -10680,7 +10694,7 @@ snapshots:
'@opentelemetry/instrumentation-restify@0.49.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
transitivePeerDependencies:
@@ -10721,7 +10735,7 @@ snapshots:
'@opentelemetry/instrumentation-undici@0.14.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
transitivePeerDependencies:
- supports-color
@@ -10772,7 +10786,7 @@ snapshots:
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
- protobufjs: 7.5.4
+ protobufjs: 7.5.5
'@opentelemetry/otlp-transformer@0.208.0(@opentelemetry/api@1.9.0)':
dependencies:
@@ -10783,7 +10797,7 @@ snapshots:
'@opentelemetry/sdk-logs': 0.208.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0)
- protobufjs: 7.5.4
+ protobufjs: 7.5.5
'@opentelemetry/propagator-b3@2.0.1(@opentelemetry/api@1.9.0)':
dependencies:
@@ -10800,34 +10814,34 @@ snapshots:
'@opentelemetry/resource-detector-alibaba-cloud@0.31.11(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
- '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resource-detector-aws@2.13.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
- '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
'@opentelemetry/resource-detector-azure@0.10.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
- '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
'@opentelemetry/resource-detector-container@0.7.11(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
- '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resource-detector-gcp@0.37.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
- '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
gcp-metadata: 6.1.1
transitivePeerDependencies:
@@ -10846,12 +10860,6 @@ snapshots:
'@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.39.0
- '@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0)':
- dependencies:
- '@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
- '@opentelemetry/semantic-conventions': 1.39.0
-
'@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@@ -10952,7 +10960,7 @@ snapshots:
'@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
- '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0)
'@orama/orama@3.1.18': {}
@@ -11067,7 +11075,7 @@ snapshots:
jotai-optics: 0.4.0(jotai@2.8.4(@types/react@19.2.14)(react@19.2.4))(optics-ts@2.4.1)
jotai-x: 2.3.3(@types/react@19.2.14)(jotai@2.8.4(@types/react@19.2.14)(react@19.2.4))(react@19.2.4)
lodash: 4.17.23
- nanoid: 5.1.6
+ nanoid: 5.1.7
optics-ts: 2.4.1
react: 19.2.4
react-compiler-runtime: 1.0.0(react@19.2.4)
@@ -11265,11 +11273,11 @@ snapshots:
'@radix-ui/primitive@1.0.0':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/primitive@1.0.1':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/primitive@1.1.3': {}
@@ -11403,12 +11411,12 @@ snapshots:
'@radix-ui/react-compose-refs@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
'@radix-ui/react-compose-refs@1.0.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
@@ -11435,12 +11443,12 @@ snapshots:
'@radix-ui/react-context@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
'@radix-ui/react-context@1.0.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
@@ -11459,7 +11467,7 @@ snapshots:
'@radix-ui/react-dialog@1.0.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/primitive': 1.0.0
'@radix-ui/react-compose-refs': 1.0.0(react@19.2.4)
'@radix-ui/react-context': 1.0.0(react@19.2.4)
@@ -11481,7 +11489,7 @@ snapshots:
'@radix-ui/react-dialog@1.0.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.0.1(@types/react@19.2.14)(react@19.2.4)
@@ -11532,7 +11540,7 @@ snapshots:
'@radix-ui/react-dismissable-layer@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/primitive': 1.0.0
'@radix-ui/react-compose-refs': 1.0.0(react@19.2.4)
'@radix-ui/react-primitive': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -11543,7 +11551,7 @@ snapshots:
'@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -11585,12 +11593,12 @@ snapshots:
'@radix-ui/react-focus-guards@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
'@radix-ui/react-focus-guards@1.0.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
@@ -11603,7 +11611,7 @@ snapshots:
'@radix-ui/react-focus-scope@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-compose-refs': 1.0.0(react@19.2.4)
'@radix-ui/react-primitive': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-callback-ref': 1.0.0(react@19.2.4)
@@ -11612,7 +11620,7 @@ snapshots:
'@radix-ui/react-focus-scope@1.0.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.2.14)(react@19.2.4)
@@ -11666,13 +11674,13 @@ snapshots:
'@radix-ui/react-id@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-use-layout-effect': 1.0.0(react@19.2.4)
react: 19.2.4
'@radix-ui/react-id@1.0.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
optionalDependencies:
@@ -11848,14 +11856,14 @@ snapshots:
'@radix-ui/react-portal@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-primitive': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
'@radix-ui/react-portal@1.0.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
@@ -11875,7 +11883,7 @@ snapshots:
'@radix-ui/react-presence@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-compose-refs': 1.0.0(react@19.2.4)
'@radix-ui/react-use-layout-effect': 1.0.0(react@19.2.4)
react: 19.2.4
@@ -11883,7 +11891,7 @@ snapshots:
'@radix-ui/react-presence@1.0.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
@@ -11904,14 +11912,14 @@ snapshots:
'@radix-ui/react-primitive@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-slot': 1.0.0(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
'@radix-ui/react-primitive@1.0.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-slot': 1.0.2(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
@@ -12067,13 +12075,13 @@ snapshots:
'@radix-ui/react-slot@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-compose-refs': 1.0.0(react@19.2.4)
react: 19.2.4
'@radix-ui/react-slot@1.0.2(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
optionalDependencies:
@@ -12207,12 +12215,12 @@ snapshots:
'@radix-ui/react-use-callback-ref@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
'@radix-ui/react-use-callback-ref@1.0.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
@@ -12225,13 +12233,13 @@ snapshots:
'@radix-ui/react-use-controllable-state@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-use-callback-ref': 1.0.0(react@19.2.4)
react: 19.2.4
'@radix-ui/react-use-controllable-state@1.0.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
optionalDependencies:
@@ -12254,13 +12262,13 @@ snapshots:
'@radix-ui/react-use-escape-keydown@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-use-callback-ref': 1.0.0(react@19.2.4)
react: 19.2.4
'@radix-ui/react-use-escape-keydown@1.0.3(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
optionalDependencies:
@@ -12282,12 +12290,12 @@ snapshots:
'@radix-ui/react-use-layout-effect@1.0.0(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
'@radix-ui/react-use-layout-effect@1.0.1(@types/react@19.2.14)(react@19.2.4)':
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
react: 19.2.4
optionalDependencies:
'@types/react': 19.2.14
@@ -12389,7 +12397,7 @@ snapshots:
'@opentelemetry/api-logs': 0.203.0
'@opentelemetry/auto-instrumentations-node': 0.62.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))
'@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-node': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-node': 2.6.0(@opentelemetry/api@1.9.0)
@@ -12417,7 +12425,7 @@ snapshots:
js-xxhash: 4.0.0
json-custom-numbers: 3.1.1
kasi: 1.1.2
- nanoid: 5.1.6
+ nanoid: 5.1.7
parse-prometheus-text-format: 1.1.1
pg-format: pg-format-fix@1.0.5
postgres: 3.4.7
@@ -12756,10 +12764,10 @@ snapshots:
'@tabler/icons-react@3.37.1(react@19.2.4)':
dependencies:
- '@tabler/icons': 3.37.1
+ '@tabler/icons': 3.41.1
react: 19.2.4
- '@tabler/icons@3.37.1': {}
+ '@tabler/icons@3.41.1': {}
'@tailwindcss/node@4.2.1':
dependencies:
@@ -13781,6 +13789,10 @@ snapshots:
dependencies:
domelementtype: 2.3.0
+ dompurify@3.2.7:
+ optionalDependencies:
+ '@types/trusted-types': 2.0.7
+
dompurify@3.3.1:
optionalDependencies:
'@types/trusted-types': 2.0.7
@@ -15360,6 +15372,8 @@ snapshots:
markdown-table@3.0.4: {}
+ marked@14.0.0: {}
+
marked@15.0.12: {}
marked@17.0.3: {}
@@ -15855,6 +15869,11 @@ snapshots:
module-details-from-path@1.0.4: {}
+ monaco-editor@0.55.1:
+ dependencies:
+ dompurify: 3.2.7
+ marked: 14.0.0
+
motion-dom@12.34.3:
dependencies:
motion-utils: 12.29.2
@@ -15875,8 +15894,6 @@ snapshots:
nanoid@3.3.11: {}
- nanoid@5.1.6: {}
-
nanoid@5.1.7: {}
napi-build-utils@2.0.0: {}
@@ -16256,7 +16273,7 @@ snapshots:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.208.0
'@opentelemetry/exporter-logs-otlp-http': 0.208.0(@opentelemetry/api@1.9.0)
- '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.208.0(@opentelemetry/api@1.9.0)
'@posthog/core': 1.23.1
'@posthog/types': 1.352.1
@@ -16323,7 +16340,7 @@ snapshots:
property-information@7.1.0: {}
- protobufjs@7.5.4:
+ protobufjs@7.5.5:
dependencies:
'@protobufjs/aspromise': 1.1.2
'@protobufjs/base64': 1.1.2
@@ -16560,7 +16577,7 @@ snapshots:
react-syntax-highlighter@15.6.6(react@19.2.4):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
highlight.js: 10.7.3
highlightjs-vue: 1.0.0
lowlight: 1.20.0
@@ -16645,7 +16662,7 @@ snapshots:
redux@4.2.1:
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.29.2
reflect.getprototypeof@1.0.10:
dependencies:
@@ -17108,6 +17125,8 @@ snapshots:
stable-hash@0.0.5: {}
+ state-local@1.0.7: {}
+
stop-iteration-iterator@1.1.0:
dependencies:
es-errors: 1.3.0
diff --git a/surfsense_web/types/window.d.ts b/surfsense_web/types/window.d.ts
index a80520684..e9f29a8f3 100644
--- a/surfsense_web/types/window.d.ts
+++ b/surfsense_web/types/window.d.ts
@@ -41,6 +41,26 @@ interface FolderFileEntry {
mtimeMs: number;
}
+type AgentFilesystemMode = "cloud" | "desktop_local_folder";
+
+interface AgentFilesystemSettings {
+ mode: AgentFilesystemMode;
+ localRootPaths: string[];
+ updatedAt: string;
+}
+
+interface AgentFilesystemMount {
+ mount: string;
+ rootPath: string;
+}
+
+interface LocalTextFileResult {
+ ok: boolean;
+ path: string;
+ content?: string;
+ error?: string;
+}
+
interface ElectronAPI {
versions: {
electron: string;
@@ -94,6 +114,11 @@ interface ElectronAPI {
// Browse files/folders via native dialogs
browseFiles: () => Promise;
readLocalFiles: (paths: string[]) => Promise;
+ readAgentLocalFileText: (virtualPath: string) => Promise;
+ writeAgentLocalFileText: (
+ virtualPath: string,
+ content: string
+ ) => Promise;
// Auth token sync across windows
getAuthTokens: () => Promise<{ bearer: string; refresh: string } | null>;
setAuthTokens: (bearer: string, refresh: string) => Promise;
@@ -125,6 +150,14 @@ interface ElectronAPI {
appVersion: string;
platform: string;
}>;
+ // Agent filesystem mode
+ getAgentFilesystemSettings: () => Promise;
+ getAgentFilesystemMounts: () => Promise;
+ setAgentFilesystemSettings: (settings: {
+ mode?: AgentFilesystemMode;
+ localRootPaths?: string[] | null;
+ }) => Promise;
+ pickAgentFilesystemRoot: () => Promise;
}
declare global {