diff --git a/surfsense_backend/app/observability/metrics.py b/surfsense_backend/app/observability/metrics.py
index fa66a9636..5cd70dd26 100644
--- a/surfsense_backend/app/observability/metrics.py
+++ b/surfsense_backend/app/observability/metrics.py
@@ -543,7 +543,7 @@ def record_kb_search_duration(
_record(
_kb_search_duration(),
duration_ms,
- {"search_space.id": workspace_id, "search.surface": surface},
+ {"workspace.id": workspace_id, "search.surface": surface},
)
diff --git a/surfsense_backend/app/observability/otel.py b/surfsense_backend/app/observability/otel.py
index c2ec951dd..7752c2673 100644
--- a/surfsense_backend/app/observability/otel.py
+++ b/surfsense_backend/app/observability/otel.py
@@ -261,7 +261,7 @@ def kb_search_span(
"""Span around knowledge-base search routines."""
attrs: dict[str, Any] = {}
if workspace_id is not None:
- attrs["search_space.id"] = int(workspace_id)
+ attrs["workspace.id"] = int(workspace_id)
if query_chars is not None:
attrs["query.chars"] = int(query_chars)
if extra:
@@ -303,7 +303,7 @@ def chat_request_span(
if chat_id is not None:
attrs["chat.id"] = int(chat_id)
if workspace_id is not None:
- attrs["search_space.id"] = int(workspace_id)
+ attrs["workspace.id"] = int(workspace_id)
if flow:
attrs["chat.flow"] = flow
if request_id:
diff --git a/surfsense_browser_extension/background/messages/savedata.ts b/surfsense_browser_extension/background/messages/savedata.ts
index 4bdca07fd..065b4d951 100644
--- a/surfsense_browser_extension/background/messages/savedata.ts
+++ b/surfsense_browser_extension/background/messages/savedata.ts
@@ -112,12 +112,12 @@ const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
}));
const token = await storage.get("token");
- const search_space_id = parseInt(await storage.get("search_space_id"), 10);
+ const workspace_id = parseInt(await storage.get("workspace_id"), 10);
const toSend = {
document_type: "EXTENSION",
content: content,
- search_space_id: search_space_id,
+ workspace_id: workspace_id,
};
console.log("toSend", toSend);
diff --git a/surfsense_browser_extension/background/messages/savesnapshot.ts b/surfsense_browser_extension/background/messages/savesnapshot.ts
index 8928e1b59..7bf0c0c84 100644
--- a/surfsense_browser_extension/background/messages/savesnapshot.ts
+++ b/surfsense_browser_extension/background/messages/savesnapshot.ts
@@ -106,12 +106,12 @@ const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
}));
const token = await storage.get("token");
- const search_space_id = parseInt(await storage.get("search_space_id"), 10);
+ const workspace_id = parseInt(await storage.get("workspace_id"), 10);
const toSend = {
document_type: "EXTENSION",
content: content,
- search_space_id: search_space_id,
+ workspace_id: workspace_id,
};
const requestOptions = {
diff --git a/surfsense_browser_extension/pnpm-workspace.yaml b/surfsense_browser_extension/pnpm-workspace.yaml
new file mode 100644
index 000000000..23a9a8e9a
--- /dev/null
+++ b/surfsense_browser_extension/pnpm-workspace.yaml
@@ -0,0 +1,7 @@
+allowBuilds:
+ '@parcel/watcher': set this to true or false
+ '@swc/core': set this to true or false
+ esbuild: set this to true or false
+ lmdb: set this to true or false
+ msgpackr-extract: set this to true or false
+ sharp: set this to true or false
diff --git a/surfsense_browser_extension/routes/pages/HomePage.tsx b/surfsense_browser_extension/routes/pages/HomePage.tsx
index 9d8787d29..ab2f6be42 100644
--- a/surfsense_browser_extension/routes/pages/HomePage.tsx
+++ b/surfsense_browser_extension/routes/pages/HomePage.tsx
@@ -33,6 +33,20 @@ import { getRenderedHtml } from "~utils/commons";
import type { WebHistory } from "~utils/interfaces";
import Loading from "./Loading";
+// One-time migration: legacy persisted keys were `search_space` / `search_space_id`.
+// Copy them to the new `workspace` / `workspace_id` keys on first read so the
+// user's selected workspace survives the rename.
+async function migrateLegacyWorkspaceKeys(storage: Storage): Promise {
+ const legacyName = await storage.get("search_space");
+ if (legacyName !== undefined && (await storage.get("workspace")) === undefined) {
+ await storage.set("workspace", legacyName);
+ }
+ const legacyId = await storage.get("search_space_id");
+ if (legacyId !== undefined && (await storage.get("workspace_id")) === undefined) {
+ await storage.set("workspace_id", legacyId);
+ }
+}
+
const HomePage = () => {
const { toast } = useToast();
const navigation = useNavigate();
@@ -40,11 +54,11 @@ const HomePage = () => {
const [loading, setLoading] = useState(true);
const [open, setOpen] = React.useState(false);
const [value, setValue] = React.useState("");
- const [searchspaces, setSearchSpaces] = useState([]);
+ const [workspaces, setWorkspaces] = useState([]);
const [isSaving, setIsSaving] = useState(false);
useEffect(() => {
- const checkSearchSpaces = async () => {
+ const checkWorkspaces = async () => {
const storage = new Storage({ area: "local" });
const token = await storage.get("token");
@@ -55,7 +69,7 @@ const HomePage = () => {
}
try {
- const response = await fetch(await buildBackendUrl("/api/v1/searchspaces"), {
+ const response = await fetch(await buildBackendUrl("/api/v1/workspaces"), {
headers: {
Authorization: `Bearer ${token}`,
}
@@ -66,7 +80,7 @@ const HomePage = () => {
} else {
const res = await response.json();
console.log(res);
- setSearchSpaces(res);
+ setWorkspaces(res);
}
} catch (error) {
await storage.remove("token");
@@ -77,7 +91,7 @@ const HomePage = () => {
}
};
- checkSearchSpaces();
+ checkWorkspaces();
}, []);
useEffect(() => {
@@ -98,10 +112,11 @@ const HomePage = () => {
});
const storage = new Storage({ area: "local" });
- const searchspace = await storage.get("search_space");
+ await migrateLegacyWorkspaceKeys(storage);
+ const workspace = await storage.get("workspace");
- if (searchspace) {
- setValue(searchspace);
+ if (workspace) {
+ setValue(workspace);
}
await storage.set("showShadowDom", true);
@@ -262,17 +277,17 @@ const HomePage = () => {
const saveDatamessage = async () => {
if (value === "") {
toast({
- title: "Select a SearchSpace !",
+ title: "Select a Workspace !",
});
return;
}
const storage = new Storage({ area: "local" });
- const search_space_id = await storage.get("search_space_id");
+ const workspace_id = await storage.get("workspace_id");
- if (!search_space_id) {
+ if (!workspace_id) {
toast({
- title: "Invalid SearchSpace selected!",
+ title: "Invalid Workspace selected!",
variant: "destructive",
});
return;
@@ -319,15 +334,15 @@ const HomePage = () => {
const storage = new Storage({ area: "local" });
await storage.remove("token");
await storage.remove("showShadowDom");
- await storage.remove("search_space");
- await storage.remove("search_space_id");
+ await storage.remove("workspace");
+ await storage.remove("workspace_id");
navigation("/login");
}
if (loading) {
return ;
} else {
- return searchspaces.length === 0 ? (
+ return workspaces.length === 0 ? (
@@ -337,7 +352,7 @@ const HomePage = () => {
SurfSense
-
Please create a Search Space to continue
+
Please create a Workspace to continue
@@ -390,7 +405,7 @@ const HomePage = () => {
-
Search Space
+
Workspace
{
className="w-full justify-between border-gray-700 bg-gray-900 text-white hover:bg-gray-700"
>
{value
- ? searchspaces.find((space) => space.name === value)?.name
- : "Select Search Space..."}
+ ? workspaces.find((space) => space.name === value)?.name
+ : "Select Workspace..."}
@@ -411,23 +426,23 @@ const HomePage = () => {
className="border-gray-700 bg-gray-900 text-gray-200"
/>
- No search spaces found.
+ No workspaces found.
- {searchspaces.map((space) => (
+ {workspaces.map((space) => (
{
const storage = new Storage({ area: "local" });
if (currentValue === value) {
- await storage.set("search_space", "");
- await storage.set("search_space_id", 0);
+ await storage.set("workspace", "");
+ await storage.set("workspace_id", 0);
} else {
- const selectedSpace = searchspaces.find(
+ const selectedSpace = workspaces.find(
(space) => space.name === currentValue
);
- await storage.set("search_space", currentValue);
- await storage.set("search_space_id", selectedSpace.id);
+ await storage.set("workspace", currentValue);
+ await storage.set("workspace_id", selectedSpace.id);
}
setValue(currentValue === value ? "" : currentValue);
setOpen(false);
diff --git a/surfsense_browser_extension/tsconfig.tsbuildinfo b/surfsense_browser_extension/tsconfig.tsbuildinfo
new file mode 100644
index 000000000..85318fb9e
--- /dev/null
+++ b/surfsense_browser_extension/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"fileNames":["../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.error.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../surfsense_web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/@types+react@18.2.48/node_modules/@types/react/global.d.ts","./node_modules/.pnpm/csstype@3.1.3/node_modules/csstype/index.d.ts","./node_modules/.pnpm/@types+prop-types@15.7.12/node_modules/@types/prop-types/index.d.ts","./node_modules/.pnpm/@types+react@18.2.48/node_modules/@types/react/index.d.ts","./node_modules/.pnpm/plasmo@0.90.5_@swc+core@1.7.14_@swc+helpers@0.5.12__@swc+helpers@0.5.12_@types+node@20._d660f477c46523e758ec011d637c233c/node_modules/plasmo/templates/plasmo.d.ts","./node_modules/.pnpm/@types+react-dom@18.2.18/node_modules/@types/react-dom/client.d.ts","./node_modules/.pnpm/plasmo@0.90.5_@swc+core@1.7.14_@swc+helpers@0.5.12__@swc+helpers@0.5.12_@types+node@20._d660f477c46523e758ec011d637c233c/node_modules/plasmo/dist/type.d.ts","./content.ts","./node_modules/.pnpm/@plasmohq+storage@1.11.0_react@18.2.0/node_modules/@plasmohq/storage/dist/index.d.ts","./utils/interfaces.ts","./utils/commons.ts","./background/index.ts","./node_modules/.pnpm/@plasmohq+messaging@0.6.2_react@18.2.0/node_modules/@plasmohq/messaging/dist/types-a2e5594b.d.ts","./node_modules/.pnpm/@plasmohq+messaging@0.6.2_react@18.2.0/node_modules/@plasmohq/messaging/dist/index.d.ts","./utils/backend-url.ts","./background/messages/savedata.ts","./node_modules/.pnpm/dom-to-semantic-markdown@1.2.11/node_modules/dom-to-semantic-markdown/dist/node/types/markdowntypes.d.ts","./node_modules/.pnpm/dom-to-semantic-markdown@1.2.11/node_modules/dom-to-semantic-markdown/dist/node/core/htmltomarkdownast.d.ts","./node_modules/.pnpm/dom-to-semantic-markdown@1.2.11/node_modules/dom-to-semantic-markdown/dist/node/core/markdownasttostring.d.ts","./node_modules/.pnpm/dom-to-semantic-markdown@1.2.11/node_modules/dom-to-semantic-markdown/dist/node/core/domutils.d.ts","./node_modules/.pnpm/dom-to-semantic-markdown@1.2.11/node_modules/dom-to-semantic-markdown/dist/node/core/urlutils.d.ts","./node_modules/.pnpm/dom-to-semantic-markdown@1.2.11/node_modules/dom-to-semantic-markdown/dist/node/index.d.ts","./background/messages/savesnapshot.ts","./node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.ts","./node_modules/.pnpm/tailwind-merge@2.5.4/node_modules/tailwind-merge/dist/types.d.ts","./lib/utils.ts","./node_modules/.pnpm/@remix-run+router@1.19.1/node_modules/@remix-run/router/dist/history.d.ts","./node_modules/.pnpm/@remix-run+router@1.19.1/node_modules/@remix-run/router/dist/utils.d.ts","./node_modules/.pnpm/@remix-run+router@1.19.1/node_modules/@remix-run/router/dist/router.d.ts","./node_modules/.pnpm/@remix-run+router@1.19.1/node_modules/@remix-run/router/dist/index.d.ts","./node_modules/.pnpm/react-router@6.26.1_react@18.2.0/node_modules/react-router/dist/lib/context.d.ts","./node_modules/.pnpm/react-router@6.26.1_react@18.2.0/node_modules/react-router/dist/lib/components.d.ts","./node_modules/.pnpm/react-router@6.26.1_react@18.2.0/node_modules/react-router/dist/lib/hooks.d.ts","./node_modules/.pnpm/react-router@6.26.1_react@18.2.0/node_modules/react-router/dist/index.d.ts","./node_modules/.pnpm/react-router-dom@6.26.1_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/react-router-dom/dist/dom.d.ts","./node_modules/.pnpm/react-router-dom@6.26.1_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/react-router-dom/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+react-primitive@2.0.0_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom_554662aa8056d3d6160ccb0686da9bae/node_modules/@radix-ui/react-primitive/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+react-dismissable-layer@1.1.1_@types+react-dom@18.2.18_@types+react@18.2.48_r_ae4c82b13c079e215addea70a4e3d8f4/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+react-toast@1.2.2_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@radix-ui/react-toast/dist/index.d.ts","./node_modules/.pnpm/clsx@2.0.0/node_modules/clsx/clsx.d.ts","./node_modules/.pnpm/class-variance-authority@0.7.0/node_modules/class-variance-authority/dist/types.d.ts","./node_modules/.pnpm/class-variance-authority@0.7.0/node_modules/class-variance-authority/dist/index.d.ts","./node_modules/.pnpm/lucide-react@0.454.0_react@18.2.0/node_modules/lucide-react/dist/lucide-react.d.ts","./routes/ui/toast.tsx","./routes/ui/use-toast.tsx","./routes/ui/toaster.tsx","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/types.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/accessibilityicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/activitylogicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/alignbaselineicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/alignbottomicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/aligncenterhorizontallyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/aligncenterverticallyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/alignlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/alignrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/aligntopicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/allsidesicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/angleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/archiveicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/arrowbottomlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/arrowbottomrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/arrowdownicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/arrowlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/arrowrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/arrowtoplefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/arrowtoprighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/arrowupicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/aspectratioicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/avataricon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/backpackicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/badgeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/barcharticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/bellicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/blendingmodeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/bookmarkicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/bookmarkfilledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderallicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderbottomicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderdashedicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderdottedicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/bordernoneicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/bordersolidicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderspliticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderstyleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/bordertopicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/borderwidthicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/boxicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/boxmodelicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/buttonicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/calendaricon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cameraicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cardstackicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cardstackminusicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cardstackplusicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/caretdownicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/caretlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/caretrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/caretsorticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/caretupicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/chatbubbleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/checkicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/checkcircledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/checkboxicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/chevrondownicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/chevronlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/chevronrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/chevronupicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/circleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/circlebackslashicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/clipboardicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/clipboardcopyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/clockicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/codeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/codesandboxlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/colorwheelicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/columnspacingicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/columnsicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/commiticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/component1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/component2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/componentbooleanicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/componentinstanceicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/componentnoneicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/componentplaceholdericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/containericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cookieicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/copyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cornerbottomlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cornerbottomrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cornertoplefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cornertoprighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cornersicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/countdowntimericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/counterclockwiseclockicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cropicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cross1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cross2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/crosscircledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/crosshair1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/crosshair2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/crumpledpapericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cubeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cursorarrowicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/cursortexticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dashicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dashboardicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/desktopicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dimensionsicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/discicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/discordlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dividerhorizontalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dividerverticalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/doticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dotfilledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dotshorizontalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dotsverticalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/doublearrowdownicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/doublearrowlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/doublearrowrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/doublearrowupicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/downloadicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/draghandledots1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/draghandledots2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/draghandlehorizontalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/draghandleverticalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/drawingpinicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/drawingpinfilledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/dropdownmenuicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/entericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/enterfullscreenicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/envelopeclosedicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/envelopeopenicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/erasericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/exclamationtriangleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/exiticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/exitfullscreenicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/externallinkicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/eyeclosedicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/eyenoneicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/eyeopenicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/faceicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/figmalogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fileicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fileminusicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fileplusicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/filetexticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fontboldicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fontfamilyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fontitalicicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fontromanicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fontsizeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/fontstyleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/frameicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/framerlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/gearicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/githublogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/globeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/gridicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/groupicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/half1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/half2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/hamburgermenuicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/handicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/headingicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/hearticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/heartfilledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/heighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/hobbyknifeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/homeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/iconjarlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/idcardicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/imageicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/infocircledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/inputicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/instagramlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/keyboardicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/laptimericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/laptopicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/layersicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/layouticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lettercasecapitalizeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lettercaselowercaseicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lettercasetoggleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lettercaseuppercaseicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/letterspacingicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lightningbolticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lineheighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/link1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/link2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/linkbreak1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/linkbreak2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/linknone1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/linknone2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/linkedinlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/listbulleticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lockclosedicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lockopen1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/lockopen2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/loopicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/magicwandicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/magnifyingglassicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/marginicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/maskofficon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/maskonicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/minusicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/minuscircledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/mixicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/mixerhorizontalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/mixerverticalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/mobileicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/modulzlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/moonicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/moveicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/notionlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/opacityicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/openinnewwindowicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/overlineicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/paddingicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/paperplaneicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pauseicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pencil1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pencil2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/personicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/piecharticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pilcrowicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pinbottomicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pinlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pinrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pintopicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/playicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/plusicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/pluscircledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/questionmarkicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/questionmarkcircledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/quoteicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/radiobuttonicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/readericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/reloadicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/reseticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/resumeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/rocketicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/rotatecounterclockwiseicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/rowspacingicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/rowsicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/rulerhorizontalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/rulersquareicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/scissorsicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/sectionicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/sewingpinicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/sewingpinfilledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/shadowicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/shadowinnericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/shadownoneicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/shadowoutericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/share1icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/share2icon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/shuffleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/sizeicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/sketchlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/slashicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/slidericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/spacebetweenhorizontallyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/spacebetweenverticallyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/spaceevenlyhorizontallyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/spaceevenlyverticallyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/speakerloudicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/speakermoderateicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/speakerofficon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/speakerquieticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/squareicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/stackicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/staricon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/starfilledicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/stitcheslogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/stopicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/stopwatchicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/stretchhorizontallyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/stretchverticallyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/strikethroughicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/sunicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/switchicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/symbolicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/tableicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/targeticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/texticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/textalignbottomicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/textaligncentericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/textalignjustifyicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/textalignlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/textalignmiddleicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/textalignrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/textaligntopicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/textnoneicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/thickarrowdownicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/thickarrowlefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/thickarrowrighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/thickarrowupicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/timericon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/tokensicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/tracknexticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/trackpreviousicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/transformicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/transparencygridicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/trashicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/triangledownicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/trianglelefticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/trianglerighticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/triangleupicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/twitterlogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/underlineicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/updateicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/uploadicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/valueicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/valuenoneicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/vercellogoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/videoicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/viewgridicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/viewhorizontalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/viewnoneicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/viewverticalicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/widthicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/zoominicon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/zoomouticon.d.ts","./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.2.0/node_modules/@radix-ui/react-icons/dist/index.d.ts","./node_modules/.pnpm/@types+react@18.2.48/node_modules/@types/react/jsx-runtime.d.ts","./node_modules/.pnpm/@radix-ui+react-slot@1.1.0_@types+react@18.2.48_react@18.2.0/node_modules/@radix-ui/react-slot/dist/index.d.ts","./routes/ui/button.tsx","./node_modules/.pnpm/@radix-ui+react-focus-scope@1.1.0_@types+react-dom@18.2.18_@types+react@18.2.48_react-d_9777f23c60de13e004445273c5cb2434/node_modules/@radix-ui/react-focus-scope/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+react-portal@1.1.2_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@radix-ui/react-portal/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+react-dialog@1.1.2_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@radix-ui/react-dialog/dist/index.d.ts","./routes/ui/dialog.tsx","./node_modules/.pnpm/@radix-ui+react-primitive@2.1.3_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom_e2daec1b538e67f798adbbf1ab062a22/node_modules/@radix-ui/react-primitive/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+react-label@2.1.7_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@radix-ui/react-label/dist/index.d.ts","./routes/ui/label.tsx","./routes/ui/connection-settings-button.tsx","./routes/pages/apikeyform.tsx","./node_modules/.pnpm/cmdk@1.0.3_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/cmdk/dist/index.d.ts","./routes/ui/command.tsx","./node_modules/.pnpm/@radix-ui+react-arrow@1.1.0_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@radix-ui/react-arrow/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+rect@1.1.0/node_modules/@radix-ui/rect/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+react-popper@1.2.0_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@radix-ui/react-popper/dist/index.d.ts","./node_modules/.pnpm/@radix-ui+react-popover@1.1.2_@types+react-dom@18.2.18_@types+react@18.2.48_react-dom@18.2.0_react@18.2.0__react@18.2.0/node_modules/@radix-ui/react-popover/dist/index.d.ts","./routes/ui/popover.tsx","./routes/pages/loading.tsx","./routes/pages/homepage.tsx","./routes/index.tsx","./popup.tsx","./node_modules/.pnpm/@types+har-format@1.2.15/node_modules/@types/har-format/index.d.ts","./node_modules/.pnpm/@types+chrome@0.0.258/node_modules/@types/chrome/har-format/index.d.ts","./node_modules/.pnpm/@types+chrome@0.0.258/node_modules/@types/chrome/chrome-cast/index.d.ts","./node_modules/.pnpm/@types+filewriter@0.0.33/node_modules/@types/filewriter/index.d.ts","./node_modules/.pnpm/@types+filesystem@0.0.36/node_modules/@types/filesystem/index.d.ts","./node_modules/.pnpm/@types+chrome@0.0.258/node_modules/@types/chrome/index.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/dom-events.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/globals.global.d.ts","./node_modules/.pnpm/@types+node@20.11.5/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/@types+react-dom@18.2.18/node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[91,92,93],[91,93,96,97],[91,92,93,96,97,104],[89],[106,107],[95],[86,119],[86,119,120,452,453],[86,129],[130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447],[86],[86,456],[86,119,120,452,453,465],[86,119,463,464],[86,449],[86,119,120],[109,110,111],[109,110],[109],[472],[473,474,476],[475],[478],[514],[515,520,548],[516,527,528,535,545,556],[516,517,527,535],[518,557],[519,520,528,536],[520,545,553],[521,523,527,535],[514,522],[523,524],[527],[525,527],[514,527],[527,528,529,545,556],[527,528,529,542,545,548],[512,515,561],[523,527,530,535,545,556],[527,528,530,531,535,545,553,556],[530,532,545,553,556],[478,479,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563],[527,533],[534,556,561],[523,527,535,545],[536],[537],[514,538],[539,555,561],[540],[541],[527,542,543],[542,544,557,559],[515,527,545,546,547,548],[515,545,547],[545,546],[548],[549],[514,545],[527,551,552],[551,552],[520,535,545,553],[554],[535,555],[515,530,541,556],[520,557],[545,558],[534,559],[560],[515,520,527,529,538,545,556,559,561],[545,562],[83,84,85],[122,123],[122],[86,119,454],[99],[99,100,101,102,103],[86,88],[112],[86,112,116,117],[112,113,114,115],[86,112,113],[86,112],[489,493,556],[489,545,556],[484],[486,489,553,556],[535,553],[564],[484,564],[486,489,535,556],[481,482,485,488,515,527,545,556],[481,487],[485,489,515,548,556,564],[515,564],[505,515,564],[483,484,564],[489],[483,484,485,486,487,488,489,490,491,493,494,495,496,497,498,499,500,501,502,503,504,506,507,508,509,510,511],[489,496,497],[487,489,497,498],[488],[481,484,489],[489,493,497,498],[493],[487,489,492,556],[481,486,487,489,493,496],[515,545],[484,489,505,515,561,564],[118,128,470],[118,460,469],[86,87,91,97,118,448,451,459],[86,87,91,92,93,96,97,104,108,118,125,127,448,451,458,459,462,467,468],[87,448],[86,108,124,450],[86,108,125,454,455,461],[86,97,448,451,455,458],[86,108,125,454],[86,108,457],[86,108,466],[86,108,121,124,125],[126,127],[86,126],[91],[91,92]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd5e7096c7bc02bf70b2cc017fc45ef489cb19bd2f32a71af39ff5787f1b56a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"247a952efd811d780e5630f8cfd76f495196f5fa74f6f0fee39ac8ba4a3c9800","impliedFormat":1},{"version":"e6f3077b1780226627f76085397d10c77a4d851c7154fd4b3f1eb114f4c2e56d","affectsGlobalScope":true,"impliedFormat":1},{"version":"97ae124daa3695481c12e517f1aadb524b12fdb1f09d67f9ecc3328c12271487","affectsGlobalScope":true,"impliedFormat":99},{"version":"c83e65334a9dc08a338f994a34bd70328c626976881d71d6aaa8dc7d66b08d96","impliedFormat":1},{"version":"032a6d45b6d1d730573abb352e355f826f42a412f02f5f37b7183df04c519bf0","impliedFormat":99},"4f83ace641bc115f8346dc57b6b15821a41f0f83ebf82b7ccea3179ae083736a",{"version":"623e835c6beebf5e3350817eea997722da5e2860811b811b331fc42feaceb903","impliedFormat":99},"e2f63ddf0102d5bfd0f3691d678bacd98fd0752b23d19890308c4210b3a5a0a1","8d8528d595e2639b740e4a0b0cf9de23a93ecf39468b707b5dcfc2b5bb4fcfd9","2aabb4e960469b8d854ad33765002f470fdc202cd432812ffb4f0e0196de2cc0",{"version":"197013e03570f313d88acecf2cb444c7bfcbe453149e0f58be04a123386b1e89","impliedFormat":99},{"version":"01e88b933f0e8c8fefa47e910415cded8a1ef4121420cb0fc0cbacf3c933e77f","impliedFormat":99},"35d32d432d95a06a14b7341a8c5fe3392aaf15be4d5f7b720fdaf064636eca75","7c35eee2b4295c21b183a258a1eeaa48b3c0f7a8011eed6c27159a775ad7a9c8",{"version":"4e413cb1023c7371d3a7c54483ef1db0dedeba61ea9241ec84dd38af256cb276","impliedFormat":1},{"version":"df87de0a20d44995d54020ad8826f65e6d9351ae1da427cde3a8e37e1e836084","impliedFormat":1},{"version":"d617f071c8ed193058b01b7b6d563891afd3fa852a03dd6a6fe261a70e241c26","impliedFormat":1},{"version":"978965b7e76bd3b7b825464ba943914513c530812d4760bfb5e394fa76f1dd86","impliedFormat":1},{"version":"ea68cc195306e209d421051a5b344b6b4819661876d9b670f5d4a2f18c95e764","impliedFormat":1},{"version":"61e43dd6b6fbed4605b0f9dc887ce2b32a7bcc327f09246061c182eecdeb5bbf","impliedFormat":1},"6761506c173d972866bf918ccee538e7702ad6f0f126d8c55399cff9ffc01236",{"version":"ef73bcfef9907c8b772a30e5a64a6bd86a5669cba3d210fcdcc6b625e3312459","impliedFormat":1},{"version":"ab90a99fb09a5dd94d80d697b6833b041239843e15ebd634857853240db7e25f","impliedFormat":1},"0fca478853f3fc4310e40ebff727a53da7ec677938f4e3e0d5ecaa62e936a199",{"version":"5af7c35a9c5c4760fd084fedb6ba4c7059ac9598b410093e5312ac10616bf17b","impliedFormat":1},{"version":"18f14a4e6f7e7fa7977ca2479920b375edbd3d9470af09349f1fd5b902948d24","impliedFormat":1},{"version":"386b110097b55a1ad6ee83ce24da8132d74871c32ffd1cc6d8da27fbd937530e","impliedFormat":1},{"version":"3c199753ff81a62b08fc48875cff98776e13b447d2eb79155669f2aa6df2ddda","impliedFormat":1},{"version":"0607c362365f0d2f53fa84d64e9ca3550f3b7e8f1e24d692d8fc5b64d4b7706a","impliedFormat":1},{"version":"86645dd2134c0061c46c9c8959b664e47e897799cfd04b0b3f550956fcaddb26","impliedFormat":1},{"version":"62ea49d20b53246d9b798ae78b60cfd42ff2637ae490ab28cf370b5e64f58080","impliedFormat":1},{"version":"a7be9824c37815e8d0ad066a3a4c1b2c1c4e7176423605ff52943d0fb1bc7c9a","impliedFormat":1},{"version":"0acf888a4886434586cd034594852509e902936e10da93823758c55f23a2a4b5","impliedFormat":1},{"version":"4174cc2d5ba415d241da72122c1693aa46b271846ee12f5b410d5f80a93426d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea3dc94b0fffe98fdf557e22b26282b039aa8c3cbbf872d0087d982d1a1f496c","impliedFormat":1},{"version":"7ec047b73f621c526468517fea779fec2007dd05baa880989def59126c98ef79","impliedFormat":1},{"version":"11d84eef6662ddfd17c1154a56d9e71d61ae3c541a61e3bc50f875cb5954379f","impliedFormat":1},{"version":"791b7d18616176562896692cdeff84662d2b2ffe3fc33fce2ce338eaa8a8288e","impliedFormat":1},{"version":"571b2640f0cf541dfed72c433706ad1c70fb55ed60763343aa617e150fbb036e","impliedFormat":1},{"version":"6a2372186491f911527a890d92ac12b88dec29f1c0cec7fce93745aba3253fde","impliedFormat":1},{"version":"8512cce0256f2fcad4dc4d72a978ef64fefab78c16a1141b31f2f2eba48823d1","impliedFormat":1},"5ad9aaf78466035e6e5a072d652d63313af7891f16208fcfbf1a596491d34e36","6037515cc66eca2db6b21889465e7df16f0350becab8c162e17715a306cfce15","359ee99d27002dc85a010d08e09326aaa1d3212afae8b75d5495f87d55b70fcc",{"version":"a58825dfef3de2927244c5337ff2845674d1d1a794fb76d37e1378e156302b90","impliedFormat":1},{"version":"1a458765deab35824b11b67f22b1a56e9a882da9f907bfbf9ce0dfaedc11d8fc","impliedFormat":1},{"version":"a48553595da584120091fb7615ed8d3b48aaea4b2a7f5bc5451c1247110be41a","impliedFormat":1},{"version":"ebba1c614e81bf35da8d88a130e7a2924058a9ad140abe79ef4c275d4aa47b0d","impliedFormat":1},{"version":"3f3cfb6d0795d076c62fca9fa90e61e1a1dd9ba1601cd28b30b21af0b989b85a","impliedFormat":1},{"version":"2647c7b6ad90f146f26f3cdf0477eed1cefb1826e8de3f61c584cc727e2e4496","impliedFormat":1},{"version":"891faf74d5399bee0d216314ecf7a0000ba56194ffd16b2b225e4e61706192fb","impliedFormat":1},{"version":"c1227e0b571469c249e7b152e98268b3ccdfd67b5324f55448fad877ba6dbbff","impliedFormat":1},{"version":"230a4cc1df158d6e6e29567bfa2bc88511822a068da08f8761cc4df5d2328dcc","impliedFormat":1},{"version":"c6ee2448a0c52942198242ec9d05251ff5abfb18b26a27970710cf85e3b62e50","impliedFormat":1},{"version":"39525087f91a6f9a246c2d5c947a90d4b80d67efb96e60f0398226827ae9161e","impliedFormat":1},{"version":"1bf429877d50f454b60c081c00b17be4b0e55132517ac322beffe6288b6e7cf6","impliedFormat":1},{"version":"b139b4ed2c853858184aed5798880633c290b680d22aee459b1a7cf9626a540d","impliedFormat":1},{"version":"037a9dab60c22cda0cd6c502a27b2ecfb1ac5199efe5e8c8d939591f32bd73c9","impliedFormat":1},{"version":"a21eaf3dc3388fae4bdd0556eb14c9e737e77b6f1b387d68c3ed01ca05439619","impliedFormat":1},{"version":"60931d8fb8f91afacbb005180092f4f745d2af8b8a9c0957c44c42409ec758e7","impliedFormat":1},{"version":"70e88656db130df927e0c98edcdb4e8beeb2779ac0e650b889ab3a1a3aa71d3d","impliedFormat":1},{"version":"a6473d7b874c3cffc1cb18f5d08dd18ac880b97ec0a651348739ade3b3730272","impliedFormat":1},{"version":"89720b54046b31371a2c18f7c7a35956f1bf497370f4e1b890622078718875b1","impliedFormat":1},{"version":"281637d0a9a4b617138c505610540583676347c856e414121a5552b9e4aeb818","impliedFormat":1},{"version":"87612b346018721fa0ee2c0cb06de4182d86c5c8b55476131612636aac448444","impliedFormat":1},{"version":"c0b2ae1fea13046b9c66df05dd8d36f9b1c9fcea88d822899339183e6ef1b952","impliedFormat":1},{"version":"8c7b41fd103b70c3a65b7ace9f16cd00570b405916d0e3bd63e9986ce91e6156","impliedFormat":1},{"version":"0e51075b769786db5e581e43a64529dca371040256e23d779603a2c8283af7d6","impliedFormat":1},{"version":"54fd7300c6ba1c98cda49b50c215cde3aa5dbae6786eaf05655abf818000954c","impliedFormat":1},{"version":"01a265adad025aa93f619b5521a9cb08b88f3c328b1d3e59c0394a41e5977d43","impliedFormat":1},{"version":"af6082823144bd943323a50c844b3dc0e37099a3a19e7d15c687cd85b3985790","impliedFormat":1},{"version":"241f5b92543efc1557ddb6c27b4941a5e0bb2f4af8dc5dd250d8ee6ca67ad67c","impliedFormat":1},{"version":"55e8db543ceaedfdd244182b3363613143ca19fc9dbc466e6307f687d100e1c8","impliedFormat":1},{"version":"27de37ad829c1672e5d1adf0c6a5be6587cbe405584e9a9a319a4214b795f83a","impliedFormat":1},{"version":"2d39120fb1d7e13f8141fa089543a817a94102bba05b2b9d14b6f33a97de4e0c","impliedFormat":1},{"version":"51c1a42c27ae22f5a2f7a26afcf9aa8e3fd155ba8ecc081c6199a5ce6239b5f4","impliedFormat":1},{"version":"72fb41649e77c743e03740d1fd8e18c824bd859a313a7caeba6ba313a84a79a9","impliedFormat":1},{"version":"6ee51191c0df1ec11db3fbc71c39a7dee2b3e77dcaab974348eaf04b2f22307d","impliedFormat":1},{"version":"b8a996130883aaffdee89e0a3e241d4674a380bde95f8270a8517e118350def7","impliedFormat":1},{"version":"a3dce310d0bd772f93e0303bb364c09fc595cc996b840566e8ef8df7ab0e5360","impliedFormat":1},{"version":"eb9fa21119013a1c7566d2154f6686c468e9675083ef39f211cd537c9560eb53","impliedFormat":1},{"version":"c6b5695ccff3ceab8c7a1fe5c5e1c37667c8e46b6fc9c3c953d53aa17f6e2e59","impliedFormat":1},{"version":"d08d0d4b4a47cc80dbea459bb1830c15ec8d5d7056742ae5ccc16dd4729047d0","impliedFormat":1},{"version":"975c1ef08d7f7d9a2f7bc279508cc47ddfdfe6186c37ac98acbf302cf20e7bb1","impliedFormat":1},{"version":"bd53b46bab84955dc0f83afc10237036facbc7e086125f81f13fd8e02b43a0d5","impliedFormat":1},{"version":"3c68d3e9cd1b250f52d16d5fbbd40a0ccbbe8b2d9dbd117bfd25acc2e1a60ebc","impliedFormat":1},{"version":"88f4763dddd0f685397f1f6e6e486b0297c049196b3d3531c48743e6334ddfcb","impliedFormat":1},{"version":"8f0ab3468882aba7a39acbc1f3b76589a1ef517bfb2ef62e2dd896f25db7fba6","impliedFormat":1},{"version":"407b6b015a9cf880756296a91142e72b3e6810f27f117130992a1138d3256740","impliedFormat":1},{"version":"0bee9708164899b64512c066ba4de189e6decd4527010cc325f550451a32e5ab","impliedFormat":1},{"version":"2472ae6554b4e997ec35ae5ad5f91ab605f4e30b97af860ced3a18ab8651fb89","impliedFormat":1},{"version":"df0e9f64d5facaa59fca31367be5e020e785335679aa088af6df0d63b7c7b3df","impliedFormat":1},{"version":"07ce90ffcac490edb66dfcb3f09f1ffa7415ecf4845f525272b53971c07ad284","impliedFormat":1},{"version":"801a0aa3e78ef62277f712aefb7455a023063f87577df019dde7412d2bc01df9","impliedFormat":1},{"version":"ab457e1e513214ba8d7d13040e404aea11a3e6e547d10a2cbbd926cccd756213","impliedFormat":1},{"version":"d62fbef71a36476326671f182368aed0d77b6577c607e6597d080e05ce49cf9e","impliedFormat":1},{"version":"2a72354cb43930dc8482bd6f623f948d932250c5358ec502a47e7b060ed3bbb6","impliedFormat":1},{"version":"cff4d73049d4fbcd270f6d2b3a6212bf17512722f8a9dfcc7a3ff1b8a8eef1f0","impliedFormat":1},{"version":"f9a7c0d530affbd3a38853818a8c739fbf042a376b7deca9230e65de7b65ee34","impliedFormat":1},{"version":"c024252e3e524fcebaeed916ccb8ede5d487eb8d705c6080dc009df3c87dd066","impliedFormat":1},{"version":"641448b49461f3e6936e82b901a48f2d956a70e75e20c6a688f8303e9604b2ff","impliedFormat":1},{"version":"0d923bfc7b397b8142db7c351ba6f59f118c4fe820c1e4a0b6641ac4b7ab533d","impliedFormat":1},{"version":"13737fae5d9116556c56b3fc01ffae01f31d77748bc419185514568d43aae9be","impliedFormat":1},{"version":"4224758de259543c154b95f11c683da9ac6735e1d53c05ae9a38835425782979","impliedFormat":1},{"version":"2704fd2c7b0e4df05a072202bfcc87b5e60a228853df055f35c5ea71455def95","impliedFormat":1},{"version":"cb52c3b46277570f9eb2ef6d24a9732c94daf83761d9940e10147ebb28fbbb8e","impliedFormat":1},{"version":"1bc305881078821daa054e3cb80272dc7528e0a51c91bf3b5f548d7f1cf13c2b","impliedFormat":1},{"version":"ba53329809c073b86270ebd0423f6e7659418c5bd48160de23f120c32b5ceccc","impliedFormat":1},{"version":"f0a86f692166c5d2b153db200e84bb3d65e0c43deb8f560e33f9f70045821ec9","impliedFormat":1},{"version":"b163773a303feb2cbfc9de37a66ce0a01110f2fb059bc86ea3475399f2c4d888","impliedFormat":1},{"version":"cf781f174469444530756c85b6c9d297af460bf228380ed65a9e5d38b2e8c669","impliedFormat":1},{"version":"cbe1b33356dbcf9f0e706d170f3edf9896a2abc9bc1be12a28440bdbb48f16b1","impliedFormat":1},{"version":"d8498ad8a1aa7416b1ebfec256149f369c4642b48eca37cd1ea85229b0ca00d6","impliedFormat":1},{"version":"d054294baaab34083b56c038027919d470b5c5b26c639720a50b1814d18c5ee4","impliedFormat":1},{"version":"4532f2906ba87ae0c4a63f572e8180a78fd612da56f54d6d20c2506324158c08","impliedFormat":1},{"version":"878bf2fc1bbed99db0c0aa2f1200af4f2a77913a9ba9aafe80b3d75fd2de6ccc","impliedFormat":1},{"version":"039d6e764bb46e433c29c86be0542755035fc7a93aa2e1d230767dd54d7307c2","impliedFormat":1},{"version":"f80195273b09618979ad43009ca9ad7d01461cce7f000dc5b7516080e1bca959","impliedFormat":1},{"version":"16a7f250b6db202acc93d9f1402f1049f0b3b1b94135b4f65c7a7b770a030083","impliedFormat":1},{"version":"d15e9aaeef9ff4e4f8887060c0f0430b7d4767deafb422b7e474d3a61be541b9","impliedFormat":1},{"version":"777ddacdcb4fb6c3e423d3f020419ae3460b283fc5fa65c894a62dff367f9ad2","impliedFormat":1},{"version":"9a02117e0da8889421c322a2650711788622c28b69ed6d70893824a1183a45a8","impliedFormat":1},{"version":"9e30d7ef1a67ddb4b3f304b5ee2873f8e39ed22e409e1b6374819348c1e06dfa","impliedFormat":1},{"version":"ddeb300b9cf256fb7f11e54ce409f6b862681c96cc240360ab180f2f094c038b","impliedFormat":1},{"version":"0dbdd4be29dfc4f317711269757792ccde60140386721bee714d3710f3fbbd66","impliedFormat":1},{"version":"1f92e3e35de7c7ddb5420320a5f4be7c71f5ce481c393b9a6316c0f3aaa8b5e4","impliedFormat":1},{"version":"b721dc785a4d747a8dabc82962b07e25080e9b194ba945f6ff401782e81d1cef","impliedFormat":1},{"version":"f88b42ae60eb60621eec477610a8f457930af3cb83f0bebc5b6ece0a8cc17126","impliedFormat":1},{"version":"97c89e7e4e301d6db3e35e33d541b8ab9751523a0def016d5d7375a632465346","impliedFormat":1},{"version":"29ab360e8b7560cf55b6fb67d0ed81aae9f787427cf2887378fdecf386887e07","impliedFormat":1},{"version":"009bfb8cd24c1a1d5170ba1c1ccfa946c5082d929d1994dcf80b9ebebe6be026","impliedFormat":1},{"version":"654ee5d98b93d5d1a5d9ad4f0571de66c37367e2d86bae3513ea8befb9ed3cac","impliedFormat":1},{"version":"83c14b1b0b4e3d42e440c6da39065ab0050f1556788dfd241643430d9d870cf3","impliedFormat":1},{"version":"d96dfcef148bd4b06fa3c765c24cb07ff20a264e7f208ec4c5a9cbb3f028a346","impliedFormat":1},{"version":"f65550bf87be517c3178ae5372f91f9165aa2f7fc8d05a833e56edc588331bb0","impliedFormat":1},{"version":"9f4031322535a054dcdd801bc39e2ed1cdeef567f83631af473a4994717358e1","impliedFormat":1},{"version":"e6ef5df7f413a8ede8b53f351aac7138908253d8497a6f3150df49270b1e7831","impliedFormat":1},{"version":"b5b3104513449d4937a542fb56ba0c1eb470713ec351922e7c42ac695618e6a4","impliedFormat":1},{"version":"2b117d7401af4b064388acbb26a745c707cbe3420a599dc55f5f8e0fd8dd5baa","impliedFormat":1},{"version":"7d768eb1b419748eec264eff74b384d3c71063c967ac04c55303c9acc0a6c5dd","impliedFormat":1},{"version":"2f1bf6397cecf50211d082f338f3885d290fb838576f71ed4f265e8c698317f9","impliedFormat":1},{"version":"54f0d5e59a56e6ba1f345896b2b79acf897dfbd5736cbd327d88aafbef26ac28","impliedFormat":1},{"version":"760f3a50c7a9a1bc41e514a3282fe88c667fbca83ce5255d89da7a7ffb573b18","impliedFormat":1},{"version":"e966c134cdad68fb5126af8065a5d6608255ed0e9a008b63cf2509940c13660c","impliedFormat":1},{"version":"64a39a5d4bcbe5c8d9e5d32d7eb22dd35ae12cd89542ecb76567334306070f73","impliedFormat":1},{"version":"c1cc0ffa5bca057cc50256964882f462f714e5a76b86d9e23eb9ff1dfa14768d","impliedFormat":1},{"version":"08ab3ecce59aceee88b0c88eb8f4f8f6931f0cfd32b8ad0e163ef30f46e35283","impliedFormat":1},{"version":"0736d054796bb2215f457464811691bf994c0244498f1bb3119c7f4a73c2f99a","impliedFormat":1},{"version":"23bc9533664545d3ba2681eb0816b3f57e6ed2f8dce2e43e8f36745eafd984d4","impliedFormat":1},{"version":"689cbcf3764917b0a1392c94e26dd7ac7b467d84dc6206e3d71a66a4094bf080","impliedFormat":1},{"version":"a9f4de411d2edff59e85dd16cde3d382c3c490cbde0a984bf15533cfed6a8539","impliedFormat":1},{"version":"e30c1cf178412030c123b16dbbee1d59c312678593a0b3622c9f6d487c7e08ba","impliedFormat":1},{"version":"837033f34e1d4b56eab73998c5a0b64ee97db7f6ee9203c649e4cd17572614d8","impliedFormat":1},{"version":"cc8d033897f386df54c65c97c8bb23cfb6912954aa8128bff472d6f99352bb80","impliedFormat":1},{"version":"ca5820f82654abe3a72170fb04bbbb65bb492c397ecce8df3be87155b4a35852","impliedFormat":1},{"version":"9badb725e63229b86fa35d822846af78321a84de4a363da4fe6b5a3262fa31f2","impliedFormat":1},{"version":"f8e96a237b01a2b696b5b31172339d50c77bef996b225e8be043478a3f4a9be5","impliedFormat":1},{"version":"7d048c0fbdb740ae3fa64225653304fdb8d8bb7d905facf14f62e72f3e0ba21a","impliedFormat":1},{"version":"c59b8fb44e6ad7dc3e80359b43821026730a82d98856b690506ba39b5b03789b","impliedFormat":1},{"version":"bd86b749fb17c6596803ace4cae1b6474d820fd680c157e66d884e7c43ef1b24","impliedFormat":1},{"version":"879ba0ae1e59ec935b82af4f3f5ca62cbddecb3eb750c7f5ab28180d3180ec86","impliedFormat":1},{"version":"14fb829e7830df3e326af086bb665fd8dc383b1da2cde92e8ef67b6c49b13980","impliedFormat":1},{"version":"ec14ef5e67a6522f967a17eeedb0b8214c17b5ae3214f1434fcfa0ea66e25756","impliedFormat":1},{"version":"b38474dee55446b3b65ea107bc05ea15b5b5ca3a5fa534371daed44610181303","impliedFormat":1},{"version":"511db7e798d39b067ea149b0025ad2198cfe13ce284a789ef87f0a629942d52f","impliedFormat":1},{"version":"0e50ecb8433db4570ed22f3f56fd7372ebddb01f4e94346f043eeb42b4ada566","impliedFormat":1},{"version":"2beccefff361c478d57f45279478baeb7b7bcdac48c6108bec3a2d662344e1ea","impliedFormat":1},{"version":"b5c984f3e386c7c7c736ed7667b94d00a66f115920e82e9fa450dc27ccc0301e","impliedFormat":1},{"version":"acdd01e74c36396d3743b0caf0b4c7801297ca7301fa5db8ce7dbced64ec5732","impliedFormat":1},{"version":"82da8b99d0030a3babb7adfe3bb77bc8f89cc7d0737b622f4f9554abdc53cd89","impliedFormat":1},{"version":"80e11385ab5c1b042e02d64c65972fff234806525bf4916a32221d1baebfe2f9","impliedFormat":1},{"version":"a894178e9f79a38124f70afb869468bace08d789925fd22f5f671d9fb2f68307","impliedFormat":1},{"version":"b44237286e4f346a7151d33ff98f11a3582e669e2c08ec8b7def892ad7803f84","impliedFormat":1},{"version":"910c0d9ce9a39acafc16f6ca56bdbdb46c558ef44a9aa1ee385257f236498ee1","impliedFormat":1},{"version":"fed512983a39b9f0c6f1f0f04cc926aca2096e81570ae8cd84cad8c348e5e619","impliedFormat":1},{"version":"2ebf8f17b91314ec8167507ee29ebeb8be62a385348a0b8a1e7f433a7fb2cf89","impliedFormat":1},{"version":"cb48d9c290927137bfbd9cd93f98fca80a3704d0a1a26a4609542a3ab416c638","impliedFormat":1},{"version":"9ab3d74792d40971106685fb08a1c0e4b9b80d41e3408aa831e8a19fedc61ab8","impliedFormat":1},{"version":"394f9d6dc566055724626b455a9b5c86c27eeb1fdbd499c3788ab763585f5c41","impliedFormat":1},{"version":"9bc0ab4b8cb98cd3cb314b341e5aaab3475e5385beafb79706a497ebddc71b5d","impliedFormat":1},{"version":"35433c5ee1603dcac929defe439eec773772fab8e51b10eeb71e6296a44d9acb","impliedFormat":1},{"version":"aeee9ba5f764cea87c2b9905beb82cfdf36f9726f8dea4352fc233b308ba2169","impliedFormat":1},{"version":"35ea8672448e71ffa3538648f47603b4f872683e6b9db63168d7e5e032e095ef","impliedFormat":1},{"version":"8e63b8db999c7ad92c668969d0e26d486744175426157964771c65580638740d","impliedFormat":1},{"version":"f9da6129c006c79d6029dc34c49da453b1fe274e3022275bcdecaa02895034a0","impliedFormat":1},{"version":"2e9694d05015feb762a5dc7052dd51f66f692c07394b15f6aff612a9fb186f60","impliedFormat":1},{"version":"f570c4e30ea43aecf6fc7dc038cf0a964cf589111498b7dd735a97bf17837e3a","impliedFormat":1},{"version":"cdad25d233b377dd852eaa9cf396f48d916c1f8fd2193969fcafa8fe7c3387cb","impliedFormat":1},{"version":"243b9e4bcd123a332cb99e4e7913114181b484c0bb6a3b1458dcb5eb08cffdc4","impliedFormat":1},{"version":"ada76d272991b9fa901b2fbd538f748a9294f7b9b4bc2764c03c0c9723739fd1","impliedFormat":1},{"version":"6409389a0fa9db5334e8fbcb1046f0a1f9775abce0da901a5bc4fec1e458917c","impliedFormat":1},{"version":"af8d9efb2a64e68ac4c224724ac213dbc559bcfc165ce545d498b1c2d5b2d161","impliedFormat":1},{"version":"094faf910367cc178228cafe86f5c2bd94a99446f51e38d9c2a4eb4c0dec534d","impliedFormat":1},{"version":"dc4cf53cebe96ef6b569db81e9572f55490bd8a0e4f860aac02b7a0e45292c71","impliedFormat":1},{"version":"2c23e2a6219fbce2801b2689a9920548673d7ca0e53859200d55a0d5d05ea599","impliedFormat":1},{"version":"62491ce05a8e3508c8f7366208287c5fded66aad2ba81854aa65067d328281cc","impliedFormat":1},{"version":"8be1b9d5a186383e435c71d371e85016f92aa25e7a6a91f29aa7fd47651abf55","impliedFormat":1},{"version":"95a1b43dfa67963bd60eb50a556e3b08a9aea65a9ffa45504e5d92d34f58087a","impliedFormat":1},{"version":"b872dcd2b627694001616ab82e6aaec5a970de72512173201aae23f7e3f6503d","impliedFormat":1},{"version":"13517c2e04de0bbf4b33ff0dde160b0281ee47d1bf8690f7836ba99adc56294b","impliedFormat":1},{"version":"a9babac4cb35b319253dfc0f48097bcb9e7897f4f5762a5b1e883c425332d010","impliedFormat":1},{"version":"3d97a5744e12e54d735e7755eabc719f88f9d651e936ff532d56bdd038889fc4","impliedFormat":1},{"version":"7fffc8f7842b7c4df1ae19df7cc18cd4b1447780117fca5f014e6eb9b1a7215e","impliedFormat":1},{"version":"aaea91db3f0d14aca3d8b57c5ffb40e8d6d7232e65947ca6c00ae0c82f0a45dc","impliedFormat":1},{"version":"c62eefdcc2e2266350340ffaa43c249d447890617b037205ac6bb45bb7f5a170","impliedFormat":1},{"version":"9924ad46287d634cf4454fdbbccd03e0b7cd2e0112b95397c70d859ae00a5062","impliedFormat":1},{"version":"b940719c852fd3d759e123b29ace8bbd2ec9c5e4933c10749b13426b096a96a1","impliedFormat":1},{"version":"2745055e3218662533fbaddfb8e2e3186f50babe9fb09e697e73de5340c2ad40","impliedFormat":1},{"version":"5d6b6e6a7626621372d2d3bbe9e66b8168dcd5a40f93ae36ee339a68272a0d8b","impliedFormat":1},{"version":"64868d7db2d9a4fde65524147730a0cccdbd1911ada98d04d69f865ea93723d8","impliedFormat":1},{"version":"368b06a0dd2a29a35794eaa02c2823269a418761d38fdb5e1ac0ad2d7fdd0166","impliedFormat":1},{"version":"20164fb31ecfad1a980bd183405c389149a32e1106993d8224aaa93aae5bfbb9","impliedFormat":1},{"version":"bb4b51c75ee079268a127b19bf386eb979ab370ce9853c7d94c0aca9b75aff26","impliedFormat":1},{"version":"f0ef6f1a7e7de521846c163161b0ec7e52ce6c2665a4e0924e1be73e5e103ed3","impliedFormat":1},{"version":"84ab3c956ae925b57e098e33bd6648c30cdab7eca38f5e5b3512d46f6462b348","impliedFormat":1},{"version":"70d6692d0723d6a8b2c6853ed9ab6baaa277362bb861cf049cb12529bd04f68e","impliedFormat":1},{"version":"b35dc79960a69cd311a7c1da15ee30a8ab966e6db26ec99c2cc339b93b028ff6","impliedFormat":1},{"version":"29d571c13d8daae4a1a41d269ec09b9d17b2e06e95efd6d6dc2eeb4ff3a8c2ef","impliedFormat":1},{"version":"5f8a5619e6ae3fb52aaaa727b305c9b8cbe5ff91fa1509ffa61e32f804b55bd8","impliedFormat":1},{"version":"15becc25682fa4c93d45d92eab97bc5d1bb0563b8c075d98f4156e91652eec86","impliedFormat":1},{"version":"702f5c10b38e8c223e1d055d3e6a3f8c572aa421969c5d8699220fbc4f664901","impliedFormat":1},{"version":"4db15f744ba0cd3ae6b8ac9f6d043bf73d8300c10bbe4d489b86496e3eb1870b","impliedFormat":1},{"version":"80841050a3081b1803dbee94ff18c8b1770d1d629b0b6ebaf3b0351a8f42790b","impliedFormat":1},{"version":"9b7987f332830a7e99a4a067e34d082d992073a4dcf26acd3ecf41ca7b538ed5","impliedFormat":1},{"version":"e95b8e0dc325174c9cb961a5e38eccfe2ac15f979b202b0e40fa7e699751b4e9","impliedFormat":1},{"version":"21360a9fd6895e97cbbd36b7ce74202548710c8e833a36a2f48133b3341c2e8f","impliedFormat":1},{"version":"d74ac436397aa26367b37aa24bdae7c1933d2fed4108ff93c9620383a7f65855","impliedFormat":1},{"version":"65825f8fda7104efe682278afec0a63aeb3c95584781845c58d040d537d3cfed","impliedFormat":1},{"version":"1f467a5e086701edf716e93064f672536fc084bba6fc44c3de7c6ae41b91ac77","impliedFormat":1},{"version":"7e12b5758df0e645592f8252284bfb18d04f0c93e6a2bf7a8663974c88ef01de","impliedFormat":1},{"version":"47dbc4b0afb6bc4c131b086f2a75e35cbae88fb68991df2075ca0feb67bbe45b","impliedFormat":1},{"version":"146d8745ed5d4c6028d9a9be2ecf857da6c241bbbf031976a3dc9b0e17efc8a1","impliedFormat":1},{"version":"c4be9442e9de9ee24a506128453cba1bdf2217dbc88d86ed33baf2c4cbfc3e84","impliedFormat":1},{"version":"c9b42fef8c9d035e9ee3be41b99aae7b1bc1a853a04ec206bf0b3134f4491ec8","impliedFormat":1},{"version":"e6a958ab1e50a3bda4857734954cd122872e6deea7930d720afeebd9058dbaa5","impliedFormat":1},{"version":"088adb4a27dab77e99484a4a5d381f09420b9d7466fce775d9fbd3c931e3e773","impliedFormat":1},{"version":"ddf3d7751343800454d755371aa580f4c5065b21c38a716502a91fbb6f0ef92b","impliedFormat":1},{"version":"9b93adcccd155b01b56b55049028baac649d9917379c9c50c0291d316c6b9cdd","impliedFormat":1},{"version":"b48c56cc948cdf5bc711c3250a7ccbdd41f24f5bbbca8784de4c46f15b3a1e27","impliedFormat":1},{"version":"9eeee88a8f1eed92c11aea07551456a0b450da36711c742668cf0495ffb9149c","impliedFormat":1},{"version":"aeb081443dadcb4a66573dba7c772511e6c3f11c8fa8d734d6b0739e5048eb37","impliedFormat":1},{"version":"acf16021a0b863117ff497c2be4135f3c2d6528e4166582d306c4acb306cb639","impliedFormat":1},{"version":"13fbdad6e115524e50af76b560999459b3afd2810c1cbaa52c08cdc1286d2564","impliedFormat":1},{"version":"d3972149b50cdea8e6631a9b4429a5a9983c6f2453070fb8298a5d685911dc46","impliedFormat":1},{"version":"e2dcfcb61b582c2e1fa1a83e3639e2cc295c79be4c8fcbcbeef9233a50b71f7b","impliedFormat":1},{"version":"4e49b8864a54c0dcde72d637ca1c5718f5c017f378f8c9024eff5738cd84738f","impliedFormat":1},{"version":"8db9eaf81db0fc93f4329f79dd05ea6de5654cabf6526adb0b473d6d1cd1f331","impliedFormat":1},{"version":"f76d2001e2c456b814761f2057874dd775e2f661646a5b4bacdcc4cdaf00c3e6","impliedFormat":1},{"version":"d95afdd2f35228db20ec312cb7a014454c80e53a8726906bd222a9ad56f58297","impliedFormat":1},{"version":"8302bf7d5a3cb0dc5c943f77c43748a683f174fa5fae95ad87c004bf128950ce","impliedFormat":1},{"version":"ced33b4c97c0c078254a2a2c1b223a68a79157d1707957d18b0b04f7450d1ad5","impliedFormat":1},{"version":"0e31e4ec65a4d12b088ecf5213c4660cb7d37181b4e7f1f2b99fe58b1ba93956","impliedFormat":1},{"version":"3028552149f473c2dcf073c9e463d18722a9b179a70403edf8b588fcea88f615","impliedFormat":1},{"version":"0ccbcaa5cb885ad2981e4d56ed6845d65e8d59aba9036796c476ca152bc2ee37","impliedFormat":1},{"version":"cb86555aef01e7aa1602fce619da6de970bb63f84f8cffc4d21a12e60cd33a8c","impliedFormat":1},{"version":"a23c3bb0aecfbb593df6b8cb4ba3f0d5fc1bf93c48cc068944f4c1bdb940cb11","impliedFormat":1},{"version":"544c1aa6fcc2166e7b627581fdd9795fc844fa66a568bfa3a1bc600207d74472","impliedFormat":1},{"version":"745c7e4f6e3666df51143ed05a1200032f57d71a180652b3528c5859a062e083","impliedFormat":1},{"version":"0308b7494aa630c6ecc0e4f848f85fcad5b5d6ef811d5c04673b78cf3f87041c","impliedFormat":1},{"version":"c540aea897a749517aea1c08aeb2562b8b6fc9e70f938f55b50624602cc8b2e4","impliedFormat":1},{"version":"a1ab0c6b4400a900efd4cd97d834a72b7aeaa4b146a165043e718335f23f9a5f","impliedFormat":1},{"version":"89ebe83d44d78b6585dfd547b898a2a36759bc815c87afdf7256204ab453bd08","impliedFormat":1},{"version":"e6a29b3b1ac19c5cdf422685ac0892908eb19993c65057ec4fd3405ebf62f03d","impliedFormat":1},{"version":"c43912d69f1d4e949b0b1ce3156ad7bc169589c11f23db7e9b010248fdd384fa","impliedFormat":1},{"version":"d585b623240793e85c71b537b8326b5506ec4e0dcbb88c95b39c2a308f0e81ba","impliedFormat":1},{"version":"aac094f538d04801ebf7ea02d4e1d6a6b91932dbce4894acb3b8d023fdaa1304","impliedFormat":1},{"version":"da0d796387b08a117070c20ec46cc1c6f93584b47f43f69503581d4d95da2a1e","impliedFormat":1},{"version":"f2307295b088c3da1afb0e5a390b313d0d9b7ff94c7ba3107b2cdaf6fca9f9e6","impliedFormat":1},{"version":"d00bd133e0907b71464cbb0adae6353ebbec6977671d34d3266d75f11b9591a8","impliedFormat":1},{"version":"c3616c3b6a33defc62d98f1339468f6066842a811c6f7419e1ee9cae9db39184","impliedFormat":1},{"version":"7d068fc64450fc5080da3772705441a48016e1022d15d1d738defa50cac446b8","impliedFormat":1},{"version":"4c3c31fba20394c26a8cfc2a0554ae3d7c9ba9a1bc5365ee6a268669851cfe19","impliedFormat":1},{"version":"584e168e0939271bcec62393e2faa74cff7a2f58341c356b3792157be90ea0f7","impliedFormat":1},{"version":"50b6829d9ef8cf6954e0adf0456720dd3fd16f01620105072bae6be3963054d1","impliedFormat":1},{"version":"a72a2dd0145eaf64aa537c22af8a25972c0acf9db1a7187fa00e46df240e4bb0","impliedFormat":1},{"version":"0008a9f24fcd300259f8a8cd31af280663554b67bf0a60e1f481294615e4c6aa","impliedFormat":1},{"version":"21738ef7b3baf3065f0f186623f8af2d695009856a51e1d2edf9873cee60fe3a","impliedFormat":1},{"version":"19c9f153e001fb7ab760e0e3a5df96fa8b7890fc13fc848c3b759453e3965bf0","impliedFormat":1},{"version":"5d3a82cef667a1cff179a0a72465a34a6f1e31d3cdba3adce27b70b85d69b071","impliedFormat":1},{"version":"38763534c4b9928cd33e7d1c2141bc16a8d6719e856bf88fda57ef2308939d82","impliedFormat":1},{"version":"292ec7e47dfc1f6539308adc8a406badff6aa98c246f57616b5fa412d58067f8","impliedFormat":1},{"version":"a11ee86b5bc726da1a2de014b71873b613699cfab8247d26a09e027dee35e438","impliedFormat":1},{"version":"95a595935eecbce6cc8615c20fafc9a2d94cf5407a5b7ff9fa69850bbef57169","impliedFormat":1},{"version":"c42fc2b9cf0b6923a473d9c85170f1e22aa098a2c95761f552ec0b9e0a620d69","impliedFormat":1},{"version":"8c9a55357196961a07563ac00bb6434c380b0b1be85d70921cd110b5e6db832d","impliedFormat":1},{"version":"73149a58ebc75929db972ab9940d4d0069d25714e369b1bc6e33bc63f1f8f094","impliedFormat":1},{"version":"c98f5a640ffecf1848baf321429964c9db6c2e943c0a07e32e8215921b6c36c3","impliedFormat":1},{"version":"43738308660af5cb4a34985a2bd18e5e2ded1b2c8f8b9c148fca208c5d2768a6","impliedFormat":1},{"version":"bb4fa3df2764387395f30de00e17d484a51b679b315d4c22316d2d0cd76095d6","impliedFormat":1},{"version":"0498a3d27ec7107ba49ecc951e38c7726af555f438bab1267385677c6918d8ec","impliedFormat":1},{"version":"fe24f95741e98d4903772dc308156562ae7e4da4f3845e27a10fab9017edae75","impliedFormat":1},{"version":"b63482acb91346b325c20087e1f2533dc620350bf7d0aa0c52967d3d79549523","impliedFormat":1},{"version":"2aef798b8572df98418a7ac4259b315df06839b968e2042f2b53434ee1dc2da4","impliedFormat":1},{"version":"249c41965bd0c7c5b987f242ac9948a2564ef92d39dde6af1c4d032b368738b0","impliedFormat":1},{"version":"7141b7ffd1dcd8575c4b8e30e465dd28e5ae4130ff9abd1a8f27c68245388039","impliedFormat":1},{"version":"d1dd80825d527d2729f4581b7da45478cdaaa0c71e377fd2684fb477761ea480","impliedFormat":1},{"version":"e78b1ba3e800a558899aba1a50704553cf9dc148036952f0b5c66d30b599776d","impliedFormat":1},{"version":"be4ccea4deb9339ca73a5e6a8331f644a6b8a77d857d21728e911eb3271a963c","impliedFormat":1},{"version":"3ee5a61ffc7b633157279afd7b3bd70daa989c8172b469d358aed96f81a078ef","impliedFormat":1},{"version":"23c63869293ca315c9e8eb9359752704068cc5fff98419e49058838125d59b1e","impliedFormat":1},{"version":"af0a68781958ab1c73d87e610953bd70c062ddb2ab761491f3e125eadef2a256","impliedFormat":1},{"version":"c20c624f1b803a54c5c12fdd065ae0f1677f04ffd1a21b94dddee50f2e23f8ec","impliedFormat":1},{"version":"49ef6d2d93b793cc3365a79f31729c0dc7fc2e789425b416b1a4a5654edb41ac","impliedFormat":1},{"version":"c2151736e5df2bdc8b38656b2e59a4bb0d7717f7da08b0ae9f5ddd1e429d90a1","impliedFormat":1},{"version":"3f1baacc3fc5e125f260c89c1d2a940cdccb65d6adef97c9936a3ac34701d414","impliedFormat":1},{"version":"3603cbabe151a2bea84325ce1ea57ca8e89f9eb96546818834d18fb7be5d4232","impliedFormat":1},{"version":"989762adfa2de753042a15514f5ccc4ed799b88bdc6ac562648972b26bc5bc60","impliedFormat":1},{"version":"a23f251635f89a1cc7363cae91e578073132dc5b65f6956967069b2b425a646a","impliedFormat":1},{"version":"995ed46b1839b3fc9b9a0bd5e7572120eac3ba959fa8f5a633be9bcded1f87ae","impliedFormat":1},{"version":"ddabaf119da03258aa0a33128401bbb91c54ef483e9de0f87be1243dd3565144","impliedFormat":1},{"version":"4e79855295a233d75415685fa4e8f686a380763e78a472e3c6c52551c6b74fd3","impliedFormat":1},{"version":"3b036f77ed5cbb981e433f886a07ec719cf51dd6c513ef31e32fd095c9720028","impliedFormat":1},{"version":"ee58f8fca40561d30c9b5e195f39dbc9305a6f2c8e1ff2bf53204cacb2cb15c0","impliedFormat":1},{"version":"83ac7ceab438470b6ddeffce2c13d3cf7d22f4b293d1e6cdf8f322edcd87a393","impliedFormat":1},{"version":"ef0e7387c15b5864b04dd9358513832d1c93b15f4f07c5226321f5f17993a0e2","impliedFormat":1},{"version":"86b6a71515872d5286fbcc408695c57176f0f7e941c8638bcd608b3718a1e28c","impliedFormat":1},{"version":"be59c70c4576ea08eee55cf1083e9d1f9891912ef0b555835b411bc4488464d4","impliedFormat":1},{"version":"57c97195e8efcfc808c41c1b73787b85588974181349b6074375eb19cc3bba91","impliedFormat":1},{"version":"d7cafcc0d3147486b39ac4ad02d879559dd3aa8ac4d0600a0c5db66ab621bdf3","impliedFormat":1},{"version":"b5c8e50e4b06f504513ca8c379f2decb459d9b8185bdcd1ee88d3f7e69725d3b","impliedFormat":1},{"version":"122621159b4443b4e14a955cf5f1a23411e6a59d2124d9f0d59f3465eddc97ec","impliedFormat":1},{"version":"c4889859626d56785246179388e5f2332c89fa4972de680b9b810ab89a9502cd","impliedFormat":1},{"version":"e9395973e2a57933fcf27b0e95b72cb45df8ecc720929ce039fc1c9013c5c0dc","impliedFormat":1},{"version":"a81723e440f533b0678ce5a3e7f5046a6bb514e086e712f9be98ebef74bd39b8","impliedFormat":1},{"version":"298d10f0561c6d3eb40f30001d7a2c8a5aa1e1e7e5d1babafb0af51cc27d2c81","impliedFormat":1},{"version":"e256d96239faffddf27f67ff61ab186ad3adaa7d925eeaf20ba084d90af1df19","impliedFormat":1},{"version":"8357843758edd0a0bd1ef4283fcabb50916663cf64a6a0675bd0996ae5204f3d","impliedFormat":1},{"version":"1525d7dd58aad8573ae1305cc30607d35c9164a8e2b0b14c7d2eaea44143f44b","impliedFormat":1},{"version":"fd19dff6b77e377451a1beacb74f0becfee4e7f4c2906d723570f6e7382bd46f","impliedFormat":1},{"version":"3f3ef670792214404589b74e790e7347e4e4478249ca09db51dc8a7fca6c1990","impliedFormat":1},{"version":"0da423d17493690db0f1adc8bf69065511c22dd99c478d9a2b59df704f77301b","impliedFormat":1},{"version":"ba627cd6215902dbe012e96f33bd4bf9ad0eefc6b14611789c52568cf679dc07","impliedFormat":1},{"version":"5fce817227cd56cb5642263709b441f118e19a64af6b0ed520f19fa032bdb49e","impliedFormat":1},{"version":"754107d580b33acc15edffaa6ac63d3cdf40fb11b1b728a2023105ca31fcb1a8","impliedFormat":1},{"version":"03cbeabd581d540021829397436423086e09081d41e3387c7f50df8c92d93b35","impliedFormat":1},{"version":"91322bf698c0c547383d3d1a368e5f1f001d50b9c3c177de84ab488ead82a1b8","impliedFormat":1},{"version":"79337611e64395512cad3eb04c8b9f50a2b803fa0ae17f8614f19c1e4a7eef8d","impliedFormat":1},{"version":"6835fc8e288c1a4c7168a72a33cb8a162f5f52d8e1c64e7683fc94f427335934","impliedFormat":1},{"version":"a90a83f007a1dece225eb2fd59b41a16e65587270bd405a2eb5f45aa3d2b2044","impliedFormat":1},{"version":"320333b36a5e801c0e6cee69fb6edc2bcc9d192cd71ee1d28c4b46467c69d0b4","impliedFormat":1},{"version":"e4e2457e74c4dc9e0bb7483113a6ba18b91defc39d6a84e64b532ad8a4c9951c","impliedFormat":1},{"version":"c39fb1745e021b123b512b86c41a96497bf60e3c8152b167da11836a6e418fd7","impliedFormat":1},{"version":"95ab9fb3b863c4f05999f131c0d2bd44a9de8e7a36bb18be890362aafa9f0a26","impliedFormat":1},{"version":"c95da8d445b765b3f704c264370ac3c92450cefd9ec5033a12f2b4e0fca3f0f4","impliedFormat":1},{"version":"ac534eb4f4c86e7bef6ed3412e7f072ec83fe36a73e79cbf8f3acb623a2447bb","impliedFormat":1},{"version":"a2a295f55159b84ca69eb642b99e06deb33263b4253c32b4119ea01e4e06a681","impliedFormat":1},{"version":"271584dd56ae5c033542a2788411e62a53075708f51ee4229c7f4f7804b46f98","impliedFormat":1},{"version":"f8fe7bba5c4b19c5e84c614ffcd3a76243049898678208f7af0d0a9752f17429","impliedFormat":1},{"version":"bad7d161bfe5943cb98c90ec486a46bf2ebc539bd3b9dbc3976968246d8c801d","impliedFormat":1},{"version":"be1f9104fa3890f1379e88fdbb9e104e5447ac85887ce5c124df4e3b3bc3fece","impliedFormat":1},{"version":"2d38259c049a6e5f2ea960ff4ad0b2fb1f8d303535afb9d0e590bb4482b26861","impliedFormat":1},{"version":"ae07140e803da03cc30c595a32bb098e790423629ab94fdb211a22c37171af5a","impliedFormat":1},{"version":"b0b6206f9b779be692beab655c1e99ec016d62c9ea6982c7c0108716d3ebb2ec","impliedFormat":1},{"version":"cc39605bf23068cbec34169b69ef3eb1c0585311247ceedf7a2029cf9d9711bd","impliedFormat":1},{"version":"132d600b779fb52dba5873aadc1e7cf491996c9e5abe50bcbc34f5e82c7bfe8a","impliedFormat":1},{"version":"429a4b07e9b7ff8090cc67db4c5d7d7e0a9ee5b9e5cd4c293fd80fca84238f14","impliedFormat":1},{"version":"4ffb10b4813cdca45715d9a8fc8f54c4610def1820fae0e4e80a469056e3c3d5","impliedFormat":1},{"version":"673a5aa23532b1d47a324a6945e73a3e20a6ec32c7599e0a55b2374afd1b098d","impliedFormat":1},{"version":"a70d616684949fdff06a57c7006950592a897413b2d76ec930606c284f89e0b9","impliedFormat":1},{"version":"ddfff10877e34d7c341cb85e4e9752679f9d1dd03e4c20bf2a8d175eda58d05b","impliedFormat":1},{"version":"d4afbe82fbc4e92c18f6c6e4007c68e4971aca82b887249fdcb292b6ae376153","impliedFormat":1},{"version":"9a6a791ca7ed8eaa9a3953cbf58ec5a4211e55c90dcd48301c010590a68b945e","impliedFormat":1},{"version":"10098d13345d8014bbfd83a3f610989946b3c22cdec1e6b1af60693ab6c9f575","impliedFormat":1},{"version":"0b5880de43560e2c042c5337f376b1a0bdae07b764a4e7f252f5f9767ebad590","impliedFormat":1},{"version":"2879a055439b6c0c0132a1467120a0f85b56b5d735c973ad235acd958b1b5345","impliedFormat":1},{"version":"a80b7bc4eda856374c26a56f6f25297f4c393309d4c4548002a5238cd57b2b66","impliedFormat":1},"3c1fac4f78df1041c0ecd16f6fc7f9512251b711e12943e3411f6624cede2bdd",{"version":"8dd450de6d756cee0761f277c6dc58b0b5a66b8c274b980949318b8cad26d712","impliedFormat":1},{"version":"904d6ad970b6bd825449480488a73d9b98432357ab38cf8d31ffd651ae376ff5","impliedFormat":1},{"version":"0eca9db21fa3ff4874640e1bec31c03da0615462388c07e7299e1b930851a80c","impliedFormat":1},"3a5ed441b9ddac9936f8cb052299142de5e2269c9a2c7aba39996d71ba2ec85a",{"version":"caf4af98bf464ad3e10c46cf7d340556f89197aab0f87f032c7b84eb8ddb24d9","impliedFormat":1},{"version":"71acd198e19fa38447a3cbc5c33f2f5a719d933fccf314aaff0e8b0593271324","impliedFormat":1},"b50ce854ad22d6df9dee3e2851083687fb07d10c002a2364608446278014a968","adefbba984a87c0f3059432a049ca2ef7e46bd93adeab0ee1828e3886b8cabb3","927de568a3cf481bf0040ced7703bbe24deb44952e838940dc7ecbe789711232",{"version":"41baad0050b9280cfe30362c267eba7b89161d528112bccea69f7b4d49ab3102","impliedFormat":1},"53b069e0b6ddfbd990397c6889801e4c83d430adc88d6d08cababfa522ff18a4",{"version":"6b5f886fe41e2e767168e491fe6048398ed6439d44e006d9f51cc31265f08978","impliedFormat":1},{"version":"f4a1eba860f7493d19df42373ddde4f3c6f31aa574b608e55e5b2bd459bba587","impliedFormat":1},{"version":"6388a549ff1e6a2d5d18da48709bb167ea28062b573ff1817016099bc6138861","impliedFormat":1},{"version":"32d280360f1bcc8b4721ff72d11a29a79ac2cb0e82dde14eea891bf73ba98f9d","impliedFormat":1},"4fed67addadd0cb81d5fd95ace0b43f4a9639ff425ec594042a0be704d98be00","dcae0b8e192da5304304681a3cc594a940b85b2249be8c45c1f71d61e7211090","734fc419cc0723016aac35e9d433ad405207cb1a29668ea91e7ead041874d00c","62d3ce5b8f548990a8f188247f539defc3075b2793d673beca132c5abc560b6f","765efb51f937b2f1e73601646da5407ff54a4a86adb0fad487910682357ab26d",{"version":"9e4b070b543d91d0b321a481e1119e99bb8f136f4ef271d7b5ba264919fc32e2","impliedFormat":1},{"version":"5f877dfc985d1fd3ac8bf4a75cd77b06c42ca608809b324c44b4151758de7189","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9a60e36a4cc38129e1882b28e24bd1d47f2bf62e7708d611384b223f31ad20b","affectsGlobalScope":true,"impliedFormat":1},{"version":"14c2fd6220654a41c53836a62ba96d4b515ae1413b0ccb31c2445fb1ae1de5de","affectsGlobalScope":true,"impliedFormat":1},{"version":"4f29c38739500cd35a2ce41d15a35e34445ca755ebb991915b5f170985a49d21","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3842a6977bc70be229c3397123adaa686d99e161c9927ae85b6f6890be401e7","affectsGlobalScope":true,"impliedFormat":1},{"version":"efc7d584a33fe3422847783d228f315c4cd1afe74bd7cf8e3f0e4c1125129fef","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"a14ed46fa3f5ffc7a8336b497cd07b45c2084213aaca933a22443fcb2eef0d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"cce1f5f86974c1e916ec4a8cab6eec9aa8e31e8148845bf07fbaa8e1d97b1a2c","impliedFormat":1},{"version":"e2eb1ce13a9c0fa7ab62c63909d81973ef4b707292667c64f1e25e6e53fa7afa","affectsGlobalScope":true,"impliedFormat":1},{"version":"16d74fe4d8e183344d3beb15d48b123c5980ff32ff0cc8c3b96614ddcdf9b239","impliedFormat":1},{"version":"7b43160a49cf2c6082da0465876c4a0b164e160b81187caeb0a6ca7a281e85ba","impliedFormat":1},{"version":"41fb2a1c108fbf46609ce5a451b7ec78eb9b5ada95fd5b94643e4b26397de0b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"1b282e90846fada1e96dc1cf5111647d6ab5985c8d7b5c542642f1ea2739406d","impliedFormat":1},{"version":"bd3f5d05b6b5e4bfcea7739a45f3ffb4a7f4a3442ba7baf93e0200799285b8f1","impliedFormat":1},{"version":"4c775c2fccabf49483c03cd5e3673f87c1ffb6079d98e7b81089c3def79e29c6","impliedFormat":1},{"version":"8806ae97308ef26363bd7ec8071bca4d07fb575f905ee3d8a91aff226df6d618","impliedFormat":1},{"version":"af5bf1db6f1804fb0069039ae77a05d60133c77a2158d9635ea27b6bb2828a8f","impliedFormat":1},{"version":"b7fe70be794e13d1b7940e318b8770cd1fb3eced7707805318a2e3aaac2c3e9e","impliedFormat":1},{"version":"2c71199d1fc83bf17636ad5bf63a945633406b7b94887612bba4ef027c662b3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ae9dc7dbb58cd843065639707815df85c044babaa0947116f97bdb824d07204","affectsGlobalScope":true,"impliedFormat":1},{"version":"7aae1df2053572c2cfc2089a77847aadbb38eedbaa837a846c6a49fb37c6e5bd","impliedFormat":1},{"version":"313a0b063f5188037db113509de1b934a0e286f14e9479af24fada241435e707","impliedFormat":1},{"version":"f1ace2d2f98429e007d017c7a445efad2aaebf8233135abdb2c88b8c0fef91ab","impliedFormat":1},{"version":"87ef1a23caa071b07157c72077fa42b86d30568f9dc9e31eed24d5d14fc30ba8","impliedFormat":1},{"version":"396a8939b5e177542bdf9b5262b4eee85d29851b2d57681fa9d7eae30e225830","impliedFormat":1},{"version":"21773f5ac69ddf5a05636ba1f50b5239f4f2d27e4420db147fc2f76a5ae598ac","impliedFormat":1},{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true,"impliedFormat":1},{"version":"a5fe4cc622c3bf8e09ababde5f4096ceac53163eefcd95e9cd53f062ff9bb67a","impliedFormat":1},{"version":"45b1053e691c5af9bfe85060a3e1542835f8d84a7e6e2e77ca305251eda0cb3c","impliedFormat":1},{"version":"0f05c06ff6196958d76b865ae17245b52d8fe01773626ac3c43214a2458ea7b7","impliedFormat":1},{"version":"ae5507fc333d637dec9f37c6b3f4d423105421ea2820a64818de55db85214d66","affectsGlobalScope":true,"impliedFormat":1},{"version":"0666f4c99b8688c7be5956df8fecf5d1779d3b22f8f2a88258ae7072c7b6026f","affectsGlobalScope":true,"impliedFormat":1},{"version":"8abd0566d2854c4bd1c5e48e05df5c74927187f1541e6770001d9637ac41542e","impliedFormat":1},{"version":"54e854615c4eafbdd3fd7688bd02a3aafd0ccf0e87c98f79d3e9109f047ce6b8","impliedFormat":1},{"version":"d8dba11dc34d50cb4202de5effa9a1b296d7a2f4a029eec871f894bddfb6430d","impliedFormat":1},{"version":"8b71dd18e7e63b6f991b511a201fad7c3bf8d1e0dd98acb5e3d844f335a73634","impliedFormat":1},{"version":"01d8e1419c84affad359cc240b2b551fb9812b450b4d3d456b64cda8102d4f60","impliedFormat":1},{"version":"8221b00f271cf7f535a8eeec03b0f80f0929c7a16116e2d2df089b41066de69b","impliedFormat":1},{"version":"269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"7424817d5eb498771e6d1808d726ec38f75d2eaf3fa359edd5c0c540c52725c1","impliedFormat":1},{"version":"831c22d257717bf2cbb03afe9c4bcffc5ccb8a2074344d4238bf16d3a857bb12","impliedFormat":1},{"version":"bddce945d552a963c9733db106b17a25474eefcab7fc990157a2134ef55d4954","affectsGlobalScope":true,"impliedFormat":1},{"version":"7052b7b0c3829df3b4985bab2fd74531074b4835d5a7b263b75c82f0916ad62f","affectsGlobalScope":true,"impliedFormat":1},{"version":"aa34c3aa493d1c699601027c441b9664547c3024f9dbab1639df7701d63d18fa","impliedFormat":1},{"version":"eefcdf86cefff36e5d87de36a3638ab5f7d16c2b68932be4a72c14bb924e43c1","impliedFormat":1},{"version":"7c651f8dce91a927ab62925e73f190763574c46098f2b11fb8ddc1b147a6709a","impliedFormat":1},{"version":"7440ab60f4cb031812940cc38166b8bb6fbf2540cfe599f87c41c08011f0c1df","impliedFormat":1},{"version":"4d0405568cf6e0ff36a4861c4a77e641366feaefa751600b0a4d12a5e8f730a8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5b5dc128973498b75f52b1b8c2d5f8629869104899733ae485100c2309b4c12","affectsGlobalScope":true,"impliedFormat":1},{"version":"e393915d3dc385e69c0e2390739c87b2d296a610662eb0b1cb85224e55992250","impliedFormat":1},{"version":"79bad8541d5779c85e82a9fb119c1fe06af77a71cc40f869d62ad379473d4b75","impliedFormat":1},{"version":"8013f6c4d1632da8f1c4d3d702ae559acccd0f1be05360c31755f272587199c9","impliedFormat":1},{"version":"629d20681ca284d9e38c0a019f647108f5fe02f9c59ac164d56f5694fc3faf4d","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7dbf5716d76846c7522e910896c5747b6df1abd538fee8f5291bdc843461795","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"b510d0a18e3db42ac9765d26711083ec1e8b4e21caaca6dc4d25ae6e8623f447","impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1}],"root":[87,90,[92,94],97,98,105,108,[126,128],451,455,[458,460],462,[467,471]],"options":{"allowJs":true,"declaration":false,"declarationMap":false,"esModuleInterop":true,"inlineSources":false,"jsx":1,"module":99,"noUnusedLocals":false,"noUnusedParameters":false,"skipLibCheck":true,"strict":false,"target":99,"verbatimModuleSyntax":true},"referencedMap":[[94,1],[98,2],[105,3],[90,4],[108,5],[96,6],[463,7],[454,8],[120,7],[452,7],[130,9],[131,9],[132,9],[133,9],[134,9],[135,9],[136,9],[137,9],[138,9],[139,9],[140,9],[141,9],[142,9],[143,9],[144,9],[145,9],[146,9],[147,9],[148,9],[149,9],[150,9],[151,9],[152,9],[153,9],[154,9],[155,9],[156,9],[158,9],[157,9],[159,9],[160,9],[161,9],[162,9],[163,9],[164,9],[165,9],[166,9],[167,9],[168,9],[169,9],[170,9],[171,9],[172,9],[173,9],[174,9],[175,9],[176,9],[177,9],[178,9],[179,9],[180,9],[181,9],[182,9],[183,9],[184,9],[187,9],[186,9],[185,9],[188,9],[189,9],[190,9],[191,9],[193,9],[192,9],[195,9],[194,9],[196,9],[197,9],[198,9],[199,9],[201,9],[200,9],[202,9],[203,9],[204,9],[205,9],[206,9],[207,9],[208,9],[209,9],[210,9],[211,9],[212,9],[213,9],[216,9],[214,9],[215,9],[217,9],[218,9],[219,9],[220,9],[221,9],[222,9],[223,9],[224,9],[225,9],[226,9],[227,9],[228,9],[230,9],[229,9],[231,9],[232,9],[233,9],[234,9],[235,9],[236,9],[238,9],[237,9],[239,9],[240,9],[241,9],[242,9],[243,9],[244,9],[245,9],[246,9],[247,9],[248,9],[249,9],[251,9],[250,9],[252,9],[254,9],[253,9],[255,9],[256,9],[257,9],[258,9],[260,9],[259,9],[261,9],[262,9],[263,9],[264,9],[265,9],[266,9],[267,9],[268,9],[269,9],[270,9],[271,9],[272,9],[273,9],[274,9],[275,9],[276,9],[277,9],[278,9],[279,9],[280,9],[281,9],[282,9],[283,9],[284,9],[285,9],[286,9],[287,9],[288,9],[290,9],[289,9],[291,9],[292,9],[293,9],[294,9],[295,9],[296,9],[448,10],[297,9],[298,9],[299,9],[300,9],[301,9],[302,9],[303,9],[304,9],[305,9],[306,9],[307,9],[308,9],[309,9],[310,9],[311,9],[312,9],[313,9],[314,9],[315,9],[318,9],[316,9],[317,9],[319,9],[320,9],[321,9],[322,9],[323,9],[324,9],[325,9],[326,9],[327,9],[328,9],[330,9],[329,9],[332,9],[333,9],[331,9],[334,9],[335,9],[336,9],[337,9],[338,9],[339,9],[340,9],[341,9],[342,9],[343,9],[344,9],[345,9],[346,9],[347,9],[348,9],[349,9],[350,9],[351,9],[352,9],[353,9],[354,9],[356,9],[355,9],[358,9],[357,9],[359,9],[360,9],[361,9],[362,9],[363,9],[364,9],[365,9],[366,9],[368,9],[367,9],[369,9],[370,9],[371,9],[372,9],[374,9],[373,9],[375,9],[376,9],[377,9],[378,9],[379,9],[380,9],[381,9],[382,9],[383,9],[384,9],[385,9],[386,9],[387,9],[388,9],[389,9],[390,9],[391,9],[392,9],[393,9],[394,9],[395,9],[397,9],[396,9],[398,9],[399,9],[400,9],[401,9],[402,9],[403,9],[404,9],[405,9],[406,9],[407,9],[408,9],[410,9],[411,9],[412,9],[413,9],[414,9],[415,9],[416,9],[409,9],[417,9],[418,9],[419,9],[420,9],[421,9],[422,9],[423,9],[424,9],[425,9],[426,9],[427,9],[428,9],[429,9],[430,9],[431,9],[432,9],[433,9],[129,11],[434,9],[435,9],[436,9],[437,9],[438,9],[439,9],[440,9],[441,9],[442,9],[443,9],[444,9],[445,9],[446,9],[447,9],[457,12],[466,13],[465,14],[453,7],[119,11],[456,11],[450,15],[121,16],[112,17],[111,18],[110,19],[473,20],[477,21],[476,22],[478,23],[479,23],[514,24],[515,25],[516,26],[517,27],[518,28],[519,29],[520,30],[521,31],[522,32],[523,33],[524,33],[526,34],[525,35],[527,36],[528,37],[529,38],[513,39],[530,40],[531,41],[532,42],[564,43],[533,44],[534,45],[535,46],[536,47],[537,48],[538,49],[539,50],[540,51],[541,52],[542,53],[543,53],[544,54],[545,55],[547,56],[546,57],[548,58],[549,59],[550,60],[551,61],[552,62],[553,63],[554,64],[555,65],[556,66],[557,67],[558,68],[559,69],[560,70],[561,71],[562,72],[88,11],[565,11],[86,73],[449,11],[124,74],[123,75],[461,76],[100,77],[101,77],[103,77],[104,78],[125,11],[89,79],[87,11],[117,80],[118,81],[116,82],[114,83],[113,84],[115,83],[496,85],[503,86],[495,85],[510,87],[487,88],[486,89],[509,90],[504,91],[507,92],[489,93],[488,94],[484,95],[483,96],[506,97],[485,98],[490,99],[494,99],[512,100],[511,99],[498,101],[499,102],[501,103],[497,104],[500,105],[505,90],[492,106],[493,107],[502,108],[482,109],[508,110],[471,111],[470,112],[460,113],[469,114],[468,115],[451,116],[462,117],[459,118],[455,119],[458,120],[467,121],[126,122],[128,123],[127,124],[97,125],[93,126]],"affectedFilesPendingEmit":[94,98,105,90,108,471,470,460,469,468,451,462,459,455,458,467,126,128,127,97,93,92],"version":"5.9.3"}
\ No newline at end of file
diff --git a/surfsense_desktop/src/ipc/channels.ts b/surfsense_desktop/src/ipc/channels.ts
index 436e0e064..308d8515e 100644
--- a/surfsense_desktop/src/ipc/channels.ts
+++ b/surfsense_desktop/src/ipc/channels.ts
@@ -50,8 +50,8 @@ export const IPC_CHANNELS = {
GET_SHORTCUTS: 'shortcuts:get',
SET_SHORTCUTS: 'shortcuts:set',
// Active search space
- GET_ACTIVE_SEARCH_SPACE: 'search-space:get-active',
- SET_ACTIVE_SEARCH_SPACE: 'search-space:set-active',
+ GET_ACTIVE_WORKSPACE: 'workspace:get-active',
+ SET_ACTIVE_WORKSPACE: 'workspace:set-active',
// Launch on system startup
GET_AUTO_LAUNCH: 'auto-launch:get',
SET_AUTO_LAUNCH: 'auto-launch:set',
diff --git a/surfsense_desktop/src/ipc/handlers.ts b/surfsense_desktop/src/ipc/handlers.ts
index ab4ba0d92..23b88e292 100644
--- a/surfsense_desktop/src/ipc/handlers.ts
+++ b/surfsense_desktop/src/ipc/handlers.ts
@@ -27,7 +27,7 @@ import {
} from '../modules/folder-watcher';
import { getShortcuts, setShortcuts, type ShortcutConfig } from '../modules/shortcuts';
import { getAutoLaunchState, setAutoLaunch } from '../modules/auto-launch';
-import { getActiveSearchSpaceId, setActiveSearchSpaceId } from '../modules/active-search-space';
+import { getActiveWorkspaceId, setActiveWorkspaceId } from '../modules/active-workspace';
import { reregisterQuickAsk } from '../modules/quick-ask';
import { reregisterGeneralAssist, reregisterScreenshotAssist } from '../modules/tray';
import {
@@ -205,9 +205,9 @@ export function registerIpcHandlers(): void {
ipcMain.handle(
IPC_CHANNELS.READ_AGENT_LOCAL_FILE_TEXT,
- async (_event, virtualPath: string, searchSpaceId?: number | null) => {
+ async (_event, virtualPath: string, workspaceId?: number | null) => {
try {
- const result = await readAgentLocalFileText(virtualPath, searchSpaceId);
+ const result = await readAgentLocalFileText(virtualPath, workspaceId);
return { ok: true, path: result.path, content: result.content };
} catch (error) {
const message = error instanceof Error ? error.message : 'Failed to read local file';
@@ -218,9 +218,9 @@ export function registerIpcHandlers(): void {
ipcMain.handle(
IPC_CHANNELS.WRITE_AGENT_LOCAL_FILE_TEXT,
- async (_event, virtualPath: string, content: string, searchSpaceId?: number | null) => {
+ async (_event, virtualPath: string, content: string, workspaceId?: number | null) => {
try {
- const result = await writeAgentLocalFileText(virtualPath, content, searchSpaceId);
+ const result = await writeAgentLocalFileText(virtualPath, content, workspaceId);
return { ok: true, path: result.path };
} catch (error) {
const message = error instanceof Error ? error.message : 'Failed to write local file';
@@ -321,10 +321,10 @@ export function registerIpcHandlers(): void {
},
);
- ipcMain.handle(IPC_CHANNELS.GET_ACTIVE_SEARCH_SPACE, () => getActiveSearchSpaceId());
+ ipcMain.handle(IPC_CHANNELS.GET_ACTIVE_WORKSPACE, () => getActiveWorkspaceId());
- ipcMain.handle(IPC_CHANNELS.SET_ACTIVE_SEARCH_SPACE, (_event, id: string) =>
- setActiveSearchSpaceId(id)
+ ipcMain.handle(IPC_CHANNELS.SET_ACTIVE_WORKSPACE, (_event, id: string) =>
+ setActiveWorkspaceId(id)
);
ipcMain.handle(IPC_CHANNELS.SET_SHORTCUTS, async (_event, config: Partial) => {
@@ -370,12 +370,12 @@ export function registerIpcHandlers(): void {
};
});
- ipcMain.handle(IPC_CHANNELS.AGENT_FILESYSTEM_GET_SETTINGS, (_event, searchSpaceId?: number | null) =>
- getAgentFilesystemSettings(searchSpaceId)
+ ipcMain.handle(IPC_CHANNELS.AGENT_FILESYSTEM_GET_SETTINGS, (_event, workspaceId?: number | null) =>
+ getAgentFilesystemSettings(workspaceId)
);
- ipcMain.handle(IPC_CHANNELS.AGENT_FILESYSTEM_GET_MOUNTS, (_event, searchSpaceId?: number | null) =>
- getAgentFilesystemMounts(searchSpaceId)
+ ipcMain.handle(IPC_CHANNELS.AGENT_FILESYSTEM_GET_MOUNTS, (_event, workspaceId?: number | null) =>
+ getAgentFilesystemMounts(workspaceId)
);
ipcMain.handle(
@@ -384,7 +384,7 @@ export function registerIpcHandlers(): void {
_event,
options: {
rootPath: string;
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
excludePatterns?: string[] | null;
fileExtensions?: string[] | null;
}
@@ -397,10 +397,10 @@ export function registerIpcHandlers(): void {
(
_event,
payload: {
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
settings: { mode?: 'cloud' | 'desktop_local_folder'; localRootPaths?: string[] | null };
}
- ) => setAgentFilesystemSettings(payload?.searchSpaceId, payload?.settings ?? {})
+ ) => setAgentFilesystemSettings(payload?.workspaceId, payload?.settings ?? {})
);
ipcMain.handle(IPC_CHANNELS.AGENT_FILESYSTEM_PICK_ROOT, () =>
@@ -415,7 +415,7 @@ export function registerIpcHandlers(): void {
ipcMain.handle(
IPC_CHANNELS.AGENT_FILESYSTEM_TREE_WATCH_STOP,
- (_event, searchSpaceId?: number | null) =>
- stopAgentFilesystemTreeWatch(searchSpaceId)
+ (_event, workspaceId?: number | null) =>
+ stopAgentFilesystemTreeWatch(workspaceId)
);
}
diff --git a/surfsense_desktop/src/modules/active-search-space.ts b/surfsense_desktop/src/modules/active-search-space.ts
deleted file mode 100644
index e5f55c8f4..000000000
--- a/surfsense_desktop/src/modules/active-search-space.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-const STORE_KEY = 'activeSearchSpaceId';
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-let store: any = null;
-
-async function getStore() {
- if (!store) {
- const { default: Store } = await import('electron-store');
- store = new Store({
- name: 'active-search-space',
- defaults: { [STORE_KEY]: null as string | null },
- });
- }
- return store;
-}
-
-export async function getActiveSearchSpaceId(): Promise {
- const s = await getStore();
- return (s.get(STORE_KEY) as string | null) ?? null;
-}
-
-export async function setActiveSearchSpaceId(id: string): Promise {
- const s = await getStore();
- s.set(STORE_KEY, id);
-}
diff --git a/surfsense_desktop/src/modules/active-workspace.ts b/surfsense_desktop/src/modules/active-workspace.ts
new file mode 100644
index 000000000..059ff5aa4
--- /dev/null
+++ b/surfsense_desktop/src/modules/active-workspace.ts
@@ -0,0 +1,35 @@
+const STORE_KEY = 'activeWorkspaceId';
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+let store: any = null;
+
+async function getStore() {
+ if (!store) {
+ const { default: Store } = await import('electron-store');
+ store = new Store({
+ name: 'active-workspace',
+ defaults: { [STORE_KEY]: null as string | null },
+ });
+ // One-time migration from the legacy `active-search-space` store so the
+ // user's last-selected workspace survives the rename.
+ if (store.get(STORE_KEY) == null) {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ const legacy: any = new Store({
+ name: 'active-search-space',
+ defaults: { activeSearchSpaceId: null as string | null },
+ });
+ const prev = legacy.get('activeSearchSpaceId') as string | null;
+ if (prev != null) store.set(STORE_KEY, prev);
+ }
+ }
+ return store;
+}
+
+export async function getActiveWorkspaceId(): Promise {
+ const s = await getStore();
+ return (s.get(STORE_KEY) as string | null) ?? null;
+}
+
+export async function setActiveWorkspaceId(id: string): Promise {
+ const s = await getStore();
+ s.set(STORE_KEY, id);
+}
diff --git a/surfsense_desktop/src/modules/agent-filesystem-tree-watcher.ts b/surfsense_desktop/src/modules/agent-filesystem-tree-watcher.ts
index 600f84fd5..6235e0342 100644
--- a/surfsense_desktop/src/modules/agent-filesystem-tree-watcher.ts
+++ b/surfsense_desktop/src/modules/agent-filesystem-tree-watcher.ts
@@ -8,7 +8,7 @@ const SAFETY_POLL_MS = 60_000;
const EVENT_DEBOUNCE_MS = 700;
export type AgentFilesystemTreeWatchOptions = {
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
rootPaths: string[];
excludePatterns?: string[] | null;
fileExtensions?: string[] | null;
@@ -17,7 +17,7 @@ export type AgentFilesystemTreeWatchOptions = {
type TreeDirtyReason = 'watcher_event' | 'safety_poll';
type TreeDirtyEvent = {
- searchSpaceId: number | null;
+ workspaceId: number | null;
reason: TreeDirtyReason;
rootPath: string;
changedPath: string | null;
@@ -25,7 +25,7 @@ type TreeDirtyEvent = {
};
type WatchSession = {
- searchSpaceId: number | null;
+ workspaceId: number | null;
optionsSignature: string;
rootPaths: string[];
excludePatterns: string[];
@@ -40,15 +40,15 @@ type WatchSession = {
const sessions = new Map();
-function normalizeSearchSpaceId(searchSpaceId?: number | null): number | null {
- if (typeof searchSpaceId === 'number' && Number.isFinite(searchSpaceId) && searchSpaceId > 0) {
- return searchSpaceId;
+function normalizeWorkspaceId(workspaceId?: number | null): number | null {
+ if (typeof workspaceId === 'number' && Number.isFinite(workspaceId) && workspaceId > 0) {
+ return workspaceId;
}
return null;
}
-function getSessionKey(searchSpaceId?: number | null): string {
- const normalized = normalizeSearchSpaceId(searchSpaceId);
+function getSessionKey(workspaceId?: number | null): string {
+ const normalized = normalizeWorkspaceId(workspaceId);
return normalized === null ? 'default' : String(normalized);
}
@@ -71,13 +71,13 @@ function normalizeExtensions(value: string[] | null | undefined): string[] | nul
}
function buildOptionsSignature(
- searchSpaceId: number | null,
+ workspaceId: number | null,
rootPaths: string[],
excludePatterns: string[],
fileExtensions: string[] | null
): string {
return JSON.stringify({
- searchSpaceId,
+ workspaceId,
rootPaths: [...rootPaths].sort(),
excludePatterns: [...excludePatterns].sort(),
fileExtensions: fileExtensions ? [...fileExtensions].sort() : null,
@@ -99,10 +99,10 @@ async function buildRootSnapshotSignature(
rootPath: string
): Promise {
let hash = 2166136261;
- hash = hashText(`space:${session.searchSpaceId ?? 'default'}|root:${rootPath}`, hash);
+ hash = hashText(`space:${session.workspaceId ?? 'default'}|root:${rootPath}`, hash);
const files = await listAgentFilesystemFiles({
rootPath,
- searchSpaceId: session.searchSpaceId,
+ workspaceId: session.workspaceId,
excludePatterns: session.excludePatterns,
fileExtensions: session.fileExtensions,
});
@@ -118,13 +118,13 @@ async function buildRootSnapshotSignature(
}
function sendTreeDirtyEvent(
- searchSpaceId: number | null,
+ workspaceId: number | null,
reason: TreeDirtyReason,
rootPath: string,
changedPath: string | null
): void {
const payload: TreeDirtyEvent = {
- searchSpaceId,
+ workspaceId,
reason,
rootPath,
changedPath,
@@ -158,7 +158,7 @@ function scheduleDirtyEmit(
session.pendingDirtyByRoot.clear();
for (const [pendingRootPath, payload] of pending) {
sendTreeDirtyEvent(
- session.searchSpaceId,
+ session.workspaceId,
payload.reason,
pendingRootPath,
payload.changedPath
@@ -183,21 +183,21 @@ async function closeSession(session: WatchSession): Promise {
export async function startAgentFilesystemTreeWatch(
options: AgentFilesystemTreeWatchOptions
): Promise<{ ok: true }> {
- const searchSpaceId = normalizeSearchSpaceId(options.searchSpaceId);
+ const workspaceId = normalizeWorkspaceId(options.workspaceId);
const rootPaths = Array.from(
new Set(normalizeList(options.rootPaths).map((rootPath) => normalizeRootPath(rootPath)))
);
const excludePatterns = Array.from(new Set(normalizeList(options.excludePatterns)));
const fileExtensions = normalizeExtensions(options.fileExtensions);
- const sessionKey = getSessionKey(searchSpaceId);
+ const sessionKey = getSessionKey(workspaceId);
if (rootPaths.length === 0) {
- await stopAgentFilesystemTreeWatch(searchSpaceId);
+ await stopAgentFilesystemTreeWatch(workspaceId);
return { ok: true };
}
const optionsSignature = buildOptionsSignature(
- searchSpaceId,
+ workspaceId,
rootPaths,
excludePatterns,
fileExtensions
@@ -228,7 +228,7 @@ export async function startAgentFilesystemTreeWatch(
);
const session: WatchSession = {
- searchSpaceId,
+ workspaceId,
optionsSignature,
rootPaths,
excludePatterns,
@@ -291,9 +291,9 @@ export async function startAgentFilesystemTreeWatch(
}
export async function stopAgentFilesystemTreeWatch(
- searchSpaceId?: number | null
+ workspaceId?: number | null
): Promise<{ ok: true }> {
- const sessionKey = getSessionKey(searchSpaceId);
+ const sessionKey = getSessionKey(workspaceId);
const session = sessions.get(sessionKey);
if (!session) return { ok: true };
sessions.delete(sessionKey);
diff --git a/surfsense_desktop/src/modules/agent-filesystem.ts b/surfsense_desktop/src/modules/agent-filesystem.ts
index 608f8c4a4..7a24876f2 100644
--- a/surfsense_desktop/src/modules/agent-filesystem.ts
+++ b/surfsense_desktop/src/modules/agent-filesystem.ts
@@ -119,9 +119,9 @@ async function normalizeLocalRootPathsCanonical(paths: unknown): Promise 0) {
- return String(searchSpaceId);
+function normalizeWorkspaceKey(workspaceId?: number | null): string {
+ if (typeof workspaceId === "number" && Number.isFinite(workspaceId) && workspaceId > 0) {
+ return String(workspaceId);
}
return DEFAULT_SPACE_KEY;
}
@@ -147,9 +147,9 @@ function getDefaultStore(): AgentFilesystemSettingsStore {
function getSettingsFromStore(
store: AgentFilesystemSettingsStore,
- searchSpaceId?: number | null
+ workspaceId?: number | null
): AgentFilesystemSettings {
- const key = normalizeSearchSpaceKey(searchSpaceId);
+ const key = normalizeWorkspaceKey(workspaceId);
return store.spaces[key] ?? getDefaultSettings();
}
@@ -194,22 +194,22 @@ async function loadAgentFilesystemSettingsStore(): Promise {
const store = await loadAgentFilesystemSettingsStore();
- return getSettingsFromStore(store, searchSpaceId);
+ return getSettingsFromStore(store, workspaceId);
}
export async function setAgentFilesystemSettings(
- searchSpaceId: number | null | undefined,
+ workspaceId: number | null | undefined,
settings: {
mode?: AgentFilesystemMode;
localRootPaths?: string[] | null;
}
): Promise {
const store = await loadAgentFilesystemSettingsStore();
- const key = normalizeSearchSpaceKey(searchSpaceId);
- const current = getSettingsFromStore(store, searchSpaceId);
+ const key = normalizeWorkspaceKey(workspaceId);
+ const current = getSettingsFromStore(store, workspaceId);
const nextMode =
settings.mode === "cloud" || settings.mode === "desktop_local_folder"
? settings.mode
@@ -291,7 +291,7 @@ export type LocalRootMount = {
export type AgentFilesystemListOptions = {
rootPath: string;
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
excludePatterns?: string[] | null;
fileExtensions?: string[] | null;
};
@@ -332,9 +332,9 @@ function buildRootMounts(rootPaths: string[]): LocalRootMount[] {
}
export async function getAgentFilesystemMounts(
- searchSpaceId?: number | null
+ workspaceId?: number | null
): Promise {
- const rootPaths = await resolveCurrentRootPaths(searchSpaceId);
+ const rootPaths = await resolveCurrentRootPaths(workspaceId);
return buildRootMounts(rootPaths);
}
@@ -371,7 +371,7 @@ function normalizeExcludeSet(excludePatterns: string[] | null | undefined): Set<
export async function listAgentFilesystemFiles(
options: AgentFilesystemListOptions
): Promise {
- const allowedRootPaths = await resolveCurrentRootPaths(options.searchSpaceId);
+ const allowedRootPaths = await resolveCurrentRootPaths(options.workspaceId);
const requestedRootPath = await canonicalizeRootPath(options.rootPath);
const normalizedRequestedRoot = normalizeComparablePath(requestedRootPath);
const allowedRoots = new Set(
@@ -474,8 +474,8 @@ function toMountedVirtualPath(mount: string, rootPath: string, absolutePath: str
return `/${mount}${relativePath}`;
}
-async function resolveCurrentRootPaths(searchSpaceId?: number | null): Promise {
- const settings = await getAgentFilesystemSettings(searchSpaceId);
+async function resolveCurrentRootPaths(workspaceId?: number | null): Promise {
+ const settings = await getAgentFilesystemSettings(workspaceId);
if (settings.localRootPaths.length === 0) {
throw new Error("No local filesystem roots selected");
}
@@ -484,9 +484,9 @@ async function resolveCurrentRootPaths(searchSpaceId?: number | null): Promise {
- const rootPaths = await resolveCurrentRootPaths(searchSpaceId);
+ const rootPaths = await resolveCurrentRootPaths(workspaceId);
const mounts = buildRootMounts(rootPaths);
const { mount, subPath } = parseMountedVirtualPath(virtualPath, mounts);
const rootMount = findMountByName(mounts, mount);
@@ -507,9 +507,9 @@ export async function readAgentLocalFileText(
export async function writeAgentLocalFileText(
virtualPath: string,
content: string,
- searchSpaceId?: number | null
+ workspaceId?: number | null
): Promise<{ path: string }> {
- const rootPaths = await resolveCurrentRootPaths(searchSpaceId);
+ const rootPaths = await resolveCurrentRootPaths(workspaceId);
const mounts = buildRootMounts(rootPaths);
const { mount, subPath } = parseMountedVirtualPath(virtualPath, mounts);
const rootMount = findMountByName(mounts, mount);
diff --git a/surfsense_desktop/src/modules/folder-watcher.ts b/surfsense_desktop/src/modules/folder-watcher.ts
index ee4214d8a..4115b8db5 100644
--- a/surfsense_desktop/src/modules/folder-watcher.ts
+++ b/surfsense_desktop/src/modules/folder-watcher.ts
@@ -5,6 +5,7 @@ import * as path from 'path';
import * as fs from 'fs';
import { IPC_CHANNELS } from '../ipc/channels';
import { trackEvent } from './analytics';
+import { migrateWatchedFolderConfigs } from './migrate-watched-folders';
export interface WatchedFolderConfig {
path: string;
@@ -12,7 +13,7 @@ export interface WatchedFolderConfig {
excludePatterns: string[];
fileExtensions: string[] | null;
rootFolderId: number | null;
- searchSpaceId: number;
+ workspaceId: number;
active: boolean;
}
@@ -27,7 +28,7 @@ type FolderSyncAction = 'add' | 'change' | 'unlink';
export interface FolderSyncFileChangedEvent {
id: string;
rootFolderId: number | null;
- searchSpaceId: number;
+ workspaceId: number;
folderPath: string;
folderName: string;
relativePath: string;
@@ -68,6 +69,12 @@ async function getStore() {
[STORE_KEY]: [] as WatchedFolderConfig[],
},
});
+ // One-time read-migration: legacy persisted configs stored the workspace as
+ // `searchSpaceId`. Map it to `workspaceId` and write back once so existing
+ // watched folders keep their sync target after the rename.
+ const raw = store.get(STORE_KEY, []) as Array>;
+ const { configs, migrated } = migrateWatchedFolderConfigs(raw);
+ if (migrated) store.set(STORE_KEY, configs);
}
return store;
}
@@ -267,7 +274,7 @@ async function startWatcher(config: WatchedFolderConfig) {
if (storedMtime === undefined) {
sendFileChangedEvent({
rootFolderId: config.rootFolderId,
- searchSpaceId: config.searchSpaceId,
+ workspaceId: config.workspaceId,
folderPath: config.path,
folderName: config.name,
relativePath: rel,
@@ -278,7 +285,7 @@ async function startWatcher(config: WatchedFolderConfig) {
} else if (Math.abs(currentMtime - storedMtime) >= MTIME_TOLERANCE_S * 1000) {
sendFileChangedEvent({
rootFolderId: config.rootFolderId,
- searchSpaceId: config.searchSpaceId,
+ workspaceId: config.workspaceId,
folderPath: config.path,
folderName: config.name,
relativePath: rel,
@@ -295,7 +302,7 @@ async function startWatcher(config: WatchedFolderConfig) {
if (!(rel in currentMap)) {
sendFileChangedEvent({
rootFolderId: config.rootFolderId,
- searchSpaceId: config.searchSpaceId,
+ workspaceId: config.workspaceId,
folderPath: config.path,
folderName: config.name,
relativePath: rel,
@@ -346,7 +353,7 @@ async function startWatcher(config: WatchedFolderConfig) {
sendFileChangedEvent({
rootFolderId: config.rootFolderId,
- searchSpaceId: config.searchSpaceId,
+ workspaceId: config.workspaceId,
folderPath: config.path,
folderName: config.name,
relativePath,
@@ -403,7 +410,7 @@ export async function addWatchedFolder(
}
trackEvent('desktop_folder_watch_added', {
- search_space_id: config.searchSpaceId,
+ workspace_id: config.workspaceId,
root_folder_id: config.rootFolderId,
active: config.active,
has_exclude_patterns: (config.excludePatterns?.length ?? 0) > 0,
@@ -431,7 +438,7 @@ export async function removeWatchedFolder(
if (removed) {
trackEvent('desktop_folder_watch_removed', {
- search_space_id: removed.searchSpaceId,
+ workspace_id: removed.workspaceId,
root_folder_id: removed.rootFolderId,
});
}
diff --git a/surfsense_desktop/src/modules/migrate-watched-folders.test.ts b/surfsense_desktop/src/modules/migrate-watched-folders.test.ts
new file mode 100644
index 000000000..cd7b3623f
--- /dev/null
+++ b/surfsense_desktop/src/modules/migrate-watched-folders.test.ts
@@ -0,0 +1,21 @@
+import assert from "node:assert/strict";
+import { test } from "node:test";
+import { migrateWatchedFolderConfigs } from "./migrate-watched-folders.ts";
+
+// Run with: node --test src/modules/migrate-watched-folders.test.ts
+test("maps legacy searchSpaceId to workspaceId and flags migration", () => {
+ const { configs, migrated } = migrateWatchedFolderConfigs<{ workspaceId?: number }>([
+ { path: "/tmp/a", searchSpaceId: 42 },
+ ]);
+ assert.equal(migrated, true);
+ assert.equal(configs[0].workspaceId, 42);
+ assert.equal("searchSpaceId" in (configs[0] as object), false);
+});
+
+test("leaves configs that already have workspaceId untouched", () => {
+ const { configs, migrated } = migrateWatchedFolderConfigs<{ workspaceId?: number }>([
+ { path: "/tmp/b", workspaceId: 5 },
+ ]);
+ assert.equal(migrated, false);
+ assert.equal(configs[0].workspaceId, 5);
+});
diff --git a/surfsense_desktop/src/modules/migrate-watched-folders.ts b/surfsense_desktop/src/modules/migrate-watched-folders.ts
new file mode 100644
index 000000000..2aa30fcd3
--- /dev/null
+++ b/surfsense_desktop/src/modules/migrate-watched-folders.ts
@@ -0,0 +1,23 @@
+/**
+ * One-time read-migration for persisted watched-folder configs: legacy configs
+ * stored the workspace as `searchSpaceId`. Map it to `workspaceId` so existing
+ * watched folders keep their sync target after the rename. Pure + dependency-free
+ * so it can be unit-checked without loading electron-store.
+ *
+ * Returns the migrated configs and whether anything changed (so callers can
+ * write back only when needed).
+ */
+export function migrateWatchedFolderConfigs(
+ raw: Array>
+): { configs: T[]; migrated: boolean } {
+ let migrated = false;
+ const configs = raw.map((c) => {
+ if (c.workspaceId === undefined && c.searchSpaceId !== undefined) {
+ migrated = true;
+ const { searchSpaceId, ...rest } = c;
+ return { ...rest, workspaceId: searchSpaceId } as unknown as T;
+ }
+ return c as unknown as T;
+ });
+ return { configs, migrated };
+}
diff --git a/surfsense_desktop/src/modules/quick-ask.ts b/surfsense_desktop/src/modules/quick-ask.ts
index 0807e2e08..4b48a3d19 100644
--- a/surfsense_desktop/src/modules/quick-ask.ts
+++ b/surfsense_desktop/src/modules/quick-ask.ts
@@ -4,14 +4,14 @@ import { IPC_CHANNELS } from '../ipc/channels';
import { checkAccessibilityPermission, getFrontmostApp, simulateCopy, simulatePaste } from './platform';
import { getServerOrigin } from './server';
import { getShortcuts } from './shortcuts';
-import { getActiveSearchSpaceId } from './active-search-space';
+import { getActiveWorkspaceId } from './active-workspace';
import { trackEvent } from './analytics';
let currentShortcut = '';
let quickAskWindow: BrowserWindow | null = null;
let pendingText = '';
let pendingMode = '';
-let pendingSearchSpaceId: string | null = null;
+let pendingWorkspaceId: string | null = null;
let sourceApp = '';
let savedClipboard = '';
@@ -57,7 +57,7 @@ function createQuickAskWindow(x: number, y: number): BrowserWindow {
skipTaskbar: true,
});
- const spaceId = pendingSearchSpaceId;
+ const spaceId = pendingWorkspaceId;
const route = spaceId ? `/dashboard/${spaceId}/new-chat` : '/dashboard';
quickAskWindow.loadURL(`${getServerOrigin()}${route}?quickAssist=true`);
@@ -87,7 +87,7 @@ function createQuickAskWindow(x: number, y: number): BrowserWindow {
async function openQuickAsk(text: string): Promise {
pendingText = text;
pendingMode = 'quick-assist';
- pendingSearchSpaceId = await getActiveSearchSpaceId();
+ pendingWorkspaceId = await getActiveWorkspaceId();
const cursor = screen.getCursorScreenPoint();
const pos = clampToScreen(cursor.x, cursor.y, 450, 750);
createQuickAskWindow(pos.x, pos.y);
diff --git a/surfsense_desktop/src/modules/window.ts b/surfsense_desktop/src/modules/window.ts
index bfcd9b512..3ab47fb58 100644
--- a/surfsense_desktop/src/modules/window.ts
+++ b/surfsense_desktop/src/modules/window.ts
@@ -3,7 +3,7 @@ import path from 'path';
import { trackEvent } from './analytics';
import { showErrorDialog } from './errors';
import { getServerOrigin, getServerPort } from './server';
-import { setActiveSearchSpaceId } from './active-search-space';
+import { setActiveWorkspaceId } from './active-workspace';
const isDev = !app.isPackaged;
const isMac = process.platform === 'darwin';
@@ -140,14 +140,14 @@ export function createMainWindow(initialPath = '/dashboard'): BrowserWindow {
});
// Auto-sync active search space from URL navigation
- const syncSearchSpace = (url: string) => {
+ const syncWorkspace = (url: string) => {
const match = url.match(/\/dashboard\/(\d+)/);
if (match) {
- setActiveSearchSpaceId(match[1]);
+ setActiveWorkspaceId(match[1]);
}
};
- mainWindow.webContents.on('did-navigate', (_event, url) => syncSearchSpace(url));
- mainWindow.webContents.on('did-navigate-in-page', (_event, url) => syncSearchSpace(url));
+ mainWindow.webContents.on('did-navigate', (_event, url) => syncWorkspace(url));
+ mainWindow.webContents.on('did-navigate-in-page', (_event, url) => syncWorkspace(url));
if (isDev) {
mainWindow.webContents.openDevTools();
diff --git a/surfsense_desktop/src/preload.ts b/surfsense_desktop/src/preload.ts
index 07f363a59..96079d241 100644
--- a/surfsense_desktop/src/preload.ts
+++ b/surfsense_desktop/src/preload.ts
@@ -74,10 +74,10 @@ contextBridge.exposeInMainWorld('electronAPI', {
// Browse files via native dialog
browseFiles: () => ipcRenderer.invoke(IPC_CHANNELS.BROWSE_FILES),
readLocalFiles: (paths: string[]) => ipcRenderer.invoke(IPC_CHANNELS.READ_LOCAL_FILES, paths),
- readAgentLocalFileText: (virtualPath: string, searchSpaceId?: number | null) =>
- ipcRenderer.invoke(IPC_CHANNELS.READ_AGENT_LOCAL_FILE_TEXT, virtualPath, searchSpaceId),
- writeAgentLocalFileText: (virtualPath: string, content: string, searchSpaceId?: number | null) =>
- ipcRenderer.invoke(IPC_CHANNELS.WRITE_AGENT_LOCAL_FILE_TEXT, virtualPath, content, searchSpaceId),
+ readAgentLocalFileText: (virtualPath: string, workspaceId?: number | null) =>
+ ipcRenderer.invoke(IPC_CHANNELS.READ_AGENT_LOCAL_FILE_TEXT, virtualPath, workspaceId),
+ writeAgentLocalFileText: (virtualPath: string, content: string, workspaceId?: number | null) =>
+ ipcRenderer.invoke(IPC_CHANNELS.WRITE_AGENT_LOCAL_FILE_TEXT, virtualPath, content, workspaceId),
// Auth token sync across windows
getAccessToken: () => ipcRenderer.invoke(IPC_CHANNELS.GET_ACCESS_TOKEN),
@@ -104,9 +104,9 @@ contextBridge.exposeInMainWorld('electronAPI', {
ipcRenderer.invoke(IPC_CHANNELS.SET_AUTO_LAUNCH, { enabled, openAsHidden }),
// Active search space
- getActiveSearchSpace: () => ipcRenderer.invoke(IPC_CHANNELS.GET_ACTIVE_SEARCH_SPACE),
- setActiveSearchSpace: (id: string) =>
- ipcRenderer.invoke(IPC_CHANNELS.SET_ACTIVE_SEARCH_SPACE, id),
+ getActiveWorkspace: () => ipcRenderer.invoke(IPC_CHANNELS.GET_ACTIVE_WORKSPACE),
+ setActiveWorkspace: (id: string) =>
+ ipcRenderer.invoke(IPC_CHANNELS.SET_ACTIVE_WORKSPACE, id),
// Analytics bridge — lets posthog-js running inside the Next.js renderer
// mirror identify/reset/capture into the Electron main-process PostHog
@@ -118,27 +118,27 @@ contextBridge.exposeInMainWorld('electronAPI', {
ipcRenderer.invoke(IPC_CHANNELS.ANALYTICS_CAPTURE, { event, properties }),
getAnalyticsContext: () => ipcRenderer.invoke(IPC_CHANNELS.ANALYTICS_GET_CONTEXT),
// Agent filesystem mode
- getAgentFilesystemSettings: (searchSpaceId?: number | null) =>
- ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_GET_SETTINGS, searchSpaceId),
- getAgentFilesystemMounts: (searchSpaceId?: number | null) =>
- ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_GET_MOUNTS, searchSpaceId),
+ getAgentFilesystemSettings: (workspaceId?: number | null) =>
+ ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_GET_SETTINGS, workspaceId),
+ getAgentFilesystemMounts: (workspaceId?: number | null) =>
+ ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_GET_MOUNTS, workspaceId),
listAgentFilesystemFiles: (options: {
rootPath: string;
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
excludePatterns?: string[] | null;
fileExtensions?: string[] | null;
}) => ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_LIST_FILES, options),
startAgentFilesystemTreeWatch: (options: {
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
rootPaths: string[];
excludePatterns?: string[] | null;
fileExtensions?: string[] | null;
}) => ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_TREE_WATCH_START, options),
- stopAgentFilesystemTreeWatch: (searchSpaceId?: number | null) =>
- ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_TREE_WATCH_STOP, searchSpaceId),
+ stopAgentFilesystemTreeWatch: (workspaceId?: number | null) =>
+ ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_TREE_WATCH_STOP, workspaceId),
onAgentFilesystemTreeDirty: (
callback: (data: {
- searchSpaceId: number | null;
+ workspaceId: number | null;
reason: 'watcher_event' | 'safety_poll';
rootPath: string;
changedPath: string | null;
@@ -148,7 +148,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
const listener = (
_event: unknown,
data: {
- searchSpaceId: number | null;
+ workspaceId: number | null;
reason: 'watcher_event' | 'safety_poll';
rootPath: string;
changedPath: string | null;
@@ -163,7 +163,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
setAgentFilesystemSettings: (settings: {
mode?: "cloud" | "desktop_local_folder";
localRootPaths?: string[] | null;
- }, searchSpaceId?: number | null) =>
- ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_SET_SETTINGS, { searchSpaceId, settings }),
+ }, workspaceId?: number | null) =>
+ ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_SET_SETTINGS, { workspaceId, settings }),
pickAgentFilesystemRoot: () => ipcRenderer.invoke(IPC_CHANNELS.AGENT_FILESYSTEM_PICK_ROOT),
});
diff --git a/surfsense_desktop/tsconfig.json b/surfsense_desktop/tsconfig.json
index a7862e222..4315c7571 100644
--- a/surfsense_desktop/tsconfig.json
+++ b/surfsense_desktop/tsconfig.json
@@ -12,5 +12,5 @@
"noEmit": true
},
"include": ["src/**/*.ts"],
- "exclude": ["node_modules", "dist", "scripts"]
+ "exclude": ["node_modules", "dist", "scripts", "src/**/*.test.ts"]
}
diff --git a/surfsense_obsidian/README.md b/surfsense_obsidian/README.md
index 6c4befcc9..52d88ab90 100644
--- a/surfsense_obsidian/README.md
+++ b/surfsense_obsidian/README.md
@@ -52,7 +52,7 @@ Open **Settings → SurfSense** in Obsidian and fill in:
| --- | --- |
| Server URL | `https://surfsense.com` for SurfSense Cloud, or your self-hosted URL |
| API token | Create a personal access token from the *Connectors → Obsidian* dialog or *User settings → API access* in the SurfSense web app |
-| Search space | Pick the search space this vault should sync into |
+| Search space | Pick the workspace this vault should sync into |
| Vault name | Defaults to your Obsidian vault name; rename if you have multiple vaults |
| Sync mode | *Auto* (recommended) or *Manual* |
| Exclude patterns | Glob patterns of folders/files to skip (e.g. `.trash`, `_attachments`, `templates/**`) |
@@ -82,7 +82,7 @@ addendum.
- `vault_id`: a random UUID minted in the plugin's `data.json` on first run
- `vault_name`: the Obsidian vault folder name
-- `search_space_id`: the SurfSense search space you picked
+- `workspace_id`: the SurfSense workspace you picked
**Sent per note on `/sync`, `/rename`, `/delete`:**
diff --git a/surfsense_obsidian/pnpm-lock.yaml b/surfsense_obsidian/pnpm-lock.yaml
new file mode 100644
index 000000000..92b269675
--- /dev/null
+++ b/surfsense_obsidian/pnpm-lock.yaml
@@ -0,0 +1,3153 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ obsidian:
+ specifier: latest
+ version: 1.13.1(@codemirror/state@6.5.0)(@codemirror/view@6.38.6)
+ devDependencies:
+ '@eslint/js':
+ specifier: 9.30.1
+ version: 9.30.1
+ '@types/node':
+ specifier: ^20.19.39
+ version: 20.19.43
+ esbuild:
+ specifier: 0.25.5
+ version: 0.25.5
+ eslint-plugin-obsidianmd:
+ specifier: 0.1.9
+ version: 0.1.9(@eslint/js@9.30.1)(@eslint/json@0.14.0)(@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(obsidian@1.13.1(@codemirror/state@6.5.0)(@codemirror/view@6.38.6))(typescript-eslint@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))
+ globals:
+ specifier: 14.0.0
+ version: 14.0.0
+ jiti:
+ specifier: 2.6.1
+ version: 2.6.1
+ tslib:
+ specifier: 2.4.0
+ version: 2.4.0
+ typescript:
+ specifier: ^5.8.3
+ version: 5.9.3
+ typescript-eslint:
+ specifier: 8.35.1
+ version: 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+
+packages:
+
+ '@codemirror/state@6.5.0':
+ resolution: {integrity: sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==}
+
+ '@codemirror/view@6.38.6':
+ resolution: {integrity: sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==}
+
+ '@esbuild/aix-ppc64@0.25.5':
+ resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.5':
+ resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.5':
+ resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.5':
+ resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.25.5':
+ resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.5':
+ resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.25.5':
+ resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.5':
+ resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.25.5':
+ resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.5':
+ resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.5':
+ resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.5':
+ resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.5':
+ resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.5':
+ resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.5':
+ resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.5':
+ resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.5':
+ resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.5':
+ resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.5':
+ resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.5':
+ resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.5':
+ resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.25.5':
+ resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.25.5':
+ resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.5':
+ resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.5':
+ resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.9.1':
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.21.2':
+ resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.5':
+ resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.30.1':
+ resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.39.4':
+ resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/json@0.14.0':
+ resolution: {integrity: sha512-rvR/EZtvUG3p9uqrSmcDJPYSH7atmWr0RnFWN6m917MAPx82+zQgPUmDu0whPFG6XTyM0vB/hR6c1Q63OaYtCQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.7':
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@humanfs/core@0.19.2':
+ resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.8':
+ resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/types@0.15.0':
+ resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/momoa@3.3.10':
+ resolution: {integrity: sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==}
+ engines: {node: '>=18'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@marijn/find-cluster-break@1.0.3':
+ resolution: {integrity: sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==}
+
+ '@microsoft/eslint-plugin-sdl@1.1.0':
+ resolution: {integrity: sha512-dxdNHOemLnBhfY3eByrujX9KyLigcNtW8sU+axzWv5nLGcsSBeKW2YYyTpfPo1hV8YPOmIGnfA4fZHyKVtWqBQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ eslint: ^9
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@pkgr/core@0.1.2':
+ resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+ '@types/codemirror@5.60.8':
+ resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==}
+
+ '@types/eslint@8.56.2':
+ resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/node@20.12.12':
+ resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==}
+
+ '@types/node@20.19.43':
+ resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==}
+
+ '@types/tern@0.23.9':
+ resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==}
+
+ '@typescript-eslint/eslint-plugin@8.35.1':
+ resolution: {integrity: sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.35.1
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/parser@8.35.1':
+ resolution: {integrity: sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/project-service@8.35.1':
+ resolution: {integrity: sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/scope-manager@8.35.1':
+ resolution: {integrity: sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.35.1':
+ resolution: {integrity: sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/type-utils@8.35.1':
+ resolution: {integrity: sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/types@8.35.1':
+ resolution: {integrity: sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.35.1':
+ resolution: {integrity: sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/utils@8.35.1':
+ resolution: {integrity: sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ '@typescript-eslint/visitor-keys@8.35.1':
+ resolution: {integrity: sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.17.0:
+ resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
+
+ ajv@8.20.0:
+ resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-includes@3.1.9:
+ resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlastindex@1.2.6:
+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ brace-expansion@1.1.15:
+ resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==}
+
+ brace-expansion@2.1.1:
+ resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.9:
+ resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ crelt@1.0.7:
+ resolution: {integrity: sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ empathic@2.0.1:
+ resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==}
+ engines: {node: '>=14'}
+
+ enhanced-resolve@5.24.1:
+ resolution: {integrity: sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==}
+ engines: {node: '>=10.13.0'}
+
+ es-abstract-get@1.0.0:
+ resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==}
+ engines: {node: '>= 0.4'}
+
+ es-abstract@1.24.2:
+ resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-iterator-helpers@1.3.3:
+ resolution: {integrity: sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.2:
+ resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+ engines: {node: '>= 0.4'}
+
+ es-to-primitive@1.3.4:
+ resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.25.5:
+ resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-compat-utils@0.5.1:
+ resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ eslint-import-resolver-node@0.3.10:
+ resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==}
+
+ eslint-module-utils@2.14.0:
+ resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-depend@1.3.1:
+ resolution: {integrity: sha512-1uo2rFAr9vzNrCYdp7IBZRB54LiyVxfaIso0R6/QV3t6Dax6DTbW/EV2Hktf0f4UtmGHK8UyzJWI382pwW04jw==}
+
+ eslint-plugin-es-x@7.8.0:
+ resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=8'
+
+ eslint-plugin-import@2.32.0:
+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-json-schema-validator@5.1.0:
+ resolution: {integrity: sha512-ZmVyxRIjm58oqe2kTuy90PpmZPrrKvOjRPXKzq8WCgRgAkidCgm5X8domL2KSfadZ3QFAmifMgGTcVNhZ5ez2g==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ eslint-plugin-n@17.10.3:
+ resolution: {integrity: sha512-ySZBfKe49nQZWR1yFaA0v/GsH6Fgp8ah6XV0WDz6CN8WO0ek4McMzb7A2xnf4DCYV43frjCygvb9f/wx7UUxRw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: '>=8.23.0'
+
+ eslint-plugin-obsidianmd@0.1.9:
+ resolution: {integrity: sha512-/gyo5vky3Y7re4BtT/8MQbHU5Wes4o6VRqas3YmXE7aTCnMsdV0kfzV1GDXJN9Hrsc9UQPoeKUMiapKL0aGE4g==}
+ engines: {node: '>= 18'}
+ hasBin: true
+ peerDependencies:
+ '@eslint/js': ^9.30.1
+ '@eslint/json': 0.14.0
+ eslint: '>=9.0.0 <10.0.0'
+ obsidian: 1.8.7
+ typescript-eslint: ^8.35.1
+
+ eslint-plugin-react@7.37.3:
+ resolution: {integrity: sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+
+ eslint-plugin-security@1.4.0:
+ resolution: {integrity: sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==}
+
+ eslint-plugin-security@2.1.1:
+ resolution: {integrity: sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w==}
+
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.39.4:
+ resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-uri@3.1.3:
+ resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==}
+
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.4.2:
+ resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.2.0:
+ resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+ engines: {node: '>= 0.4'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.14.0:
+ resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@15.15.0:
+ resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.4:
+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
+ engines: {node: '>= 0.4'}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.2:
+ resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-document.all@1.0.0:
+ resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ iterator.prototype@1.1.5:
+ resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
+ engines: {node: '>= 0.4'}
+
+ jiti@2.6.1:
+ resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.3.0:
+ resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-migrate@2.0.0:
+ resolution: {integrity: sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ jsonc-eslint-parser@2.4.2:
+ resolution: {integrity: sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+
+ minimatch@8.0.7:
+ resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimatch@9.0.9:
+ resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ module-replacements@2.11.0:
+ resolution: {integrity: sha512-j5sNQm3VCpQQ7nTqGeOZtoJtV3uKERgCBm9QRhmGRiXiqkf7iRFOkfxdJRZWLkqYY8PNf4cDQF/WfXUYLENrRA==}
+
+ moment@2.29.4:
+ resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ node-exports-info@1.6.2:
+ resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==}
+ engines: {node: '>= 0.4'}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.entries@1.1.9:
+ resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+ engines: {node: '>= 0.4'}
+
+ obsidian@1.13.1:
+ resolution: {integrity: sha512-qtTEA2pmhJzhuhJqzbBFRYhpIOqvW+krDYjtFynv66KbxBbumHBlsJfWw3I4jtnK/6fZwbQhCrmmDdRwXmX56w==}
+ peerDependencies:
+ '@codemirror/state': 6.5.0
+ '@codemirror/view': 6.38.6
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ regexp-tree@0.1.27:
+ resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+ hasBin: true
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@2.0.0-next.7:
+ resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ ret@0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+ engines: {node: '>=0.12'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-array-concat@1.1.4:
+ resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex@1.1.0:
+ resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
+
+ safe-regex@2.1.1:
+ resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel-list@1.0.1:
+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.1:
+ resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
+ engines: {node: '>= 0.4'}
+
+ stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.matchall@4.0.12:
+ resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.repeat@1.0.0:
+ resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
+
+ string.prototype.trim@1.2.11:
+ resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.10:
+ resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ style-mod@4.1.3:
+ resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ synckit@0.9.3:
+ resolution: {integrity: sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+ engines: {node: '>=6'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toml-eslint-parser@0.9.3:
+ resolution: {integrity: sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ ts-api-utils@2.5.0:
+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@2.4.0:
+ resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tunnel-agent@0.6.0:
+ resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.8:
+ resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==}
+ engines: {node: '>= 0.4'}
+
+ typescript-eslint@8.35.1:
+ resolution: {integrity: sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.9.0'
+
+ typescript@5.4.5:
+ resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ w3c-keyname@2.2.8:
+ resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.22:
+ resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ yaml-eslint-parser@1.3.2:
+ resolution: {integrity: sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+
+ yaml@2.9.0:
+ resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ '@codemirror/state@6.5.0':
+ dependencies:
+ '@marijn/find-cluster-break': 1.0.3
+
+ '@codemirror/view@6.38.6':
+ dependencies:
+ '@codemirror/state': 6.5.0
+ crelt: 1.0.7
+ style-mod: 4.1.3
+ w3c-keyname: 2.2.8
+
+ '@esbuild/aix-ppc64@0.25.5':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.5':
+ optional: true
+
+ '@esbuild/android-arm@0.25.5':
+ optional: true
+
+ '@esbuild/android-x64@0.25.5':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.5':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.5':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.5':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.5':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.5':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.5':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.5':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.5':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.5':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.5':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.5':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.5':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.5':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.5':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.5':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.5':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.5':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.5':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.5':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.5':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.5':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))':
+ dependencies:
+ eslint: 9.39.4(jiti@2.6.1)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint/config-array@0.21.2':
+ dependencies:
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3
+ minimatch: 3.1.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.4.2':
+ dependencies:
+ '@eslint/core': 0.17.0
+
+ '@eslint/core@0.17.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.5':
+ dependencies:
+ ajv: 6.15.0
+ debug: 4.4.3
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.3.0
+ minimatch: 3.1.5
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.30.1': {}
+
+ '@eslint/js@9.39.4': {}
+
+ '@eslint/json@0.14.0':
+ dependencies:
+ '@eslint/core': 0.17.0
+ '@eslint/plugin-kit': 0.4.1
+ '@humanwhocodes/momoa': 3.3.10
+ natural-compare: 1.4.0
+
+ '@eslint/object-schema@2.1.7': {}
+
+ '@eslint/plugin-kit@0.4.1':
+ dependencies:
+ '@eslint/core': 0.17.0
+ levn: 0.4.1
+
+ '@humanfs/core@0.19.2':
+ dependencies:
+ '@humanfs/types': 0.15.0
+
+ '@humanfs/node@0.16.8':
+ dependencies:
+ '@humanfs/core': 0.19.2
+ '@humanfs/types': 0.15.0
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanfs/types@0.15.0': {}
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/momoa@3.3.10': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@marijn/find-cluster-break@1.0.3': {}
+
+ '@microsoft/eslint-plugin-sdl@1.1.0(eslint@9.39.4(jiti@2.6.1))':
+ dependencies:
+ eslint: 9.39.4(jiti@2.6.1)
+ eslint-plugin-n: 17.10.3(eslint@9.39.4(jiti@2.6.1))
+ eslint-plugin-react: 7.37.3(eslint@9.39.4(jiti@2.6.1))
+ eslint-plugin-security: 1.4.0
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.1
+
+ '@pkgr/core@0.1.2': {}
+
+ '@rtsao/scc@1.1.0': {}
+
+ '@types/codemirror@5.60.8':
+ dependencies:
+ '@types/tern': 0.23.9
+
+ '@types/eslint@8.56.2':
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/json-schema': 7.0.15
+
+ '@types/estree@1.0.9': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/node@20.12.12':
+ dependencies:
+ undici-types: 5.26.5
+
+ '@types/node@20.19.43':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/tern@0.23.9':
+ dependencies:
+ '@types/estree': 1.0.9
+
+ '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.35.1
+ '@typescript-eslint/type-utils': 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.35.1
+ eslint: 9.39.4(jiti@2.6.1)
+ graphemer: 1.4.0
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.5.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.35.1
+ '@typescript-eslint/types': 8.35.1
+ '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.35.1
+ debug: 4.4.3
+ eslint: 9.39.4(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.35.1(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.9.3)
+ '@typescript-eslint/types': 8.35.1
+ debug: 4.4.3
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.35.1':
+ dependencies:
+ '@typescript-eslint/types': 8.35.1
+ '@typescript-eslint/visitor-keys': 8.35.1
+
+ '@typescript-eslint/tsconfig-utils@8.35.1(typescript@5.9.3)':
+ dependencies:
+ typescript: 5.9.3
+
+ '@typescript-eslint/type-utils@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ debug: 4.4.3
+ eslint: 9.39.4(jiti@2.6.1)
+ ts-api-utils: 2.5.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.35.1': {}
+
+ '@typescript-eslint/typescript-estree@8.35.1(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.35.1(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.9.3)
+ '@typescript-eslint/types': 8.35.1
+ '@typescript-eslint/visitor-keys': 8.35.1
+ debug: 4.4.3
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.9
+ semver: 7.8.5
+ ts-api-utils: 2.5.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1))
+ '@typescript-eslint/scope-manager': 8.35.1
+ '@typescript-eslint/types': 8.35.1
+ '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.9.3)
+ eslint: 9.39.4(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.35.1':
+ dependencies:
+ '@typescript-eslint/types': 8.35.1
+ eslint-visitor-keys: 4.2.1
+
+ acorn-jsx@5.3.2(acorn@8.17.0):
+ dependencies:
+ acorn: 8.17.0
+
+ acorn@8.17.0: {}
+
+ ajv@6.15.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.20.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ argparse@2.0.1: {}
+
+ array-buffer-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+
+ array-includes@3.1.9:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
+ get-intrinsic: 1.3.0
+ is-string: 1.1.1
+ math-intrinsics: 1.1.0
+
+ array.prototype.findlast@1.2.5:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.findlastindex@1.2.6:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flat@1.3.3:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flatmap@1.3.3:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.tosorted@1.1.4:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.1.0
+
+ arraybuffer.prototype.slice@1.0.4:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+
+ async-function@1.0.0: {}
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.1.0
+
+ balanced-match@1.0.2: {}
+
+ brace-expansion@1.1.15:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.1.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.9:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ concat-map@0.0.1: {}
+
+ crelt@1.0.7: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ deep-is@0.1.4: {}
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ empathic@2.0.1: {}
+
+ enhanced-resolve@5.24.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
+ es-abstract-get@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ is-callable: 1.2.7
+ object-inspect: 1.13.4
+
+ es-abstract@1.24.2:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.4
+ function.prototype.name: 1.2.0
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.4
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.4
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.11
+ string.prototype.trimend: 1.0.10
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.8
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.22
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-iterator-helpers@1.3.3:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.1.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ iterator.prototype: 1.1.5
+ math-intrinsics: 1.1.0
+
+ es-object-atoms@1.1.2:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.4
+
+ es-shim-unscopables@1.1.0:
+ dependencies:
+ hasown: 2.0.4
+
+ es-to-primitive@1.3.4:
+ dependencies:
+ es-abstract-get: 1.0.0
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+
+ esbuild@0.25.5:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.5
+ '@esbuild/android-arm': 0.25.5
+ '@esbuild/android-arm64': 0.25.5
+ '@esbuild/android-x64': 0.25.5
+ '@esbuild/darwin-arm64': 0.25.5
+ '@esbuild/darwin-x64': 0.25.5
+ '@esbuild/freebsd-arm64': 0.25.5
+ '@esbuild/freebsd-x64': 0.25.5
+ '@esbuild/linux-arm': 0.25.5
+ '@esbuild/linux-arm64': 0.25.5
+ '@esbuild/linux-ia32': 0.25.5
+ '@esbuild/linux-loong64': 0.25.5
+ '@esbuild/linux-mips64el': 0.25.5
+ '@esbuild/linux-ppc64': 0.25.5
+ '@esbuild/linux-riscv64': 0.25.5
+ '@esbuild/linux-s390x': 0.25.5
+ '@esbuild/linux-x64': 0.25.5
+ '@esbuild/netbsd-arm64': 0.25.5
+ '@esbuild/netbsd-x64': 0.25.5
+ '@esbuild/openbsd-arm64': 0.25.5
+ '@esbuild/openbsd-x64': 0.25.5
+ '@esbuild/sunos-x64': 0.25.5
+ '@esbuild/win32-arm64': 0.25.5
+ '@esbuild/win32-ia32': 0.25.5
+ '@esbuild/win32-x64': 0.25.5
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-compat-utils@0.5.1(eslint@9.39.4(jiti@2.6.1)):
+ dependencies:
+ eslint: 9.39.4(jiti@2.6.1)
+ semver: 7.8.5
+
+ eslint-import-resolver-node@0.3.10:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.2
+ resolve: 2.0.0-next.7
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.14.0(@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.6.1)):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.4(jiti@2.6.1)
+ eslint-import-resolver-node: 0.3.10
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-depend@1.3.1:
+ dependencies:
+ empathic: 2.0.1
+ module-replacements: 2.11.0
+ semver: 7.8.5
+
+ eslint-plugin-es-x@7.8.0(eslint@9.39.4(jiti@2.6.1)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1))
+ '@eslint-community/regexpp': 4.12.2
+ eslint: 9.39.4(jiti@2.6.1)
+ eslint-compat-utils: 0.5.1(eslint@9.39.4(jiti@2.6.1))
+
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.9
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 9.39.4(jiti@2.6.1)
+ eslint-import-resolver-node: 0.3.10
+ eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.6.1))
+ hasown: 2.0.4
+ is-core-module: 2.16.2
+ is-glob: 4.0.3
+ minimatch: 3.1.5
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.10
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-json-schema-validator@5.1.0(eslint@9.39.4(jiti@2.6.1)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1))
+ ajv: 8.20.0
+ debug: 4.4.3
+ eslint: 9.39.4(jiti@2.6.1)
+ eslint-compat-utils: 0.5.1(eslint@9.39.4(jiti@2.6.1))
+ json-schema-migrate: 2.0.0
+ jsonc-eslint-parser: 2.4.2
+ minimatch: 8.0.7
+ synckit: 0.9.3
+ toml-eslint-parser: 0.9.3
+ tunnel-agent: 0.6.0
+ yaml-eslint-parser: 1.3.2
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-n@17.10.3(eslint@9.39.4(jiti@2.6.1)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1))
+ enhanced-resolve: 5.24.1
+ eslint: 9.39.4(jiti@2.6.1)
+ eslint-plugin-es-x: 7.8.0(eslint@9.39.4(jiti@2.6.1))
+ get-tsconfig: 4.14.0
+ globals: 15.15.0
+ ignore: 5.3.2
+ minimatch: 9.0.9
+ semver: 7.8.5
+
+ eslint-plugin-obsidianmd@0.1.9(@eslint/js@9.30.1)(@eslint/json@0.14.0)(@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(obsidian@1.13.1(@codemirror/state@6.5.0)(@codemirror/view@6.38.6))(typescript-eslint@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)):
+ dependencies:
+ '@eslint/js': 9.30.1
+ '@eslint/json': 0.14.0
+ '@microsoft/eslint-plugin-sdl': 1.1.0(eslint@9.39.4(jiti@2.6.1))
+ '@types/eslint': 8.56.2
+ '@types/node': 20.12.12
+ eslint: 9.39.4(jiti@2.6.1)
+ eslint-plugin-depend: 1.3.1
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))
+ eslint-plugin-json-schema-validator: 5.1.0(eslint@9.39.4(jiti@2.6.1))
+ eslint-plugin-security: 2.1.1
+ globals: 14.0.0
+ obsidian: 1.13.1(@codemirror/state@6.5.0)(@codemirror/view@6.38.6)
+ typescript: 5.4.5
+ typescript-eslint: 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ transitivePeerDependencies:
+ - '@typescript-eslint/parser'
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-react@7.37.3(eslint@9.39.4(jiti@2.6.1)):
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.findlast: 1.2.5
+ array.prototype.flatmap: 1.3.3
+ array.prototype.tosorted: 1.1.4
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.3.3
+ eslint: 9.39.4(jiti@2.6.1)
+ estraverse: 5.3.0
+ hasown: 2.0.4
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.5
+ object.entries: 1.1.9
+ object.fromentries: 2.0.8
+ object.values: 1.2.1
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.7
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.12
+ string.prototype.repeat: 1.0.0
+
+ eslint-plugin-security@1.4.0:
+ dependencies:
+ safe-regex: 1.1.0
+
+ eslint-plugin-security@2.1.1:
+ dependencies:
+ safe-regex: 2.1.1
+
+ eslint-scope@8.4.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.1: {}
+
+ eslint@9.39.4(jiti@2.6.1):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1))
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.21.2
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
+ '@eslint/eslintrc': 3.3.5
+ '@eslint/js': 9.39.4
+ '@eslint/plugin-kit': 0.4.1
+ '@humanfs/node': 0.16.8
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.9
+ ajv: 6.15.0
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.7.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.5
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 2.6.1
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.4.0:
+ dependencies:
+ acorn: 8.17.0
+ acorn-jsx: 5.3.2(acorn@8.17.0)
+ eslint-visitor-keys: 4.2.1
+
+ espree@9.6.1:
+ dependencies:
+ acorn: 8.17.0
+ acorn-jsx: 5.3.2(acorn@8.17.0)
+ eslint-visitor-keys: 3.4.3
+
+ esquery@1.7.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ esutils@2.0.3: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-uri@3.1.3: {}
+
+ fastq@1.20.1:
+ dependencies:
+ reusify: 1.1.0
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.4.2
+ keyv: 4.5.4
+
+ flatted@3.4.2: {}
+
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.2.0:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+ hasown: 2.0.4
+ is-callable: 1.2.7
+ is-document.all: 1.0.0
+
+ functions-have-names@1.2.3: {}
+
+ generator-function@2.0.1: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.4
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.2
+
+ get-symbol-description@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+
+ get-tsconfig@4.14.0:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ globals@14.0.0: {}
+
+ globals@15.15.0: {}
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ has-bigints@1.1.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.1
+
+ has-proto@1.2.0:
+ dependencies:
+ dunder-proto: 1.0.1
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ hasown@2.0.4:
+ dependencies:
+ function-bind: 1.1.2
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.5: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.4
+ side-channel: 1.1.1
+
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-async-function@2.1.1:
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
+
+ is-boolean-object@1.2.2:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.2:
+ dependencies:
+ hasown: 2.0.4
+
+ is-data-view@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
+
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-document.all@1.0.0:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-generator-function@1.1.2:
+ dependencies:
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-map@2.0.3: {}
+
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-number@7.0.0: {}
+
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.4
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.22
+
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-weakset@2.0.4:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ isarray@2.0.5: {}
+
+ isexe@2.0.0: {}
+
+ iterator.prototype@1.1.5:
+ dependencies:
+ define-data-property: 1.1.4
+ es-object-atoms: 1.1.2
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ has-symbols: 1.1.0
+ set-function-name: 2.0.2
+
+ jiti@2.6.1: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.3.0:
+ dependencies:
+ argparse: 2.0.1
+
+ json-buffer@3.0.1: {}
+
+ json-schema-migrate@2.0.0:
+ dependencies:
+ ajv: 8.20.0
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ jsonc-eslint-parser@2.4.2:
+ dependencies:
+ acorn: 8.17.0
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ semver: 7.8.5
+
+ jsx-ast-utils@3.3.5:
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.flat: 1.3.3
+ object.assign: 4.1.7
+ object.values: 1.2.1
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.merge@4.6.2: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ math-intrinsics@1.1.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
+
+ minimatch@3.1.5:
+ dependencies:
+ brace-expansion: 1.1.15
+
+ minimatch@8.0.7:
+ dependencies:
+ brace-expansion: 2.1.1
+
+ minimatch@9.0.9:
+ dependencies:
+ brace-expansion: 2.1.1
+
+ minimist@1.2.8: {}
+
+ module-replacements@2.11.0: {}
+
+ moment@2.29.4: {}
+
+ ms@2.1.3: {}
+
+ natural-compare@1.4.0: {}
+
+ node-exports-info@1.6.2:
+ dependencies:
+ array.prototype.flatmap: 1.3.3
+ es-errors: 1.3.0
+ object.entries: 1.1.9
+ semver: 6.3.1
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.4: {}
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.entries@1.1.9:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
+
+ object.groupby@1.0.3:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+
+ object.values@1.2.1:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+
+ obsidian@1.13.1(@codemirror/state@6.5.0)(@codemirror/view@6.38.6):
+ dependencies:
+ '@codemirror/state': 6.5.0
+ '@codemirror/view': 6.38.6
+ '@types/codemirror': 5.60.8
+ moment: 2.29.4
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ picomatch@2.3.2: {}
+
+ possible-typed-array-names@1.1.0: {}
+
+ prelude-ls@1.2.1: {}
+
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
+
+ react-is@16.13.1: {}
+
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ regexp-tree@0.1.27: {}
+
+ regexp.prototype.flags@1.5.4:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+
+ require-from-string@2.0.2: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@2.0.0-next.7:
+ dependencies:
+ es-errors: 1.3.0
+ is-core-module: 2.16.2
+ node-exports-info: 1.6.2
+ object-keys: 1.1.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ ret@0.1.15: {}
+
+ reusify@1.1.0: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-array-concat@1.1.4:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+
+ safe-buffer@5.2.1: {}
+
+ safe-push-apply@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
+ safe-regex@1.1.0:
+ dependencies:
+ ret: 0.1.15
+
+ safe-regex@2.1.1:
+ dependencies:
+ regexp-tree: 0.1.27
+
+ semver@6.3.1: {}
+
+ semver@7.8.5: {}
+
+ set-function-length@1.2.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ set-proto@1.0.0:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ side-channel-list@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.1
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ stop-iteration-iterator@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+
+ string.prototype.matchall@4.0.12:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ regexp.prototype.flags: 1.5.4
+ set-function-name: 2.0.2
+ side-channel: 1.1.1
+
+ string.prototype.repeat@1.0.0:
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+
+ string.prototype.trim@1.2.11:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.2
+ es-object-atoms: 1.1.2
+ has-property-descriptors: 1.0.2
+ safe-regex-test: 1.1.0
+
+ string.prototype.trimend@1.0.10:
+ dependencies:
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.9
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.2
+
+ strip-bom@3.0.0: {}
+
+ strip-json-comments@3.1.1: {}
+
+ style-mod@4.1.3: {}
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ synckit@0.9.3:
+ dependencies:
+ '@pkgr/core': 0.1.2
+ tslib: 2.8.1
+
+ tapable@2.3.3: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toml-eslint-parser@0.9.3:
+ dependencies:
+ eslint-visitor-keys: 3.4.3
+
+ ts-api-utils@2.5.0(typescript@5.9.3):
+ dependencies:
+ typescript: 5.9.3
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.4.0: {}
+
+ tslib@2.8.1: {}
+
+ tunnel-agent@0.6.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-length@1.0.3:
+ dependencies:
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-offset@1.0.4:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+
+ typed-array-length@1.0.8:
+ dependencies:
+ call-bind: 1.0.9
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
+
+ typescript-eslint@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.35.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.4(jiti@2.6.1)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.4.5: {}
+
+ typescript@5.9.3: {}
+
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
+ undici-types@5.26.5: {}
+
+ undici-types@6.21.0: {}
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ w3c-keyname@2.2.8: {}
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.2.0
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.22
+
+ which-collection@1.0.2:
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+
+ which-typed-array@1.1.22:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.9
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ word-wrap@1.2.5: {}
+
+ yaml-eslint-parser@1.3.2:
+ dependencies:
+ eslint-visitor-keys: 3.4.3
+ yaml: 2.9.0
+
+ yaml@2.9.0: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/surfsense_obsidian/pnpm-workspace.yaml b/surfsense_obsidian/pnpm-workspace.yaml
new file mode 100644
index 000000000..00f6fc470
--- /dev/null
+++ b/surfsense_obsidian/pnpm-workspace.yaml
@@ -0,0 +1,2 @@
+allowBuilds:
+ esbuild: set this to true or false
diff --git a/surfsense_obsidian/src/api-client.ts b/surfsense_obsidian/src/api-client.ts
index 114e531f7..b66373f02 100644
--- a/surfsense_obsidian/src/api-client.ts
+++ b/surfsense_obsidian/src/api-client.ts
@@ -7,7 +7,7 @@ import type {
NotePayload,
RenameAck,
RenameItem,
- SearchSpace,
+ Workspace,
SyncAck,
} from "./types";
@@ -94,14 +94,14 @@ export class SurfSenseApiClient {
return await this.request("GET", "/api/v1/obsidian/health");
}
- async listSearchSpaces(): Promise {
- const resp = await this.request(
+ async listWorkspaces(): Promise {
+ const resp = await this.request(
"GET",
- "/api/v1/searchspaces/"
+ "/api/v1/workspaces/"
);
if (Array.isArray(resp)) return resp;
- if (resp && Array.isArray((resp as { items?: SearchSpace[] }).items)) {
- return (resp as { items: SearchSpace[] }).items;
+ if (resp && Array.isArray((resp as { items?: Workspace[] }).items)) {
+ return (resp as { items: Workspace[] }).items;
}
return [];
}
@@ -114,7 +114,7 @@ export class SurfSenseApiClient {
}
async connect(input: {
- searchSpaceId: number;
+ workspaceId: number;
vaultId: string;
vaultName: string;
vaultFingerprint: string;
@@ -125,7 +125,7 @@ export class SurfSenseApiClient {
{
vault_id: input.vaultId,
vault_name: input.vaultName,
- search_space_id: input.searchSpaceId,
+ workspace_id: input.workspaceId,
vault_fingerprint: input.vaultFingerprint,
}
);
diff --git a/surfsense_obsidian/src/main.ts b/surfsense_obsidian/src/main.ts
index 6600b7145..ca5de7206 100644
--- a/surfsense_obsidian/src/main.ts
+++ b/surfsense_obsidian/src/main.ts
@@ -119,7 +119,7 @@ export default class SurfSensePlugin extends Plugin {
name: "Sync current note",
checkCallback: (checking) => {
const file = this.app.workspace.getActiveFile();
- if (!file || file.extension.toLowerCase() !== "md") return false;
+ if (file?.extension.toLowerCase() !== "md") return false;
if (checking) return true;
this.queue.enqueueUpsert(file.path);
void this.engine.flushQueue();
@@ -186,7 +186,7 @@ export default class SurfSensePlugin extends Plugin {
if (!changed) return;
this.engine?.refreshStatus();
this.notifyStatusChange();
- if (this.settings.searchSpaceId !== null) {
+ if (this.settings.workspaceId !== null) {
void this.engine.ensureConnected();
}
}
@@ -252,16 +252,24 @@ export default class SurfSensePlugin extends Plugin {
}
async loadSettings() {
- const data = (await this.loadData()) as Partial | null;
+ // One-time migration: the workspace was previously persisted as `searchSpaceId`.
+ // Destructure it out so the migrated value moves into `workspaceId` and the
+ // dead key is not spread back in / re-persisted.
+ const data = (await this.loadData()) as
+ | (Partial & { searchSpaceId?: number | null })
+ | null;
+ const { searchSpaceId: legacyWorkspaceId, ...persisted } = data ?? {};
this.settings = {
...DEFAULT_SETTINGS,
- ...(data ?? {}),
- queue: (data?.queue ?? []).map((i: QueueItem) => ({ ...i })),
- tombstones: { ...(data?.tombstones ?? {}) },
- includeFolders: [...(data?.includeFolders ?? [])],
- excludeFolders: [...(data?.excludeFolders ?? [])],
- excludePatterns: data?.excludePatterns?.length
- ? [...data.excludePatterns]
+ ...persisted,
+ workspaceId:
+ persisted.workspaceId ?? legacyWorkspaceId ?? DEFAULT_SETTINGS.workspaceId,
+ queue: (persisted.queue ?? []).map((i: QueueItem) => ({ ...i })),
+ tombstones: { ...(persisted.tombstones ?? {}) },
+ includeFolders: [...(persisted.includeFolders ?? [])],
+ excludeFolders: [...(persisted.excludeFolders ?? [])],
+ excludePatterns: persisted.excludePatterns?.length
+ ? [...persisted.excludePatterns]
: [...DEFAULT_SETTINGS.excludePatterns],
};
}
diff --git a/surfsense_obsidian/src/settings.ts b/surfsense_obsidian/src/settings.ts
index 7f404fc97..79e5762a9 100644
--- a/surfsense_obsidian/src/settings.ts
+++ b/surfsense_obsidian/src/settings.ts
@@ -13,13 +13,13 @@ import { normalizeFolder, parseExcludePatterns } from "./excludes";
import { FolderSuggestModal } from "./folder-suggest-modal";
import type SurfSensePlugin from "./main";
import { STATUS_VISUALS } from "./status-visuals";
-import type { SearchSpace } from "./types";
+import type { Workspace } from "./types";
/** Plugin settings tab. */
export class SurfSenseSettingTab extends PluginSettingTab {
private readonly plugin: SurfSensePlugin;
- private searchSpaces: SearchSpace[] = [];
+ private workspaces: Workspace[] = [];
private loadingSpaces = false;
private connectionIndicator: HTMLElement | null = null;
private readonly onStatusChange = (): void => this.updateConnectionIndicator();
@@ -51,7 +51,7 @@ export class SurfSenseSettingTab extends PluginSettingTab {
const next = value.trim();
const previous = this.plugin.settings.serverUrl;
if (previous !== "" && next !== previous) {
- this.plugin.settings.searchSpaceId = null;
+ this.plugin.settings.workspaceId = null;
this.plugin.settings.connectorId = null;
}
this.plugin.settings.serverUrl = next;
@@ -80,7 +80,7 @@ export class SurfSenseSettingTab extends PluginSettingTab {
const next = value.trim();
const previous = this.plugin.settings.apiToken;
if (previous !== "" && next !== previous) {
- this.plugin.settings.searchSpaceId = null;
+ this.plugin.settings.workspaceId = null;
this.plugin.settings.connectorId = null;
}
this.plugin.settings.apiToken = next;
@@ -102,7 +102,7 @@ export class SurfSenseSettingTab extends PluginSettingTab {
await this.plugin.api.verifyToken();
new Notice("Surfsense: token verified.");
this.plugin.engine.refreshStatus({ force: true });
- await this.refreshSearchSpaces();
+ await this.refreshWorkspaces();
this.display();
} catch (err) {
this.handleApiError(err);
@@ -115,21 +115,21 @@ export class SurfSenseSettingTab extends PluginSettingTab {
new Setting(containerEl)
.setName("Search space")
.setDesc(
- "Which Surfsense search space this vault syncs into. Reload after changing your token.",
+ "Which Surfsense workspace this vault syncs into. Reload after changing your token.",
)
.addDropdown((drop) => {
- drop.addOption("", this.loadingSpaces ? "Loading…" : "Select a search space");
- for (const space of this.searchSpaces) {
+ drop.addOption("", this.loadingSpaces ? "Loading…" : "Select a workspace");
+ for (const space of this.workspaces) {
drop.addOption(String(space.id), space.name);
}
- if (settings.searchSpaceId !== null) {
- drop.setValue(String(settings.searchSpaceId));
+ if (settings.workspaceId !== null) {
+ drop.setValue(String(settings.workspaceId));
}
drop.onChange(async (value) => {
- this.plugin.settings.searchSpaceId = value ? Number(value) : null;
+ this.plugin.settings.workspaceId = value ? Number(value) : null;
this.plugin.settings.connectorId = null;
await this.plugin.saveSettings();
- if (this.plugin.settings.searchSpaceId !== null) {
+ if (this.plugin.settings.workspaceId !== null) {
try {
await this.plugin.engine.ensureConnected();
await this.plugin.engine.maybeReconcile(true);
@@ -144,9 +144,9 @@ export class SurfSenseSettingTab extends PluginSettingTab {
.addExtraButton((btn) =>
btn
.setIcon("refresh-ccw")
- .setTooltip("Reload search spaces")
+ .setTooltip("Reload workspaces")
.onClick(async () => {
- await this.refreshSearchSpaces();
+ await this.refreshWorkspaces();
this.display();
}),
);
@@ -319,13 +319,13 @@ export class SurfSenseSettingTab extends PluginSettingTab {
indicator.setAttr("title", visual.label);
}
- private async refreshSearchSpaces(): Promise {
+ private async refreshWorkspaces(): Promise {
this.loadingSpaces = true;
try {
- this.searchSpaces = await this.plugin.api.listSearchSpaces();
+ this.workspaces = await this.plugin.api.listWorkspaces();
} catch (err) {
this.handleApiError(err);
- this.searchSpaces = [];
+ this.workspaces = [];
} finally {
this.loadingSpaces = false;
}
diff --git a/surfsense_obsidian/src/sync-engine.ts b/surfsense_obsidian/src/sync-engine.ts
index 80594dd9e..921067a37 100644
--- a/surfsense_obsidian/src/sync-engine.ts
+++ b/surfsense_obsidian/src/sync-engine.ts
@@ -48,7 +48,7 @@ export interface SyncEngineSettings {
vaultId: string;
apiToken: string;
connectorId: number | null;
- searchSpaceId: number | null;
+ workspaceId: number | null;
includeFolders: string[];
excludeFolders: string[];
excludePatterns: string[];
@@ -96,7 +96,7 @@ export class SyncEngine {
this.setStatus("syncing", "Connecting to SurfSense…");
const settings = this.deps.getSettings();
- if (!settings.searchSpaceId) {
+ if (!settings.workspaceId) {
// No target yet — /health still surfaces auth/network errors.
try {
const health = await this.deps.apiClient.health();
@@ -124,7 +124,7 @@ export class SyncEngine {
*/
async ensureConnected(): Promise {
const settings = this.deps.getSettings();
- if (!settings.searchSpaceId) {
+ if (!settings.workspaceId) {
this.setStatus("idle");
return false;
}
@@ -132,7 +132,7 @@ export class SyncEngine {
try {
const fingerprint = await computeVaultFingerprint(this.deps.app);
const resp = await this.deps.apiClient.connect({
- searchSpaceId: settings.searchSpaceId,
+ workspaceId: settings.workspaceId,
vaultId: settings.vaultId,
vaultName: this.deps.app.vault.getName(),
vaultFingerprint: fingerprint,
@@ -272,7 +272,7 @@ export class SyncEngine {
this.refreshStatus({ force: true });
return;
}
- if (!settings.searchSpaceId) {
+ if (!settings.workspaceId) {
try {
const health = await this.deps.apiClient.health();
this.applyHealth(health);
@@ -543,7 +543,7 @@ export class SyncEngine {
const isError =
last === "auth-error" || last === "offline" || last === "error";
const s = this.deps.getSettings();
- const setupComplete = !!(s.apiToken && s.searchSpaceId && s.connectorId);
+ const setupComplete = !!(s.apiToken && s.workspaceId && s.connectorId);
if (isError && setupComplete) return;
}
this.setStatus(this.queueStatusKind(), this.statusDetail());
@@ -571,7 +571,7 @@ export class SyncEngine {
kind = "needs-setup";
detail = this.setupHint(s);
} else if (kind !== "auth-error" && kind !== "offline" && kind !== "error") {
- if (!s.searchSpaceId || !s.connectorId) {
+ if (!s.workspaceId || !s.connectorId) {
kind = "needs-setup";
detail = this.setupHint(s);
}
@@ -582,7 +582,7 @@ export class SyncEngine {
private setupHint(s: SyncEngineSettings): string {
if (!s.apiToken) return "Paste your API token in settings.";
- if (!s.searchSpaceId) return "Pick a search space in settings.";
+ if (!s.workspaceId) return "Pick a workspace in settings.";
return "Connecting…";
}
diff --git a/surfsense_obsidian/src/types.ts b/surfsense_obsidian/src/types.ts
index 192d34dc8..cfa9fbb74 100644
--- a/surfsense_obsidian/src/types.ts
+++ b/surfsense_obsidian/src/types.ts
@@ -3,7 +3,7 @@
export interface SurfsensePluginSettings {
serverUrl: string;
apiToken: string;
- searchSpaceId: number | null;
+ workspaceId: number | null;
connectorId: number | null;
/** UUID for the vault — lives here so Obsidian Sync replicates it across devices. */
vaultId: string;
@@ -25,7 +25,7 @@ export interface SurfsensePluginSettings {
export const DEFAULT_SETTINGS: SurfsensePluginSettings = {
serverUrl: "https://surfsense.com",
apiToken: "",
- searchSpaceId: null,
+ workspaceId: null,
connectorId: null,
vaultId: "",
syncIntervalMinutes: 10,
@@ -107,7 +107,7 @@ export interface HeadingRef {
level: number;
}
-export interface SearchSpace {
+export interface Workspace {
id: number;
name: string;
description?: string;
@@ -117,7 +117,7 @@ export interface SearchSpace {
export interface ConnectResponse {
connector_id: number;
vault_id: string;
- search_space_id: number;
+ workspace_id: number;
capabilities: string[];
server_time_utc: string;
[key: string]: unknown;
diff --git a/surfsense_web/app/dashboard/[workspace_id]/automations/[automation_id]/automation-detail-content.tsx b/surfsense_web/app/dashboard/[workspace_id]/automations/[automation_id]/automation-detail-content.tsx
index d4f0962f4..acf816629 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/automations/[automation_id]/automation-detail-content.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/automations/[automation_id]/automation-detail-content.tsx
@@ -45,7 +45,7 @@ export function AutomationDetailContent({
Access denied
- You don't have permission to view automations in this search space.
+ You don't have permission to view automations in this workspace.
);
diff --git a/surfsense_web/app/dashboard/[workspace_id]/automations/[automation_id]/edit/automation-edit-content.tsx b/surfsense_web/app/dashboard/[workspace_id]/automations/[automation_id]/edit/automation-edit-content.tsx
index 77e26e51a..470cf7d5c 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/automations/[automation_id]/edit/automation-edit-content.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/automations/[automation_id]/edit/automation-edit-content.tsx
@@ -32,7 +32,7 @@ export function AutomationEditContent({ workspaceId, automationId }: AutomationE
Access denied
- You don't have permission to edit automations in this search space.
+ You don't have permission to edit automations in this workspace.
);
diff --git a/surfsense_web/app/dashboard/[workspace_id]/automations/automations-content.tsx b/surfsense_web/app/dashboard/[workspace_id]/automations/automations-content.tsx
index 9e0fa81c6..826337a27 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/automations/automations-content.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/automations/automations-content.tsx
@@ -13,7 +13,7 @@ interface AutomationsContentProps {
/**
* Client orchestrator for the automations list page. Pulls the active
- * search space's first page (via ``useAutomations`` → ``automationsListAtom``)
+ * workspace's first page (via ``useAutomations`` → ``automationsListAtom``)
* and the user's permissions, then decides between empty / loading / table.
*
* Read access is mandatory; anything else is hidden behind RBAC. The
@@ -46,7 +46,7 @@ export function AutomationsContent({ workspaceId }: AutomationsContentProps) {
Access denied
- You don't have permission to view automations in this search space.
+ You don't have permission to view automations in this workspace.
);
diff --git a/surfsense_web/app/dashboard/[workspace_id]/automations/components/automations-empty-state.tsx b/surfsense_web/app/dashboard/[workspace_id]/automations/components/automations-empty-state.tsx
index c689d85bb..1004c21b6 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/automations/components/automations-empty-state.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/automations/components/automations-empty-state.tsx
@@ -40,7 +40,7 @@ export function AutomationsEmptyState({ workspaceId, canCreate }: AutomationsEmp
) : (
- You don't have permission to create automations in this search space.
+ You don't have permission to create automations in this workspace.
)}
diff --git a/surfsense_web/app/dashboard/[workspace_id]/automations/components/builder/automation-builder-form.tsx b/surfsense_web/app/dashboard/[workspace_id]/automations/components/builder/automation-builder-form.tsx
index 1103307eb..0994ceb7d 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/automations/components/builder/automation-builder-form.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/automations/components/builder/automation-builder-form.tsx
@@ -120,7 +120,7 @@ export function AutomationBuilderForm({
const [submitting, setSubmitting] = useState(false);
- // Eligible models + the search-space-seeded defaults. Models are chosen per
+ // Eligible models + the workspace-seeded defaults. Models are chosen per
// automation on create; in edit mode the backend preserves the captured
// snapshot, so the picker is create-only.
const eligibleModels = useAutomationEligibleModels();
diff --git a/surfsense_web/app/dashboard/[workspace_id]/automations/components/builder/mention-task-input.tsx b/surfsense_web/app/dashboard/[workspace_id]/automations/components/builder/mention-task-input.tsx
index 1814af6b7..d17b5f9a6 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/automations/components/builder/mention-task-input.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/automations/components/builder/mention-task-input.tsx
@@ -235,7 +235,7 @@ export function MentionTaskInput({
Access denied
- You don't have permission to create automations in this search space.
+ You don't have permission to create automations in this workspace.
);
diff --git a/surfsense_web/app/dashboard/[workspace_id]/chats/page.tsx b/surfsense_web/app/dashboard/[workspace_id]/chats/page.tsx
index 8186018ea..79a7b2ffc 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/chats/page.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/chats/page.tsx
@@ -5,7 +5,7 @@ export default async function ChatsPage({ params }: { params: Promise<{ workspac
return (
);
}
diff --git a/surfsense_web/app/dashboard/[workspace_id]/client-layout.tsx b/surfsense_web/app/dashboard/[workspace_id]/client-layout.tsx
index 707663fff..b54ce0aad 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/client-layout.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/client-layout.tsx
@@ -52,12 +52,12 @@ export function DashboardClientLayout({
const isOnboardingPage = pathname?.includes("/onboard");
const isOwner = access?.is_owner ?? false;
- const isSearchSpaceReady = activeWorkspaceId === workspaceId;
+ const isWorkspaceReady = activeWorkspaceId === workspaceId;
useEffect(() => {
- if (isSearchSpaceReady) return;
+ if (isWorkspaceReady) return;
setHasCheckedOnboarding(false);
- }, [isSearchSpaceReady]);
+ }, [isWorkspaceReady]);
useEffect(() => {
if (isOnboardingPage) {
@@ -66,7 +66,7 @@ export function DashboardClientLayout({
}
if (
- isSearchSpaceReady &&
+ isWorkspaceReady &&
!loading &&
!accessLoading &&
!globalConfigsLoading &&
@@ -75,7 +75,7 @@ export function DashboardClientLayout({
!hasCheckedOnboarding
) {
// Onboarding is only relevant when no operator-provided
- // global_llm_config.yaml exists. When it does, search spaces inherit
+ // global_llm_config.yaml exists. When it does, workspaces inherit
// the global config and should never be forced into onboarding.
if (globalConfigStatus?.exists) {
setHasCheckedOnboarding(true);
@@ -102,7 +102,7 @@ export function DashboardClientLayout({
setHasCheckedOnboarding(true);
}
}, [
- isSearchSpaceReady,
+ isWorkspaceReady,
loading,
accessLoading,
globalConfigsLoading,
@@ -153,13 +153,13 @@ export function DashboardClientLayout({
setActiveWorkspaceIdState(activeSeacrhSpaceId);
// Sync to Electron store if stored value is null (first navigation)
- if (electronAPI?.getActiveSearchSpace && electronAPI.setActiveSearchSpace) {
- const setActiveSearchSpace = electronAPI.setActiveSearchSpace;
+ if (electronAPI?.getActiveWorkspace && electronAPI.setActiveWorkspace) {
+ const setActiveWorkspace = electronAPI.setActiveWorkspace;
electronAPI
- .getActiveSearchSpace()
+ .getActiveWorkspace()
.then((stored: string | null) => {
if (!stored) {
- setActiveSearchSpace(activeSeacrhSpaceId);
+ setActiveWorkspace(activeSeacrhSpaceId);
}
})
.catch(() => {});
@@ -169,7 +169,7 @@ export function DashboardClientLayout({
// Determine if we should show loading
const shouldShowLoading =
!hasCheckedOnboarding &&
- (!isSearchSpaceReady ||
+ (!isWorkspaceReady ||
loading ||
accessLoading ||
globalConfigsLoading ||
@@ -214,7 +214,7 @@ export function DashboardClientLayout({
return (
- {children}
+ {children}
);
}
diff --git a/surfsense_web/app/dashboard/[workspace_id]/new-chat/[[...chat_id]]/page.tsx b/surfsense_web/app/dashboard/[workspace_id]/new-chat/[[...chat_id]]/page.tsx
index 15f35cac1..4bb355049 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/new-chat/[[...chat_id]]/page.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/new-chat/[[...chat_id]]/page.tsx
@@ -579,7 +579,7 @@ export default function NewChatPage() {
error,
flow,
context: {
- searchSpaceId: workspaceId,
+ workspaceId: workspaceId,
threadId,
},
});
@@ -717,7 +717,7 @@ export default function NewChatPage() {
data: typeof threadMessagesQuery.data;
}>({ threadId: null, data: undefined });
- // Reset thread-local runtime state on route/search-space changes. Data fetching
+ // Reset thread-local runtime state on route/workspace changes. Data fetching
// is handled by React Query below so the chat shell can render immediately.
useEffect(() => {
const nextThreadId = urlChatId > 0 ? urlChatId : null;
@@ -755,7 +755,7 @@ export default function NewChatPage() {
chatId: thread.id,
title: thread.title,
chatUrl: `/dashboard/${thread.workspace_id ?? workspaceId}/new-chat/${thread.id}`,
- searchSpaceId: thread.workspace_id ?? workspaceId,
+ workspaceId: thread.workspace_id ?? workspaceId,
visibility: thread.visibility,
hasComments: thread.has_comments ?? false,
});
@@ -892,7 +892,7 @@ export default function NewChatPage() {
}
setCurrentThreadMetadata({
id: null,
- searchSpaceId: null,
+ workspaceId: null,
visibility: null,
hasComments: false,
});
@@ -906,7 +906,7 @@ export default function NewChatPage() {
setCurrentThreadMetadata({
id: currentThread.id,
- searchSpaceId: currentThread.workspace_id ?? workspaceId,
+ workspaceId: currentThread.workspace_id ?? workspaceId,
visibility,
hasComments: currentThread.has_comments ?? false,
});
diff --git a/surfsense_web/app/dashboard/[workspace_id]/onboard/page.tsx b/surfsense_web/app/dashboard/[workspace_id]/onboard/page.tsx
index 9da14ef4a..861ceaa07 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/onboard/page.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/onboard/page.tsx
@@ -74,7 +74,7 @@ export default function OnboardPage() {
;
diff --git a/surfsense_web/app/dashboard/[workspace_id]/team/team-content.tsx b/surfsense_web/app/dashboard/[workspace_id]/team/team-content.tsx
index a43a07021..571512305 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/team/team-content.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/team/team-content.tsx
@@ -96,7 +96,7 @@ import type { Role } from "@/contracts/types/roles.types";
import { invitesApiService } from "@/lib/apis/invites-api.service";
import { rolesApiService } from "@/lib/apis/roles-api.service";
import { formatRelativeDate } from "@/lib/format-date";
-import { trackSearchSpaceInviteSent, trackSearchSpaceUsersViewed } from "@/lib/posthog/events";
+import { trackWorkspaceInviteSent, trackWorkspaceUsersViewed } from "@/lib/posthog/events";
import { cacheKeys } from "@/lib/query-client/cache-keys";
import { cn } from "@/lib/utils";
@@ -229,7 +229,7 @@ export function TeamContent({ workspaceId }: TeamContentProps) {
useEffect(() => {
if (members.length > 0 && !membersLoading) {
const ownerCount = members.filter((m) => m.is_owner).length;
- trackSearchSpaceUsersViewed(workspaceId, members.length, ownerCount);
+ trackWorkspaceUsersViewed(workspaceId, members.length, ownerCount);
}
}, [members, membersLoading, workspaceId]);
@@ -654,7 +654,7 @@ function CreateInviteDialog({
setCreatedInvite(invite);
const roleName = roleId ? roles.find((r) => r.id.toString() === roleId)?.name : undefined;
- trackSearchSpaceInviteSent(workspaceId, {
+ trackWorkspaceInviteSent(workspaceId, {
roleName,
hasExpiry: !!expiresAt,
hasMaxUses: !!maxUses,
diff --git a/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/AgentPermissionsContent.tsx b/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/AgentPermissionsContent.tsx
index bb19697f6..e8b15b00b 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/AgentPermissionsContent.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/AgentPermissionsContent.tsx
@@ -226,9 +226,7 @@ export function AgentPermissionsContent() {
}
if (!workspaceId) {
- return (
- Open a search space to manage agent rules.
- );
+ return Open a workspace to manage agent rules.
;
}
return (
diff --git a/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/DesktopContent.tsx b/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/DesktopContent.tsx
index bccc146f0..4a775bc90 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/DesktopContent.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/DesktopContent.tsx
@@ -13,15 +13,15 @@ import {
import { Separator } from "@/components/ui/separator";
import { Skeleton } from "@/components/ui/skeleton";
import { Switch } from "@/components/ui/switch";
-import type { SearchSpace } from "@/contracts/types/workspace.types";
+import type { Workspace } from "@/contracts/types/workspace.types";
import { useElectronAPI } from "@/hooks/use-platform";
-import { searchSpacesApiService } from "@/lib/apis/workspaces-api.service";
+import { workspacesApiService } from "@/lib/apis/workspaces-api.service";
export function DesktopContent() {
const api = useElectronAPI();
const [loading, setLoading] = useState(true);
- const [searchSpaces, setSearchSpaces] = useState([]);
+ const [workspaces, setWorkspaces] = useState([]);
const [activeSpaceId, setActiveSpaceId] = useState(null);
const [autoLaunchEnabled, setAutoLaunchEnabled] = useState(false);
@@ -40,14 +40,14 @@ export function DesktopContent() {
setAutoLaunchSupported(hasAutoLaunchApi);
Promise.all([
- api.getActiveSearchSpace?.() ?? Promise.resolve(null),
- searchSpacesApiService.getSearchSpaces(),
+ api.getActiveWorkspace?.() ?? Promise.resolve(null),
+ workspacesApiService.getWorkspaces(),
hasAutoLaunchApi ? api.getAutoLaunch() : Promise.resolve(null),
])
.then(([spaceId, spaces, autoLaunch]) => {
if (!mounted) return;
setActiveSpaceId(spaceId);
- if (spaces) setSearchSpaces(spaces);
+ if (spaces) setWorkspaces(spaces);
if (autoLaunch) {
setAutoLaunchEnabled(autoLaunch.enabled);
setAutoLaunchHidden(autoLaunch.openAsHidden);
@@ -136,30 +136,30 @@ export function DesktopContent() {
}
};
- const handleSearchSpaceChange = (value: string) => {
+ const handleWorkspaceChange = (value: string) => {
setActiveSpaceId(value);
- api.setActiveSearchSpace?.(value);
- toast.success("Default search space updated");
+ api.setActiveWorkspace?.(value);
+ toast.success("Default workspace updated");
};
return (
-
Default Search Space
+
Default Workspace
- Choose which search space General Assist, Screenshot Assist, and Quick Assist use by
+ Choose which workspace General Assist, Screenshot Assist, and Quick Assist use by
default.
- {searchSpaces.length > 0 ? (
-
+ {workspaces.length > 0 ? (
+
-
+
- {searchSpaces.map((space) => (
+ {workspaces.map((space) => (
{space.name}
@@ -167,9 +167,7 @@ export function DesktopContent() {
) : (
-
- No search spaces found. Create one first.
-
+ No workspaces found. Create one first.
)}
diff --git a/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/MessagingChannelsContent.tsx b/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/MessagingChannelsContent.tsx
index 09472fd70..f5cdd1448 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/MessagingChannelsContent.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/user-settings/components/MessagingChannelsContent.tsx
@@ -17,8 +17,8 @@ import {
} from "@/components/ui/select";
import { Separator } from "@/components/ui/separator";
import { Skeleton } from "@/components/ui/skeleton";
-import type { SearchSpace } from "@/contracts/types/workspace.types";
-import { searchSpacesApiService } from "@/lib/apis/workspaces-api.service";
+import type { Workspace } from "@/contracts/types/workspace.types";
+import { workspacesApiService } from "@/lib/apis/workspaces-api.service";
import { authenticatedFetch } from "@/lib/auth-fetch";
import { buildBackendUrl } from "@/lib/env-config";
import { cn } from "@/lib/utils";
@@ -79,7 +79,7 @@ export function MessagingChannelsContent() {
const workspaceId = Number(params.workspace_id);
const [gatewayConfig, setGatewayConfig] = useState
(null);
const [connections, setConnections] = useState([]);
- const [searchSpaces, setSearchSpaces] = useState([]);
+ const [workspaces, setWorkspaces] = useState([]);
const [pairing, setPairing] = useState(null);
const [pairingPlatform, setPairingPlatform] = useState(null);
const [baileysHealth, setBaileysHealth] = useState(null);
@@ -114,11 +114,11 @@ export function MessagingChannelsContent() {
const refresh = useCallback(async () => {
const [nextConnections, spaces, nextGatewayConfig] = await Promise.all([
fetchConnections(),
- searchSpacesApiService.getSearchSpaces(),
+ workspacesApiService.getWorkspaces(),
fetchGatewayConfig(),
]);
setConnections(nextConnections);
- setSearchSpaces(spaces);
+ setWorkspaces(spaces);
setGatewayConfig(nextGatewayConfig);
}, [fetchConnections, fetchGatewayConfig]);
@@ -210,10 +210,7 @@ export function MessagingChannelsContent() {
await refreshPlatform(connection.platform as GatewayPlatform);
}
- async function updateConnectionSearchSpace(
- connection: GatewayConnection,
- nextWorkspaceId: string
- ) {
+ async function updateConnectionWorkspace(connection: GatewayConnection, nextWorkspaceId: string) {
const previousConnections = connections;
const parsedWorkspaceId = Number(nextWorkspaceId);
const targetKey = connectionKey(connection);
@@ -324,14 +321,14 @@ export function MessagingChannelsContent() {
updateConnectionSearchSpace(connection, value)}
- disabled={searchSpaces.length === 0}
+ onValueChange={(value) => updateConnectionWorkspace(connection, value)}
+ disabled={workspaces.length === 0}
>
-
+
- {searchSpaces.map((space) => (
+ {workspaces.map((space) => (
{space.name}
@@ -409,7 +406,7 @@ export function MessagingChannelsContent() {
Soon you'll be able to connect WhatsApp, Telegram, Slack, and Discord to your
- SurfSense agent so you can ask questions, route messages to search spaces, and get
+ SurfSense agent so you can ask questions, route messages to workspaces, and get
answers from your knowledge base without leaving your chat app.
diff --git a/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/layout-shell.tsx b/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/layout-shell.tsx
index 79680ae9f..e23daecb9 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/layout-shell.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/layout-shell.tsx
@@ -9,25 +9,20 @@ import { useCallback, useMemo, useState } from "react";
import { Separator } from "@/components/ui/separator";
import { cn } from "@/lib/utils";
-export type SearchSpaceSettingsTab =
- | "general"
- | "models"
- | "team-roles"
- | "prompts"
- | "public-links";
+export type WorkspaceSettingsTab = "general" | "models" | "team-roles" | "prompts" | "public-links";
-const DEFAULT_TAB: SearchSpaceSettingsTab = "general";
+const DEFAULT_TAB: WorkspaceSettingsTab = "general";
-interface SearchSpaceSettingsLayoutShellProps {
+interface WorkspaceSettingsLayoutShellProps {
workspaceId: string;
children: React.ReactNode;
}
-export function SearchSpaceSettingsLayoutShell({
+export function WorkspaceSettingsLayoutShell({
workspaceId,
children,
-}: SearchSpaceSettingsLayoutShellProps) {
- const t = useTranslations("searchSpaceSettings");
+}: WorkspaceSettingsLayoutShellProps) {
+ const t = useTranslations("workspaceSettings");
const segment = useSelectedLayoutSegment();
const [tabScrollPos, setTabScrollPos] = useState<"start" | "middle" | "end">("start");
@@ -69,13 +64,13 @@ export function SearchSpaceSettingsLayoutShell({
[t]
);
- const activeTab: SearchSpaceSettingsTab =
+ const activeTab: WorkspaceSettingsTab =
segment && navItems.some((item) => item.value === segment)
- ? (segment as SearchSpaceSettingsTab)
+ ? (segment as WorkspaceSettingsTab)
: DEFAULT_TAB;
const selectedLabel = navItems.find((item) => item.value === activeTab)?.label ?? t("title");
- const hrefFor = (tab: SearchSpaceSettingsTab) =>
+ const hrefFor = (tab: WorkspaceSettingsTab) =>
`/dashboard/${workspaceId}/workspace-settings/${tab}`;
return (
diff --git a/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/layout.tsx b/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/layout.tsx
index 906025090..70196e6cb 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/layout.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/layout.tsx
@@ -1,8 +1,8 @@
import type React from "react";
import { use } from "react";
-import { SearchSpaceSettingsLayoutShell } from "./layout-shell";
+import { WorkspaceSettingsLayoutShell } from "./layout-shell";
-export default function SearchSpaceSettingsLayout({
+export default function WorkspaceSettingsLayout({
params,
children,
}: {
@@ -12,8 +12,8 @@ export default function SearchSpaceSettingsLayout({
const { workspace_id } = use(params);
return (
-
+
{children}
-
+
);
}
diff --git a/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/page.tsx b/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/page.tsx
index cd1d51f3a..20c7d892b 100644
--- a/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/page.tsx
+++ b/surfsense_web/app/dashboard/[workspace_id]/workspace-settings/page.tsx
@@ -1,6 +1,6 @@
import { redirect } from "next/navigation";
-export default async function SearchSpaceSettingsPage({
+export default async function WorkspaceSettingsPage({
params,
}: {
params: Promise<{ workspace_id: string }>;
diff --git a/surfsense_web/app/dashboard/page.tsx b/surfsense_web/app/dashboard/page.tsx
index 205f8df94..bff85b33a 100644
--- a/surfsense_web/app/dashboard/page.tsx
+++ b/surfsense_web/app/dashboard/page.tsx
@@ -6,8 +6,8 @@ import { motion } from "motion/react";
import { useRouter } from "next/navigation";
import { useTranslations } from "next-intl";
import { useEffect, useState } from "react";
-import { searchSpacesAtom } from "@/atoms/workspaces/workspace-query.atoms";
-import { CreateSearchSpaceDialog } from "@/components/layout";
+import { workspacesAtom } from "@/atoms/workspaces/workspace-query.atoms";
+import { CreateWorkspaceDialog } from "@/components/layout";
import { Button } from "@/components/ui/button";
import { Card, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card";
import { useGlobalLoadingEffect } from "@/hooks/use-global-loading";
@@ -42,7 +42,7 @@ function ErrorScreen({ message }: { message: string }) {
}
function EmptyState({ onCreateClick }: { onCreateClick: () => void }) {
- const t = useTranslations("searchSpace");
+ const t = useTranslations("workspace");
return (
@@ -74,26 +74,26 @@ export default function DashboardPage() {
const router = useRouter();
const [showCreateDialog, setShowCreateDialog] = useState(false);
- const { data: searchSpaces = [], isLoading, error } = useAtomValue(searchSpacesAtom);
+ const { data: workspaces = [], isLoading, error } = useAtomValue(workspacesAtom);
useEffect(() => {
if (isLoading) return;
- if (searchSpaces.length > 0) {
+ if (workspaces.length > 0) {
// Read the query string at the time of redirect — no subscription needed.
// (Vercel Best Practice: rerender-defer-reads 5.2)
const query = window.location.search;
- router.replace(`/dashboard/${searchSpaces[0].id}/new-chat${query}`);
+ router.replace(`/dashboard/${workspaces[0].id}/new-chat${query}`);
}
- }, [isLoading, searchSpaces, router]);
+ }, [isLoading, workspaces, router]);
// Show loading while fetching or while we have spaces and are about to redirect
- const shouldShowLoading = isLoading || searchSpaces.length > 0;
+ const shouldShowLoading = isLoading || workspaces.length > 0;
// Use global loading screen - spinner animation won't reset
useGlobalLoadingEffect(shouldShowLoading);
- if (error) return ;
+ if (error) return ;
if (shouldShowLoading) {
return null;
@@ -102,7 +102,7 @@ export default function DashboardPage() {
return (
<>
setShowCreateDialog(true)} />
-
+
>
);
}
diff --git a/surfsense_web/app/desktop/login/page.tsx b/surfsense_web/app/desktop/login/page.tsx
index b8edeba96..2d7e169c2 100644
--- a/surfsense_web/app/desktop/login/page.tsx
+++ b/surfsense_web/app/desktop/login/page.tsx
@@ -14,7 +14,7 @@ import { Separator } from "@/components/ui/separator";
import { ShortcutKbd } from "@/components/ui/shortcut-kbd";
import { Spinner } from "@/components/ui/spinner";
import { useElectronAPI } from "@/hooks/use-platform";
-import { searchSpacesApiService } from "@/lib/apis/workspaces-api.service";
+import { workspacesApiService } from "@/lib/apis/workspaces-api.service";
import { getPostLoginRedirectPath } from "@/lib/auth-utils";
type ShortcutKey = "generalAssist" | "quickAsk" | "screenshotAssist";
@@ -239,7 +239,7 @@ export default function DesktopLoginPage() {
setIsGoogleRedirecting(true);
try {
await api?.startGoogleOAuth?.();
- await autoSetSearchSpace();
+ await autoSetWorkspace();
router.push(getPostLoginRedirectPath());
} catch (error) {
setIsGoogleRedirecting(false);
@@ -247,13 +247,13 @@ export default function DesktopLoginPage() {
}
};
- const autoSetSearchSpace = async () => {
+ const autoSetWorkspace = async () => {
try {
- const stored = await api?.getActiveSearchSpace?.();
+ const stored = await api?.getActiveWorkspace?.();
if (stored) return;
- const spaces = await searchSpacesApiService.getSearchSpaces();
+ const spaces = await workspacesApiService.getWorkspaces();
if (spaces?.length) {
- await api?.setActiveSearchSpace?.(String(spaces[0].id));
+ await api?.setActiveWorkspace?.(String(spaces[0].id));
}
} catch {
// non-critical — dashboard-sync will catch it later
@@ -272,7 +272,7 @@ export default function DesktopLoginPage() {
}
await api.loginPassword(email, password);
- await autoSetSearchSpace();
+ await autoSetWorkspace();
setTimeout(() => {
router.push(getPostLoginRedirectPath());
diff --git a/surfsense_web/app/invite/[invite_code]/page.tsx b/surfsense_web/app/invite/[invite_code]/page.tsx
index a6423d28d..2384ca422 100644
--- a/surfsense_web/app/invite/[invite_code]/page.tsx
+++ b/surfsense_web/app/invite/[invite_code]/page.tsx
@@ -34,9 +34,9 @@ import { useSession } from "@/hooks/use-session";
import { invitesApiService } from "@/lib/apis/invites-api.service";
import { setRedirectPath } from "@/lib/auth-utils";
import {
- trackSearchSpaceInviteAccepted,
- trackSearchSpaceInviteDeclined,
- trackSearchSpaceUserAdded,
+ trackWorkspaceInviteAccepted,
+ trackWorkspaceInviteDeclined,
+ trackWorkspaceUserAdded,
} from "@/lib/posthog/events";
import { cacheKeys } from "@/lib/query-client/cache-keys";
@@ -97,12 +97,8 @@ export default function InviteAcceptPage() {
setAcceptedData(result);
// Track invite accepted and user added events
- trackSearchSpaceInviteAccepted(
- result.workspace_id,
- result.workspace_name,
- result.role_name
- );
- trackSearchSpaceUserAdded(result.workspace_id, result.workspace_name, result.role_name);
+ trackWorkspaceInviteAccepted(result.workspace_id, result.workspace_name, result.role_name);
+ trackWorkspaceUserAdded(result.workspace_id, result.workspace_name, result.role_name);
}
} catch (err: any) {
setError(err.message || "Failed to accept invite");
@@ -113,7 +109,7 @@ export default function InviteAcceptPage() {
const handleDecline = () => {
// Track invite declined event
- trackSearchSpaceInviteDeclined(inviteInfo?.workspace_name);
+ trackWorkspaceInviteDeclined(inviteInfo?.workspace_name);
router.push("/dashboard");
};
@@ -187,7 +183,7 @@ export default function InviteAcceptPage() {
{acceptedData.workspace_name}
-
Search Space
+
Workspace
@@ -206,7 +202,7 @@ export default function InviteAcceptPage() {
className="w-full gap-2"
onClick={() => router.push(`/dashboard/${acceptedData.workspace_id}`)}
>
- Go to Search Space
+ Go to Workspace
@@ -256,7 +252,7 @@ export default function InviteAcceptPage() {
You're Invited!
- Sign in to join {inviteInfo?.workspace_name || "this search space"}
+ Sign in to join {inviteInfo?.workspace_name || "this workspace"}
@@ -267,7 +263,7 @@ export default function InviteAcceptPage() {
{inviteInfo?.workspace_name}
-
Search Space
+
Workspace
{inviteInfo?.role_name && (
@@ -303,7 +299,7 @@ export default function InviteAcceptPage() {
You're Invited!
- Accept this invite to join {inviteInfo?.workspace_name || "this search space"}
+ Accept this invite to join {inviteInfo?.workspace_name || "this workspace"}
@@ -314,7 +310,7 @@ export default function InviteAcceptPage() {
{inviteInfo?.workspace_name}
-
Search Space
+
Workspace
{inviteInfo?.role_name && (
diff --git a/surfsense_web/atoms/agent-tools/agent-tools.atoms.ts b/surfsense_web/atoms/agent-tools/agent-tools.atoms.ts
index 02e0bf4d4..65b3f43d7 100644
--- a/surfsense_web/atoms/agent-tools/agent-tools.atoms.ts
+++ b/surfsense_web/atoms/agent-tools/agent-tools.atoms.ts
@@ -12,78 +12,78 @@ export const agentToolsAtom = atomWithQuery((_get) => ({
const STORAGE_PREFIX = "surfsense-disabled-tools-";
-function loadDisabledTools(searchSpaceId: string): string[] {
+function loadDisabledTools(workspaceId: string): string[] {
if (typeof window === "undefined") return [];
try {
- const raw = localStorage.getItem(`${STORAGE_PREFIX}${searchSpaceId}`);
+ const raw = localStorage.getItem(`${STORAGE_PREFIX}${workspaceId}`);
return raw ? (JSON.parse(raw) as string[]) : [];
} catch {
return [];
}
}
-function saveDisabledTools(searchSpaceId: string, tools: string[]) {
+function saveDisabledTools(workspaceId: string, tools: string[]) {
if (typeof window === "undefined") return;
if (tools.length === 0) {
- localStorage.removeItem(`${STORAGE_PREFIX}${searchSpaceId}`);
+ localStorage.removeItem(`${STORAGE_PREFIX}${workspaceId}`);
} else {
- localStorage.setItem(`${STORAGE_PREFIX}${searchSpaceId}`, JSON.stringify(tools));
+ localStorage.setItem(`${STORAGE_PREFIX}${workspaceId}`, JSON.stringify(tools));
}
}
const disabledToolsBaseAtom = atom([]);
-/** Tracks whether the atom has been hydrated from localStorage for the current search space */
+/** Tracks whether the atom has been hydrated from localStorage for the current workspace */
const hydratedForAtom = atom(null);
/**
* Read/write atom for the set of disabled tool names.
- * Persists to localStorage keyed by search space ID.
+ * Persists to localStorage keyed by workspace ID.
*/
export const disabledToolsAtom = atom(
(get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
const hydratedFor = get(hydratedForAtom);
- if (searchSpaceId && hydratedFor !== searchSpaceId) {
- return loadDisabledTools(searchSpaceId);
+ if (workspaceId && hydratedFor !== workspaceId) {
+ return loadDisabledTools(workspaceId);
}
return get(disabledToolsBaseAtom);
},
(get, set, update: string[] | ((prev: string[]) => string[])) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
const prev = get(disabledToolsBaseAtom);
const next = typeof update === "function" ? update(prev) : update;
set(disabledToolsBaseAtom, next);
- set(hydratedForAtom, searchSpaceId);
- if (searchSpaceId) {
- saveDisabledTools(searchSpaceId, next);
+ set(hydratedForAtom, workspaceId);
+ if (workspaceId) {
+ saveDisabledTools(workspaceId, next);
}
}
);
/**
- * Hydrate disabled tools from localStorage when search space changes.
- * Call this from a useEffect in a component that has access to the search space.
+ * Hydrate disabled tools from localStorage when workspace changes.
+ * Call this from a useEffect in a component that has access to the workspace.
*/
export const hydrateDisabledToolsAtom = atom(null, (get, set) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
- if (!searchSpaceId) return;
- const stored = loadDisabledTools(searchSpaceId);
+ const workspaceId = get(activeWorkspaceIdAtom);
+ if (!workspaceId) return;
+ const stored = loadDisabledTools(workspaceId);
set(disabledToolsBaseAtom, stored);
- set(hydratedForAtom, searchSpaceId);
+ set(hydratedForAtom, workspaceId);
});
/** Toggle a single tool's enabled/disabled state */
export const toggleToolAtom = atom(null, (get, set, toolName: string) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
const current = get(disabledToolsBaseAtom);
const next = current.includes(toolName)
? current.filter((t) => t !== toolName)
: [...current, toolName];
set(disabledToolsBaseAtom, next);
- set(hydratedForAtom, searchSpaceId);
- if (searchSpaceId) {
- saveDisabledTools(searchSpaceId, next);
+ set(hydratedForAtom, workspaceId);
+ if (workspaceId) {
+ saveDisabledTools(workspaceId, next);
}
});
diff --git a/surfsense_web/atoms/automations/automations-mutation.atoms.ts b/surfsense_web/atoms/automations/automations-mutation.atoms.ts
index 021758deb..f96b2a252 100644
--- a/surfsense_web/atoms/automations/automations-mutation.atoms.ts
+++ b/surfsense_web/atoms/automations/automations-mutation.atoms.ts
@@ -26,15 +26,15 @@ import { cacheKeys } from "@/lib/query-client/cache-keys";
import { queryClient } from "@/lib/query-client/client";
// Cache invalidation strategy:
-// - Automation writes invalidate the search-space list + the touched detail.
+// - Automation writes invalidate the workspace list + the touched detail.
// - Trigger writes only invalidate the parent automation detail (triggers
// come back inline in AutomationDetail).
// We deliberately invalidate the whole "automations" prefix on the list side
-// because list is keyed by (searchSpaceId, limit, offset) and we don't track
+// because list is keyed by (workspaceId, limit, offset) and we don't track
// the active pagination in this layer.
-function invalidateList(searchSpaceId: number) {
- queryClient.invalidateQueries({ queryKey: ["automations", "list", searchSpaceId] });
+function invalidateList(workspaceId: number) {
+ queryClient.invalidateQueries({ queryKey: ["automations", "list", workspaceId] });
}
function invalidateDetail(automationId: number) {
@@ -113,17 +113,17 @@ export const updateAutomationMutationAtom = atomWithMutation(() => ({
export const deleteAutomationMutationAtom = atomWithMutation(() => ({
meta: { suppressGlobalErrorToast: true },
- mutationFn: async (vars: { automationId: number; searchSpaceId: number }) => {
+ mutationFn: async (vars: { automationId: number; workspaceId: number }) => {
await automationsApiService.deleteAutomation(vars.automationId);
return vars;
},
onSuccess: (vars) => {
- invalidateList(vars.searchSpaceId);
+ invalidateList(vars.workspaceId);
invalidateDetail(vars.automationId);
toast.success("Automation deleted");
trackAutomationDeleted({
automation_id: vars.automationId,
- workspace_id: vars.searchSpaceId,
+ workspace_id: vars.workspaceId,
});
},
onError: (error: Error, vars) => {
diff --git a/surfsense_web/atoms/automations/automations-query.atoms.ts b/surfsense_web/atoms/automations/automations-query.atoms.ts
index 104c80356..fcb416c53 100644
--- a/surfsense_web/atoms/automations/automations-query.atoms.ts
+++ b/surfsense_web/atoms/automations/automations-query.atoms.ts
@@ -3,7 +3,7 @@ import { activeWorkspaceIdAtom } from "@/atoms/workspaces/workspace-query.atoms"
import { automationsApiService } from "@/lib/apis/automations-api.service";
import { cacheKeys } from "@/lib/query-client/cache-keys";
-// First page of the active search space's automations.
+// First page of the active workspace's automations.
// Detail + paginated/parameterized reads live in hooks (see use-automation.ts,
// use-automation-runs.ts) so atoms stay tied to "current scope" and don't
// proliferate atom families for every (id, limit, offset) tuple.
@@ -11,18 +11,18 @@ const DEFAULT_LIMIT = 50;
const DEFAULT_OFFSET = 0;
export const automationsListAtom = atomWithQuery((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- queryKey: cacheKeys.automations.list(Number(searchSpaceId ?? 0), DEFAULT_LIMIT, DEFAULT_OFFSET),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.automations.list(Number(workspaceId ?? 0), DEFAULT_LIMIT, DEFAULT_OFFSET),
+ enabled: !!workspaceId,
staleTime: 60 * 1000,
queryFn: async () => {
- if (!searchSpaceId) {
+ if (!workspaceId) {
return { items: [], total: 0 };
}
return automationsApiService.listAutomations({
- workspace_id: Number(searchSpaceId),
+ workspace_id: Number(workspaceId),
limit: DEFAULT_LIMIT,
offset: DEFAULT_OFFSET,
});
diff --git a/surfsense_web/atoms/chat/current-thread.atom.ts b/surfsense_web/atoms/chat/current-thread.atom.ts
index 9e931a9bf..de1888f81 100644
--- a/surfsense_web/atoms/chat/current-thread.atom.ts
+++ b/surfsense_web/atoms/chat/current-thread.atom.ts
@@ -4,14 +4,14 @@ import { reportPanelAtom } from "./report-panel.atom";
interface CurrentThreadState {
id: number | null;
- searchSpaceId: number | null;
+ workspaceId: number | null;
visibility: ChatVisibility | null;
hasComments: boolean;
}
interface CurrentThreadMetadataPatch {
id: number | null;
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
visibility?: ChatVisibility | null;
hasComments?: boolean;
}
@@ -24,7 +24,7 @@ interface CurrentThreadMetadataUpdate {
const initialState: CurrentThreadState = {
id: null,
- searchSpaceId: null,
+ workspaceId: null,
visibility: null,
hasComments: false,
};
@@ -44,11 +44,11 @@ export const setCurrentThreadMetadataAtom = atom(
set(currentThreadAtom, {
...current,
id: metadata.id,
- searchSpaceId:
- "searchSpaceId" in metadata
- ? (metadata.searchSpaceId ?? null)
+ workspaceId:
+ "workspaceId" in metadata
+ ? (metadata.workspaceId ?? null)
: isSameThread
- ? current.searchSpaceId
+ ? current.workspaceId
: null,
visibility:
"visibility" in metadata
diff --git a/surfsense_web/atoms/connectors/connector-mutation.atoms.ts b/surfsense_web/atoms/connectors/connector-mutation.atoms.ts
index 927ac8572..1cd980e82 100644
--- a/surfsense_web/atoms/connectors/connector-mutation.atoms.ts
+++ b/surfsense_web/atoms/connectors/connector-mutation.atoms.ts
@@ -13,38 +13,38 @@ import { queryClient } from "@/lib/query-client/client";
import { activeWorkspaceIdAtom } from "../workspaces/workspace-query.atoms";
export const createConnectorMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: cacheKeys.connectors.all(searchSpaceId ?? ""),
- enabled: !!searchSpaceId,
+ mutationKey: cacheKeys.connectors.all(workspaceId ?? ""),
+ enabled: !!workspaceId,
mutationFn: async (request: CreateConnectorRequest) => {
return connectorsApiService.createConnector(request);
},
onSuccess: () => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
queryClient.invalidateQueries({
- queryKey: cacheKeys.connectors.all(searchSpaceId),
+ queryKey: cacheKeys.connectors.all(workspaceId),
});
},
};
});
export const updateConnectorMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: cacheKeys.connectors.all(searchSpaceId ?? ""),
- enabled: !!searchSpaceId,
+ mutationKey: cacheKeys.connectors.all(workspaceId ?? ""),
+ enabled: !!workspaceId,
mutationFn: async (request: UpdateConnectorRequest) => {
return connectorsApiService.updateConnector(request);
},
onSuccess: (_, request: UpdateConnectorRequest) => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
queryClient.invalidateQueries({
- queryKey: cacheKeys.connectors.all(searchSpaceId),
+ queryKey: cacheKeys.connectors.all(workspaceId),
});
queryClient.invalidateQueries({
queryKey: cacheKeys.connectors.byId(String(request.id)),
@@ -54,19 +54,19 @@ export const updateConnectorMutationAtom = atomWithMutation((get) => {
});
export const deleteConnectorMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: cacheKeys.connectors.all(searchSpaceId ?? ""),
- enabled: !!searchSpaceId,
+ mutationKey: cacheKeys.connectors.all(workspaceId ?? ""),
+ enabled: !!workspaceId,
mutationFn: async (request: DeleteConnectorRequest) => {
return connectorsApiService.deleteConnector(request);
},
onSuccess: (_, request: DeleteConnectorRequest) => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
queryClient.setQueryData(
- cacheKeys.connectors.all(searchSpaceId),
+ cacheKeys.connectors.all(workspaceId),
(oldData: GetConnectorsResponse | undefined) => {
if (!oldData) return oldData;
return oldData.filter((connector) => connector.id !== request.id);
@@ -80,19 +80,19 @@ export const deleteConnectorMutationAtom = atomWithMutation((get) => {
});
export const indexConnectorMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
mutationKey: cacheKeys.connectors.index(),
- enabled: !!searchSpaceId,
+ enabled: !!workspaceId,
mutationFn: async (request: IndexConnectorRequest) => {
return connectorsApiService.indexConnector(request);
},
onSuccess: (response: IndexConnectorResponse) => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
queryClient.invalidateQueries({
- queryKey: cacheKeys.connectors.all(searchSpaceId),
+ queryKey: cacheKeys.connectors.all(workspaceId),
});
queryClient.invalidateQueries({
queryKey: cacheKeys.connectors.byId(String(response.connector_id)),
diff --git a/surfsense_web/atoms/connectors/connector-query.atoms.ts b/surfsense_web/atoms/connectors/connector-query.atoms.ts
index b43e23388..8d75e4586 100644
--- a/surfsense_web/atoms/connectors/connector-query.atoms.ts
+++ b/surfsense_web/atoms/connectors/connector-query.atoms.ts
@@ -4,16 +4,16 @@ import { cacheKeys } from "@/lib/query-client/cache-keys";
import { activeWorkspaceIdAtom } from "../workspaces/workspace-query.atoms";
export const connectorsAtom = atomWithQuery((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- queryKey: cacheKeys.connectors.all(searchSpaceId!),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.connectors.all(workspaceId!),
+ enabled: !!workspaceId,
staleTime: 5 * 60 * 1000, // 5 minutes
queryFn: async () => {
return connectorsApiService.getConnectors({
queryParams: {
- workspace_id: searchSpaceId!,
+ workspace_id: workspaceId!,
},
});
},
diff --git a/surfsense_web/atoms/documents/document-mutation.atoms.ts b/surfsense_web/atoms/documents/document-mutation.atoms.ts
index 6336f7441..c5f95234a 100644
--- a/surfsense_web/atoms/documents/document-mutation.atoms.ts
+++ b/surfsense_web/atoms/documents/document-mutation.atoms.ts
@@ -14,12 +14,12 @@ import { queryClient } from "@/lib/query-client/client";
import { globalDocumentsQueryParamsAtom } from "./ui.atoms";
export const createDocumentMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
const documentsQueryParams = get(globalDocumentsQueryParamsAtom);
return {
mutationKey: cacheKeys.documents.globalQueryParams(documentsQueryParams),
- enabled: !!searchSpaceId,
+ enabled: !!workspaceId,
mutationFn: async (request: CreateDocumentRequest) => {
return documentsApiService.createDocument(request);
},
@@ -34,12 +34,12 @@ export const createDocumentMutationAtom = atomWithMutation((get) => {
});
export const uploadDocumentMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
const documentsQueryParams = get(globalDocumentsQueryParamsAtom);
return {
mutationKey: cacheKeys.documents.globalQueryParams(documentsQueryParams),
- enabled: !!searchSpaceId,
+ enabled: !!workspaceId,
mutationFn: async (request: UploadDocumentRequest) => {
return documentsApiService.uploadDocument(request);
},
@@ -47,19 +47,19 @@ export const uploadDocumentMutationAtom = atomWithMutation((get) => {
onSuccess: () => {
// Note: Toast notification is handled by the caller (DocumentUploadTab) to use i18n
queryClient.invalidateQueries({
- queryKey: cacheKeys.logs.summary(searchSpaceId ?? undefined),
+ queryKey: cacheKeys.logs.summary(workspaceId ?? undefined),
});
},
};
});
export const updateDocumentMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
const documentsQueryParams = get(globalDocumentsQueryParamsAtom);
return {
mutationKey: cacheKeys.documents.globalQueryParams(documentsQueryParams),
- enabled: !!searchSpaceId,
+ enabled: !!workspaceId,
mutationFn: async (request: UpdateDocumentRequest) => {
return documentsApiService.updateDocument(request);
},
@@ -77,12 +77,12 @@ export const updateDocumentMutationAtom = atomWithMutation((get) => {
});
export const deleteDocumentMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
const documentsQueryParams = get(globalDocumentsQueryParamsAtom);
return {
mutationKey: cacheKeys.documents.globalQueryParams(documentsQueryParams),
- enabled: !!searchSpaceId,
+ enabled: !!workspaceId,
mutationFn: async (request: DeleteDocumentRequest) => {
return documentsApiService.deleteDocument(request);
},
diff --git a/surfsense_web/atoms/documents/folder.atoms.ts b/surfsense_web/atoms/documents/folder.atoms.ts
index bbdc58e4e..2d381557b 100644
--- a/surfsense_web/atoms/documents/folder.atoms.ts
+++ b/surfsense_web/atoms/documents/folder.atoms.ts
@@ -4,7 +4,7 @@ import { atom } from "jotai";
import { atomWithStorage } from "jotai/utils";
/**
- * Set of folder IDs that are currently expanded in the tree, keyed by search space ID.
+ * Set of folder IDs that are currently expanded in the tree, keyed by workspace ID.
* Persisted to localStorage so expand/collapse state survives page refreshes.
*/
export const expandedFolderIdsAtom = atomWithStorage>(
@@ -13,7 +13,7 @@ export const expandedFolderIdsAtom = atomWithStorage>(
);
/**
- * Expanded folder keys for Local filesystem tree, keyed by search space ID.
+ * Expanded folder keys for Local filesystem tree, keyed by workspace ID.
* Persisted so local tree expansion survives remounts/reloads.
*/
export const localExpandedFolderKeysAtom = atomWithStorage>(
diff --git a/surfsense_web/atoms/documents/ui.atoms.ts b/surfsense_web/atoms/documents/ui.atoms.ts
index febdb19ec..37096a3d1 100644
--- a/surfsense_web/atoms/documents/ui.atoms.ts
+++ b/surfsense_web/atoms/documents/ui.atoms.ts
@@ -12,7 +12,7 @@ export interface AgentCreatedDocument {
id: number;
title: string;
documentType: string;
- searchSpaceId: number;
+ workspaceId: number;
folderId: number | null;
createdById: string | null;
}
diff --git a/surfsense_web/atoms/editor/editor-panel.atom.ts b/surfsense_web/atoms/editor/editor-panel.atom.ts
index c302c66ee..5df2d2fbe 100644
--- a/surfsense_web/atoms/editor/editor-panel.atom.ts
+++ b/surfsense_web/atoms/editor/editor-panel.atom.ts
@@ -6,7 +6,7 @@ interface EditorPanelState {
kind: "document" | "local_file" | "memory";
documentId: number | null;
localFilePath: string | null;
- searchSpaceId: number | null;
+ workspaceId: number | null;
memoryScope: "user" | "team" | null;
title: string | null;
}
@@ -16,7 +16,7 @@ const initialState: EditorPanelState = {
kind: "document",
documentId: null,
localFilePath: null,
- searchSpaceId: null,
+ workspaceId: null,
memoryScope: null,
title: null,
};
@@ -33,18 +33,18 @@ export const openEditorPanelAtom = atom(
get,
set,
payload:
- | { documentId: number; searchSpaceId: number; title?: string; kind?: "document" }
+ | { documentId: number; workspaceId: number; title?: string; kind?: "document" }
| {
kind: "local_file";
localFilePath: string;
title?: string;
- searchSpaceId?: number;
+ workspaceId?: number;
}
| {
kind: "memory";
memoryScope: "user" | "team";
title?: string;
- searchSpaceId?: number;
+ workspaceId?: number;
}
) => {
if (!get(editorPanelAtom).isOpen) {
@@ -56,7 +56,7 @@ export const openEditorPanelAtom = atom(
kind: "local_file",
documentId: null,
localFilePath: payload.localFilePath,
- searchSpaceId: payload.searchSpaceId ?? null,
+ workspaceId: payload.workspaceId ?? null,
memoryScope: null,
title: payload.title ?? null,
});
@@ -70,7 +70,7 @@ export const openEditorPanelAtom = atom(
kind: "memory",
documentId: null,
localFilePath: null,
- searchSpaceId: payload.searchSpaceId ?? null,
+ workspaceId: payload.workspaceId ?? null,
memoryScope: payload.memoryScope,
title: payload.title ?? null,
});
@@ -83,7 +83,7 @@ export const openEditorPanelAtom = atom(
kind: "document",
documentId: payload.documentId,
localFilePath: null,
- searchSpaceId: payload.searchSpaceId,
+ workspaceId: payload.workspaceId,
memoryScope: null,
title: payload.title ?? null,
});
diff --git a/surfsense_web/atoms/invites/invites-mutation.atoms.ts b/surfsense_web/atoms/invites/invites-mutation.atoms.ts
index cb0871372..463f6c7df 100644
--- a/surfsense_web/atoms/invites/invites-mutation.atoms.ts
+++ b/surfsense_web/atoms/invites/invites-mutation.atoms.ts
@@ -79,7 +79,7 @@ export const acceptInviteMutationAtom = atomWithMutation(() => ({
return invitesApiService.acceptInvite(request);
},
onSuccess: () => {
- queryClient.invalidateQueries({ queryKey: cacheKeys.searchSpaces.all });
+ queryClient.invalidateQueries({ queryKey: cacheKeys.workspaces.all });
toast.success("Invite accepted successfully");
},
onError: (error: Error) => {
diff --git a/surfsense_web/atoms/invites/invites-query.atoms.ts b/surfsense_web/atoms/invites/invites-query.atoms.ts
index 925ba3bf0..7b47a29f6 100644
--- a/surfsense_web/atoms/invites/invites-query.atoms.ts
+++ b/surfsense_web/atoms/invites/invites-query.atoms.ts
@@ -4,18 +4,18 @@ import { invitesApiService } from "@/lib/apis/invites-api.service";
import { cacheKeys } from "@/lib/query-client/cache-keys";
export const invitesAtom = atomWithQuery((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- queryKey: cacheKeys.invites.all(searchSpaceId?.toString() ?? ""),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.invites.all(workspaceId?.toString() ?? ""),
+ enabled: !!workspaceId,
staleTime: 5 * 60 * 1000, // 5 minutes
queryFn: async () => {
- if (!searchSpaceId) {
+ if (!workspaceId) {
return [];
}
return invitesApiService.getInvites({
- workspace_id: Number(searchSpaceId),
+ workspace_id: Number(workspaceId),
});
},
};
diff --git a/surfsense_web/atoms/logs/log-mutation.atoms.ts b/surfsense_web/atoms/logs/log-mutation.atoms.ts
index 19a2d770f..b00cca8ea 100644
--- a/surfsense_web/atoms/logs/log-mutation.atoms.ts
+++ b/surfsense_web/atoms/logs/log-mutation.atoms.ts
@@ -13,10 +13,10 @@ import { queryClient } from "@/lib/query-client/client";
* Create Log Mutation
*/
export const createLogMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: cacheKeys.logs.list(searchSpaceId ?? undefined),
- enabled: !!searchSpaceId,
+ mutationKey: cacheKeys.logs.list(workspaceId ?? undefined),
+ enabled: !!workspaceId,
mutationFn: async (request: CreateLogRequest) => logsApiService.createLog(request),
onSuccess: () => {
// Invalidate all log-related queries (list, summary, detail, withQueryParams)
@@ -29,10 +29,10 @@ export const createLogMutationAtom = atomWithMutation((get) => {
* Update Log Mutation
*/
export const updateLogMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: cacheKeys.logs.list(searchSpaceId ?? undefined),
- enabled: !!searchSpaceId,
+ mutationKey: cacheKeys.logs.list(workspaceId ?? undefined),
+ enabled: !!workspaceId,
mutationFn: async ({ logId, data }: { logId: number; data: UpdateLogRequest }) =>
logsApiService.updateLog(logId, data),
onSuccess: (_data, variables) => {
@@ -45,10 +45,10 @@ export const updateLogMutationAtom = atomWithMutation((get) => {
* Delete Log Mutation
*/
export const deleteLogMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: cacheKeys.logs.list(searchSpaceId ?? undefined),
- enabled: !!searchSpaceId,
+ mutationKey: cacheKeys.logs.list(workspaceId ?? undefined),
+ enabled: !!workspaceId,
mutationFn: async (request: DeleteLogRequest) => logsApiService.deleteLog(request),
onSuccess: (_data, request) => {
queryClient.invalidateQueries({ queryKey: ["logs"] });
diff --git a/surfsense_web/atoms/members/members-mutation.atoms.ts b/surfsense_web/atoms/members/members-mutation.atoms.ts
index 8d080fd2c..d6fff4db3 100644
--- a/surfsense_web/atoms/members/members-mutation.atoms.ts
+++ b/surfsense_web/atoms/members/members-mutation.atoms.ts
@@ -3,8 +3,8 @@ import { toast } from "sonner";
import type {
DeleteMembershipRequest,
DeleteMembershipResponse,
- LeaveSearchSpaceRequest,
- LeaveSearchSpaceResponse,
+ LeaveWorkspaceRequest,
+ LeaveWorkspaceResponse,
UpdateMembershipRequest,
UpdateMembershipResponse,
} from "@/contracts/types/members.types";
@@ -48,20 +48,20 @@ export const deleteMemberMutationAtom = atomWithMutation(() => {
};
});
-export const leaveSearchSpaceMutationAtom = atomWithMutation(() => {
+export const leaveWorkspaceMutationAtom = atomWithMutation(() => {
return {
meta: { suppressGlobalErrorToast: true },
- mutationFn: async (request: LeaveSearchSpaceRequest) => {
- return membersApiService.leaveSearchSpace(request);
+ mutationFn: async (request: LeaveWorkspaceRequest) => {
+ return membersApiService.leaveWorkspace(request);
},
- onSuccess: (_: LeaveSearchSpaceResponse, request: LeaveSearchSpaceRequest) => {
- toast.success("Successfully left the search space");
+ onSuccess: (_: LeaveWorkspaceResponse, request: LeaveWorkspaceRequest) => {
+ toast.success("Successfully left the workspace");
queryClient.invalidateQueries({
queryKey: cacheKeys.members.all(request.workspace_id.toString()),
});
},
onError: () => {
- toast.error("Failed to leave search space");
+ toast.error("Failed to leave workspace");
},
};
});
diff --git a/surfsense_web/atoms/members/members-query.atoms.ts b/surfsense_web/atoms/members/members-query.atoms.ts
index 0f04a0f80..6ff285fc7 100644
--- a/surfsense_web/atoms/members/members-query.atoms.ts
+++ b/surfsense_web/atoms/members/members-query.atoms.ts
@@ -5,37 +5,37 @@ import { membersApiService } from "@/lib/apis/members-api.service";
import { cacheKeys } from "@/lib/query-client/cache-keys";
export const membersAtom = atomWithQuery((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- queryKey: cacheKeys.members.all(searchSpaceId?.toString() ?? ""),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.members.all(workspaceId?.toString() ?? ""),
+ enabled: !!workspaceId,
staleTime: 3 * 1000, // 3 seconds - short staleness for live collaboration
refetchInterval: 2 * 60 * 1000, // 2 minutes
queryFn: async () => {
- if (!searchSpaceId) {
+ if (!workspaceId) {
return [];
}
return membersApiService.getMembers({
- workspace_id: Number(searchSpaceId),
+ workspace_id: Number(workspaceId),
});
},
};
});
export const myAccessAtom = atomWithQuery((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- queryKey: cacheKeys.members.myAccess(searchSpaceId?.toString() ?? ""),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.members.myAccess(workspaceId?.toString() ?? ""),
+ enabled: !!workspaceId,
staleTime: 5 * 60 * 1000, // 5 minutes
queryFn: async () => {
- if (!searchSpaceId) {
+ if (!workspaceId) {
return null;
}
return membersApiService.getMyAccess({
- workspace_id: Number(searchSpaceId),
+ workspace_id: Number(workspaceId),
});
},
};
diff --git a/surfsense_web/atoms/model-connections/model-connections-mutation.atoms.ts b/surfsense_web/atoms/model-connections/model-connections-mutation.atoms.ts
index ecc570ed5..5228833e2 100644
--- a/surfsense_web/atoms/model-connections/model-connections-mutation.atoms.ts
+++ b/surfsense_web/atoms/model-connections/model-connections-mutation.atoms.ts
@@ -18,18 +18,18 @@ import { cacheKeys } from "@/lib/query-client/cache-keys";
import { queryClient } from "@/lib/query-client/client";
import { activeWorkspaceIdAtom } from "../workspaces/workspace-query.atoms";
-function invalidateModelConnections(searchSpaceId: number) {
+function invalidateModelConnections(workspaceId: number) {
queryClient.invalidateQueries({
- queryKey: cacheKeys.modelConnections.all(searchSpaceId),
+ queryKey: cacheKeys.modelConnections.all(workspaceId),
});
queryClient.invalidateQueries({
- queryKey: cacheKeys.modelConnections.roles(searchSpaceId),
+ queryKey: cacheKeys.modelConnections.roles(workspaceId),
});
}
-function upsertModelConnection(searchSpaceId: number, connection: ConnectionRead) {
+function upsertModelConnection(workspaceId: number, connection: ConnectionRead) {
queryClient.setQueryData(
- cacheKeys.modelConnections.all(searchSpaceId),
+ cacheKeys.modelConnections.all(workspaceId),
(current = []) => {
if (current.some((item) => item.id === connection.id)) {
return current.map((item) => (item.id === connection.id ? connection : item));
@@ -40,19 +40,19 @@ function upsertModelConnection(searchSpaceId: number, connection: ConnectionRead
}
export const createModelConnectionMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["model-connections", "create"],
mutationFn: (request: ConnectionCreateRequest) =>
modelConnectionsApiService.createConnection(request),
onSuccess: (connection: ConnectionRead, request: ConnectionCreateRequest) => {
- const resolvedSearchSpaceId = Number(
- request.workspace_id ?? connection.workspace_id ?? searchSpaceId
+ const resolvedWorkspaceId = Number(
+ request.workspace_id ?? connection.workspace_id ?? workspaceId
);
toast.success("Connection created");
- if (resolvedSearchSpaceId > 0) {
- upsertModelConnection(resolvedSearchSpaceId, connection);
- invalidateModelConnections(resolvedSearchSpaceId);
+ if (resolvedWorkspaceId > 0) {
+ upsertModelConnection(resolvedWorkspaceId, connection);
+ invalidateModelConnections(resolvedWorkspaceId);
}
},
onError: (error: Error) => toast.error(error.message || "Failed to create connection"),
@@ -60,34 +60,34 @@ export const createModelConnectionMutationAtom = atomWithMutation((get) => {
});
export const updateModelConnectionMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["model-connections", "update"],
mutationFn: ({ id, data }: { id: number; data: ConnectionUpdateRequest }) =>
modelConnectionsApiService.updateConnection(id, data),
onSuccess: () => {
toast.success("Connection updated");
- invalidateModelConnections(searchSpaceId);
+ invalidateModelConnections(workspaceId);
},
onError: (error: Error) => toast.error(error.message || "Failed to update connection"),
};
});
export const deleteModelConnectionMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["model-connections", "delete"],
mutationFn: (id: number) => modelConnectionsApiService.deleteConnection(id),
onSuccess: () => {
toast.success("Connection deleted");
- invalidateModelConnections(searchSpaceId);
+ invalidateModelConnections(workspaceId);
},
onError: (error: Error) => toast.error(error.message || "Failed to delete connection"),
};
});
export const verifyModelConnectionMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["model-connections", "verify"],
mutationFn: (id: number) => modelConnectionsApiService.verifyConnection(id),
@@ -103,14 +103,14 @@ export const verifyModelConnectionMutationAtom = atomWithMutation((get) => {
: "Couldn't list models. Chat may still work — add model IDs manually."
);
}
- invalidateModelConnections(searchSpaceId);
+ invalidateModelConnections(workspaceId);
},
onError: (error: Error) => toast.error(error.message || "Failed to verify connection"),
};
});
export const discoverConnectionModelsMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["model-connections", "discover"],
mutationFn: (id: number) => modelConnectionsApiService.discoverModels(id),
@@ -118,7 +118,7 @@ export const discoverConnectionModelsMutationAtom = atomWithMutation((get) => {
toast.success(
models.length ? `${models.length} models discovered` : "No models found for this connection"
);
- invalidateModelConnections(searchSpaceId);
+ invalidateModelConnections(workspaceId);
},
onError: (error: Error) => toast.error(error.message || "Failed to discover models"),
};
@@ -149,64 +149,64 @@ export const testPreviewModelMutationAtom = atomWithMutation(() => {
});
export const addManualModelMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["models", "add-manual"],
mutationFn: ({ connectionId, data }: { connectionId: number; data: ModelCreateRequest }) =>
modelConnectionsApiService.addManualModel(connectionId, data),
onSuccess: () => {
toast.success("Model added");
- invalidateModelConnections(searchSpaceId);
+ invalidateModelConnections(workspaceId);
},
onError: (error: Error) => toast.error(error.message || "Failed to add model"),
};
});
export const updateModelMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["models", "update"],
mutationFn: ({ id, data }: { id: number; data: ModelUpdateRequest }) =>
modelConnectionsApiService.updateModel(id, data),
- onSuccess: () => invalidateModelConnections(searchSpaceId),
+ onSuccess: () => invalidateModelConnections(workspaceId),
onError: (error: Error) => toast.error(error.message || "Failed to update model"),
};
});
export const bulkUpdateModelsMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["models", "bulk-update"],
mutationFn: ({ connectionId, data }: { connectionId: number; data: ModelsBulkUpdateRequest }) =>
modelConnectionsApiService.bulkUpdateModels(connectionId, data),
- onSuccess: () => invalidateModelConnections(searchSpaceId),
+ onSuccess: () => invalidateModelConnections(workspaceId),
onError: (error: Error) => toast.error(error.message || "Failed to update models"),
};
});
export const testModelMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["models", "test"],
mutationFn: (id: number) => modelConnectionsApiService.testModel(id),
onSuccess: (result: VerifyConnectionResponse) => {
if (result.ok) toast.success("Model test succeeded");
else toast.error(result.message || "Model test failed");
- invalidateModelConnections(searchSpaceId);
+ invalidateModelConnections(workspaceId);
},
onError: (error: Error) => toast.error(error.message || "Failed to test model"),
};
});
export const updateModelRolesMutationAtom = atomWithMutation((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
mutationKey: ["model-roles", "update"],
mutationFn: (roles: ModelRoles) =>
- modelConnectionsApiService.updateModelRoles(searchSpaceId, roles),
+ modelConnectionsApiService.updateModelRoles(workspaceId, roles),
onSuccess: () => {
queryClient.invalidateQueries({
- queryKey: cacheKeys.modelConnections.roles(searchSpaceId),
+ queryKey: cacheKeys.modelConnections.roles(workspaceId),
});
},
onError: (error: Error) => toast.error(error.message || "Failed to update model roles"),
diff --git a/surfsense_web/atoms/model-connections/model-connections-query.atoms.ts b/surfsense_web/atoms/model-connections/model-connections-query.atoms.ts
index be3643b67..36cc6ae4e 100644
--- a/surfsense_web/atoms/model-connections/model-connections-query.atoms.ts
+++ b/surfsense_web/atoms/model-connections/model-connections-query.atoms.ts
@@ -26,21 +26,21 @@ export const modelProvidersAtom = atomWithQuery(() => ({
}));
export const modelConnectionsAtom = atomWithQuery((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
- queryKey: cacheKeys.modelConnections.all(searchSpaceId),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.modelConnections.all(workspaceId),
+ enabled: !!workspaceId,
staleTime: 5 * 60 * 1000,
- queryFn: () => modelConnectionsApiService.getConnections(searchSpaceId),
+ queryFn: () => modelConnectionsApiService.getConnections(workspaceId),
};
});
export const modelRolesAtom = atomWithQuery((get) => {
- const searchSpaceId = Number(get(activeWorkspaceIdAtom));
+ const workspaceId = Number(get(activeWorkspaceIdAtom));
return {
- queryKey: cacheKeys.modelConnections.roles(searchSpaceId),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.modelConnections.roles(workspaceId),
+ enabled: !!workspaceId,
staleTime: 5 * 60 * 1000,
- queryFn: () => modelConnectionsApiService.getModelRoles(searchSpaceId),
+ queryFn: () => modelConnectionsApiService.getModelRoles(workspaceId),
};
});
diff --git a/surfsense_web/atoms/public-chat-snapshots/public-chat-snapshots-query.atoms.ts b/surfsense_web/atoms/public-chat-snapshots/public-chat-snapshots-query.atoms.ts
index c96ba53d7..4f9e07b62 100644
--- a/surfsense_web/atoms/public-chat-snapshots/public-chat-snapshots-query.atoms.ts
+++ b/surfsense_web/atoms/public-chat-snapshots/public-chat-snapshots-query.atoms.ts
@@ -4,18 +4,18 @@ import { chatThreadsApiService } from "@/lib/apis/chat-threads-api.service";
import { cacheKeys } from "@/lib/query-client/cache-keys";
export const publicChatSnapshotsAtom = atomWithQuery((get) => {
- const searchSpaceId = get(activeWorkspaceIdAtom);
+ const workspaceId = get(activeWorkspaceIdAtom);
return {
- queryKey: cacheKeys.publicChatSnapshots.bySearchSpace(Number(searchSpaceId) || 0),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.publicChatSnapshots.byWorkspace(Number(workspaceId) || 0),
+ enabled: !!workspaceId,
staleTime: 5 * 60 * 1000,
queryFn: async () => {
- if (!searchSpaceId) {
+ if (!workspaceId) {
return { snapshots: [] };
}
- return chatThreadsApiService.listPublicChatSnapshotsForSearchSpace({
- workspace_id: Number(searchSpaceId),
+ return chatThreadsApiService.listPublicChatSnapshotsForWorkspace({
+ workspace_id: Number(workspaceId),
});
},
};
diff --git a/surfsense_web/atoms/tabs/migrate-tabs.test.ts b/surfsense_web/atoms/tabs/migrate-tabs.test.ts
new file mode 100644
index 000000000..e0067a4d2
--- /dev/null
+++ b/surfsense_web/atoms/tabs/migrate-tabs.test.ts
@@ -0,0 +1,21 @@
+import assert from "node:assert/strict";
+import { test } from "node:test";
+import { migrateLegacyTabs } from "./migrate-tabs";
+
+// Run with: pnpm exec tsx --test atoms/tabs/migrate-tabs.test.ts
+test("maps legacy searchSpaceId to workspaceId on read", () => {
+ const migrated = migrateLegacyTabs({
+ tabs: [{ id: "chat-new", type: "chat", searchSpaceId: 7 } as never],
+ activeTabId: "chat-new",
+ });
+ const tab = migrated.tabs[0] as { workspaceId?: number };
+ assert.equal(tab.workspaceId, 7);
+});
+
+test("leaves an already-migrated workspaceId untouched", () => {
+ const migrated = migrateLegacyTabs({
+ tabs: [{ id: "d1", type: "document", workspaceId: 3, searchSpaceId: 9 } as never],
+ });
+ const tab = migrated.tabs[0] as { workspaceId?: number };
+ assert.equal(tab.workspaceId, 3);
+});
diff --git a/surfsense_web/atoms/tabs/migrate-tabs.ts b/surfsense_web/atoms/tabs/migrate-tabs.ts
new file mode 100644
index 000000000..e95a921de
--- /dev/null
+++ b/surfsense_web/atoms/tabs/migrate-tabs.ts
@@ -0,0 +1,19 @@
+/**
+ * One-time read-migration for persisted tabs: legacy state stored the workspace
+ * as `searchSpaceId`. Map it to `workspaceId` on read so already-open tabs keep
+ * their workspace association after the rename. Pure + dependency-free so it can
+ * be unit-checked without loading the atom module.
+ */
+export function migrateLegacyTabs }>(
+ state: T
+): T {
+ return {
+ ...state,
+ tabs: state.tabs.map((t) => {
+ const legacy = t as { workspaceId?: number; searchSpaceId?: number };
+ return legacy.workspaceId === undefined && legacy.searchSpaceId !== undefined
+ ? { ...t, workspaceId: legacy.searchSpaceId }
+ : t;
+ }),
+ };
+}
diff --git a/surfsense_web/atoms/tabs/tabs.atom.ts b/surfsense_web/atoms/tabs/tabs.atom.ts
index 0abbf2e74..45e0c098c 100644
--- a/surfsense_web/atoms/tabs/tabs.atom.ts
+++ b/surfsense_web/atoms/tabs/tabs.atom.ts
@@ -1,6 +1,7 @@
import { atom } from "jotai";
import { atomWithStorage, createJSONStorage } from "jotai/utils";
import type { ChatVisibility } from "@/lib/chat/thread-persistence";
+import { migrateLegacyTabs } from "./migrate-tabs";
export type TabType = "chat" | "document";
@@ -15,7 +16,7 @@ export interface Tab {
hasComments?: boolean;
/** For document tabs */
documentId?: number;
- searchSpaceId?: number;
+ workspaceId?: number;
}
interface TabsState {
@@ -40,11 +41,17 @@ const initialState: TabsState = {
const deletedChatIdsAtom = atom>(new Set());
// Persist tabs in localStorage so they survive a hard refresh and let the user
-// keep tabs open across multiple search spaces (browser-like behavior).
+// keep tabs open across multiple workspaces (browser-like behavior).
const localStorageAdapter = createJSONStorage(
() => (typeof window !== "undefined" ? localStorage : undefined) as Storage
);
+// Wrap getItem in place so the adapter keeps its original (sync) type while
+// migrating legacy persisted state on read.
+const baseGetItem = localStorageAdapter.getItem.bind(localStorageAdapter);
+localStorageAdapter.getItem = (key, initialValue) =>
+ migrateLegacyTabs(baseGetItem(key, initialValue));
+
export const tabsStateAtom = atomWithStorage(
"surfsense:tabs",
initialState,
@@ -81,14 +88,14 @@ export const syncChatTabAtom = atom(
chatId,
title,
chatUrl,
- searchSpaceId,
+ workspaceId,
visibility,
hasComments,
}: {
chatId: number | null;
title?: string;
chatUrl?: string;
- searchSpaceId: number;
+ workspaceId: number;
visibility?: ChatVisibility;
hasComments?: boolean;
}
@@ -111,7 +118,7 @@ export const syncChatTabAtom = atom(
...t,
title: title || t.title,
chatUrl: chatUrl || t.chatUrl,
- searchSpaceId: searchSpaceId ?? t.searchSpaceId,
+ workspaceId: workspaceId ?? t.workspaceId,
...(visibility !== undefined ? { visibility } : {}),
...(hasComments !== undefined ? { hasComments } : {}),
}
@@ -122,18 +129,18 @@ export const syncChatTabAtom = atom(
}
// If navigating to a new chat (no chatId), ensure there's a "new chat" tab
- // scoped to the current search space.
+ // scoped to the current workspace.
if (!chatId) {
const hasNewChatTab = state.tabs.some((t) => t.id === "chat-new");
if (hasNewChatTab) {
set(tabsStateAtom, {
...state,
activeTabId: "chat-new",
- tabs: state.tabs.map((t) => (t.id === "chat-new" ? { ...t, searchSpaceId, chatUrl } : t)),
+ tabs: state.tabs.map((t) => (t.id === "chat-new" ? { ...t, workspaceId, chatUrl } : t)),
});
} else {
set(tabsStateAtom, {
- tabs: [...state.tabs, { ...INITIAL_CHAT_TAB, searchSpaceId, chatUrl }],
+ tabs: [...state.tabs, { ...INITIAL_CHAT_TAB, workspaceId, chatUrl }],
activeTabId: "chat-new",
});
}
@@ -148,7 +155,7 @@ export const syncChatTabAtom = atom(
title: title || "New Chat",
chatId,
chatUrl,
- searchSpaceId,
+ workspaceId,
...(visibility !== undefined ? { visibility } : {}),
...(hasComments !== undefined ? { hasComments } : {}),
};
@@ -197,11 +204,7 @@ export const openDocumentTabAtom = atom(
(
get,
set,
- {
- documentId,
- searchSpaceId,
- title,
- }: { documentId: number; searchSpaceId: number; title?: string }
+ { documentId, workspaceId, title }: { documentId: number; workspaceId: number; title?: string }
) => {
const state = get(tabsStateAtom);
const tabId = makeDocumentTabId(documentId);
@@ -221,7 +224,7 @@ export const openDocumentTabAtom = atom(
type: "document",
title: title || `Document ${documentId}`,
documentId,
- searchSpaceId,
+ workspaceId,
};
set(tabsStateAtom, {
@@ -300,7 +303,7 @@ export const removeChatTabAtom = atom(null, (get, set, chatId: number) => {
return remaining.find((t) => t.id === newActiveId) ?? null;
});
-/** Reset tabs when switching search spaces. */
+/** Reset tabs when switching workspaces. */
export const resetTabsAtom = atom(null, (_get, set) => {
set(tabsStateAtom, { ...initialState });
set(deletedChatIdsAtom, new Set());
diff --git a/surfsense_web/atoms/workspaces/workspace-mutation.atoms.ts b/surfsense_web/atoms/workspaces/workspace-mutation.atoms.ts
index 85194e957..8d517782c 100644
--- a/surfsense_web/atoms/workspaces/workspace-mutation.atoms.ts
+++ b/surfsense_web/atoms/workspaces/workspace-mutation.atoms.ts
@@ -1,96 +1,96 @@
import { atomWithMutation } from "jotai-tanstack-query";
import { toast } from "sonner";
import type {
- CreateSearchSpaceRequest,
- DeleteSearchSpaceRequest,
- UpdateSearchSpaceApiAccessRequest,
- UpdateSearchSpaceRequest,
+ CreateWorkspaceRequest,
+ DeleteWorkspaceRequest,
+ UpdateWorkspaceApiAccessRequest,
+ UpdateWorkspaceRequest,
} from "@/contracts/types/workspace.types";
-import { searchSpacesApiService } from "@/lib/apis/workspaces-api.service";
+import { workspacesApiService } from "@/lib/apis/workspaces-api.service";
import { cacheKeys } from "@/lib/query-client/cache-keys";
import { queryClient } from "@/lib/query-client/client";
import { activeWorkspaceIdAtom } from "./workspace-query.atoms";
-export const createSearchSpaceMutationAtom = atomWithMutation(() => {
+export const createWorkspaceMutationAtom = atomWithMutation(() => {
return {
- mutationKey: ["create-search-space"],
- mutationFn: async (request: CreateSearchSpaceRequest) => {
- return searchSpacesApiService.createSearchSpace(request);
+ mutationKey: ["create-workspace"],
+ mutationFn: async (request: CreateWorkspaceRequest) => {
+ return workspacesApiService.createWorkspace(request);
},
onSuccess: () => {
toast.success("Search space created successfully");
queryClient.invalidateQueries({
- queryKey: cacheKeys.searchSpaces.all,
+ queryKey: cacheKeys.workspaces.all,
});
},
};
});
-export const updateSearchSpaceMutationAtom = atomWithMutation((get) => {
- const activeSearchSpaceId = get(activeWorkspaceIdAtom);
+export const updateWorkspaceMutationAtom = atomWithMutation((get) => {
+ const activeWorkspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: ["update-search-space", activeSearchSpaceId],
- enabled: !!activeSearchSpaceId,
- mutationFn: async (request: UpdateSearchSpaceRequest) => {
- return searchSpacesApiService.updateSearchSpace(request);
+ mutationKey: ["update-workspace", activeWorkspaceId],
+ enabled: !!activeWorkspaceId,
+ mutationFn: async (request: UpdateWorkspaceRequest) => {
+ return workspacesApiService.updateWorkspace(request);
},
- onSuccess: (_, request: UpdateSearchSpaceRequest) => {
+ onSuccess: (_, request: UpdateWorkspaceRequest) => {
toast.success("Search space updated successfully");
queryClient.invalidateQueries({
- queryKey: cacheKeys.searchSpaces.all,
+ queryKey: cacheKeys.workspaces.all,
});
if (request.id) {
queryClient.invalidateQueries({
- queryKey: cacheKeys.searchSpaces.detail(String(request.id)),
+ queryKey: cacheKeys.workspaces.detail(String(request.id)),
});
}
},
};
});
-export const updateSearchSpaceApiAccessMutationAtom = atomWithMutation((get) => {
- const activeSearchSpaceId = get(activeWorkspaceIdAtom);
+export const updateWorkspaceApiAccessMutationAtom = atomWithMutation((get) => {
+ const activeWorkspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: ["update-search-space-api-access", activeSearchSpaceId],
- enabled: !!activeSearchSpaceId,
- mutationFn: async (request: UpdateSearchSpaceApiAccessRequest) => {
- return searchSpacesApiService.updateSearchSpaceApiAccess(request);
+ mutationKey: ["update-workspace-api-access", activeWorkspaceId],
+ enabled: !!activeWorkspaceId,
+ mutationFn: async (request: UpdateWorkspaceApiAccessRequest) => {
+ return workspacesApiService.updateWorkspaceApiAccess(request);
},
- onSuccess: (_, request: UpdateSearchSpaceApiAccessRequest) => {
+ onSuccess: (_, request: UpdateWorkspaceApiAccessRequest) => {
toast.success("API access updated successfully");
queryClient.invalidateQueries({
- queryKey: cacheKeys.searchSpaces.all,
+ queryKey: cacheKeys.workspaces.all,
});
queryClient.invalidateQueries({
- queryKey: cacheKeys.searchSpaces.detail(String(request.id)),
+ queryKey: cacheKeys.workspaces.detail(String(request.id)),
});
},
};
});
-export const deleteSearchSpaceMutationAtom = atomWithMutation((get) => {
- const activeSearchSpaceId = get(activeWorkspaceIdAtom);
+export const deleteWorkspaceMutationAtom = atomWithMutation((get) => {
+ const activeWorkspaceId = get(activeWorkspaceIdAtom);
return {
- mutationKey: ["delete-search-space", activeSearchSpaceId],
- enabled: !!activeSearchSpaceId,
- mutationFn: async (request: DeleteSearchSpaceRequest) => {
- return searchSpacesApiService.deleteSearchSpace(request);
+ mutationKey: ["delete-workspace", activeWorkspaceId],
+ enabled: !!activeWorkspaceId,
+ mutationFn: async (request: DeleteWorkspaceRequest) => {
+ return workspacesApiService.deleteWorkspace(request);
},
- onSuccess: (_, request: DeleteSearchSpaceRequest) => {
+ onSuccess: (_, request: DeleteWorkspaceRequest) => {
toast.success("Search space deleted successfully");
queryClient.invalidateQueries({
- queryKey: cacheKeys.searchSpaces.all,
+ queryKey: cacheKeys.workspaces.all,
});
if (request.id) {
queryClient.removeQueries({
- queryKey: cacheKeys.searchSpaces.detail(String(request.id)),
+ queryKey: cacheKeys.workspaces.detail(String(request.id)),
});
}
},
diff --git a/surfsense_web/atoms/workspaces/workspace-query.atoms.ts b/surfsense_web/atoms/workspaces/workspace-query.atoms.ts
index 457e57a70..85203cc1d 100644
--- a/surfsense_web/atoms/workspaces/workspace-query.atoms.ts
+++ b/surfsense_web/atoms/workspaces/workspace-query.atoms.ts
@@ -1,25 +1,25 @@
import { atom } from "jotai";
import { atomWithQuery } from "jotai-tanstack-query";
-import type { GetSearchSpacesRequest } from "@/contracts/types/workspace.types";
-import { searchSpacesApiService } from "@/lib/apis/workspaces-api.service";
+import type { GetWorkspacesRequest } from "@/contracts/types/workspace.types";
+import { workspacesApiService } from "@/lib/apis/workspaces-api.service";
import { cacheKeys } from "@/lib/query-client/cache-keys";
export const activeWorkspaceIdAtom = atom(null);
-export const searchSpacesQueryParamsAtom = atom({
+export const workspacesQueryParamsAtom = atom({
skip: 0,
limit: 10,
owned_only: false,
});
-export const searchSpacesAtom = atomWithQuery((get) => {
- const queryParams = get(searchSpacesQueryParamsAtom);
+export const workspacesAtom = atomWithQuery((get) => {
+ const queryParams = get(workspacesQueryParamsAtom);
return {
- queryKey: cacheKeys.searchSpaces.withQueryParams(queryParams),
+ queryKey: cacheKeys.workspaces.withQueryParams(queryParams),
staleTime: 5 * 60 * 1000,
queryFn: async () => {
- return searchSpacesApiService.getSearchSpaces({
+ return workspacesApiService.getWorkspaces({
queryParams,
});
},
diff --git a/surfsense_web/changelog/content/2026-01-26.mdx b/surfsense_web/changelog/content/2026-01-26.mdx
index 1e5debaf8..9423fbe3d 100644
--- a/surfsense_web/changelog/content/2026-01-26.mdx
+++ b/surfsense_web/changelog/content/2026-01-26.mdx
@@ -14,7 +14,7 @@ This release brings major improvements to **collaboration and user experience**.
#### New Chat-First Interface
- **Dashboard Removed**: Users now land directly in a chat for faster access
-- **Redesigned Search Spaces**: Moved to a left column with color-coded icons and hover tooltips
+- **Redesigned Workspaces**: Moved to a left column with color-coded icons and hover tooltips
- **Collapsible Sidebar**: New sidebar design with collapsible sections for private and group chats
- **Streamlined Settings**: Accessible through intuitive dropdown menus
- **Mobile-Responsive Design**: Better experience on all devices
diff --git a/surfsense_web/changelog/content/2026-02-09.mdx b/surfsense_web/changelog/content/2026-02-09.mdx
index 7ffef2b4a..3a513b56b 100644
--- a/surfsense_web/changelog/content/2026-02-09.mdx
+++ b/surfsense_web/changelog/content/2026-02-09.mdx
@@ -16,8 +16,8 @@ This update brings **public sharing, image generation**, a redesigned Documents
#### Public Sharing
- **Public Chats**: Share snapshots of chats via public links.
-- **Sharing Permissions**: Search Space owners control who can create and manage public links.
-- **Link Management Page**: View and revoke all public chats from Search Space Settings.
+- **Sharing Permissions**: Workspace owners control who can create and manage public links.
+- **Link Management Page**: View and revoke all public chats from Workspace Settings.
#### Auto (Load Balanced) Mode
diff --git a/surfsense_web/changelog/content/2026-03-31.mdx b/surfsense_web/changelog/content/2026-03-31.mdx
index 271851fb8..0f9be10c9 100644
--- a/surfsense_web/changelog/content/2026-03-31.mdx
+++ b/surfsense_web/changelog/content/2026-03-31.mdx
@@ -80,7 +80,7 @@ SurfSense now treats every sensitive AI action as an explicit, reviewable step.
- **Mobile-First Polish**: Mobile citation drawer, long-press actions in chats and documents, a responsive documents sidebar, and a mobile-friendly onboarding tour.
- **Reworked Composer**: Tool actions are grouped into a cleaner menu with better icons, plus a helpful "connect tools" banner.
-- **Settings & Team**: New tabbed user settings page (profile + API keys), team roles management with pagination, and a search space settings dialog.
+- **Settings & Team**: New tabbed user settings page (profile + API keys), team roles management with pagination, and a workspace settings dialog.
- **Right Panel & Docked Sidebar**: A tabbed Sources/Report panel with smooth transitions, plus an optional docked documents sidebar.
- **Community Prompts**: Public prompt library with copy support, inline share toggles, and a see-more/less toggle for long prompts.
- **New Homepage**: Smooth scrolling, a use-cases grid, an updated walkthrough hero, a GitHub stars badge, and a new carousel for AI-generated video.
diff --git a/surfsense_web/changelog/content/2026-04-08.mdx b/surfsense_web/changelog/content/2026-04-08.mdx
index 7be430933..08fac1688 100644
--- a/surfsense_web/changelog/content/2026-04-08.mdx
+++ b/surfsense_web/changelog/content/2026-04-08.mdx
@@ -44,7 +44,7 @@ The SurfSense desktop app becomes a serious always-on **AI like ChatGPT** that a
- **Multi-Suggestion UI**: The suggestion popup now offers up to **3 options** to pick from, with clean cards and quick-assist detection.
- **Knowledge Base Grounding**: Suggestions are grounded in your connected knowledge base, not just generic model output.
- **macOS Permission Onboarding**: A clearer onboarding page walks macOS users through the permissions the app needs, only when they're actually needed.
-- **Switch Search Spaces from the Overlay**: Change the active search space without opening the main app.
+- **Switch Workspaces from the Overlay**: Change the active workspace without opening the main app.
- **General Assist**: A new general-purpose assist mode with cleaner shortcut icons and descriptions.
- **Stay Signed In Everywhere**: Sign-in is now synchronized between the desktop app and the web app.
- **Vision Model Settings**: A dedicated Vision Models tab in Settings lets you pick and manage vision models, including a dynamic model list from OpenRouter.
diff --git a/surfsense_web/changelog/content/2026-04-21.mdx b/surfsense_web/changelog/content/2026-04-21.mdx
index 2c96e4543..3da7338c1 100644
--- a/surfsense_web/changelog/content/2026-04-21.mdx
+++ b/surfsense_web/changelog/content/2026-04-21.mdx
@@ -21,7 +21,7 @@ Turn your knowledge and profile details into export-ready resume documents.
- **Cross-Site Anonymous Chat Cookies**: Anonymous chat cookies now adapt their SameSite and Secure settings based on deployment context, making hosted and cross-domain setups more reliable.
- **Better Anonymous Chat History**: Message history handling in anonymous chat is more dependable, especially when users move between public chat states.
-- **Safer Form Inputs**: Login, registration, profile, search space, and role forms now enforce sensible max-length limits directly in the UI.
+- **Safer Form Inputs**: Login, registration, profile, workspace, and role forms now enforce sensible max-length limits directly in the UI.
- **Cleaner Page Landmarks**: Home and free-chat pages no longer nest main landmarks, improving HTML semantics and screen-reader navigation.
- **SEO Metadata Refresh**: Titles and descriptions across key pages now better communicate SurfSense's open-source, privacy-focused positioning.
diff --git a/surfsense_web/components/assistant-ui/assistant-message.tsx b/surfsense_web/components/assistant-ui/assistant-message.tsx
index 3b0181f8d..c4a0e86dc 100644
--- a/surfsense_web/components/assistant-ui/assistant-message.tsx
+++ b/surfsense_web/components/assistant-ui/assistant-message.tsx
@@ -491,7 +491,7 @@ export const AssistantMessage: FC = () => {
const commentPanelRef = useRef(null);
const commentTriggerRef = useRef(null);
const messageId = useAuiState(({ message }) => message?.id);
- const searchSpaceId = useAtomValue(activeWorkspaceIdAtom);
+ const workspaceId = useAtomValue(activeWorkspaceIdAtom);
const dbMessageId = parseMessageId(messageId);
const commentsEnabled = useAtomValue(commentsEnabledAtom);
@@ -520,7 +520,7 @@ export const AssistantMessage: FC = () => {
const commentCount = commentsData?.total_count ?? 0;
const hasComments = commentCount > 0;
- const showCommentTrigger = searchSpaceId && commentsEnabled && !isMessageStreaming && dbMessageId;
+ const showCommentTrigger = workspaceId && commentsEnabled && !isMessageStreaming && dbMessageId;
// Close floating panel when clicking outside (but not on portaled popover/dropdown content)
useEffect(() => {
diff --git a/surfsense_web/components/assistant-ui/connector-popup.tsx b/surfsense_web/components/assistant-ui/connector-popup.tsx
index b3dd1824c..d702a4209 100644
--- a/surfsense_web/components/assistant-ui/connector-popup.tsx
+++ b/surfsense_web/components/assistant-ui/connector-popup.tsx
@@ -36,10 +36,10 @@ interface ConnectorIndicatorProps {
export const ConnectorIndicator = forwardRef(
(_props, ref) => {
- const searchSpaceId = useAtomValue(activeWorkspaceIdAtom);
+ const workspaceId = useAtomValue(activeWorkspaceIdAtom);
// Real-time document type counts via Zero (updates instantly as docs are indexed)
- const documentTypeCounts = useZeroDocumentTypeCounts(searchSpaceId);
+ const documentTypeCounts = useZeroDocumentTypeCounts(workspaceId);
// Read status inbox items from shared atom (populated by LayoutDataProvider)
// instead of creating a duplicate useInbox("status") hook.
const statusInboxItems = useAtomValue(statusInboxItemsAtom);
@@ -124,7 +124,7 @@ export const ConnectorIndicator = forwardRef 0 || (connectorsLoading && !connectorsError);
const connectors = useSyncData ? connectorsFromSync : allConnectors || [];
@@ -142,7 +142,7 @@ export const ConnectorIndicator = forwardRef count > 0)
: [];
@@ -163,7 +163,7 @@ export const ConnectorIndicator = forwardRef handleOpenChange(true),
}));
- if (!searchSpaceId) return null;
+ if (!workspaceId) return null;
return (
@@ -191,8 +191,8 @@ export const ConnectorIndicator = forwardRef
Manage Connectors
{/* YouTube Crawler View - shown when adding YouTube videos */}
- {isYouTubeView && searchSpaceId ? (
-
+ {isYouTubeView && workspaceId ? (
+
) : viewingMCPList ? (
= ({ onBack }) => {
- {/* Step 4 — Pick search space */}
+ {/* Step 4 — Pick workspace */}
4
- Pick this search space
+ Pick this workspace
In the plugin's Search space setting, choose the
- search space you want this vault to sync into. The connector will appear here
+ workspace you want this vault to sync into. The connector will appear here
automatically once the plugin makes its first sync.
diff --git a/surfsense_web/components/assistant-ui/connector-popup/connect-forms/connector-benefits.ts b/surfsense_web/components/assistant-ui/connector-popup/connect-forms/connector-benefits.ts
index f4883fa36..dc5e906ca 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/connect-forms/connector-benefits.ts
+++ b/surfsense_web/components/assistant-ui/connector-popup/connect-forms/connector-benefits.ts
@@ -7,7 +7,7 @@ export function getConnectorBenefits(connectorType: string): string[] | null {
LINEAR_CONNECTOR: [
"Search through all your Linear issues and comments",
"Access issue titles, descriptions, and full discussion threads",
- "Connect your team's project management directly to your search space",
+ "Connect your team's project management directly to your workspace",
"Keep your search results up-to-date with latest Linear content",
"Index your Linear issues for enhanced search capabilities",
],
@@ -36,63 +36,63 @@ export function getConnectorBenefits(connectorType: string): string[] | null {
SLACK_CONNECTOR: [
"Search through all your Slack messages and conversations",
"Access messages from public and private channels",
- "Connect your team's communications directly to your search space",
+ "Connect your team's communications directly to your workspace",
"Keep your search results up-to-date with latest Slack content",
"Index your Slack conversations for enhanced search capabilities",
],
DISCORD_CONNECTOR: [
"Search through all your Discord messages and conversations",
"Access messages from all accessible channels",
- "Connect your community's communications directly to your search space",
+ "Connect your community's communications directly to your workspace",
"Keep your search results up-to-date with latest Discord content",
"Index your Discord conversations for enhanced search capabilities",
],
NOTION_CONNECTOR: [
"Search through all your Notion pages and databases",
"Access page content, properties, and metadata",
- "Connect your knowledge base directly to your search space",
+ "Connect your knowledge base directly to your workspace",
"Keep your search results up-to-date with latest Notion content",
"Index your Notion workspace for enhanced search capabilities",
],
CONFLUENCE_CONNECTOR: [
"Search through all your Confluence pages and spaces",
"Access page content, comments, and attachments",
- "Connect your team's documentation directly to your search space",
+ "Connect your team's documentation directly to your workspace",
"Keep your search results up-to-date with latest Confluence content",
"Index your Confluence workspace for enhanced search capabilities",
],
BOOKSTACK_CONNECTOR: [
"Search through all your BookStack pages and books",
"Access page content, chapters, and documentation",
- "Connect your documentation directly to your search space",
+ "Connect your documentation directly to your workspace",
"Keep your search results up-to-date with latest BookStack content",
"Index your BookStack instance for enhanced search capabilities",
],
GITHUB_CONNECTOR: [
"Search through code, issues, and documentation from GitHub repositories",
"Access repository content, pull requests, and discussions",
- "Connect your codebase directly to your search space",
+ "Connect your codebase directly to your workspace",
"Keep your search results up-to-date with latest GitHub content",
"Index your GitHub repositories for enhanced search capabilities",
],
JIRA_CONNECTOR: [
"Search through all your Jira issues and tickets",
"Access issue descriptions, comments, and project data",
- "Connect your project management directly to your search space",
+ "Connect your project management directly to your workspace",
"Keep your search results up-to-date with latest Jira content",
"Index your Jira projects for enhanced search capabilities",
],
CLICKUP_CONNECTOR: [
"Search through all your ClickUp tasks and projects",
"Access task descriptions, comments, and project data",
- "Connect your task management directly to your search space",
+ "Connect your task management directly to your workspace",
"Keep your search results up-to-date with latest ClickUp content",
"Index your ClickUp workspace for enhanced search capabilities",
],
LUMA_CONNECTOR: [
"Search through all your Luma events",
"Access event details, descriptions, and attendee information",
- "Connect your events directly to your search space",
+ "Connect your events directly to your workspace",
"Keep your search results up-to-date with latest Luma content",
"Index your Luma events for enhanced search capabilities",
],
diff --git a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/circleback-config.tsx b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/circleback-config.tsx
index 346ba45dd..91ff28eeb 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/circleback-config.tsx
+++ b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/circleback-config.tsx
@@ -165,7 +165,7 @@ export const CirclebackConfig: FC = ({ connector, onNameC
Configure this URL in Circleback Settings → Automations → Create automation → Send
webhook request. The webhook will automatically send meeting notes, transcripts, and
- action items to this search space.
+ action items to this workspace.
)}
diff --git a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/index.tsx b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/index.tsx
index e3d6641fc..a994a3db2 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/index.tsx
+++ b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/index.tsx
@@ -8,7 +8,7 @@ export interface ConnectorConfigProps {
connector: SearchSourceConnector;
onConfigChange?: (config: Record) => void;
onNameChange?: (name: string) => void;
- searchSpaceId?: string;
+ workspaceId?: string;
}
export type ConnectorConfigComponent = FC;
diff --git a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-edit-view.tsx b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-edit-view.tsx
index 507945ad6..4874ded34 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-edit-view.tsx
+++ b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-edit-view.tsx
@@ -41,7 +41,7 @@ interface ConnectorEditViewProps {
isSaving: boolean;
isDisconnecting: boolean;
isIndexing?: boolean;
- searchSpaceId?: string;
+ workspaceId?: string;
onStartDateChange: (date: Date | undefined) => void;
onEndDateChange: (date: Date | undefined) => void;
onPeriodicEnabledChange: (enabled: boolean) => void;
@@ -65,7 +65,7 @@ export const ConnectorEditView: FC = ({
isSaving,
isDisconnecting,
isIndexing = false,
- searchSpaceId,
+ workspaceId,
onStartDateChange,
onEndDateChange,
onPeriodicEnabledChange,
@@ -78,7 +78,7 @@ export const ConnectorEditView: FC = ({
onConfigChange,
onNameChange,
}) => {
- const searchSpaceIdAtom = useAtomValue(activeWorkspaceIdAtom);
+ const workspaceIdAtom = useAtomValue(activeWorkspaceIdAtom);
const isAuthExpired = connector.config?.auth_expired === true;
const reauthEndpoint = getReauthEndpoint(connector);
const [reauthing, setReauthing] = useState(false);
@@ -91,7 +91,7 @@ export const ConnectorEditView: FC = ({
(connector.is_indexable || connector.connector_type === EnumConnectorName.OBSIDIAN_CONNECTOR);
const handleReauth = useCallback(async () => {
- const spaceId = searchSpaceId ?? searchSpaceIdAtom;
+ const spaceId = workspaceId ?? workspaceIdAtom;
if (!spaceId || !reauthEndpoint) return;
setReauthing(true);
try {
@@ -119,7 +119,7 @@ export const ConnectorEditView: FC = ({
} finally {
setReauthing(false);
}
- }, [searchSpaceId, searchSpaceIdAtom, reauthEndpoint, connector.id]);
+ }, [workspaceId, workspaceIdAtom, reauthEndpoint, connector.id]);
// Get connector-specific config component (MCP-backed connectors use a generic view)
const ConnectorConfigComponent = useMemo(() => {
@@ -273,7 +273,7 @@ export const ConnectorEditView: FC = ({
connector={connector}
onConfigChange={onConfigChange}
onNameChange={onNameChange}
- searchSpaceId={searchSpaceId}
+ workspaceId={workspaceId}
/>
)}
diff --git a/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts b/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts
index f741fc2aa..a3eaf632f 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts
+++ b/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts
@@ -58,7 +58,7 @@ function clearOAuthResultCookie(): void {
}
export const useConnectorDialog = () => {
- const searchSpaceId = useAtomValue(activeWorkspaceIdAtom);
+ const workspaceId = useAtomValue(activeWorkspaceIdAtom);
const { data: allConnectors, refetch: refetchAllConnectors } = useAtomValue(connectorsAtom);
const { mutateAsync: indexConnector } = useAtomValue(indexConnectorMutationAtom);
const { mutateAsync: updateConnector } = useAtomValue(updateConnectorMutationAtom);
@@ -140,7 +140,7 @@ export const useConnectorDialog = () => {
const handleAutoIndex = useCallback(
async (connector: SearchSourceConnector, connectorTitle: string, connectorType: string) => {
- if (!searchSpaceId || isAutoIndexingRef.current) return;
+ if (!workspaceId || isAutoIndexingRef.current) return;
isAutoIndexingRef.current = true;
const defaults = AUTO_INDEX_DEFAULTS[connectorType];
@@ -165,13 +165,13 @@ export const useConnectorDialog = () => {
await indexConnector({
connector_id: connector.id,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
start_date: format(startDate, "yyyy-MM-dd"),
end_date: format(endDate, "yyyy-MM-dd"),
},
});
- trackIndexWithDateRangeStarted(Number(searchSpaceId), connectorType, connector.id, {
+ trackIndexWithDateRangeStarted(Number(workspaceId), connectorType, connector.id, {
hasStartDate: true,
hasEndDate: true,
});
@@ -188,13 +188,13 @@ export const useConnectorDialog = () => {
});
} finally {
queryClient.invalidateQueries({
- queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
+ queryKey: cacheKeys.logs.summary(Number(workspaceId)),
});
await refetchAllConnectors();
isAutoIndexingRef.current = false;
}
},
- [searchSpaceId, indexConnector, updateConnector, refetchAllConnectors]
+ [workspaceId, indexConnector, updateConnector, refetchAllConnectors]
);
// YouTube view state
@@ -206,7 +206,7 @@ export const useConnectorDialog = () => {
// Consume OAuth result from cookie (set by /connectors/callback route handler)
useEffect(() => {
const raw = readOAuthResultCookie();
- if (!raw || !searchSpaceId) return;
+ if (!raw || !workspaceId) return;
clearOAuthResultCookie();
const result = parseOAuthCallbackResult(raw);
@@ -221,7 +221,7 @@ export const useConnectorDialog = () => {
if (oauthConnector) {
trackConnectorSetupFailure(
- Number(searchSpaceId),
+ Number(workspaceId),
oauthConnector.connectorType,
result.error,
"oauth_callback"
@@ -292,7 +292,7 @@ export const useConnectorDialog = () => {
const connectorValidation = searchSourceConnector.safeParse(newConnector);
if (connectorValidation.success) {
trackConnectorConnected(
- Number(searchSpaceId),
+ Number(workspaceId),
oauthConnector.connectorType,
newConnector.id
);
@@ -338,20 +338,20 @@ export const useConnectorDialog = () => {
});
}
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [searchSpaceId, handleAutoIndex, refetchAllConnectors, setIsOpen]);
+ }, [workspaceId, handleAutoIndex, refetchAllConnectors, setIsOpen]);
// Handle OAuth connection
const handleConnectOAuth = useCallback(
async (connector: (typeof OAUTH_CONNECTORS)[number] | (typeof COMPOSIO_CONNECTORS)[number]) => {
- if (!searchSpaceId || !connector.authEndpoint) return;
+ if (!workspaceId || !connector.authEndpoint) return;
// Set connecting state immediately to disable button and show spinner
setConnectingId(connector.id);
- trackConnectorSetupStarted(Number(searchSpaceId), connector.connectorType, "oauth_click");
+ trackConnectorSetupStarted(Number(workspaceId), connector.connectorType, "oauth_click");
try {
- const url = buildBackendUrl(connector.authEndpoint, { space_id: searchSpaceId });
+ const url = buildBackendUrl(connector.authEndpoint, { space_id: workspaceId });
const response = await authenticatedFetch(url, { method: "GET" });
@@ -370,7 +370,7 @@ export const useConnectorDialog = () => {
} catch (error) {
console.error(`Error connecting to ${connector.title}:`, error);
trackConnectorSetupFailure(
- Number(searchSpaceId),
+ Number(workspaceId),
connector.connectorType,
error instanceof Error ? error.message : "oauth_initiation_failed",
"oauth_init"
@@ -384,22 +384,22 @@ export const useConnectorDialog = () => {
setConnectingId(null);
}
},
- [searchSpaceId]
+ [workspaceId]
);
// Handle creating YouTube crawler (not a connector, shows view in popup)
const handleCreateYouTubeCrawler = useCallback(() => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
setIsYouTubeView(true);
- }, [searchSpaceId]);
+ }, [workspaceId]);
// Handle creating webcrawler connector
const handleCreateWebcrawler = useCallback(async () => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
setConnectingId("webcrawler-connector");
trackConnectorSetupStarted(
- Number(searchSpaceId),
+ Number(workspaceId),
EnumConnectorName.WEBCRAWLER_CONNECTOR,
"webcrawler_quick_add"
);
@@ -418,7 +418,7 @@ export const useConnectorDialog = () => {
enable_vision_llm: false,
},
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
},
});
@@ -433,7 +433,7 @@ export const useConnectorDialog = () => {
if (connectorValidation.success) {
// Track webcrawler connector connected
trackConnectorConnected(
- Number(searchSpaceId),
+ Number(workspaceId),
EnumConnectorName.WEBCRAWLER_CONNECTOR,
connector.id
);
@@ -453,7 +453,7 @@ export const useConnectorDialog = () => {
} catch (error) {
console.error("Error creating webcrawler connector:", error);
trackConnectorSetupFailure(
- Number(searchSpaceId),
+ Number(workspaceId),
EnumConnectorName.WEBCRAWLER_CONNECTOR,
error instanceof Error ? error.message : "webcrawler_create_failed",
"webcrawler_quick_add"
@@ -462,18 +462,18 @@ export const useConnectorDialog = () => {
} finally {
setConnectingId(null);
}
- }, [searchSpaceId, createConnector, refetchAllConnectors, setIsOpen]);
+ }, [workspaceId, createConnector, refetchAllConnectors, setIsOpen]);
// Handle connecting non-OAuth connectors (like Tavily API, Obsidian plugin, etc.)
const handleConnectNonOAuth = useCallback(
(connectorType: string) => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
- trackConnectorSetupStarted(Number(searchSpaceId), connectorType, "non_oauth_click");
+ trackConnectorSetupStarted(Number(workspaceId), connectorType, "non_oauth_click");
setConnectingConnectorType(connectorType);
},
- [searchSpaceId]
+ [workspaceId]
);
// Handle submitting connect form
@@ -495,7 +495,7 @@ export const useConnectorDialog = () => {
},
onIndexingStart?: (connectorId: number) => void
) => {
- if (!searchSpaceId || !connectingConnectorType) {
+ if (!workspaceId || !connectingConnectorType) {
return;
}
@@ -519,7 +519,7 @@ export const useConnectorDialog = () => {
enable_vision_llm: false,
},
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
},
});
// Refetch connectors to get the new one
@@ -536,7 +536,7 @@ export const useConnectorDialog = () => {
const currentConnectorType = connectingConnectorType;
// Track connector connected event for non-OAuth connectors
- trackConnectorConnected(Number(searchSpaceId), currentConnectorType, connector.id);
+ trackConnectorConnected(Number(workspaceId), currentConnectorType, connector.id);
// Find connector title from constants
const connectorInfo = OTHER_CONNECTORS.find(
@@ -612,7 +612,7 @@ export const useConnectorDialog = () => {
await indexConnector({
connector_id: connector.id,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
start_date: startDateStr,
end_date: endDateStr,
},
@@ -631,7 +631,7 @@ export const useConnectorDialog = () => {
setIndexingConnectorConfig(null);
queryClient.invalidateQueries({
- queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
+ queryKey: cacheKeys.logs.summary(Number(workspaceId)),
});
await refetchAllConnectors();
@@ -684,7 +684,7 @@ export const useConnectorDialog = () => {
} catch (error) {
console.error("Error creating connector:", error);
trackConnectorSetupFailure(
- Number(searchSpaceId),
+ Number(workspaceId),
connectingConnectorType ?? formData.connector_type,
error instanceof Error ? error.message : "connector_create_failed",
"non_oauth_form"
@@ -698,7 +698,7 @@ export const useConnectorDialog = () => {
},
[
connectingConnectorType,
- searchSpaceId,
+ workspaceId,
createConnector,
refetchAllConnectors,
updateConnector,
@@ -724,7 +724,7 @@ export const useConnectorDialog = () => {
// Handle viewing accounts list for OAuth connector type
const handleViewAccountsList = useCallback(
(connectorType: string, _connectorTitle?: string) => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
const oauthConnector =
OAUTH_CONNECTORS.find((c) => c.connectorType === connectorType) ||
@@ -736,7 +736,7 @@ export const useConnectorDialog = () => {
});
}
},
- [searchSpaceId]
+ [workspaceId]
);
// Handle going back from accounts list view
@@ -746,9 +746,9 @@ export const useConnectorDialog = () => {
// Handle viewing MCP list
const handleViewMCPList = useCallback(() => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
setViewingMCPList(true);
- }, [searchSpaceId]);
+ }, [workspaceId]);
// Handle going back from MCP list view
const handleBackFromMCPList = useCallback(() => {
@@ -765,7 +765,7 @@ export const useConnectorDialog = () => {
// Handle starting indexing
const handleStartIndexing = useCallback(
async (refreshConnectors: () => void) => {
- if (!indexingConfig || !searchSpaceId) return;
+ if (!indexingConfig || !workspaceId) return;
// Validate date range (skip for Google Drive, Composio Drive, OneDrive, Dropbox, and Webcrawler)
if (
@@ -847,7 +847,7 @@ export const useConnectorDialog = () => {
await indexConnector({
connector_id: indexingConfig.connectorId,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
},
body: {
folders: selectedFolders || [],
@@ -870,14 +870,14 @@ export const useConnectorDialog = () => {
await indexConnector({
connector_id: indexingConfig.connectorId,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
},
});
} else {
await indexConnector({
connector_id: indexingConfig.connectorId,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
start_date: startDateStr,
end_date: endDateStr,
},
@@ -886,7 +886,7 @@ export const useConnectorDialog = () => {
// Track index with date range started event
trackIndexWithDateRangeStarted(
- Number(searchSpaceId),
+ Number(workspaceId),
indexingConfig.connectorType,
indexingConfig.connectorId,
{
@@ -898,7 +898,7 @@ export const useConnectorDialog = () => {
// Track periodic indexing started if enabled
if (periodicEnabled) {
trackPeriodicIndexingStarted(
- Number(searchSpaceId),
+ Number(workspaceId),
indexingConfig.connectorType,
indexingConfig.connectorId,
parseInt(frequencyMinutes, 10)
@@ -915,7 +915,7 @@ export const useConnectorDialog = () => {
refreshConnectors();
queryClient.invalidateQueries({
- queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
+ queryKey: cacheKeys.logs.summary(Number(workspaceId)),
});
} catch (error) {
console.error("Error starting indexing:", error);
@@ -926,7 +926,7 @@ export const useConnectorDialog = () => {
},
[
indexingConfig,
- searchSpaceId,
+ workspaceId,
startDate,
endDate,
indexConnector,
@@ -951,7 +951,7 @@ export const useConnectorDialog = () => {
// Handle starting edit mode
const handleStartEdit = useCallback(
(connector: SearchSourceConnector) => {
- if (!searchSpaceId) return;
+ if (!workspaceId) return;
// For MCP connectors from "All Connectors" tab, show the list view instead of directly editing
// (unless we're already in the MCP list view or on the Active tab where individual MCPs are shown)
@@ -986,11 +986,7 @@ export const useConnectorDialog = () => {
// Track index with date range opened event
if (connector.is_indexable) {
- trackIndexWithDateRangeOpened(
- Number(searchSpaceId),
- connector.connector_type,
- connector.id
- );
+ trackIndexWithDateRangeOpened(Number(workspaceId), connector.connector_type, connector.id);
}
setEditingConnector(connector);
@@ -1001,13 +997,13 @@ export const useConnectorDialog = () => {
setStartDate(undefined);
setEndDate(undefined);
},
- [searchSpaceId, viewingAccountsType, viewingMCPList, handleViewMCPList, activeTab]
+ [workspaceId, viewingAccountsType, viewingMCPList, handleViewMCPList, activeTab]
);
// Handle saving connector changes
const handleSaveConnector = useCallback(
async (refreshConnectors: () => void) => {
- if (!editingConnector || !searchSpaceId || isSaving) return;
+ if (!editingConnector || !workspaceId || isSaving) return;
// Validate date range (skip for Google Drive/OneDrive/Dropbox which uses folder selection, Webcrawler which uses config, and non-indexable connectors)
if (
@@ -1114,7 +1110,7 @@ export const useConnectorDialog = () => {
await indexConnector({
connector_id: editingConnector.id,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
},
body: {
folders: selectedFolders || [],
@@ -1134,7 +1130,7 @@ export const useConnectorDialog = () => {
await indexConnector({
connector_id: editingConnector.id,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
},
});
indexingDescription = "Re-indexing started with updated configuration.";
@@ -1143,7 +1139,7 @@ export const useConnectorDialog = () => {
await indexConnector({
connector_id: editingConnector.id,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
start_date: startDateStr,
end_date: endDateStr,
},
@@ -1157,7 +1153,7 @@ export const useConnectorDialog = () => {
(indexingDescription.includes("Re-indexing") || indexingDescription.includes("indexing"))
) {
trackIndexWithDateRangeStarted(
- Number(searchSpaceId),
+ Number(workspaceId),
editingConnector.connector_type,
editingConnector.id,
{
@@ -1170,7 +1166,7 @@ export const useConnectorDialog = () => {
// Track periodic indexing if enabled
if (periodicEnabled && editingConnector.is_indexable) {
trackPeriodicIndexingStarted(
- Number(searchSpaceId),
+ Number(workspaceId),
editingConnector.connector_type,
editingConnector.id,
frequency || parseInt(frequencyMinutes, 10)
@@ -1190,7 +1186,7 @@ export const useConnectorDialog = () => {
refreshConnectors();
queryClient.invalidateQueries({
- queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
+ queryKey: cacheKeys.logs.summary(Number(workspaceId)),
});
} catch (error) {
console.error("Error saving connector:", error);
@@ -1201,7 +1197,7 @@ export const useConnectorDialog = () => {
},
[
editingConnector,
- searchSpaceId,
+ workspaceId,
isSaving,
startDate,
endDate,
@@ -1220,7 +1216,7 @@ export const useConnectorDialog = () => {
// Handle disconnecting connector
const handleDisconnectConnector = useCallback(
async (refreshConnectors: () => void) => {
- if (!editingConnector || !searchSpaceId) return;
+ if (!editingConnector || !workspaceId) return;
setIsDisconnecting(true);
try {
@@ -1230,7 +1226,7 @@ export const useConnectorDialog = () => {
// Track connector deleted event
trackConnectorDeleted(
- Number(searchSpaceId),
+ Number(workspaceId),
editingConnector.connector_type,
editingConnector.id
);
@@ -1255,7 +1251,7 @@ export const useConnectorDialog = () => {
refreshConnectors();
queryClient.invalidateQueries({
- queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
+ queryKey: cacheKeys.logs.summary(Number(workspaceId)),
});
} catch (error) {
console.error("Error disconnecting connector:", error);
@@ -1264,7 +1260,7 @@ export const useConnectorDialog = () => {
setIsDisconnecting(false);
}
},
- [editingConnector, searchSpaceId, deleteConnector, cameFromMCPList, setIsOpen]
+ [editingConnector, workspaceId, deleteConnector, cameFromMCPList, setIsOpen]
);
// Handle quick index (index with selected date range, or backend defaults if none selected)
@@ -1276,7 +1272,7 @@ export const useConnectorDialog = () => {
startDate?: Date,
endDate?: Date
) => {
- if (!searchSpaceId) {
+ if (!workspaceId) {
if (stopIndexing) {
stopIndexing(connectorId);
}
@@ -1285,7 +1281,7 @@ export const useConnectorDialog = () => {
// Track quick index clicked event
if (connectorType) {
- trackQuickIndexClicked(Number(searchSpaceId), connectorType, connectorId);
+ trackQuickIndexClicked(Number(workspaceId), connectorType, connectorId);
}
try {
@@ -1296,7 +1292,7 @@ export const useConnectorDialog = () => {
await indexConnector({
connector_id: connectorId,
queryParams: {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
start_date: startDateStr,
end_date: endDateStr,
},
@@ -1305,7 +1301,7 @@ export const useConnectorDialog = () => {
// Invalidate queries to refresh data
queryClient.invalidateQueries({
- queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
+ queryKey: cacheKeys.logs.summary(Number(workspaceId)),
});
// Note: Don't call stopIndexing here - let useIndexingConnectors hook
// detect when last_indexed_at changes via real-time sync
@@ -1318,7 +1314,7 @@ export const useConnectorDialog = () => {
}
}
},
- [searchSpaceId, indexConnector]
+ [workspaceId, indexConnector]
);
// Handle going back from edit view
@@ -1406,7 +1402,7 @@ export const useConnectorDialog = () => {
periodicEnabled,
frequencyMinutes,
enableVisionLlm,
- searchSpaceId,
+ workspaceId,
allConnectors,
viewingAccountsType,
viewingMCPList,
diff --git a/surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx b/surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx
index 39286b6cd..7adde28b0 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx
+++ b/surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx
@@ -44,7 +44,7 @@ export function getConnectorDisplayName(fullName: string): string {
interface AllConnectorsTabProps {
searchQuery: string;
- searchSpaceId: string;
+ workspaceId: string;
connectedTypes: Set;
connectingId: string | null;
allConnectors: SearchSourceConnector[] | undefined;
diff --git a/surfsense_web/components/assistant-ui/connector-popup/views/connector-accounts-list-view.tsx b/surfsense_web/components/assistant-ui/connector-popup/views/connector-accounts-list-view.tsx
index 30db5d3ff..6a2f7dec7 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/views/connector-accounts-list-view.tsx
+++ b/surfsense_web/components/assistant-ui/connector-popup/views/connector-accounts-list-view.tsx
@@ -44,7 +44,7 @@ export const ConnectorAccountsListView: FC = ({
isConnecting = false,
addButtonText,
}) => {
- const searchSpaceId = useAtomValue(activeWorkspaceIdAtom);
+ const workspaceId = useAtomValue(activeWorkspaceIdAtom);
const [reauthingId, setReauthingId] = useState(null);
const [confirmDisconnectId, setConfirmDisconnectId] = useState(null);
const [disconnectingId, setDisconnectingId] = useState(null);
@@ -58,13 +58,13 @@ export const ConnectorAccountsListView: FC = ({
const handleReauth = useCallback(
async (connector: SearchSourceConnector) => {
const endpoint = getReauthEndpoint(connector);
- if (!searchSpaceId || !endpoint) return;
+ if (!workspaceId || !endpoint) return;
setReauthingId(connector.id);
try {
const response = await authenticatedFetch(
buildBackendUrl(endpoint, {
connector_id: connector.id,
- space_id: searchSpaceId,
+ space_id: workspaceId,
return_url: window.location.pathname,
})
);
@@ -86,7 +86,7 @@ export const ConnectorAccountsListView: FC = ({
setReauthingId(null);
}
},
- [searchSpaceId]
+ [workspaceId]
);
// Filter connectors to only show those of this type
diff --git a/surfsense_web/components/assistant-ui/connector-popup/views/youtube-crawler-view.tsx b/surfsense_web/components/assistant-ui/connector-popup/views/youtube-crawler-view.tsx
index 11befc19b..4223418b7 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/views/youtube-crawler-view.tsx
+++ b/surfsense_web/components/assistant-ui/connector-popup/views/youtube-crawler-view.tsx
@@ -38,11 +38,11 @@ function extractYoutubeUrls(text: string): string[] {
}
interface YouTubeCrawlerViewProps {
- searchSpaceId: string;
+ workspaceId: string;
onBack: () => void;
}
-export const YouTubeCrawlerView: FC = ({ searchSpaceId, onBack }) => {
+export const YouTubeCrawlerView: FC = ({ workspaceId, onBack }) => {
const t = useTranslations("add_youtube");
const [videoTags, setVideoTags] = useState([]);
const [activeTagIndex, setActiveTagIndex] = useState(null);
@@ -165,7 +165,7 @@ export const YouTubeCrawlerView: FC = ({ searchSpaceId,
{
document_type: "YOUTUBE_VIDEO",
content: videoUrls,
- workspace_id: parseInt(searchSpaceId, 10),
+ workspace_id: parseInt(workspaceId, 10),
},
{
onSuccess: () => {
diff --git a/surfsense_web/components/assistant-ui/document-upload-popup.tsx b/surfsense_web/components/assistant-ui/document-upload-popup.tsx
index bb8c4dcad..9d0f10853 100644
--- a/surfsense_web/components/assistant-ui/document-upload-popup.tsx
+++ b/surfsense_web/components/assistant-ui/document-upload-popup.tsx
@@ -90,9 +90,9 @@ const DocumentUploadPopupContent: FC<{
isOpen: boolean;
onOpenChange: (open: boolean) => void;
}> = ({ isOpen, onOpenChange }) => {
- const searchSpaceId = useAtomValue(activeWorkspaceIdAtom);
+ const workspaceId = useAtomValue(activeWorkspaceIdAtom);
- if (!searchSpaceId) return null;
+ if (!workspaceId) return null;
const handleSuccess = () => {
onOpenChange(false);
@@ -112,12 +112,12 @@ const DocumentUploadPopupContent: FC<{
Upload Documents
- Upload and sync your documents to your search space
+ Upload and sync your documents to your workspace
-
+
diff --git a/surfsense_web/components/assistant-ui/markdown-text.tsx b/surfsense_web/components/assistant-ui/markdown-text.tsx
index 190a300a8..51a8a76fe 100644
--- a/surfsense_web/components/assistant-ui/markdown-text.tsx
+++ b/surfsense_web/components/assistant-ui/markdown-text.tsx
@@ -189,7 +189,7 @@ function FilePathLink({ path, className }: { path: string; className?: string })
const openEditorPanel = useSetAtom(openEditorPanelAtom);
const params = useParams();
const electronAPI = useElectronAPI();
- const resolvedSearchSpaceId = getWorkspaceIdNumber(params);
+ const resolvedWorkspaceId = getWorkspaceIdNumber(params);
const { displayName, isFolder } = getVirtualPathDisplay(path);
const icon = isFolder ? : ;
@@ -204,7 +204,7 @@ function FilePathLink({ path, className }: { path: string; className?: string })
if (electronAPI.getAgentFilesystemMounts) {
try {
const mounts = (await electronAPI.getAgentFilesystemMounts(
- resolvedSearchSpaceId
+ resolvedWorkspaceId
)) as AgentFilesystemMount[];
resolvedLocalPath = normalizeLocalVirtualPathForEditor(path, mounts);
} catch {
@@ -215,21 +215,21 @@ function FilePathLink({ path, className }: { path: string; className?: string })
kind: "local_file",
localFilePath: resolvedLocalPath,
title: resolvedLocalPath.split("/").pop() || resolvedLocalPath,
- searchSpaceId: resolvedSearchSpaceId,
+ workspaceId: resolvedWorkspaceId,
});
return;
}
- if (!resolvedSearchSpaceId || !path.startsWith("/documents/")) return;
+ if (!resolvedWorkspaceId || !path.startsWith("/documents/")) return;
try {
const doc = await documentsApiService.getDocumentByVirtualPath({
- workspace_id: resolvedSearchSpaceId,
+ workspace_id: resolvedWorkspaceId,
virtual_path: path,
});
openEditorPanel({
kind: "document",
documentId: doc.id,
- searchSpaceId: resolvedSearchSpaceId,
+ workspaceId: resolvedWorkspaceId,
title: doc.title,
});
} catch {
@@ -237,7 +237,7 @@ function FilePathLink({ path, className }: { path: string; className?: string })
}
})();
},
- [electronAPI, openEditorPanel, path, resolvedSearchSpaceId]
+ [electronAPI, openEditorPanel, path, resolvedWorkspaceId]
);
// Folders cannot open in the editor panel — keep them as visual chips.
diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx
index c12f0f247..1b43b0a8a 100644
--- a/surfsense_web/components/assistant-ui/thread.tsx
+++ b/surfsense_web/components/assistant-ui/thread.tsx
@@ -895,7 +895,7 @@ const Composer: FC = () => {
{
@@ -982,13 +982,13 @@ const Composer: FC = () => {
interface ComposerActionProps {
isBlockedByOtherUser?: boolean;
- searchSpaceId: number;
+ workspaceId: number;
onChatModelSelected?: () => void;
}
const ComposerAction: FC = ({
isBlockedByOtherUser = false,
- searchSpaceId,
+ workspaceId,
onChatModelSelected,
}) => {
const mentionedDocuments = useAtomValue(mentionedDocumentsAtom);
@@ -1564,7 +1564,7 @@ const ComposerAction: FC = ({
)}
diff --git a/surfsense_web/components/assistant-ui/user-message.tsx b/surfsense_web/components/assistant-ui/user-message.tsx
index e74d2b4ab..592dc4224 100644
--- a/surfsense_web/components/assistant-ui/user-message.tsx
+++ b/surfsense_web/components/assistant-ui/user-message.tsx
@@ -76,33 +76,33 @@ const UserTextPart: FC = () => {
const openEditorPanel = useSetAtom(openEditorPanelAtom);
const router = useRouter();
const params = useParams();
- const resolvedSearchSpaceId = getWorkspaceIdNumber(params);
+ const resolvedWorkspaceId = getWorkspaceIdNumber(params);
const handleOpenDoc = useCallback(
(docId: number, title: string) => {
- if (!resolvedSearchSpaceId) {
- toast.error("Cannot open document outside a search space.");
+ if (!resolvedWorkspaceId) {
+ toast.error("Cannot open document outside a workspace.");
return;
}
openEditorPanel({
kind: "document",
documentId: docId,
- searchSpaceId: resolvedSearchSpaceId,
+ workspaceId: resolvedWorkspaceId,
title,
});
},
- [openEditorPanel, resolvedSearchSpaceId]
+ [openEditorPanel, resolvedWorkspaceId]
);
const handleOpenThread = useCallback(
(threadId: number) => {
- if (!resolvedSearchSpaceId) {
- toast.error("Cannot open chat outside a search space.");
+ if (!resolvedWorkspaceId) {
+ toast.error("Cannot open chat outside a workspace.");
return;
}
- router.push(`/dashboard/${resolvedSearchSpaceId}/new-chat/${threadId}`);
+ router.push(`/dashboard/${resolvedWorkspaceId}/new-chat/${threadId}`);
},
- [resolvedSearchSpaceId, router]
+ [resolvedWorkspaceId, router]
);
const segments = parseMentionSegments(text, mentionedDocs);
diff --git a/surfsense_web/components/citation-panel/citation-panel.tsx b/surfsense_web/components/citation-panel/citation-panel.tsx
index 068f560d3..34cc89c8b 100644
--- a/surfsense_web/components/citation-panel/citation-panel.tsx
+++ b/surfsense_web/components/citation-panel/citation-panel.tsx
@@ -77,7 +77,7 @@ export const CitationPanelContent: FC
= ({
if (!data) return;
openEditorPanel({
documentId: data.id,
- searchSpaceId: data.workspace_id,
+ workspaceId: data.workspace_id,
title: data.title,
});
};
diff --git a/surfsense_web/components/documents/FolderNode.tsx b/surfsense_web/components/documents/FolderNode.tsx
index 849de2ea9..b46af227a 100644
--- a/surfsense_web/components/documents/FolderNode.tsx
+++ b/surfsense_web/components/documents/FolderNode.tsx
@@ -49,7 +49,7 @@ export interface FolderDisplay {
name: string;
position: string;
parentId: number | null;
- searchSpaceId: number;
+ workspaceId: number;
metadata?: Record | null;
}
diff --git a/surfsense_web/components/editor-panel/editor-panel.tsx b/surfsense_web/components/editor-panel/editor-panel.tsx
index c20c6127a..dfaeeba96 100644
--- a/surfsense_web/components/editor-panel/editor-panel.tsx
+++ b/surfsense_web/components/editor-panel/editor-panel.tsx
@@ -146,7 +146,7 @@ export function EditorPanelContent({
documentId,
localFilePath,
memoryScope,
- searchSpaceId,
+ workspaceId,
title,
onClose,
}: {
@@ -154,7 +154,7 @@ export function EditorPanelContent({
documentId?: number;
localFilePath?: string;
memoryScope?: "user" | "team";
- searchSpaceId?: number;
+ workspaceId?: number;
title: string | null;
onClose?: () => void;
}) {
@@ -186,14 +186,14 @@ export function EditorPanelContent({
}
try {
const mounts = (await electronAPI.getAgentFilesystemMounts(
- searchSpaceId
+ workspaceId
)) as AgentFilesystemMount[];
return normalizeLocalVirtualPathForEditor(candidatePath, mounts);
} catch {
return candidatePath;
}
},
- [electronAPI, searchSpaceId]
+ [electronAPI, workspaceId]
);
const plateMaxBytes = editorDoc?.editor_plate_max_bytes ?? LARGE_DOCUMENT_THRESHOLD;
@@ -234,7 +234,7 @@ export function EditorPanelContent({
const resolvedLocalPath = await resolveLocalVirtualPath(localFilePath);
const readResult = await electronAPI.readAgentLocalFileText(
resolvedLocalPath,
- searchSpaceId
+ workspaceId
);
if (!readResult.ok) {
throw new Error(readResult.error || "Failed to read local file");
@@ -257,7 +257,7 @@ export function EditorPanelContent({
if (!memoryScope) throw new Error("Missing memory context");
const { document, limits } = await fetchMemoryEditorDocument({
scope: memoryScope,
- searchSpaceId,
+ workspaceId,
title,
signal: controller.signal,
});
@@ -271,12 +271,12 @@ export function EditorPanelContent({
return;
}
- if (!documentId || !searchSpaceId) {
+ if (!documentId || !workspaceId) {
throw new Error("Missing document context");
}
const response = await authenticatedFetch(
buildBackendUrl(
- `/api/v1/workspaces/${searchSpaceId}/documents/${documentId}/editor-content`
+ `/api/v1/workspaces/${workspaceId}/documents/${documentId}/editor-content`
),
{ method: "GET" }
);
@@ -323,7 +323,7 @@ export function EditorPanelContent({
localFilePath,
memoryScope,
resolveLocalVirtualPath,
- searchSpaceId,
+ workspaceId,
title,
]);
@@ -382,7 +382,7 @@ export function EditorPanelContent({
const writeResult = await electronAPI.writeAgentLocalFileText(
resolvedLocalPath,
contentToSave,
- searchSpaceId
+ workspaceId
);
if (!writeResult.ok) {
throw new Error(writeResult.error || "Failed to save local file");
@@ -395,7 +395,7 @@ export function EditorPanelContent({
if (!memoryScope) throw new Error("Missing memory context");
const { markdown: savedContent, limits } = await saveMemoryMarkdown({
scope: memoryScope,
- searchSpaceId,
+ workspaceId,
markdown: markdownRef.current,
});
markdownRef.current = savedContent;
@@ -408,11 +408,11 @@ export function EditorPanelContent({
return true;
}
- if (!searchSpaceId || !documentId) {
+ if (!workspaceId || !documentId) {
throw new Error("Missing document context");
}
const response = await authenticatedFetch(
- buildBackendUrl(`/api/v1/workspaces/${searchSpaceId}/documents/${documentId}/save`),
+ buildBackendUrl(`/api/v1/workspaces/${workspaceId}/documents/${documentId}/save`),
{
method: "POST",
headers: { "Content-Type": "application/json" },
@@ -460,7 +460,7 @@ export function EditorPanelContent({
plateMaxBytes,
plateMaxLines,
resolveLocalVirtualPath,
- searchSpaceId,
+ workspaceId,
]
);
@@ -515,12 +515,12 @@ export function EditorPanelContent({
}, [editorDoc?.source_markdown]);
const handleDownloadMarkdown = useCallback(async () => {
- if (!searchSpaceId || !documentId) return;
+ if (!workspaceId || !documentId) return;
setDownloading(true);
try {
const response = await authenticatedFetch(
buildBackendUrl(
- `/api/v1/workspaces/${searchSpaceId}/documents/${documentId}/download-markdown`
+ `/api/v1/workspaces/${workspaceId}/documents/${documentId}/download-markdown`
),
{ method: "GET" }
);
@@ -542,7 +542,7 @@ export function EditorPanelContent({
} finally {
setDownloading(false);
}
- }, [documentId, editorDoc?.title, searchSpaceId]);
+ }, [documentId, editorDoc?.title, workspaceId]);
const largeDocAlert = viewerMode === "monaco" && !isLocalFileMode && editorDoc && (
@@ -890,7 +890,7 @@ function DesktopEditorPanel() {
const hasTarget =
panelState.kind === "document"
- ? !!panelState.documentId && !!panelState.searchSpaceId
+ ? !!panelState.documentId && !!panelState.workspaceId
: panelState.kind === "local_file"
? !!panelState.localFilePath
: !!panelState.memoryScope;
@@ -903,7 +903,7 @@ function DesktopEditorPanel() {
documentId={panelState.documentId ?? undefined}
localFilePath={panelState.localFilePath ?? undefined}
memoryScope={panelState.memoryScope ?? undefined}
- searchSpaceId={panelState.searchSpaceId ?? undefined}
+ workspaceId={panelState.workspaceId ?? undefined}
title={panelState.title}
onClose={closePanel}
/>
@@ -919,7 +919,7 @@ function MobileEditorDrawer() {
const hasTarget =
panelState.kind === "document"
- ? !!panelState.documentId && !!panelState.searchSpaceId
+ ? !!panelState.documentId && !!panelState.workspaceId
: !!panelState.memoryScope;
if (!hasTarget) return null;
@@ -943,7 +943,7 @@ function MobileEditorDrawer() {
documentId={panelState.documentId ?? undefined}
localFilePath={panelState.localFilePath ?? undefined}
memoryScope={panelState.memoryScope ?? undefined}
- searchSpaceId={panelState.searchSpaceId ?? undefined}
+ workspaceId={panelState.workspaceId ?? undefined}
title={panelState.title}
/>
@@ -957,7 +957,7 @@ export function EditorPanel() {
const isDesktop = useMediaQuery("(min-width: 1024px)");
const hasTarget =
panelState.kind === "document"
- ? !!panelState.documentId && !!panelState.searchSpaceId
+ ? !!panelState.documentId && !!panelState.workspaceId
: panelState.kind === "local_file"
? !!panelState.localFilePath
: !!panelState.memoryScope;
@@ -977,7 +977,7 @@ export function MobileEditorPanel() {
const isDesktop = useMediaQuery("(min-width: 1024px)");
const hasTarget =
panelState.kind === "document"
- ? !!panelState.documentId && !!panelState.searchSpaceId
+ ? !!panelState.documentId && !!panelState.workspaceId
: panelState.kind === "local_file"
? !!panelState.localFilePath
: !!panelState.memoryScope;
diff --git a/surfsense_web/components/editor-panel/memory.ts b/surfsense_web/components/editor-panel/memory.ts
index 085837803..9ba94efb3 100644
--- a/surfsense_web/components/editor-panel/memory.ts
+++ b/surfsense_web/components/editor-panel/memory.ts
@@ -24,10 +24,10 @@ interface MemoryReadResponse {
limits?: MemoryLimits;
}
-function getMemoryPath(scope: MemoryScope, searchSpaceId?: number | null) {
+function getMemoryPath(scope: MemoryScope, workspaceId?: number | null) {
if (scope === "user") return "/api/v1/users/me/memory";
- if (!searchSpaceId) throw new Error("Missing search space context");
- return `/api/v1/workspaces/${searchSpaceId}/memory`;
+ if (!workspaceId) throw new Error("Missing workspace context");
+ return `/api/v1/workspaces/${workspaceId}/memory`;
}
export function getMemoryLimitState(length: number, limits?: MemoryLimits | null) {
@@ -53,16 +53,16 @@ export function getMemoryLimitState(length: number, limits?: MemoryLimits | null
export async function fetchMemoryEditorDocument({
scope,
- searchSpaceId,
+ workspaceId,
title,
signal,
}: {
scope: MemoryScope;
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
title?: string | null;
signal?: AbortSignal;
}) {
- const response = await authenticatedFetch(buildBackendUrl(getMemoryPath(scope, searchSpaceId)), {
+ const response = await authenticatedFetch(buildBackendUrl(getMemoryPath(scope, workspaceId)), {
method: "GET",
signal,
});
@@ -87,14 +87,14 @@ export async function fetchMemoryEditorDocument({
export async function saveMemoryMarkdown({
scope,
- searchSpaceId,
+ workspaceId,
markdown,
}: {
scope: MemoryScope;
- searchSpaceId?: number | null;
+ workspaceId?: number | null;
markdown: string;
}) {
- const response = await authenticatedFetch(buildBackendUrl(getMemoryPath(scope, searchSpaceId)), {
+ const response = await authenticatedFetch(buildBackendUrl(getMemoryPath(scope, workspaceId)), {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ memory_md: markdown }),
diff --git a/surfsense_web/components/layout/index.ts b/surfsense_web/components/layout/index.ts
index eb475e414..e6903c642 100644
--- a/surfsense_web/components/layout/index.ts
+++ b/surfsense_web/components/layout/index.ts
@@ -5,13 +5,13 @@ export type {
IconRailProps,
NavItem,
PageUsage,
- SearchSpace,
SidebarSectionProps,
User,
+ Workspace,
} from "./types/layout.types";
export {
ChatListItem,
- CreateSearchSpaceDialog,
+ CreateWorkspaceDialog,
CreditBalanceDisplay,
Header,
IconRail,
@@ -20,10 +20,10 @@ export {
MobileSidebarTrigger,
NavIcon,
NavSection,
- SearchSpaceAvatar,
Sidebar,
SidebarCollapseButton,
SidebarHeader,
SidebarSection,
SidebarUserProfile,
+ WorkspaceAvatar,
} from "./ui";
diff --git a/surfsense_web/components/layout/providers/FreeLayoutDataProvider.tsx b/surfsense_web/components/layout/providers/FreeLayoutDataProvider.tsx
index 9e2a99f2a..b1b36aa3d 100644
--- a/surfsense_web/components/layout/providers/FreeLayoutDataProvider.tsx
+++ b/surfsense_web/components/layout/providers/FreeLayoutDataProvider.tsx
@@ -9,14 +9,14 @@ import { useLoginGate } from "@/contexts/login-gate";
import { useAnnouncements } from "@/hooks/use-announcements";
import { useIsMobile } from "@/hooks/use-mobile";
import { anonymousChatApiService } from "@/lib/apis/anonymous-chat-api.service";
-import type { ChatItem, NavItem, PageUsage, SearchSpace } from "../types/layout.types";
+import type { ChatItem, NavItem, PageUsage, Workspace } from "../types/layout.types";
import { LayoutShell } from "../ui/shell";
interface FreeLayoutDataProviderProps {
children: ReactNode;
}
-const GUEST_SPACE: SearchSpace = {
+const GUEST_SPACE: Workspace = {
id: 0,
name: "SurfSense Free",
description: "Free AI chat without login",
@@ -94,19 +94,16 @@ export function FreeLayoutDataProvider({ children }: FreeLayoutDataProviderProps
const handleAnnouncements = useCallback(() => gate("see what's new"), [gate]);
- const handleSearchSpaceSelect = useCallback(
- (_id: number) => gate("switch search spaces"),
- [gate]
- );
+ const handleWorkspaceSelect = useCallback((_id: number) => gate("switch workspaces"), [gate]);
return (
searchSpacesApiService.getSearchSpace({ id: Number(searchSpaceId) }),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.workspaces.detail(workspaceId),
+ queryFn: () => workspacesApiService.getWorkspace({ id: Number(workspaceId) }),
+ enabled: !!workspaceId,
});
// Fetch threads (40 total to allow up to 20 per section - shared/private)
const { data: threadsData, isPending: isLoadingThreads } = useQuery({
- queryKey: ["threads", searchSpaceId, { limit: 40 }],
- queryFn: () => fetchThreads(Number(searchSpaceId), 40),
- enabled: !!searchSpaceId,
+ queryKey: ["threads", workspaceId, { limit: 40 }],
+ queryFn: () => fetchThreads(Number(workspaceId), 40),
+ enabled: !!workspaceId,
});
// Unified slide-out panel state (only one can be open at a time)
@@ -147,10 +147,10 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
}, [setIsDocumentsSidebarOpen]);
// Search space dialog state
- const [isCreateSearchSpaceDialogOpen, setIsCreateSearchSpaceDialogOpen] = useState(false);
+ const [isCreateWorkspaceDialogOpen, setIsCreateWorkspaceDialogOpen] = useState(false);
const userId = user?.id ? String(user.id) : null;
- const numericSpaceId = Number(searchSpaceId) || null;
+ const numericSpaceId = Number(workspaceId) || null;
// Batch-fetch unread counts for all categories in a single request
// instead of 2 separate /unread-count calls.
@@ -218,11 +218,11 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
icon: ,
action: {
label: "Buy credits",
- onClick: () => router.push(`/dashboard/${searchSpaceId}/buy-more`),
+ onClick: () => router.push(`/dashboard/${workspaceId}/buy-more`),
},
});
}
- }, [statusInbox.inboxItems, statusInbox.loading, searchSpaceId, router]);
+ }, [statusInbox.inboxItems, statusInbox.loading, workspaceId, router]);
// Delete dialogs state
const [showDeleteChatDialog, setShowDeleteChatDialog] = useState(false);
@@ -235,28 +235,28 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
const [newChatTitle, setNewChatTitle] = useState("");
const [isRenamingChat, setIsRenamingChat] = useState(false);
- // Delete/Leave search space dialog state
- const [showDeleteSearchSpaceDialog, setShowDeleteSearchSpaceDialog] = useState(false);
- const [showLeaveSearchSpaceDialog, setShowLeaveSearchSpaceDialog] = useState(false);
- const [searchSpaceToDelete, setSearchSpaceToDelete] = useState(null);
- const [searchSpaceToLeave, setSearchSpaceToLeave] = useState(null);
- const [isDeletingSearchSpace, setIsDeletingSearchSpace] = useState(false);
- const [isLeavingSearchSpace, setIsLeavingSearchSpace] = useState(false);
+ // Delete/Leave workspace dialog state
+ const [showDeleteWorkspaceDialog, setShowDeleteWorkspaceDialog] = useState(false);
+ const [showLeaveWorkspaceDialog, setShowLeaveWorkspaceDialog] = useState(false);
+ const [workspaceToDelete, setWorkspaceToDelete] = useState(null);
+ const [workspaceToLeave, setWorkspaceToLeave] = useState(null);
+ const [isDeletingWorkspace, setIsDeletingWorkspace] = useState(false);
+ const [isLeavingWorkspace, setIsLeavingWorkspace] = useState(false);
- // Reset transient slide-out panels when switching search spaces.
+ // Reset transient slide-out panels when switching workspaces.
// Tabs intentionally persist across spaces — opening tabs from multiple
- // search spaces is a supported flow (browser-tab semantics).
- const prevSearchSpaceIdRef = useRef(searchSpaceId);
+ // workspaces is a supported flow (browser-tab semantics).
+ const prevWorkspaceIdRef = useRef(workspaceId);
useEffect(() => {
- if (prevSearchSpaceIdRef.current !== searchSpaceId) {
- prevSearchSpaceIdRef.current = searchSpaceId;
+ if (prevWorkspaceIdRef.current !== workspaceId) {
+ prevWorkspaceIdRef.current = workspaceId;
setActiveSlideoutPanel(null);
}
- }, [searchSpaceId]);
+ }, [workspaceId]);
- const searchSpaces: SearchSpace[] = useMemo(() => {
- if (!searchSpacesData || !Array.isArray(searchSpacesData)) return [];
- return searchSpacesData.map((space) => ({
+ const workspaces: Workspace[] = useMemo(() => {
+ if (!workspacesData || !Array.isArray(workspacesData)) return [];
+ return workspacesData.map((space) => ({
id: space.id,
name: space.name,
description: space.description,
@@ -264,15 +264,15 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
memberCount: space.member_count || 0,
createdAt: space.created_at,
}));
- }, [searchSpacesData]);
+ }, [workspacesData]);
// Find active workspace from list, falling back to the route-scoped detail query.
- const activeSearchSpace: SearchSpace | null = useMemo(() => {
- if (!searchSpaceId) return null;
- const searchSpaceIdNumber = Number(searchSpaceId);
- const listedSpace = searchSpaces.find((s) => s.id === searchSpaceIdNumber);
+ const activeWorkspace: Workspace | null = useMemo(() => {
+ if (!workspaceId) return null;
+ const workspaceIdNumber = Number(workspaceId);
+ const listedSpace = workspaces.find((s) => s.id === workspaceIdNumber);
if (listedSpace) return listedSpace;
- if (!currentWorkspace || currentWorkspace.id !== searchSpaceIdNumber) return null;
+ if (!currentWorkspace || currentWorkspace.id !== workspaceIdNumber) return null;
return {
id: currentWorkspace.id,
name: currentWorkspace.name,
@@ -281,25 +281,24 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
memberCount: 0,
createdAt: currentWorkspace.created_at,
};
- }, [currentWorkspace, searchSpaceId, searchSpaces]);
+ }, [currentWorkspace, workspaceId, workspaces]);
- // Safety redirect: if the current search space is no longer in the user's list
+ // Safety redirect: if the current workspace is no longer in the user's list
// (e.g. deleted by background task, membership revoked), redirect to a valid space.
useEffect(() => {
- if (!searchSpacesLoaded || !searchSpaceId || isDeletingSearchSpace || isLeavingSearchSpace)
- return;
- if (searchSpaces.length > 0 && !activeSearchSpace) {
- router.replace(`/dashboard/${searchSpaces[0].id}/new-chat`);
- } else if (searchSpaces.length === 0 && searchSpacesLoaded && !activeSearchSpace) {
+ if (!workspacesLoaded || !workspaceId || isDeletingWorkspace || isLeavingWorkspace) return;
+ if (workspaces.length > 0 && !activeWorkspace) {
+ router.replace(`/dashboard/${workspaces[0].id}/new-chat`);
+ } else if (workspaces.length === 0 && workspacesLoaded && !activeWorkspace) {
router.replace("/dashboard");
}
}, [
- searchSpacesLoaded,
- searchSpaceId,
- searchSpaces,
- activeSearchSpace,
- isDeletingSearchSpace,
- isLeavingSearchSpace,
+ workspacesLoaded,
+ workspaceId,
+ workspaces,
+ activeWorkspace,
+ isDeletingWorkspace,
+ isLeavingWorkspace,
router,
]);
@@ -307,18 +306,18 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
useEffect(() => {
const chatId = currentChatId ?? null;
const chatUrl = chatId
- ? `/dashboard/${searchSpaceId}/new-chat/${chatId}`
- : `/dashboard/${searchSpaceId}/new-chat`;
+ ? `/dashboard/${workspaceId}/new-chat/${chatId}`
+ : `/dashboard/${workspaceId}/new-chat`;
const thread = threadsData?.threads?.find((t) => t.id === chatId);
syncChatTab({
chatId,
// Avoid overwriting live SSE-updated tab titles with fallback values.
title: chatId ? (thread?.title ?? undefined) : "New Chat",
chatUrl,
- searchSpaceId: Number(searchSpaceId),
+ workspaceId: Number(workspaceId),
...(thread?.visibility !== undefined ? { visibility: thread.visibility } : {}),
});
- }, [currentChatId, searchSpaceId, threadsData?.threads, syncChatTab]);
+ }, [currentChatId, workspaceId, threadsData?.threads, syncChatTab]);
const chats = useMemo(() => {
if (!threadsData?.threads) return [];
@@ -326,12 +325,12 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
return threadsData.threads.map((thread) => ({
id: thread.id,
name: thread.title || `Chat ${thread.id}`,
- url: `/dashboard/${searchSpaceId}/new-chat/${thread.id}`,
+ url: `/dashboard/${workspaceId}/new-chat/${thread.id}`,
visibility: thread.visibility,
isOwnThread: thread.is_own_thread,
archived: thread.archived,
}));
- }, [threadsData, searchSpaceId]);
+ }, [threadsData, workspaceId]);
// Navigation items
// Inbox, Automations, and Artifacts are rendered explicitly below "New chat"
@@ -352,13 +351,13 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
},
{
title: "Automations",
- url: `/dashboard/${searchSpaceId}/automations`,
+ url: `/dashboard/${workspaceId}/automations`,
icon: AlarmClock,
isActive: isAutomationsActive,
},
{
title: "Artifacts",
- url: `/dashboard/${searchSpaceId}/artifacts`,
+ url: `/dashboard/${workspaceId}/artifacts`,
icon: Boxes,
isActive: isArtifactsActive,
},
@@ -377,63 +376,63 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
isInboxSidebarOpen,
isDocumentsSidebarOpen,
totalUnreadCount,
- searchSpaceId,
+ workspaceId,
isAutomationsActive,
isArtifactsActive,
]
);
// Handlers
- const handleSearchSpaceSelect = useCallback(
+ const handleWorkspaceSelect = useCallback(
(id: number) => {
router.push(`/dashboard/${id}/new-chat`);
},
[router]
);
- const handleAddSearchSpace = useCallback(() => {
- setIsCreateSearchSpaceDialogOpen(true);
+ const handleAddWorkspace = useCallback(() => {
+ setIsCreateWorkspaceDialogOpen(true);
}, []);
const setAnnouncementsDialog = useSetAtom(announcementsDialogAtom);
const handleUserSettings = useCallback(() => {
- router.push(`/dashboard/${searchSpaceId}/user-settings/profile`);
- }, [router, searchSpaceId]);
+ router.push(`/dashboard/${workspaceId}/user-settings/profile`);
+ }, [router, workspaceId]);
const handleAnnouncements = useCallback(() => {
setAnnouncementsDialog(true);
}, [setAnnouncementsDialog]);
- const handleSearchSpaceSettings = useCallback(
- (space: SearchSpace) => {
+ const handleWorkspaceSettings = useCallback(
+ (space: Workspace) => {
router.push(`/dashboard/${space.id}/workspace-settings`);
},
[router]
);
- const handleSearchSpaceDeleteClick = useCallback((space: SearchSpace) => {
+ const handleWorkspaceDeleteClick = useCallback((space: Workspace) => {
// If user is owner, show delete dialog; otherwise show leave dialog
if (space.isOwner) {
- setSearchSpaceToDelete(space);
- setShowDeleteSearchSpaceDialog(true);
+ setWorkspaceToDelete(space);
+ setShowDeleteWorkspaceDialog(true);
} else {
- setSearchSpaceToLeave(space);
- setShowLeaveSearchSpaceDialog(true);
+ setWorkspaceToLeave(space);
+ setShowLeaveWorkspaceDialog(true);
}
}, []);
- const confirmDeleteSearchSpace = useCallback(async () => {
- if (!searchSpaceToDelete) return;
- setIsDeletingSearchSpace(true);
+ const confirmDeleteWorkspace = useCallback(async () => {
+ if (!workspaceToDelete) return;
+ setIsDeletingWorkspace(true);
try {
- await deleteSearchSpace({ id: searchSpaceToDelete.id });
+ await deleteWorkspace({ id: workspaceToDelete.id });
- const isCurrentSpace = Number(searchSpaceId) === searchSpaceToDelete.id;
+ const isCurrentSpace = Number(workspaceId) === workspaceToDelete.id;
// Await refetch so we have the freshest list (backend now hides [DELETING] spaces)
- const result = await refetchSearchSpaces();
- const updatedSpaces = (result.data ?? []).filter((s) => s.id !== searchSpaceToDelete.id);
+ const result = await refetchWorkspaces();
+ const updatedSpaces = (result.data ?? []).filter((s) => s.id !== workspaceToDelete.id);
if (isCurrentSpace) {
if (updatedSpaces.length > 0) {
@@ -443,27 +442,27 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
}
}
} catch (error) {
- console.error("Error deleting search space:", error);
+ console.error("Error deleting workspace:", error);
toast.error(
- t.has("delete_space_error") ? t("delete_space_error") : "Failed to delete search space"
+ t.has("delete_space_error") ? t("delete_space_error") : "Failed to delete workspace"
);
} finally {
- setIsDeletingSearchSpace(false);
- setShowDeleteSearchSpaceDialog(false);
- setSearchSpaceToDelete(null);
+ setIsDeletingWorkspace(false);
+ setShowDeleteWorkspaceDialog(false);
+ setWorkspaceToDelete(null);
}
- }, [searchSpaceToDelete, deleteSearchSpace, refetchSearchSpaces, searchSpaceId, router, t]);
+ }, [workspaceToDelete, deleteWorkspace, refetchWorkspaces, workspaceId, router, t]);
- const confirmLeaveSearchSpace = useCallback(async () => {
- if (!searchSpaceToLeave) return;
- setIsLeavingSearchSpace(true);
+ const confirmLeaveWorkspace = useCallback(async () => {
+ if (!workspaceToLeave) return;
+ setIsLeavingWorkspace(true);
try {
- await searchSpacesApiService.leaveSearchSpace(searchSpaceToLeave.id);
+ await workspacesApiService.leaveWorkspace(workspaceToLeave.id);
- const isCurrentSpace = Number(searchSpaceId) === searchSpaceToLeave.id;
+ const isCurrentSpace = Number(workspaceId) === workspaceToLeave.id;
- const result = await refetchSearchSpaces();
- const updatedSpaces = (result.data ?? []).filter((s) => s.id !== searchSpaceToLeave.id);
+ const result = await refetchWorkspaces();
+ const updatedSpaces = (result.data ?? []).filter((s) => s.id !== workspaceToLeave.id);
if (isCurrentSpace) {
if (updatedSpaces.length > 0) {
@@ -473,14 +472,14 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
}
}
} catch (error) {
- console.error("Error leaving search space:", error);
- toast.error(t.has("leave_error") ? t("leave_error") : "Failed to leave search space");
+ console.error("Error leaving workspace:", error);
+ toast.error(t.has("leave_error") ? t("leave_error") : "Failed to leave workspace");
} finally {
- setIsLeavingSearchSpace(false);
- setShowLeaveSearchSpaceDialog(false);
- setSearchSpaceToLeave(null);
+ setIsLeavingWorkspace(false);
+ setShowLeaveWorkspaceDialog(false);
+ setWorkspaceToLeave(null);
}
- }, [searchSpaceToLeave, refetchSearchSpaces, searchSpaceId, router, t]);
+ }, [workspaceToLeave, refetchWorkspaces, workspaceId, router, t]);
const handleTabSwitch = useCallback(
(tab: Tab) => {
@@ -489,14 +488,14 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
id: tab.chatId ?? null,
title: tab.title,
url: tab.chatUrl,
- searchSpaceId: tab.searchSpaceId ?? searchSpaceId,
+ workspaceId: tab.workspaceId ?? workspaceId,
...(tab.visibility !== undefined ? { visibility: tab.visibility } : {}),
...(tab.hasComments !== undefined ? { hasComments: tab.hasComments } : {}),
});
}
// Document tabs are handled in-place by LayoutShell — no navigation needed
},
- [activateChatThread, searchSpaceId]
+ [activateChatThread, workspaceId]
);
const handleTabPrefetch = useCallback(
@@ -542,15 +541,15 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
if (isOutOfSync) {
resetCurrentThread();
// Immediately set the browser URL so the page remounts with a clean /new-chat path
- window.history.replaceState(null, "", `/dashboard/${searchSpaceId}/new-chat`);
+ window.history.replaceState(null, "", `/dashboard/${workspaceId}/new-chat`);
// Force-remount the page component to reset all React state synchronously
setChatResetKey((k) => k + 1);
// Sync Next.js router internals so useParams/usePathname stay correct going forward
- router.replace(`/dashboard/${searchSpaceId}/new-chat`);
+ router.replace(`/dashboard/${workspaceId}/new-chat`);
} else {
- router.push(`/dashboard/${searchSpaceId}/new-chat`);
+ router.push(`/dashboard/${workspaceId}/new-chat`);
}
- }, [router, searchSpaceId, currentThreadState.id, params?.chat_id, resetCurrentThread]);
+ }, [router, workspaceId, currentThreadState.id, params?.chat_id, resetCurrentThread]);
const handleChatSelect = useCallback(
(chat: ChatItem) => {
@@ -558,11 +557,11 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
id: chat.id,
title: chat.name,
url: chat.url,
- searchSpaceId,
+ workspaceId,
...(chat.visibility !== undefined ? { visibility: chat.visibility } : {}),
});
},
- [activateChatThread, searchSpaceId]
+ [activateChatThread, workspaceId]
);
const handleChatDelete = useCallback((chat: ChatItem) => {
@@ -595,12 +594,12 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
);
const handleSettings = useCallback(() => {
- router.push(`/dashboard/${searchSpaceId}/workspace-settings`);
- }, [router, searchSpaceId]);
+ router.push(`/dashboard/${workspaceId}/workspace-settings`);
+ }, [router, workspaceId]);
const handleManageMembers = useCallback(() => {
- router.push(`/dashboard/${searchSpaceId}/team`);
- }, [router, searchSpaceId]);
+ router.push(`/dashboard/${workspaceId}/team`);
+ }, [router, workspaceId]);
const handleLogout = useCallback(async () => {
try {
@@ -634,7 +633,7 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
id: fallbackTab.chatId ?? null,
title: fallbackTab.title,
url: fallbackTab.chatUrl,
- searchSpaceId: fallbackTab.searchSpaceId ?? searchSpaceId,
+ workspaceId: fallbackTab.workspaceId ?? workspaceId,
...(fallbackTab.visibility !== undefined ? { visibility: fallbackTab.visibility } : {}),
...(fallbackTab.hasComments !== undefined
? { hasComments: fallbackTab.hasComments }
@@ -643,10 +642,10 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
} else {
const isOutOfSync = currentThreadState.id !== null && !params?.chat_id;
if (isOutOfSync) {
- window.history.replaceState(null, "", `/dashboard/${searchSpaceId}/new-chat`);
+ window.history.replaceState(null, "", `/dashboard/${workspaceId}/new-chat`);
setChatResetKey((k) => k + 1);
} else {
- router.push(`/dashboard/${searchSpaceId}/new-chat`);
+ router.push(`/dashboard/${workspaceId}/new-chat`);
}
}
}
@@ -660,7 +659,7 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
}, [
chatToDelete,
deleteThread,
- searchSpaceId,
+ workspaceId,
resetCurrentThread,
currentChatId,
currentThreadState.id,
@@ -695,7 +694,7 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
// Detect if we're on the chat page (needs overflow-hidden for chat's own scroll)
const isChatPage = pathname?.includes("/new-chat") ?? false;
const isUserSettingsPage = pathname?.includes("/user-settings") === true;
- const isSearchSpaceSettingsPage = pathname?.includes("/workspace-settings") === true;
+ const isWorkspaceSettingsPage = pathname?.includes("/workspace-settings") === true;
const isTeamPage = pathname?.endsWith("/team") === true;
const isAutomationsPage = pathname?.includes("/automations") === true;
const isArtifactsPage = pathname?.endsWith("/artifacts") === true;
@@ -703,15 +702,15 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
const handleViewAllChats = useCallback(() => {
setActiveSlideoutPanel(null);
router.push(
- isAllChatsPage ? `/dashboard/${searchSpaceId}/new-chat` : `/dashboard/${searchSpaceId}/chats`
+ isAllChatsPage ? `/dashboard/${workspaceId}/new-chat` : `/dashboard/${workspaceId}/chats`
);
- }, [isAllChatsPage, router, searchSpaceId]);
+ }, [isAllChatsPage, router, workspaceId]);
const useWorkspacePanel =
pathname?.endsWith("/buy-more") === true ||
pathname?.endsWith("/earn-credits") === true ||
pathname?.endsWith("/more-pages") === true ||
isUserSettingsPage ||
- isSearchSpaceSettingsPage ||
+ isWorkspaceSettingsPage ||
isTeamPage ||
isAutomationsPage ||
isArtifactsPage ||
@@ -720,13 +719,13 @@ export function LayoutDataProvider({ searchSpaceId, children }: LayoutDataProvid
return (
<>
- {/* Delete Search Space Dialog */}
-
+ {/* Delete Workspace Dialog */}
+
- {t("delete_search_space")}
+ {t("delete_workspace")}
- {t("delete_space_confirm", { name: searchSpaceToDelete?.name || "" })}
+ {t("delete_space_confirm", { name: workspaceToDelete?.name || "" })}
-
+
{tCommon("cancel")}
{
e.preventDefault();
- confirmDeleteSearchSpace();
+ confirmDeleteWorkspace();
}}
- disabled={isDeletingSearchSpace}
+ disabled={isDeletingWorkspace}
className="relative bg-destructive text-destructive-foreground hover:bg-destructive/90"
>
- {tCommon("delete")}
- {isDeletingSearchSpace && }
+ {tCommon("delete")}
+ {isDeletingWorkspace && }
- {/* Leave Search Space Dialog */}
-
+ {/* Leave Workspace Dialog */}
+
{t("leave_title")}
- {t("leave_confirm", { name: searchSpaceToLeave?.name || "" })}
+ {t("leave_confirm", { name: workspaceToLeave?.name || "" })}
-
- {tCommon("cancel")}
-
+ {tCommon("cancel")}
{
e.preventDefault();
- confirmLeaveSearchSpace();
+ confirmLeaveWorkspace();
}}
- disabled={isLeavingSearchSpace}
+ disabled={isLeavingWorkspace}
className="relative bg-destructive text-destructive-foreground hover:bg-destructive/90"
>
- {t("leave")}
- {isLeavingSearchSpace && }
+ {t("leave")}
+ {isLeavingWorkspace && }
- {/* Create Search Space Dialog */}
-
diff --git a/surfsense_web/components/layout/types/layout.types.ts b/surfsense_web/components/layout/types/layout.types.ts
index 1dfb51ca8..334b587ef 100644
--- a/surfsense_web/components/layout/types/layout.types.ts
+++ b/surfsense_web/components/layout/types/layout.types.ts
@@ -1,7 +1,7 @@
import type { LucideIcon } from "lucide-react";
import type { DocumentsProcessingStatus } from "@/hooks/use-documents-processing";
-export interface SearchSpace {
+export interface Workspace {
id: number;
name: string;
description?: string | null;
@@ -41,15 +41,15 @@ export interface PageUsage {
}
export interface IconRailProps {
- searchSpaces: SearchSpace[];
- activeSearchSpaceId: number | null;
- onSearchSpaceSelect: (id: number) => void;
- onAddSearchSpace: () => void;
+ workspaces: Workspace[];
+ activeWorkspaceId: number | null;
+ onWorkspaceSelect: (id: number) => void;
+ onAddWorkspace: () => void;
className?: string;
}
export interface SidebarHeaderProps {
- searchSpace: SearchSpace | null;
+ workspace: Workspace | null;
onSettings?: () => void;
}
@@ -71,23 +71,23 @@ export interface ChatsSectionProps {
onChatSelect: (chat: ChatItem) => void;
onChatDelete?: (chat: ChatItem) => void;
onViewAllChats?: () => void;
- searchSpaceId?: string;
+ workspaceId?: string;
}
export interface SidebarUserProfileProps {
user: User;
- searchSpaceId?: string;
+ workspaceId?: string;
onSettings?: () => void;
onManageMembers?: () => void;
- onSwitchSearchSpace?: () => void;
+ onSwitchWorkspace?: () => void;
onToggleTheme?: () => void;
onLogout?: () => void;
theme?: string;
}
export interface SidebarProps {
- searchSpace: SearchSpace | null;
- searchSpaceId?: string;
+ workspace: Workspace | null;
+ workspaceId?: string;
navItems: NavItem[];
chats: ChatItem[];
activeChatId?: number | null;
@@ -106,10 +106,10 @@ export interface SidebarProps {
}
export interface LayoutShellProps {
- searchSpaces: SearchSpace[];
- activeSearchSpaceId: number | null;
- onSearchSpaceSelect: (id: number) => void;
- onAddSearchSpace: () => void;
+ workspaces: Workspace[];
+ activeWorkspaceId: number | null;
+ onWorkspaceSelect: (id: number) => void;
+ onAddWorkspace: () => void;
sidebarProps: Omit;
children: React.ReactNode;
className?: string;
diff --git a/surfsense_web/components/layout/ui/dialogs/CreateWorkspaceDialog.tsx b/surfsense_web/components/layout/ui/dialogs/CreateWorkspaceDialog.tsx
index ec9e94554..cabe4879a 100644
--- a/surfsense_web/components/layout/ui/dialogs/CreateWorkspaceDialog.tsx
+++ b/surfsense_web/components/layout/ui/dialogs/CreateWorkspaceDialog.tsx
@@ -7,7 +7,7 @@ import { useTranslations } from "next-intl";
import { useState } from "react";
import { useForm } from "react-hook-form";
import * as z from "zod";
-import { createSearchSpaceMutationAtom } from "@/atoms/workspaces/workspace-mutation.atoms";
+import { createWorkspaceMutationAtom } from "@/atoms/workspaces/workspace-mutation.atoms";
import { Button } from "@/components/ui/button";
import {
Dialog,
@@ -27,7 +27,7 @@ import {
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Spinner } from "@/components/ui/spinner";
-import { trackSearchSpaceCreated } from "@/lib/posthog/events";
+import { trackWorkspaceCreated } from "@/lib/posthog/events";
const formSchema = z.object({
name: z.string().min(1, "Name is required"),
@@ -36,18 +36,18 @@ const formSchema = z.object({
type FormValues = z.infer;
-interface CreateSearchSpaceDialogProps {
+interface CreateWorkspaceDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
}
-export function CreateSearchSpaceDialog({ open, onOpenChange }: CreateSearchSpaceDialogProps) {
- const t = useTranslations("searchSpace");
+export function CreateWorkspaceDialog({ open, onOpenChange }: CreateWorkspaceDialogProps) {
+ const t = useTranslations("workspace");
const tCommon = useTranslations("common");
const router = useRouter();
const [isSubmitting, setIsSubmitting] = useState(false);
- const { mutateAsync: createSearchSpace } = useAtomValue(createSearchSpaceMutationAtom);
+ const { mutateAsync: createWorkspace } = useAtomValue(createWorkspaceMutationAtom);
const form = useForm({
resolver: zodResolver(formSchema),
@@ -60,16 +60,16 @@ export function CreateSearchSpaceDialog({ open, onOpenChange }: CreateSearchSpac
const handleSubmit = async (values: FormValues) => {
setIsSubmitting(true);
try {
- const result = await createSearchSpace({
+ const result = await createWorkspace({
name: values.name,
description: values.description || "",
});
- trackSearchSpaceCreated(result.id, values.name);
+ trackWorkspaceCreated(result.id, values.name);
router.push(`/dashboard/${result.id}/new-chat`);
} catch (error) {
- console.error("Failed to create search space:", error);
+ console.error("Failed to create workspace:", error);
setIsSubmitting(false);
}
};
diff --git a/surfsense_web/components/layout/ui/dialogs/index.ts b/surfsense_web/components/layout/ui/dialogs/index.ts
index 8caf14d1c..880c397e1 100644
--- a/surfsense_web/components/layout/ui/dialogs/index.ts
+++ b/surfsense_web/components/layout/ui/dialogs/index.ts
@@ -1 +1 @@
-export { CreateSearchSpaceDialog } from "./CreateWorkspaceDialog";
+export { CreateWorkspaceDialog } from "./CreateWorkspaceDialog";
diff --git a/surfsense_web/components/layout/ui/header/Header.tsx b/surfsense_web/components/layout/ui/header/Header.tsx
index 05ed0e6b3..24ec9ea35 100644
--- a/surfsense_web/components/layout/ui/header/Header.tsx
+++ b/surfsense_web/components/layout/ui/header/Header.tsx
@@ -16,7 +16,7 @@ interface HeaderProps {
export function Header({ mobileMenuTrigger }: HeaderProps) {
const pathname = usePathname();
- const searchSpaceId = useAtomValue(activeWorkspaceIdAtom);
+ const workspaceId = useAtomValue(activeWorkspaceIdAtom);
const activeTab = useAtomValue(activeTabAtom);
const isFreePage = pathname?.startsWith("/free") ?? false;
@@ -26,14 +26,14 @@ export function Header({ mobileMenuTrigger }: HeaderProps) {
const currentThreadState = useAtomValue(currentThreadAtom);
const hasThread = isChatPage && !isDocumentTab && currentThreadState.id !== null;
- const activeSearchSpaceId = searchSpaceId ? Number(searchSpaceId) : null;
+ const activeWorkspaceId = workspaceId ? Number(workspaceId) : null;
const canRenderShareButton =
hasThread &&
currentThreadState.id !== null &&
currentThreadState.visibility !== null &&
- currentThreadState.searchSpaceId !== null &&
- activeSearchSpaceId !== null &&
- currentThreadState.searchSpaceId === activeSearchSpaceId;
+ currentThreadState.workspaceId !== null &&
+ activeWorkspaceId !== null &&
+ currentThreadState.workspaceId === activeWorkspaceId;
// Free chat pages have their own header with model selector; only render mobile trigger
if (isFreePage) {
@@ -50,13 +50,13 @@ export function Header({ mobileMenuTrigger }: HeaderProps) {
canRenderShareButton &&
currentThreadState.id !== null &&
currentThreadState.visibility !== null &&
- currentThreadState.searchSpaceId !== null
+ currentThreadState.workspaceId !== null
) {
threadForButton = {
id: currentThreadState.id,
visibility: currentThreadState.visibility,
created_by_id: null,
- workspace_id: currentThreadState.searchSpaceId,
+ workspace_id: currentThreadState.workspaceId,
title: "",
archived: false,
created_at: "",
diff --git a/surfsense_web/components/layout/ui/icon-rail/IconRail.tsx b/surfsense_web/components/layout/ui/icon-rail/IconRail.tsx
index a33b69a96..5170fa770 100644
--- a/surfsense_web/components/layout/ui/icon-rail/IconRail.tsx
+++ b/surfsense_web/components/layout/ui/icon-rail/IconRail.tsx
@@ -5,17 +5,17 @@ import { Button } from "@/components/ui/button";
import { ScrollArea } from "@/components/ui/scroll-area";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { cn } from "@/lib/utils";
-import type { NavItem, SearchSpace, User } from "../../types/layout.types";
+import type { NavItem, User, Workspace } from "../../types/layout.types";
import { SidebarUserProfile } from "../sidebar/SidebarUserProfile";
-import { SearchSpaceAvatar } from "./WorkspaceAvatar";
+import { WorkspaceAvatar } from "./WorkspaceAvatar";
interface IconRailProps {
- searchSpaces: SearchSpace[];
- activeSearchSpaceId: number | null;
- onSearchSpaceSelect: (id: number) => void;
- onSearchSpaceDelete?: (searchSpace: SearchSpace) => void;
- onSearchSpaceSettings?: (searchSpace: SearchSpace) => void;
- onAddSearchSpace: () => void;
+ workspaces: Workspace[];
+ activeWorkspaceId: number | null;
+ onWorkspaceSelect: (id: number) => void;
+ onWorkspaceDelete?: (workspace: Workspace) => void;
+ onWorkspaceSettings?: (workspace: Workspace) => void;
+ onAddWorkspace: () => void;
isSingleRailMode?: boolean;
onNewChat?: () => void;
navItems?: NavItem[];
@@ -31,12 +31,12 @@ interface IconRailProps {
}
export function IconRail({
- searchSpaces,
- activeSearchSpaceId,
- onSearchSpaceSelect,
- onSearchSpaceDelete,
- onSearchSpaceSettings,
- onAddSearchSpace,
+ workspaces,
+ activeWorkspaceId,
+ onWorkspaceSelect,
+ onWorkspaceDelete,
+ onWorkspaceSettings,
+ onAddWorkspace,
isSingleRailMode = false,
onNewChat,
navItems = [],
@@ -77,18 +77,16 @@ export function IconRail({
- {searchSpaces.map((searchSpace) => (
-
1}
- isOwner={searchSpace.isOwner}
- onClick={() => onSearchSpaceSelect(searchSpace.id)}
- onDelete={onSearchSpaceDelete ? () => onSearchSpaceDelete(searchSpace) : undefined}
- onSettings={
- onSearchSpaceSettings ? () => onSearchSpaceSettings(searchSpace) : undefined
- }
+ {workspaces.map((workspace) => (
+ 1}
+ isOwner={workspace.isOwner}
+ onClick={() => onWorkspaceSelect(workspace.id)}
+ onDelete={onWorkspaceDelete ? () => onWorkspaceDelete(workspace) : undefined}
+ onSettings={onWorkspaceSettings ? () => onWorkspaceSettings(workspace) : undefined}
size="md"
/>
))}
@@ -98,7 +96,7 @@ export function IconRail({
diff --git a/surfsense_web/components/layout/ui/icon-rail/WorkspaceAvatar.tsx b/surfsense_web/components/layout/ui/icon-rail/WorkspaceAvatar.tsx
index b90a3b2a9..b525afc7d 100644
--- a/surfsense_web/components/layout/ui/icon-rail/WorkspaceAvatar.tsx
+++ b/surfsense_web/components/layout/ui/icon-rail/WorkspaceAvatar.tsx
@@ -14,7 +14,7 @@ import {
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { cn } from "@/lib/utils";
-interface SearchSpaceAvatarProps {
+interface WorkspaceAvatarProps {
name: string;
isActive?: boolean;
isShared?: boolean;
@@ -27,7 +27,7 @@ interface SearchSpaceAvatarProps {
}
/**
- * Generates a consistent color based on search space name
+ * Generates a consistent color based on workspace name
*/
function stringToColor(str: string): string {
let hash = 0;
@@ -48,7 +48,7 @@ function stringToColor(str: string): string {
}
/**
- * Gets initials from search space name (max 2 chars)
+ * Gets initials from workspace name (max 2 chars)
*/
function getInitials(name: string): string {
const words = name.trim().split(/\s+/);
@@ -58,7 +58,7 @@ function getInitials(name: string): string {
return name.slice(0, 2).toUpperCase();
}
-export function SearchSpaceAvatar({
+export function WorkspaceAvatar({
name,
isActive,
isShared,
@@ -68,8 +68,8 @@ export function SearchSpaceAvatar({
onSettings,
size = "md",
disableTooltip = false,
-}: SearchSpaceAvatarProps) {
- const t = useTranslations("searchSpace");
+}: WorkspaceAvatarProps) {
+ const t = useTranslations("workspace");
const tCommon = useTranslations("common");
const bgColor = stringToColor(name);
const initials = getInitials(name);
diff --git a/surfsense_web/components/layout/ui/icon-rail/index.ts b/surfsense_web/components/layout/ui/icon-rail/index.ts
index 2feddd146..0e7e8cd29 100644
--- a/surfsense_web/components/layout/ui/icon-rail/index.ts
+++ b/surfsense_web/components/layout/ui/icon-rail/index.ts
@@ -1,3 +1,3 @@
export { IconRail } from "./IconRail";
export { NavIcon } from "./NavIcon";
-export { SearchSpaceAvatar } from "./WorkspaceAvatar";
+export { WorkspaceAvatar } from "./WorkspaceAvatar";
diff --git a/surfsense_web/components/layout/ui/index.ts b/surfsense_web/components/layout/ui/index.ts
index 85a47bea1..52507ba37 100644
--- a/surfsense_web/components/layout/ui/index.ts
+++ b/surfsense_web/components/layout/ui/index.ts
@@ -1,6 +1,6 @@
-export { CreateSearchSpaceDialog } from "./dialogs";
+export { CreateWorkspaceDialog } from "./dialogs";
export { Header } from "./header";
-export { IconRail, NavIcon, SearchSpaceAvatar } from "./icon-rail";
+export { IconRail, NavIcon, WorkspaceAvatar } from "./icon-rail";
export { LayoutShell } from "./shell";
export {
ChatListItem,
diff --git a/surfsense_web/components/layout/ui/right-panel/RightPanel.tsx b/surfsense_web/components/layout/ui/right-panel/RightPanel.tsx
index 501399bf5..80f9cf002 100644
--- a/surfsense_web/components/layout/ui/right-panel/RightPanel.tsx
+++ b/surfsense_web/components/layout/ui/right-panel/RightPanel.tsx
@@ -274,7 +274,7 @@ export function RightPanel({ showTopBorder = false }: RightPanelProps) {
documentId={editorState.documentId ?? undefined}
localFilePath={editorState.localFilePath ?? undefined}
memoryScope={editorState.memoryScope ?? undefined}
- searchSpaceId={editorState.searchSpaceId ?? undefined}
+ workspaceId={editorState.workspaceId ?? undefined}
title={editorState.title}
onClose={closeEditor}
/>
diff --git a/surfsense_web/components/layout/ui/shell/LayoutShell.tsx b/surfsense_web/components/layout/ui/shell/LayoutShell.tsx
index ea63d3583..83ec8459a 100644
--- a/surfsense_web/components/layout/ui/shell/LayoutShell.tsx
+++ b/surfsense_web/components/layout/ui/shell/LayoutShell.tsx
@@ -18,7 +18,7 @@ import {
SIDEBAR_MIN_WIDTH,
useSidebarResize,
} from "../../hooks/useSidebarResize";
-import type { ChatItem, NavItem, PageUsage, SearchSpace, User } from "../../types/layout.types";
+import type { ChatItem, NavItem, PageUsage, User, Workspace } from "../../types/layout.types";
import { Header } from "../header";
import { IconRail } from "../icon-rail";
import {
@@ -102,13 +102,13 @@ interface InboxProps {
}
interface LayoutShellProps {
- searchSpaces: SearchSpace[];
- activeSearchSpaceId: number | null;
- onSearchSpaceSelect: (id: number) => void;
- onSearchSpaceDelete?: (searchSpace: SearchSpace) => void;
- onSearchSpaceSettings?: (searchSpace: SearchSpace) => void;
- onAddSearchSpace: () => void;
- searchSpace: SearchSpace | null;
+ workspaces: Workspace[];
+ activeWorkspaceId: number | null;
+ onWorkspaceSelect: (id: number) => void;
+ onWorkspaceDelete?: (workspace: Workspace) => void;
+ onWorkspaceSettings?: (workspace: Workspace) => void;
+ onAddWorkspace: () => void;
+ workspace: Workspace | null;
navItems: NavItem[];
onNavItemClick?: (item: NavItem) => void;
chats: ChatItem[];
@@ -186,12 +186,12 @@ function MainContentPanel({
- {isDocumentTab && activeTab.documentId && activeTab.searchSpaceId ? (
+ {isDocumentTab && activeTab.documentId && activeTab.workspaceId ? (
@@ -210,13 +210,13 @@ function DesktopWorkspaceRegion({ children }: { children: React.ReactNode }) {
}
export function LayoutShell({
- searchSpaces,
- activeSearchSpaceId,
- onSearchSpaceSelect,
- onSearchSpaceDelete,
- onSearchSpaceSettings,
- onAddSearchSpace,
- searchSpace,
+ workspaces,
+ activeWorkspaceId,
+ onWorkspaceSelect,
+ onWorkspaceDelete,
+ onWorkspaceSettings,
+ onAddWorkspace,
+ workspace,
navItems,
onNavItemClick,
chats,
@@ -295,11 +295,11 @@ export function LayoutShell({
fetchThreads(Number(searchSpaceId)),
- enabled: !!searchSpaceId && !isSearchMode,
- placeholderData: () => queryClient.getQueryData(["threads", searchSpaceId, { limit: 40 }]),
+ queryKey: ["all-threads", workspaceId],
+ queryFn: () => fetchThreads(Number(workspaceId)),
+ enabled: !!workspaceId && !isSearchMode,
+ placeholderData: () => queryClient.getQueryData(["threads", workspaceId, { limit: 40 }]),
});
const {
@@ -107,9 +107,9 @@ function AllChatsContent({ searchSpaceId, className }: AllChatsContentProps) {
error: searchError,
isLoading: isLoadingSearch,
} = useQuery({
- queryKey: ["search-threads", searchSpaceId, debouncedSearchQuery],
- queryFn: () => searchThreads(Number(searchSpaceId), debouncedSearchQuery.trim()),
- enabled: !!searchSpaceId && isSearchMode,
+ queryKey: ["search-threads", workspaceId, debouncedSearchQuery],
+ queryFn: () => searchThreads(Number(workspaceId), debouncedSearchQuery.trim()),
+ enabled: !!workspaceId && isSearchMode,
});
const threads = useMemo(() => {
@@ -127,11 +127,11 @@ function AllChatsContent({ searchSpaceId, className }: AllChatsContentProps) {
activateChatThread({
id: thread.id,
title: thread.title || "New Chat",
- searchSpaceId,
+ workspaceId,
visibility: thread.visibility,
});
},
- [activateChatThread, searchSpaceId]
+ [activateChatThread, workspaceId]
);
const handleDeleteThread = useCallback(
@@ -153,7 +153,7 @@ function AllChatsContent({ searchSpaceId, className }: AllChatsContentProps) {
id: fallbackTab.chatId ?? null,
title: fallbackTab.title,
url: fallbackTab.chatUrl,
- searchSpaceId: fallbackTab.searchSpaceId ?? searchSpaceId,
+ workspaceId: fallbackTab.workspaceId ?? workspaceId,
...(fallbackTab.visibility !== undefined
? { visibility: fallbackTab.visibility }
: {}),
@@ -163,7 +163,7 @@ function AllChatsContent({ searchSpaceId, className }: AllChatsContentProps) {
});
return;
}
- router.push(`/dashboard/${searchSpaceId}/new-chat`);
+ router.push(`/dashboard/${workspaceId}/new-chat`);
}, 250);
}
} catch (error) {
@@ -173,7 +173,7 @@ function AllChatsContent({ searchSpaceId, className }: AllChatsContentProps) {
setDeletingThreadId(null);
}
},
- [activateChatThread, deleteThread, t, currentChatId, router, removeChatTab, searchSpaceId]
+ [activateChatThread, deleteThread, t, currentChatId, router, removeChatTab, workspaceId]
);
const handleToggleArchive = useCallback(
@@ -548,10 +548,10 @@ function AllChatsContent({ searchSpaceId, className }: AllChatsContentProps) {
);
}
-export function AllChatsWorkspaceContent({ searchSpaceId }: { searchSpaceId: string }) {
+export function AllChatsWorkspaceContent({ workspaceId }: { workspaceId: string }) {
return (
);
}
diff --git a/surfsense_web/components/layout/ui/sidebar/DesktopLocalTabContent.tsx b/surfsense_web/components/layout/ui/sidebar/DesktopLocalTabContent.tsx
index 71d798e22..ae080a1ec 100644
--- a/surfsense_web/components/layout/ui/sidebar/DesktopLocalTabContent.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/DesktopLocalTabContent.tsx
@@ -25,7 +25,7 @@ interface DesktopLocalTabContentProps {
localRootPaths: string[];
canAddMoreLocalRoots: boolean;
maxLocalFilesystemRoots: number;
- searchSpaceId: number;
+ workspaceId: number;
onPickFilesystemRoot: () => Promise | void;
onRemoveFilesystemRoot: (rootPath: string) => Promise | void;
onClearFilesystemRoots: () => Promise | void;
@@ -37,7 +37,7 @@ export function DesktopLocalTabContent({
localRootPaths,
canAddMoreLocalRoots,
maxLocalFilesystemRoots,
- searchSpaceId,
+ workspaceId,
onPickFilesystemRoot,
onRemoveFilesystemRoot,
onClearFilesystemRoots,
@@ -49,17 +49,17 @@ export function DesktopLocalTabContent({
const localSearchInputRef = useRef(null);
const [expandedFolderKeyMap, setExpandedFolderKeyMap] = useAtom(localExpandedFolderKeysAtom);
const expandedFolderKeys = useMemo(
- () => new Set(expandedFolderKeyMap[searchSpaceId] ?? []),
- [expandedFolderKeyMap, searchSpaceId]
+ () => new Set(expandedFolderKeyMap[workspaceId] ?? []),
+ [expandedFolderKeyMap, workspaceId]
);
const handleExpandedFolderKeysChange = useCallback(
(nextExpandedKeys: Set) => {
setExpandedFolderKeyMap((prev) => ({
...prev,
- [searchSpaceId]: Array.from(nextExpandedKeys),
+ [workspaceId]: Array.from(nextExpandedKeys),
}));
},
- [searchSpaceId, setExpandedFolderKeyMap]
+ [workspaceId, setExpandedFolderKeyMap]
);
return (
@@ -199,7 +199,7 @@ export function DesktopLocalTabContent({
| null | undefined,
})),
[zeroFolders]
@@ -361,7 +361,7 @@ function AuthenticatedDocumentsSidebarBase({
const zeroIds = new Set(zeroDocs.map((d) => d.id));
const pendingAgentDocs = agentCreatedDocs
- .filter((d) => d.searchSpaceId === workspaceId && !zeroIds.has(d.id))
+ .filter((d) => d.workspaceId === workspaceId && !zeroIds.has(d.id))
.map((d) => ({
id: d.id,
title: d.title,
@@ -456,7 +456,7 @@ function AuthenticatedDocumentsSidebarBase({
await uploadFolderScan({
folderPath: matched.path,
folderName: matched.name,
- searchSpaceId: workspaceId,
+ workspaceId: workspaceId,
excludePatterns: matched.excludePatterns ?? DEFAULT_EXCLUDE_PATTERNS,
fileExtensions:
matched.fileExtensions ?? Array.from(getSupportedExtensionsSet(undefined, etlService)),
@@ -842,7 +842,7 @@ function AuthenticatedDocumentsSidebarBase({
openEditorPanel({
kind: "memory",
memoryScope: "user",
- searchSpaceId: workspaceId,
+ workspaceId: workspaceId,
title: doc.title,
});
return true;
@@ -851,7 +851,7 @@ function AuthenticatedDocumentsSidebarBase({
openEditorPanel({
kind: "memory",
memoryScope: "team",
- searchSpaceId: workspaceId,
+ workspaceId: workspaceId,
title: doc.title,
});
return true;
@@ -1020,7 +1020,7 @@ function AuthenticatedDocumentsSidebarBase({
if (openMemoryDocument(doc)) return;
openEditorPanel({
documentId: doc.id,
- searchSpaceId: workspaceId,
+ workspaceId: workspaceId,
title: doc.title,
});
}}
@@ -1028,7 +1028,7 @@ function AuthenticatedDocumentsSidebarBase({
if (openMemoryDocument(doc)) return;
openEditorPanel({
documentId: doc.id,
- searchSpaceId: workspaceId,
+ workspaceId: workspaceId,
title: doc.title,
});
}}
diff --git a/surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx
index 67c138850..7cf909112 100644
--- a/surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx
@@ -166,7 +166,7 @@ export function InboxSidebarContent({
const router = useRouter();
const params = useParams();
const isMobile = !useMediaQuery("(min-width: 640px)");
- const searchSpaceId = getWorkspaceIdNumber(params) ?? null;
+ const workspaceId = getWorkspaceIdNumber(params) ?? null;
const [, setTargetCommentId] = useAtom(setTargetCommentIdAtom);
@@ -204,11 +204,11 @@ export function InboxSidebarContent({
// Server-side search query
const searchTypeFilter = activeTab === "comments" ? ("new_mention" as const) : undefined;
const { data: searchResponse, isLoading: isSearchLoading } = useQuery({
- queryKey: cacheKeys.notifications.search(searchSpaceId, debouncedSearch.trim(), activeTab),
+ queryKey: cacheKeys.notifications.search(workspaceId, debouncedSearch.trim(), activeTab),
queryFn: () =>
notificationsApiService.getNotifications({
queryParams: {
- workspace_id: searchSpaceId ?? undefined,
+ workspace_id: workspaceId ?? undefined,
type: searchTypeFilter,
search: debouncedSearch.trim(),
limit: 50,
@@ -242,8 +242,8 @@ export function InboxSidebarContent({
// Fetch source types for the status tab filter
const { data: sourceTypesData } = useQuery({
- queryKey: cacheKeys.notifications.sourceTypes(searchSpaceId),
- queryFn: () => notificationsApiService.getSourceTypes(searchSpaceId ?? undefined),
+ queryKey: cacheKeys.notifications.sourceTypes(workspaceId),
+ queryFn: () => notificationsApiService.getSourceTypes(workspaceId ?? undefined),
staleTime: 60 * 1000,
enabled: activeTab === "status",
});
@@ -364,17 +364,17 @@ export function InboxSidebarContent({
if (item.type === "new_mention") {
if (isNewMentionMetadata(item.metadata)) {
- const searchSpaceId = item.workspace_id;
+ const workspaceId = item.workspace_id;
const threadId = item.metadata.thread_id;
const commentId = item.metadata.comment_id;
- if (searchSpaceId && threadId) {
+ if (workspaceId && threadId) {
if (commentId) {
setTargetCommentId(commentId);
}
const url = commentId
- ? `/dashboard/${searchSpaceId}/new-chat/${threadId}?commentId=${commentId}`
- : `/dashboard/${searchSpaceId}/new-chat/${threadId}`;
+ ? `/dashboard/${workspaceId}/new-chat/${threadId}?commentId=${commentId}`
+ : `/dashboard/${workspaceId}/new-chat/${threadId}`;
onOpenChange(false);
onCloseMobileSidebar?.();
router.push(url);
@@ -382,17 +382,17 @@ export function InboxSidebarContent({
}
} else if (item.type === "comment_reply") {
if (isCommentReplyMetadata(item.metadata)) {
- const searchSpaceId = item.workspace_id;
+ const workspaceId = item.workspace_id;
const threadId = item.metadata.thread_id;
const replyId = item.metadata.reply_id;
- if (searchSpaceId && threadId) {
+ if (workspaceId && threadId) {
if (replyId) {
setTargetCommentId(replyId);
}
const url = replyId
- ? `/dashboard/${searchSpaceId}/new-chat/${threadId}?commentId=${replyId}`
- : `/dashboard/${searchSpaceId}/new-chat/${threadId}`;
+ ? `/dashboard/${workspaceId}/new-chat/${threadId}?commentId=${replyId}`
+ : `/dashboard/${workspaceId}/new-chat/${threadId}`;
onOpenChange(false);
onCloseMobileSidebar?.();
router.push(url);
diff --git a/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx b/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx
index aa773f3e1..394a9aaae 100644
--- a/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx
@@ -11,7 +11,7 @@ import { cn } from "@/lib/utils";
interface LocalFilesystemBrowserProps {
rootPaths: string[];
- searchSpaceId: number;
+ workspaceId: number;
active?: boolean;
searchQuery?: string;
onOpenFile: (fullPath: string) => void;
@@ -134,7 +134,7 @@ function getNormalizedExtension(pathValue: string): string {
export function LocalFilesystemBrowser({
rootPaths,
- searchSpaceId,
+ workspaceId,
active = true,
searchQuery,
onOpenFile,
@@ -184,7 +184,7 @@ export function LocalFilesystemBrowser({
}
const rootsToReload = rootEntries.filter(({ rootKey }) => {
const nonce = reloadNonceByRoot[rootKey] ?? 0;
- const signature = `${searchSpaceId}:${rootKey}:${nonce}`;
+ const signature = `${workspaceId}:${rootKey}:${nonce}`;
return lastLoadedSignatureByRootRef.current.get(rootKey) !== signature;
});
if (rootsToReload.length === 0) {
@@ -192,7 +192,7 @@ export function LocalFilesystemBrowser({
}
for (const { rootKey } of rootsToReload) {
const nonce = reloadNonceByRoot[rootKey] ?? 0;
- lastLoadedSignatureByRootRef.current.set(rootKey, `${searchSpaceId}:${rootKey}:${nonce}`);
+ lastLoadedSignatureByRootRef.current.set(rootKey, `${workspaceId}:${rootKey}:${nonce}`);
}
let cancelled = false;
@@ -212,7 +212,7 @@ export function LocalFilesystemBrowser({
try {
const files = (await electronAPI.listAgentFilesystemFiles({
rootPath,
- searchSpaceId,
+ workspaceId,
excludePatterns: DEFAULT_EXCLUDE_PATTERNS,
})) as LocalFolderFileEntry[];
if (cancelled) return;
@@ -241,7 +241,7 @@ export function LocalFilesystemBrowser({
return () => {
cancelled = true;
};
- }, [active, electronAPI, isWindowsPlatform, reloadNonceByRoot, rootPaths, searchSpaceId]);
+ }, [active, electronAPI, isWindowsPlatform, reloadNonceByRoot, rootPaths, workspaceId]);
useEffect(() => {
if (active) return;
@@ -254,19 +254,19 @@ export function LocalFilesystemBrowser({
if (!electronAPI?.onAgentFilesystemTreeDirty) return;
if (!active) return;
if (rootPaths.length === 0) {
- void electronAPI.stopAgentFilesystemTreeWatch(searchSpaceId);
+ void electronAPI.stopAgentFilesystemTreeWatch(workspaceId);
return;
}
const unsubscribe = electronAPI.onAgentFilesystemTreeDirty(
(event: {
- searchSpaceId: number | null;
+ workspaceId: number | null;
reason: "watcher_event" | "safety_poll";
rootPath: string;
changedPath: string | null;
timestamp: number;
}) => {
- if ((event.searchSpaceId ?? null) !== (searchSpaceId ?? null)) {
+ if ((event.workspaceId ?? null) !== (workspaceId ?? null)) {
return;
}
const eventRootKey = normalizeRootPathForLookup(event.rootPath, isWindowsPlatform);
@@ -290,16 +290,16 @@ export function LocalFilesystemBrowser({
}
);
void electronAPI.startAgentFilesystemTreeWatch({
- searchSpaceId,
+ workspaceId,
rootPaths,
excludePatterns: DEFAULT_EXCLUDE_PATTERNS,
});
return () => {
unsubscribe();
- void electronAPI.stopAgentFilesystemTreeWatch(searchSpaceId);
+ void electronAPI.stopAgentFilesystemTreeWatch(workspaceId);
};
- }, [active, electronAPI, isWindowsPlatform, rootPaths, searchSpaceId]);
+ }, [active, electronAPI, isWindowsPlatform, rootPaths, workspaceId]);
useEffect(() => {
if (!electronAPI?.getAgentFilesystemMounts) {
@@ -322,7 +322,7 @@ export function LocalFilesystemBrowser({
setMountRefreshInFlight(true);
}
void electronAPI
- .getAgentFilesystemMounts(searchSpaceId)
+ .getAgentFilesystemMounts(workspaceId)
.then((mounts: LocalRootMount[]) => {
if (cancelled) return;
const next = new Map();
@@ -348,7 +348,7 @@ export function LocalFilesystemBrowser({
return () => {
cancelled = true;
};
- }, [electronAPI, isWindowsPlatform, rootPaths, searchSpaceId]);
+ }, [electronAPI, isWindowsPlatform, rootPaths, workspaceId]);
const treeByRoot = useMemo(() => {
const query = searchQuery?.trim().toLowerCase() ?? "";
diff --git a/surfsense_web/components/layout/ui/sidebar/MobileSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/MobileSidebar.tsx
index 0bceff0f1..d0e3c09d5 100644
--- a/surfsense_web/components/layout/ui/sidebar/MobileSidebar.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/MobileSidebar.tsx
@@ -4,18 +4,18 @@ import { PanelLeft, Plus } from "lucide-react";
import { Button } from "@/components/ui/button";
import { ScrollArea } from "@/components/ui/scroll-area";
import { Sheet, SheetContent, SheetTitle } from "@/components/ui/sheet";
-import type { ChatItem, NavItem, PageUsage, SearchSpace, User } from "../../types/layout.types";
-import { SearchSpaceAvatar } from "../icon-rail/WorkspaceAvatar";
+import type { ChatItem, NavItem, PageUsage, User, Workspace } from "../../types/layout.types";
+import { WorkspaceAvatar } from "../icon-rail/WorkspaceAvatar";
import { Sidebar } from "./Sidebar";
interface MobileSidebarProps {
isOpen: boolean;
onOpenChange: (open: boolean) => void;
- searchSpaces: SearchSpace[];
- activeSearchSpaceId: number | null;
- onSearchSpaceSelect: (id: number) => void;
- onAddSearchSpace: () => void;
- searchSpace: SearchSpace | null;
+ workspaces: Workspace[];
+ activeWorkspaceId: number | null;
+ onWorkspaceSelect: (id: number) => void;
+ onAddWorkspace: () => void;
+ workspace: Workspace | null;
navItems: NavItem[];
onNavItemClick?: (item: NavItem) => void;
chats: ChatItem[];
@@ -62,12 +62,12 @@ export function MobileSidebarTrigger({ onClick }: { onClick: () => void }) {
export function MobileSidebar({
isOpen,
onOpenChange,
- searchSpaces,
- activeSearchSpaceId,
- onSearchSpaceSelect,
+ workspaces,
+ activeWorkspaceId,
+ onWorkspaceSelect,
- onAddSearchSpace,
- searchSpace,
+ onAddWorkspace,
+ workspace,
navItems,
onNavItemClick,
chats,
@@ -93,8 +93,8 @@ export function MobileSidebar({
setTheme,
isLoadingChats = false,
}: MobileSidebarProps) {
- const handleSearchSpaceSelect = (id: number) => {
- onSearchSpaceSelect(id);
+ const handleWorkspaceSelect = (id: number) => {
+ onWorkspaceSelect(id);
};
const handleNavItemClick = (item: NavItem) => {
@@ -118,18 +118,18 @@ export function MobileSidebar({
>
Navigation
- {/* Vertical Search Spaces Rail - left side */}
+ {/* Vertical Workspaces Rail - left side */}
- {searchSpaces.map((space) => (
-
(
+ 1}
isOwner={space.isOwner}
- onClick={() => handleSearchSpaceSelect(space.id)}
+ onClick={() => handleWorkspaceSelect(space.id)}
size="md"
disableTooltip
/>
@@ -137,7 +137,7 @@ export function MobileSidebar({
@@ -150,7 +150,7 @@ export function MobileSidebar({
{/* Sidebar Content - right side */}
onOpenChange(false)}
navItems={navItems}
diff --git a/surfsense_web/components/layout/ui/sidebar/Sidebar.tsx b/surfsense_web/components/layout/ui/sidebar/Sidebar.tsx
index 92233cb50..5213fd3b0 100644
--- a/surfsense_web/components/layout/ui/sidebar/Sidebar.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/Sidebar.tsx
@@ -13,7 +13,7 @@ import { useIsAnonymous } from "@/contexts/anonymous-mode";
import { getWorkspaceIdParam } from "@/lib/route-params";
import { cn } from "@/lib/utils";
import { SIDEBAR_MIN_WIDTH } from "../../hooks/useSidebarResize";
-import type { ChatItem, NavItem, PageUsage, SearchSpace, User } from "../../types/layout.types";
+import type { ChatItem, NavItem, PageUsage, User, Workspace } from "../../types/layout.types";
import { ChatListItem } from "./ChatListItem";
import { CreditBalanceDisplay } from "./CreditBalanceDisplay";
import { DocumentsSidebar } from "./DocumentsSidebar";
@@ -62,7 +62,7 @@ function CollapsedInboxIcon({ item }: { item: NavItem }) {
}
interface SidebarProps {
- searchSpace: SearchSpace | null;
+ workspace: Workspace | null;
isCollapsed?: boolean;
onToggleCollapse?: () => void;
navItems: NavItem[];
@@ -103,7 +103,7 @@ interface SidebarProps {
}
export function Sidebar({
- searchSpace,
+ workspace,
isCollapsed = false,
onToggleCollapse,
navItems,
@@ -192,7 +192,7 @@ export function Sidebar({
aria-hidden={isCollapsed}
>
void;
}) {
const params = useParams();
- const searchSpaceId = getWorkspaceIdParam(params) ?? "";
+ const workspaceId = getWorkspaceIdParam(params) ?? "";
const isAnonymous = useIsAnonymous();
if (isCollapsed) return null;
@@ -446,7 +446,7 @@ function SidebarUsageFooter({
@@ -459,7 +459,7 @@ function SidebarUsageFooter({
diff --git a/surfsense_web/components/layout/ui/sidebar/SidebarHeader.tsx b/surfsense_web/components/layout/ui/sidebar/SidebarHeader.tsx
index 2a5761d6f..f13898b6b 100644
--- a/surfsense_web/components/layout/ui/sidebar/SidebarHeader.tsx
+++ b/surfsense_web/components/layout/ui/sidebar/SidebarHeader.tsx
@@ -10,10 +10,10 @@ import {
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { cn } from "@/lib/utils";
-import type { SearchSpace } from "../../types/layout.types";
+import type { Workspace } from "../../types/layout.types";
interface SidebarHeaderProps {
- searchSpace: SearchSpace | null;
+ workspace: Workspace | null;
isCollapsed?: boolean;
onSettings?: () => void;
onManageMembers?: () => void;
@@ -21,7 +21,7 @@ interface SidebarHeaderProps {
}
export function SidebarHeader({
- searchSpace,
+ workspace,
isCollapsed,
onSettings,
onManageMembers,
@@ -40,9 +40,7 @@ export function SidebarHeader({
isCollapsed && "w-10"
)}
>
-
- {searchSpace?.name ?? t("select_search_space")}
-
+
{workspace?.name ?? t("select_workspace")}
@@ -53,7 +51,7 @@ export function SidebarHeader({
- {t("search_space_settings")}
+ {t("workspace_settings")}
diff --git a/surfsense_web/components/layout/ui/tabs/DocumentTabContent.tsx b/surfsense_web/components/layout/ui/tabs/DocumentTabContent.tsx
index 8af24cbde..1718653a3 100644
--- a/surfsense_web/components/layout/ui/tabs/DocumentTabContent.tsx
+++ b/surfsense_web/components/layout/ui/tabs/DocumentTabContent.tsx
@@ -48,7 +48,7 @@ function DocumentSkeleton() {
interface DocumentTabContentProps {
documentId: number;
- searchSpaceId: number;
+ workspaceId: number;
title?: string;
}
@@ -69,7 +69,7 @@ function formatBytes(bytes: number): string {
return `${bytes}B`;
}
-export function DocumentTabContent({ documentId, searchSpaceId, title }: DocumentTabContentProps) {
+export function DocumentTabContent({ documentId, workspaceId, title }: DocumentTabContentProps) {
const [doc, setDoc] = useState
(null);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState(null);
@@ -104,7 +104,7 @@ export function DocumentTabContent({ documentId, searchSpaceId, title }: Documen
try {
const response = await authenticatedFetch(
buildBackendUrl(
- `/api/v1/workspaces/${searchSpaceId}/documents/${documentId}/editor-content`
+ `/api/v1/workspaces/${workspaceId}/documents/${documentId}/editor-content`
),
{ method: "GET" }
);
@@ -140,7 +140,7 @@ export function DocumentTabContent({ documentId, searchSpaceId, title }: Documen
doFetch().catch(() => {});
return () => controller.abort();
- }, [documentId, searchSpaceId]);
+ }, [documentId, workspaceId]);
const handleMarkdownChange = useCallback((md: string) => {
markdownRef.current = md;
@@ -154,7 +154,7 @@ export function DocumentTabContent({ documentId, searchSpaceId, title }: Documen
setSaving(true);
try {
const response = await authenticatedFetch(
- buildBackendUrl(`/api/v1/workspaces/${searchSpaceId}/documents/${documentId}/save`),
+ buildBackendUrl(`/api/v1/workspaces/${workspaceId}/documents/${documentId}/save`),
{
method: "POST",
headers: { "Content-Type": "application/json" },
@@ -183,7 +183,7 @@ export function DocumentTabContent({ documentId, searchSpaceId, title }: Documen
} finally {
setSaving(false);
}
- }, [documentId, plateMaxBytes, searchSpaceId]);
+ }, [documentId, plateMaxBytes, workspaceId]);
if (isLoading) return ;
@@ -313,7 +313,7 @@ export function DocumentTabContent({ documentId, searchSpaceId, title }: Documen
try {
const response = await authenticatedFetch(
buildBackendUrl(
- `/api/v1/workspaces/${searchSpaceId}/documents/${documentId}/download-markdown`
+ `/api/v1/workspaces/${workspaceId}/documents/${documentId}/download-markdown`
),
{ method: "GET" }
);
diff --git a/surfsense_web/components/new-chat/chat-header.tsx b/surfsense_web/components/new-chat/chat-header.tsx
index 99d56eb02..e83a95d6c 100644
--- a/surfsense_web/components/new-chat/chat-header.tsx
+++ b/surfsense_web/components/new-chat/chat-header.tsx
@@ -4,20 +4,20 @@ import { ImageModelSelector } from "./image-model-selector";
import { ModelSelector } from "./model-selector";
interface ChatHeaderProps {
- searchSpaceId: number;
+ workspaceId: number;
className?: string;
onChatModelSelected?: () => void;
}
-export function ChatHeader({ searchSpaceId, className, onChatModelSelected }: ChatHeaderProps) {
+export function ChatHeader({ workspaceId, className, onChatModelSelected }: ChatHeaderProps) {
return (
-
+
);
}
diff --git a/surfsense_web/components/new-chat/chat-share-button.tsx b/surfsense_web/components/new-chat/chat-share-button.tsx
index d892eb024..a70a70147 100644
--- a/surfsense_web/components/new-chat/chat-share-button.tsx
+++ b/surfsense_web/components/new-chat/chat-share-button.tsx
@@ -38,8 +38,8 @@ const visibilityOptions: {
},
{
value: "SEARCH_SPACE",
- label: "Search Space",
- description: "All members of this search space can access",
+ label: "Workspace",
+ description: "All members of this workspace can access",
icon: Users,
},
];
@@ -96,7 +96,7 @@ export function ChatShareButton({ thread, onVisibilityChange, className }: ChatS
onVisibilityChange?.(updatedThread.visibility);
toast.success(
- newVisibility === "SEARCH_SPACE" ? "Chat shared with search space" : "Chat is now private"
+ newVisibility === "SEARCH_SPACE" ? "Chat shared with workspace" : "Chat is now private"
);
setOpen(false);
} catch (error) {
diff --git a/surfsense_web/components/new-chat/document-mention-picker.tsx b/surfsense_web/components/new-chat/document-mention-picker.tsx
index fae13420a..dca3b5f7f 100644
--- a/surfsense_web/components/new-chat/document-mention-picker.tsx
+++ b/surfsense_web/components/new-chat/document-mention-picker.tsx
@@ -56,7 +56,7 @@ import { queries } from "@/zero/queries";
export type DocumentMentionPickerRef = ComposerSuggestionNavigatorRef;
interface DocumentMentionPickerProps {
- searchSpaceId: number;
+ workspaceId: number;
onSelectionChange: (mentions: MentionedDocumentInfo[]) => void;
onDone: () => void;
initialSelectedDocuments?: MentionedDocumentInfo[];
@@ -105,14 +105,14 @@ function isMentionedContextItem(value: unknown): value is MentionedDocumentInfo
return false;
}
-function getRecentsStorageKey(searchSpaceId: number) {
- return `${RECENTS_STORAGE_PREFIX}${searchSpaceId}`;
+function getRecentsStorageKey(workspaceId: number) {
+ return `${RECENTS_STORAGE_PREFIX}${workspaceId}`;
}
-function readRecentMentions(searchSpaceId: number): MentionedDocumentInfo[] {
+function readRecentMentions(workspaceId: number): MentionedDocumentInfo[] {
if (typeof window === "undefined") return [];
try {
- const raw = window.localStorage.getItem(getRecentsStorageKey(searchSpaceId));
+ const raw = window.localStorage.getItem(getRecentsStorageKey(workspaceId));
if (!raw) return [];
const parsed: unknown = JSON.parse(raw);
if (!Array.isArray(parsed)) return [];
@@ -122,11 +122,11 @@ function readRecentMentions(searchSpaceId: number): MentionedDocumentInfo[] {
}
}
-function writeRecentMentions(searchSpaceId: number, mentions: MentionedDocumentInfo[]) {
+function writeRecentMentions(workspaceId: number, mentions: MentionedDocumentInfo[]) {
if (typeof window === "undefined") return;
try {
window.localStorage.setItem(
- getRecentsStorageKey(searchSpaceId),
+ getRecentsStorageKey(workspaceId),
JSON.stringify(mentions.slice(0, RECENTS_LIMIT))
);
} catch {
@@ -134,13 +134,13 @@ function writeRecentMentions(searchSpaceId: number, mentions: MentionedDocumentI
}
}
-export function promoteRecentMention(searchSpaceId: number, mention: MentionedDocumentInfo) {
+export function promoteRecentMention(workspaceId: number, mention: MentionedDocumentInfo) {
const mentionKey = getMentionDocKey(mention);
const next = [
mention,
- ...readRecentMentions(searchSpaceId).filter((item) => getMentionDocKey(item) !== mentionKey),
+ ...readRecentMentions(workspaceId).filter((item) => getMentionDocKey(item) !== mentionKey),
].slice(0, RECENTS_LIMIT);
- writeRecentMentions(searchSpaceId, next);
+ writeRecentMentions(workspaceId, next);
return next;
}
@@ -261,7 +261,7 @@ export const DocumentMentionPicker = forwardRef<
DocumentMentionPickerProps
>(function DocumentMentionPicker(
{
- searchSpaceId,
+ workspaceId,
onSelectionChange,
onDone,
initialSelectedDocuments = [],
@@ -286,15 +286,15 @@ export const DocumentMentionPicker = forwardRef<
const [hasMore, setHasMore] = useState(false);
const [isLoadingMore, setIsLoadingMore] = useState(false);
const [recentMentions, setRecentMentions] = useState(() =>
- readRecentMentions(searchSpaceId)
+ readRecentMentions(workspaceId)
);
- const [zeroFolders] = useZeroQuery(queries.folders.bySpace({ searchSpaceId }));
+ const [zeroFolders] = useZeroQuery(queries.folders.bySpace({ workspaceId }));
const { data: connectors = [], isLoading: isConnectorsLoading } = useAtomValue(connectorsAtom);
const activeConnectors = useMemo(() => connectors.filter(isConnectorActive), [connectors]);
const paginationScopeKey = useMemo(
- () => `${searchSpaceId}:${debouncedSearch}`,
- [searchSpaceId, debouncedSearch]
+ () => `${workspaceId}:${debouncedSearch}`,
+ [workspaceId, debouncedSearch]
);
const previousPaginationScopeKeyRef = useRef(null);
@@ -311,17 +311,17 @@ export const DocumentMentionPicker = forwardRef<
}, [hasSearch]);
useEffect(() => {
- setRecentMentions(readRecentMentions(searchSpaceId));
- }, [searchSpaceId]);
+ setRecentMentions(readRecentMentions(workspaceId));
+ }, [workspaceId]);
const titleSearchParams = useMemo(
() => ({
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
page: 0,
page_size: PAGE_SIZE,
...(isSearchValid ? { title: debouncedSearch.trim() } : {}),
}),
- [searchSpaceId, debouncedSearch, isSearchValid]
+ [workspaceId, debouncedSearch, isSearchValid]
);
const { data: titleSearchResults, isLoading: isTitleSearchLoading } = useQuery({
@@ -329,7 +329,7 @@ export const DocumentMentionPicker = forwardRef<
queryFn: ({ signal }) =>
documentsApiService.searchDocumentTitles({ queryParams: titleSearchParams }, signal),
staleTime: 60 * 1000,
- enabled: !!searchSpaceId && currentPage === 0 && (!hasSearch || isSearchValid),
+ enabled: !!workspaceId && currentPage === 0 && (!hasSearch || isSearchValid),
placeholderData: keepPreviousData,
});
@@ -362,7 +362,7 @@ export const DocumentMentionPicker = forwardRef<
try {
const queryParams = {
- workspace_id: searchSpaceId,
+ workspace_id: workspaceId,
page: nextPage,
page_size: PAGE_SIZE,
...(isSearchValid ? { title: debouncedSearch.trim() } : {}),
@@ -381,7 +381,7 @@ export const DocumentMentionPicker = forwardRef<
} finally {
setIsLoadingMore(false);
}
- }, [currentPage, hasMore, isLoadingMore, debouncedSearch, searchSpaceId, isSearchValid]);
+ }, [currentPage, hasMore, isLoadingMore, debouncedSearch, workspaceId, isSearchValid]);
const actualDocuments = useMemo(() => {
if (!isSingleCharSearch) return accumulatedDocuments;
@@ -406,10 +406,10 @@ export const DocumentMentionPicker = forwardRef<
// or types a search. An empty title returns recent threads (the
// backend ``ilike '%%'`` matches all, newest first).
const { data: threadResults = [], isLoading: isThreadsLoading } = useQuery({
- queryKey: ["composer-mention-threads", searchSpaceId, debouncedSearch],
- queryFn: () => searchThreads(searchSpaceId, debouncedSearch.trim()),
+ queryKey: ["composer-mention-threads", workspaceId, debouncedSearch],
+ queryFn: () => searchThreads(workspaceId, debouncedSearch.trim()),
staleTime: 60 * 1000,
- enabled: enableChatMentions && !!searchSpaceId && (view.kind === "chats" || hasSearch),
+ enabled: enableChatMentions && !!workspaceId && (view.kind === "chats" || hasSearch),
placeholderData: keepPreviousData,
});
const threadMentions = useMemo(
@@ -425,7 +425,7 @@ export const DocumentMentionPicker = forwardRef<
[recentDocMentions]
);
const { data: hydratedRecentDocs = [], isFetched: hasHydratedRecentDocs } = useQuery({
- queryKey: ["composer-mention-recent-docs", searchSpaceId, recentDocIdsKey],
+ queryKey: ["composer-mention-recent-docs", workspaceId, recentDocIdsKey],
queryFn: async () => {
const results = await Promise.allSettled(
recentDocMentions.map((mention) => documentsApiService.getDocument({ id: mention.id }))
diff --git a/surfsense_web/components/new-chat/image-model-selector.tsx b/surfsense_web/components/new-chat/image-model-selector.tsx
index 631a9742f..e9232a275 100644
--- a/surfsense_web/components/new-chat/image-model-selector.tsx
+++ b/surfsense_web/components/new-chat/image-model-selector.tsx
@@ -31,7 +31,7 @@ import { cn } from "@/lib/utils";
import { providerDisplay } from "../settings/model-connections/provider-metadata";
interface ImageModelSelectorProps {
- searchSpaceId: number;
+ workspaceId: number;
className?: string;
mobileIconOnly?: boolean;
}
@@ -97,7 +97,7 @@ function groupedModels(models: ImageModel[]) {
}
export function ImageModelSelector({
- searchSpaceId,
+ workspaceId,
className,
mobileIconOnly = false,
}: ImageModelSelectorProps) {
@@ -146,7 +146,7 @@ export function ImageModelSelector({
function manageModelConnections() {
setOpen(false);
- router.push(`/dashboard/${searchSpaceId}/workspace-settings/models`);
+ router.push(`/dashboard/${workspaceId}/workspace-settings/models`);
}
const handleScroll = useCallback((event: UIEvent) => {
diff --git a/surfsense_web/components/new-chat/model-selector.tsx b/surfsense_web/components/new-chat/model-selector.tsx
index 7579be7f1..20eca4739 100644
--- a/surfsense_web/components/new-chat/model-selector.tsx
+++ b/surfsense_web/components/new-chat/model-selector.tsx
@@ -31,7 +31,7 @@ import { cn } from "@/lib/utils";
import { providerDisplay } from "../settings/model-connections/provider-metadata";
interface ModelSelectorProps {
- searchSpaceId: number;
+ workspaceId: number;
className?: string;
onChatModelSelected?: () => void;
}
@@ -96,11 +96,7 @@ function groupedModels(models: ChatModel[]) {
}, {});
}
-export function ModelSelector({
- searchSpaceId,
- className,
- onChatModelSelected,
-}: ModelSelectorProps) {
+export function ModelSelector({ workspaceId, className, onChatModelSelected }: ModelSelectorProps) {
const router = useRouter();
const isMobile = useIsMobile();
const [open, setOpen] = useState(false);
@@ -149,7 +145,7 @@ export function ModelSelector({
function manageModelConnections() {
setOpen(false);
- router.push(`/dashboard/${searchSpaceId}/workspace-settings/models`);
+ router.push(`/dashboard/${workspaceId}/workspace-settings/models`);
}
const handleScroll = useCallback((event: UIEvent) => {
diff --git a/surfsense_web/components/new-chat/prompt-picker.tsx b/surfsense_web/components/new-chat/prompt-picker.tsx
index d3dbb5309..c2c44aae7 100644
--- a/surfsense_web/components/new-chat/prompt-picker.tsx
+++ b/surfsense_web/components/new-chat/prompt-picker.tsx
@@ -70,14 +70,14 @@ export const PromptPicker = forwardRef(funct
const createPromptIndex = filtered.length;
const totalItems = filtered.length + 1;
- const searchSpaceId = getWorkspaceIdParam(params);
+ const workspaceId = getWorkspaceIdParam(params);
const handleSelect = useCallback(
(index: number) => {
if (index === createPromptIndex) {
onDone();
- if (searchSpaceId) {
- router.push(`/dashboard/${searchSpaceId}/user-settings/prompts`);
+ if (workspaceId) {
+ router.push(`/dashboard/${workspaceId}/user-settings/prompts`);
}
return;
}
@@ -85,7 +85,7 @@ export const PromptPicker = forwardRef(funct
if (!action) return;
onSelect({ name: action.name, prompt: action.prompt, mode: action.mode });
},
- [filtered, onSelect, createPromptIndex, onDone, router, searchSpaceId]
+ [filtered, onSelect, createPromptIndex, onDone, router, workspaceId]
);
useEffect(() => {
diff --git a/surfsense_web/components/onboarding-tour.tsx b/surfsense_web/components/onboarding-tour.tsx
index de3712ae9..44eff3944 100644
--- a/surfsense_web/components/onboarding-tour.tsx
+++ b/surfsense_web/components/onboarding-tour.tsx
@@ -31,7 +31,7 @@ const TOUR_STEPS: TourStep[] = [
{
target: '[data-joyride="upload-button"]',
title: "Upload documents",
- content: "Upload files to your search space.",
+ content: "Upload files to your workspace.",
placement: "left",
},
{
@@ -391,17 +391,17 @@ export function OnboardingTour() {
// Get user data
const { data: user } = useAtomValue(currentUserAtom);
- const searchSpaceId = useAtomValue(activeWorkspaceIdAtom);
+ const workspaceId = useAtomValue(activeWorkspaceIdAtom);
// Fetch threads data
const { data: threadsData } = useQuery({
- queryKey: ["threads", searchSpaceId, { limit: 40 }], // Same key as layout
- queryFn: () => fetchThreads(Number(searchSpaceId), 40),
- enabled: !!searchSpaceId,
+ queryKey: ["threads", workspaceId, { limit: 40 }], // Same key as layout
+ queryFn: () => fetchThreads(Number(workspaceId), 40),
+ enabled: !!workspaceId,
});
// Real-time document type counts via Zero
- const documentTypeCounts = useZeroDocumentTypeCounts(searchSpaceId);
+ const documentTypeCounts = useZeroDocumentTypeCounts(workspaceId);
// Get connectors
const { data: connectors = [] } = useAtomValue(connectorsAtom);
@@ -448,7 +448,7 @@ export function OnboardingTour() {
// Check if tour should run: localStorage + data validation with user ID tracking
useEffect(() => {
// Don't check if not mounted or no user
- if (!mounted || !user?.id || !searchSpaceId) return;
+ if (!mounted || !user?.id || !workspaceId) return;
// Check if on new-chat page
const isNewChatPage = pathname?.includes("/new-chat");
@@ -459,7 +459,7 @@ export function OnboardingTour() {
// - threadsData is defined (query completed, even if empty)
// - documentTypeCounts is defined (query completed, even if empty object)
// - connectors is an array (always defined with default [])
- // If searchSpaceId is not set, connectors query won't run, but that's okay
+ // If workspaceId is not set, connectors query won't run, but that's okay
const dataLoaded = threadsData !== undefined && documentTypeCounts !== undefined;
if (!dataLoaded) return;
@@ -542,7 +542,7 @@ export function OnboardingTour() {
cancelled = true;
if (startCheckTimerRef.current) clearTimeout(startCheckTimerRef.current);
};
- }, [mounted, user?.id, searchSpaceId, pathname, threadsData, documentTypeCounts, connectors]);
+ }, [mounted, user?.id, workspaceId, pathname, threadsData, documentTypeCounts, connectors]);
// Update position on resize/scroll
useEffect(() => {
diff --git a/surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx b/surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx
index 5a53a8d87..1a299fbe0 100644
--- a/surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx
+++ b/surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx
@@ -125,7 +125,7 @@ export function PublicChatSnapshotsManager({
- You don't have permission to view public chats in this search space.
+ You don't have permission to view public chats in this workspace.
);
diff --git a/surfsense_web/components/settings/auto-reload-settings.tsx b/surfsense_web/components/settings/auto-reload-settings.tsx
index e871c00d5..b11a64353 100644
--- a/surfsense_web/components/settings/auto-reload-settings.tsx
+++ b/surfsense_web/components/settings/auto-reload-settings.tsx
@@ -39,7 +39,7 @@ export function AutoReloadSettings() {
const pathname = usePathname();
const searchParams = useSearchParams();
const queryClient = useQueryClient();
- const searchSpaceId = getWorkspaceIdNumber(params) ?? 0;
+ const workspaceId = getWorkspaceIdNumber(params) ?? 0;
const [enabled, setEnabled] = useState(false);
const [thresholdInput, setThresholdInput] = useState("");
@@ -79,8 +79,7 @@ export function AutoReloadSettings() {
}, [searchParams, router, pathname, queryClient]);
const setupMutation = useMutation({
- mutationFn: () =>
- stripeApiService.createAutoReloadSetupSession({ workspace_id: searchSpaceId }),
+ mutationFn: () => stripeApiService.createAutoReloadSetupSession({ workspace_id: workspaceId }),
onSuccess: (response) => {
window.location.assign(response.checkout_url);
},
diff --git a/surfsense_web/components/settings/buy-credits-content.tsx b/surfsense_web/components/settings/buy-credits-content.tsx
index 5ef450bd8..962ec21e4 100644
--- a/surfsense_web/components/settings/buy-credits-content.tsx
+++ b/surfsense_web/components/settings/buy-credits-content.tsx
@@ -38,7 +38,7 @@ const formatUsd = (micros: number) => {
export function BuyCreditsContent() {
const params = useParams();
- const searchSpaceId = getWorkspaceIdNumber(params) ?? 0;
+ const workspaceId = getWorkspaceIdNumber(params) ?? 0;
const [quantity, setQuantity] = useState(1);
// Raw text of the amount field so the user can clear it while typing;
// committed back to a clamped integer on blur.
@@ -177,7 +177,7 @@ export function BuyCreditsContent() {
purchaseMutation.mutate({ quantity, workspace_id: searchSpaceId })}
+ onClick={() => purchaseMutation.mutate({ quantity, workspace_id: workspaceId })}
>
{purchaseMutation.isPending ? (
<>
diff --git a/surfsense_web/components/settings/earn-credits-content.tsx b/surfsense_web/components/settings/earn-credits-content.tsx
index 4637d7c72..c14daf099 100644
--- a/surfsense_web/components/settings/earn-credits-content.tsx
+++ b/surfsense_web/components/settings/earn-credits-content.tsx
@@ -33,7 +33,7 @@ const formatRewardUsd = (micros: number) => {
export function EarnCreditsContent() {
const params = useParams();
const queryClient = useQueryClient();
- const searchSpaceId = getWorkspaceIdParam(params) ?? "";
+ const workspaceId = getWorkspaceIdParam(params) ?? "";
useEffect(() => {
trackIncentivePageViewed();
@@ -163,7 +163,7 @@ export function EarnCreditsContent() {
Need more?
{creditBuyingEnabled ? (
- Buy credits at $1 per $1
+ Buy credits at $1 per $1
) : (
diff --git a/surfsense_web/components/settings/general-settings-manager.tsx b/surfsense_web/components/settings/general-settings-manager.tsx
index 682dbe51b..2db1b4def 100644
--- a/surfsense_web/components/settings/general-settings-manager.tsx
+++ b/surfsense_web/components/settings/general-settings-manager.tsx
@@ -6,15 +6,15 @@ import { useTranslations } from "next-intl";
import { useCallback, useEffect, useState } from "react";
import { toast } from "sonner";
import {
- updateSearchSpaceApiAccessMutationAtom,
- updateSearchSpaceMutationAtom,
+ updateWorkspaceApiAccessMutationAtom,
+ updateWorkspaceMutationAtom,
} from "@/atoms/workspaces/workspace-mutation.atoms";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Skeleton } from "@/components/ui/skeleton";
import { Switch } from "@/components/ui/switch";
-import { searchSpacesApiService } from "@/lib/apis/workspaces-api.service";
+import { workspacesApiService } from "@/lib/apis/workspaces-api.service";
import { authenticatedFetch } from "@/lib/auth-fetch";
import { buildBackendUrl } from "@/lib/env-config";
import { cacheKeys } from "@/lib/query-client/cache-keys";
@@ -25,23 +25,22 @@ interface GeneralSettingsManagerProps {
}
export function GeneralSettingsManager({ workspaceId }: GeneralSettingsManagerProps) {
- const searchSpaceId = workspaceId;
- const t = useTranslations("searchSpaceSettings");
+ const t = useTranslations("workspaceSettings");
const tCommon = useTranslations("common");
const {
- data: searchSpace,
+ data: workspace,
isLoading: loading,
isError,
- refetch: fetchSearchSpace,
+ refetch: fetchWorkspace,
} = useQuery({
- queryKey: cacheKeys.searchSpaces.detail(searchSpaceId.toString()),
- queryFn: () => searchSpacesApiService.getSearchSpace({ id: searchSpaceId }),
- enabled: !!searchSpaceId,
+ queryKey: cacheKeys.workspaces.detail(workspaceId.toString()),
+ queryFn: () => workspacesApiService.getWorkspace({ id: workspaceId }),
+ enabled: !!workspaceId,
});
- const { mutateAsync: updateSearchSpace } = useAtomValue(updateSearchSpaceMutationAtom);
- const { mutateAsync: updateSearchSpaceApiAccess } = useAtomValue(
- updateSearchSpaceApiAccessMutationAtom
+ const { mutateAsync: updateWorkspace } = useAtomValue(updateWorkspaceMutationAtom);
+ const { mutateAsync: updateWorkspaceApiAccess } = useAtomValue(
+ updateWorkspaceApiAccessMutationAtom
);
const [name, setName] = useState("");
@@ -49,16 +48,16 @@ export function GeneralSettingsManager({ workspaceId }: GeneralSettingsManagerPr
const [saving, setSaving] = useState(false);
const [savingApiAccess, setSavingApiAccess] = useState(false);
const [isExporting, setIsExporting] = useState(false);
- const hasSearchSpace = !!searchSpace;
- const searchSpaceName = searchSpace?.name;
- const searchSpaceDescription = searchSpace?.description;
+ const hasWorkspace = !!workspace;
+ const workspaceName = workspace?.name;
+ const workspaceDescription = workspace?.description;
const handleExportKB = useCallback(async () => {
if (isExporting) return;
setIsExporting(true);
try {
const response = await authenticatedFetch(
- buildBackendUrl(`/api/v1/workspaces/${searchSpaceId}/export`),
+ buildBackendUrl(`/api/v1/workspaces/${workspaceId}/export`),
{ method: "GET" }
);
if (!response.ok) {
@@ -81,37 +80,37 @@ export function GeneralSettingsManager({ workspaceId }: GeneralSettingsManagerPr
} finally {
setIsExporting(false);
}
- }, [searchSpaceId, isExporting]);
+ }, [workspaceId, isExporting]);
- // Initialize state from fetched search space
+ // Initialize state from fetched workspace
useEffect(() => {
- if (hasSearchSpace) {
- setName(searchSpaceName || "");
- setDescription(searchSpaceDescription || "");
+ if (hasWorkspace) {
+ setName(workspaceName || "");
+ setDescription(workspaceDescription || "");
}
- }, [hasSearchSpace, searchSpaceName, searchSpaceDescription]);
+ }, [hasWorkspace, workspaceName, workspaceDescription]);
// Derive hasChanges during render
const hasChanges =
- !!searchSpace &&
- ((searchSpace.name || "") !== name || (searchSpace.description || "") !== description);
+ !!workspace &&
+ ((workspace.name || "") !== name || (workspace.description || "") !== description);
const handleSave = async () => {
try {
setSaving(true);
- await updateSearchSpace({
- id: searchSpaceId,
+ await updateWorkspace({
+ id: workspaceId,
data: {
name: name.trim(),
description: description.trim() || undefined,
},
});
- await fetchSearchSpace();
+ await fetchWorkspace();
} catch (error: unknown) {
- console.error("Error saving search space details:", error);
- toast.error(error instanceof Error ? error.message : "Failed to save search space details");
+ console.error("Error saving workspace details:", error);
+ toast.error(error instanceof Error ? error.message : "Failed to save workspace details");
} finally {
setSaving(false);
}
@@ -126,11 +125,11 @@ export function GeneralSettingsManager({ workspaceId }: GeneralSettingsManagerPr
async (enabled: boolean) => {
try {
setSavingApiAccess(true);
- await updateSearchSpaceApiAccess({
- id: searchSpaceId,
+ await updateWorkspaceApiAccess({
+ id: workspaceId,
api_access_enabled: enabled,
});
- await fetchSearchSpace();
+ await fetchWorkspace();
} catch (error) {
console.error("Error updating API access:", error);
toast.error(error instanceof Error ? error.message : "Failed to update API access");
@@ -138,7 +137,7 @@ export function GeneralSettingsManager({ workspaceId }: GeneralSettingsManagerPr
setSavingApiAccess(false);
}
},
- [fetchSearchSpace, searchSpaceId, updateSearchSpaceApiAccess]
+ [fetchWorkspace, workspaceId, updateWorkspaceApiAccess]
);
if (loading) {
@@ -156,7 +155,7 @@ export function GeneralSettingsManager({ workspaceId }: GeneralSettingsManagerPr
return (
Failed to load settings.
-
fetchSearchSpace()}>
+ fetchWorkspace()}>
Retry
@@ -168,9 +167,9 @@ export function GeneralSettingsManager({ workspaceId }: GeneralSettingsManagerPr