paperclip-plugin-supermemory-otomatik 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/manifest.js +1 -1
- package/dist/manifest.js.map +1 -1
- package/dist/ui/index.js +36 -11
- package/dist/ui/index.js.map +2 -2
- package/dist/worker.js +48 -1
- package/dist/worker.js.map +3 -3
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ The plugin uses Paperclip's standard plugin slots (`settingsPage`, `page`, `side
|
|
|
13
13
|
|
|
14
14
|
## Install from Paperclip
|
|
15
15
|
|
|
16
|
-
Package: [`paperclip-plugin-supermemory-otomatik`](https://www.npmjs.com/package/paperclip-plugin-supermemory-otomatik) **0.2.
|
|
16
|
+
Package: [`paperclip-plugin-supermemory-otomatik`](https://www.npmjs.com/package/paperclip-plugin-supermemory-otomatik) **0.2.7**.
|
|
17
17
|
|
|
18
18
|
1. In Paperclip, open **Settings → Plugins → Install Plugin**.
|
|
19
19
|
2. Enter `paperclip-plugin-supermemory-otomatik` and install it for the instance.
|
package/dist/manifest.js
CHANGED
|
@@ -9,7 +9,7 @@ var MEMORY_ROUTE = "memory";
|
|
|
9
9
|
var manifest = {
|
|
10
10
|
id: PLUGIN_ID,
|
|
11
11
|
apiVersion: 1,
|
|
12
|
-
version: "0.2.
|
|
12
|
+
version: "0.2.7",
|
|
13
13
|
minimumHostVersion: "2026.1023.0",
|
|
14
14
|
displayName: "Supermemory (self-hosted)",
|
|
15
15
|
description: "Memory tools and an Owner-managed memory library for self-hosted Supermemory, with company-, agent-, and project-scoped access.",
|
package/dist/manifest.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nexport const PLUGIN_ID = \"paperclipai.supermemory\";\nexport const SEARCH_TOOL = \"search-approved-memory\";\nexport const SAVE_TOOL = \"submit-memory-candidate\";\nexport const MEMORY_SETTINGS_PAGE = \"supermemory-settings\";\nexport const MEMORY_PAGE = \"supermemory-memory\";\nexport const MEMORY_SIDEBAR = \"supermemory-sidebar\";\nexport const MEMORY_ROUTE = \"memory\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: PLUGIN_ID,\n apiVersion: 1,\n version: \"0.2.
|
|
4
|
+
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nexport const PLUGIN_ID = \"paperclipai.supermemory\";\nexport const SEARCH_TOOL = \"search-approved-memory\";\nexport const SAVE_TOOL = \"submit-memory-candidate\";\nexport const MEMORY_SETTINGS_PAGE = \"supermemory-settings\";\nexport const MEMORY_PAGE = \"supermemory-memory\";\nexport const MEMORY_SIDEBAR = \"supermemory-sidebar\";\nexport const MEMORY_ROUTE = \"memory\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: PLUGIN_ID,\n apiVersion: 1,\n version: \"0.2.7\",\n minimumHostVersion: \"2026.1023.0\",\n displayName: \"Supermemory (self-hosted)\",\n description: \"Memory tools and an Owner-managed memory library for self-hosted Supermemory, with company-, agent-, and project-scoped access.\",\n author: \"Otomatik\",\n categories: [\"connector\", \"automation\", \"ui\"],\n capabilities: [\n \"agent.tools.register\",\n \"agents.read\",\n \"projects.read\",\n \"access.members.read\",\n \"http.outbound\",\n \"instance.settings.register\",\n \"secrets.read-ref\",\n \"ui.page.register\",\n \"ui.sidebar.register\",\n ],\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n instanceConfigSchema: {\n type: \"object\",\n properties: {\n gatewayUrl: {\n type: \"string\",\n title: \"Gateway Supermemory su Tailscale HTTPS\",\n description: \"URL HTTPS tailnet del gateway ACL e delle operazioni Owner. Esempio OTOMATIK: https://otomatik.tail77a9ab.ts.net:18443/mcp. Supermemory Local resta privato sul server.\",\n default: \"https://otomatik.tail77a9ab.ts.net:18443/mcp\",\n },\n localApiUrl: {\n type: \"string\",\n title: \"Legacy Supermemory Local API URL\",\n description: \"Legacy value retained for existing configurations; ignored since plugin 0.2.3. The Local API is reached only by the server-side gateway.\",\n },\n adminApiKeyRef: {\n // Paperclip persists a secret-ref format as an object binding, even\n // though the format marker historically describes a string picker.\n type: [\"string\", \"object\"],\n format: \"secret-ref\",\n title: \"Secret con la chiave master Supermemory Local\",\n description: \"Usata come credenziale per le route Owner del gateway Tailscale. Viene risolta solo dopo il controllo Owner o per una ricerca con namespace assegnato esplicitamente; non viene esposta nei prompt.\",\n },\n agentGrants: {\n type: \"array\",\n title: \"Authorized agents\",\n description: \"Only listed Paperclip agents can use the memory tools. Each one uses its own ACL gateway token secret, already bound to the same agent, company, and role.\",\n items: {\n type: \"object\",\n title: \"Agent grant\",\n required: [\"agentId\", \"tokenRef\"],\n properties: {\n agentId: {\n type: \"string\",\n title: \"Paperclip agent\",\n minLength: 1,\n },\n tokenRef: {\n type: [\"string\", \"object\"],\n format: \"secret-ref\",\n title: \"This agent's ACL token secret\",\n description: \"Select the Paperclip company secret containing only this agent's Supermemory ACL token.\",\n },\n },\n },\n default: [],\n },\n },\n },\n tools: [\n {\n name: SEARCH_TOOL,\n displayName: \"Search approved Supermemory\",\n description: \"Search this agent's explicitly authorized company/team compartments and any assigned agent/project namespaces. Project memory is available only when the Paperclip run is in that project and the agent is on its explicit allowlist. Do not search for credentials or personal records.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", minLength: 1, maxLength: 300 },\n searchMode: { type: \"string\", enum: [\"hybrid\", \"memories\", \"chunks\"], default: \"hybrid\" },\n limit: { type: \"integer\", minimum: 1, maximum: 5, default: 3 },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: SAVE_TOOL,\n displayName: \"Submit a Supermemory candidate\",\n description: \"Submit one durable, non-sensitive fact or decision to this agent's role staging compartment for human review. This does not publish it to shared approved memory. Never submit credentials, personal data, customer cases, legal/health/workplace records, or full chat transcripts.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n content: { type: \"string\", minLength: 20, maxLength: 1200 },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n ],\n ui: {\n slots: [\n {\n type: \"settingsPage\",\n id: MEMORY_SETTINGS_PAGE,\n displayName: \"Supermemory settings\",\n exportName: \"SupermemorySettingsPage\",\n },\n {\n type: \"page\",\n id: MEMORY_PAGE,\n displayName: \"Memory\",\n exportName: \"MemoryPage\",\n routePath: MEMORY_ROUTE,\n },\n {\n type: \"sidebar\",\n id: MEMORY_SIDEBAR,\n displayName: \"Memory\",\n exportName: \"MemorySidebarLink\",\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/ui/index.js
CHANGED
|
@@ -289,6 +289,7 @@ function MemoryPage() {
|
|
|
289
289
|
const [scopeType, setScopeType] = useState("project");
|
|
290
290
|
const [scopeId, setScopeId] = useState("");
|
|
291
291
|
const [allowedAgentIds, setAllowedAgentIds] = useState([]);
|
|
292
|
+
const [editingAssignmentId, setEditingAssignmentId] = useState("");
|
|
292
293
|
const [showAssignment, setShowAssignment] = useState(false);
|
|
293
294
|
const [showUrlForm, setShowUrlForm] = useState(false);
|
|
294
295
|
const [urlInput, setUrlInput] = useState("");
|
|
@@ -326,6 +327,7 @@ function MemoryPage() {
|
|
|
326
327
|
};
|
|
327
328
|
}, [companyId, loadCatalog]);
|
|
328
329
|
const activeAssignment = catalog?.assignments.find((assignment) => assignment.id === activeAssignmentId) ?? null;
|
|
330
|
+
const editingAssignment = catalog?.assignments.find((assignment) => assignment.id === editingAssignmentId) ?? null;
|
|
329
331
|
const visibleDocuments = (catalog?.documents ?? []).filter((item) => item.assignmentId === activeAssignmentId);
|
|
330
332
|
const selectedDocumentSummary = visibleDocuments.find((item) => `${item.assignmentId}:${item.id}` === activeDocumentKey) ?? null;
|
|
331
333
|
useEffect(() => {
|
|
@@ -474,12 +476,13 @@ function MemoryPage() {
|
|
|
474
476
|
}
|
|
475
477
|
const authorized = scopeType === "agent" ? [scopeId] : allowedAgentIds;
|
|
476
478
|
try {
|
|
477
|
-
await saveAssignment({ companyId, scopeType, scopeId, label: source.name, authorizedAgentIds: authorized });
|
|
478
|
-
await refreshCatalog();
|
|
479
|
+
const saved = await saveAssignment({ companyId, ...editingAssignmentId ? { assignmentId: editingAssignmentId } : {}, scopeType, scopeId, label: source.name, authorizedAgentIds: authorized });
|
|
480
|
+
await refreshCatalog(saved.id);
|
|
479
481
|
setShowAssignment(false);
|
|
480
482
|
setScopeId("");
|
|
481
483
|
setAllowedAgentIds([]);
|
|
482
|
-
|
|
484
|
+
setEditingAssignmentId("");
|
|
485
|
+
toast({ tone: "success", title: editingAssignmentId ? "Assegnazione aggiornata" : "Namespace assegnato", body: "Il namespace esistente e i suoi documenti restano intatti; sono cambiati l\u2019ambito Paperclip e gli agenti autorizzati." });
|
|
483
486
|
} catch (cause) {
|
|
484
487
|
const message = displayError(cause);
|
|
485
488
|
setError(message);
|
|
@@ -487,6 +490,14 @@ function MemoryPage() {
|
|
|
487
490
|
setBusy(false);
|
|
488
491
|
}
|
|
489
492
|
}
|
|
493
|
+
function editAssignment(assignment) {
|
|
494
|
+
setEditingAssignmentId(assignment.id);
|
|
495
|
+
setScopeType(assignment.scopeType);
|
|
496
|
+
setScopeId(assignment.scopeId);
|
|
497
|
+
setAllowedAgentIds(assignment.authorizedAgentIds);
|
|
498
|
+
setShowAssignment(true);
|
|
499
|
+
setError(null);
|
|
500
|
+
}
|
|
490
501
|
async function removeAssignment(assignment) {
|
|
491
502
|
if (!companyId || !window.confirm(`Disattivare l\u2019accesso al namespace \u201C${assignment.label}\u201D? I documenti restano in Supermemory.`)) return;
|
|
492
503
|
setBusy(true);
|
|
@@ -517,7 +528,7 @@ function MemoryPage() {
|
|
|
517
528
|
setBusy(false);
|
|
518
529
|
}
|
|
519
530
|
}
|
|
520
|
-
const namespacePreview = companyId && scopeId ? `paperclip_${companyId}_${scopeType}_${scopeId}` : "Il namespace verr\xE0 generato con ID organizzazione + target";
|
|
531
|
+
const namespacePreview = editingAssignment?.namespace ?? (companyId && scopeId ? `paperclip_${companyId}_${scopeType}_${scopeId}` : "Il namespace verr\xE0 generato con ID organizzazione + target");
|
|
521
532
|
if (loading) return /* @__PURE__ */ jsx("main", { style: pageStyle, children: /* @__PURE__ */ jsx("p", { children: "Caricamento Memory\u2026" }) });
|
|
522
533
|
if (error && !catalog) return /* @__PURE__ */ jsxs("main", { style: { ...pageStyle, maxWidth: 760 }, children: [
|
|
523
534
|
/* @__PURE__ */ jsx("h1", { style: { fontSize: 24 }, children: "Memory" }),
|
|
@@ -534,7 +545,17 @@ function MemoryPage() {
|
|
|
534
545
|
/* @__PURE__ */ jsx("p", { style: { ...mutedStyle, margin: "6px 0 0", maxWidth: 760 }, children: "Gestisci namespace e contenuti Supermemory per questa organizzazione. Questa libreria \xE8 visibile solo agli Owner." })
|
|
535
546
|
] }),
|
|
536
547
|
/* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", justifyContent: "end" }, children: [
|
|
537
|
-
/* @__PURE__ */ jsx("button", { type: "button", style: secondaryButtonStyle, onClick: () =>
|
|
548
|
+
/* @__PURE__ */ jsx("button", { type: "button", style: secondaryButtonStyle, onClick: () => {
|
|
549
|
+
if (showAssignment && !editingAssignmentId) {
|
|
550
|
+
setShowAssignment(false);
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
setEditingAssignmentId("");
|
|
554
|
+
setScopeType("project");
|
|
555
|
+
setScopeId("");
|
|
556
|
+
setAllowedAgentIds([]);
|
|
557
|
+
setShowAssignment(true);
|
|
558
|
+
}, children: "\uFF0B Assegna namespace" }),
|
|
538
559
|
/* @__PURE__ */ jsx("a", { ...navigation.linkProps("/company/settings/instance/plugins/paperclipai.supermemory"), style: { ...secondaryButtonStyle, textDecoration: "none" }, children: "Configurazione" })
|
|
539
560
|
] })
|
|
540
561
|
] }),
|
|
@@ -544,7 +565,7 @@ function MemoryPage() {
|
|
|
544
565
|
/* @__PURE__ */ jsx("span", { style: { ...mutedStyle, marginLeft: 6 }, children: "Le assegnazioni saranno salvate, ma l\u2019indicizzazione e la ricerca nei namespace restano disattivate finch\xE9 non selezioni il secret Supermemory Local nella configurazione del plugin." })
|
|
545
566
|
] }) : null,
|
|
546
567
|
showAssignment ? /* @__PURE__ */ jsxs("form", { onSubmit: saveAssignmentForm, style: { ...panelStyle, padding: 18, display: "grid", gap: 13, marginBottom: 18 }, children: [
|
|
547
|
-
/* @__PURE__ */ jsx("h2", { style: { fontSize: 17, margin: 0 }, children: "Assegna un namespace" }),
|
|
568
|
+
/* @__PURE__ */ jsx("h2", { style: { fontSize: 17, margin: 0 }, children: editingAssignmentId ? "Modifica assegnazione del namespace" : "Assegna un namespace" }),
|
|
548
569
|
/* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: "minmax(160px, 220px) minmax(220px, 1fr)", gap: 12 }, children: [
|
|
549
570
|
/* @__PURE__ */ jsxs("label", { style: { display: "grid", gap: 6, fontSize: 13 }, children: [
|
|
550
571
|
"Ambito",
|
|
@@ -574,13 +595,16 @@ function MemoryPage() {
|
|
|
574
595
|
] }, agent.id)) })
|
|
575
596
|
] }) : null,
|
|
576
597
|
/* @__PURE__ */ jsxs("div", { style: { ...mutedStyle, fontSize: 12 }, children: [
|
|
577
|
-
"Namespace isolato per questa organizzazione: ",
|
|
578
|
-
|
|
579
|
-
"
|
|
598
|
+
editingAssignmentId ? "Il namespace fisico e i documenti non cambiano. Cambiano il progetto/agente associato e la allowlist di accesso." : "Namespace isolato per questa organizzazione: Supermemory lo crea al primo contenuto.",
|
|
599
|
+
" ",
|
|
600
|
+
/* @__PURE__ */ jsx("code", { style: { overflowWrap: "anywhere" }, children: namespacePreview })
|
|
580
601
|
] }),
|
|
581
602
|
/* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8 }, children: [
|
|
582
|
-
/* @__PURE__ */ jsx("button", { style: primaryButtonStyle, disabled: busy, children: busy ? "Salvataggio\u2026" : "Salva assegnazione" }),
|
|
583
|
-
/* @__PURE__ */ jsx("button", { type: "button", style: secondaryButtonStyle, onClick: () =>
|
|
603
|
+
/* @__PURE__ */ jsx("button", { style: primaryButtonStyle, disabled: busy, children: busy ? "Salvataggio\u2026" : editingAssignmentId ? "Salva modifiche" : "Salva assegnazione" }),
|
|
604
|
+
/* @__PURE__ */ jsx("button", { type: "button", style: secondaryButtonStyle, onClick: () => {
|
|
605
|
+
setShowAssignment(false);
|
|
606
|
+
setEditingAssignmentId("");
|
|
607
|
+
}, children: "Annulla" })
|
|
584
608
|
] })
|
|
585
609
|
] }) : null,
|
|
586
610
|
/* @__PURE__ */ jsxs("section", { style: { display: "grid", gridTemplateColumns: "minmax(230px, 285px) minmax(0, 1fr)", gap: 18, minHeight: 640 }, children: [
|
|
@@ -613,6 +637,7 @@ function MemoryPage() {
|
|
|
613
637
|
/* @__PURE__ */ jsx("span", { style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", flex: 1, fontSize: 12 }, children: item.title })
|
|
614
638
|
] }, `${item.assignmentId}:${item.id}`)),
|
|
615
639
|
!docs.length ? /* @__PURE__ */ jsx("span", { style: { ...mutedStyle, fontSize: 11, padding: "4px 5px" }, children: "Nessun contenuto" }) : null,
|
|
640
|
+
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => editAssignment(assignment), style: { ...secondaryButtonStyle, padding: "5px 7px", fontSize: 11, marginTop: 5 }, children: "Modifica assegnazione" }),
|
|
616
641
|
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => void removeAssignment(assignment), style: { ...secondaryButtonStyle, padding: "5px 7px", fontSize: 11, marginTop: 5 }, children: "Disattiva assegnazione" })
|
|
617
642
|
] }) : null
|
|
618
643
|
] }, assignment.id);
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/ui/index.tsx", "../../src/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["import { useCallback, useEffect, useState, type CSSProperties, type DragEvent, type ChangeEvent, type FormEvent } from \"react\";\nimport {\n MarkdownBlock,\n useHostContext,\n useHostNavigation,\n usePluginAction,\n usePluginToast,\n type PluginSidebarProps,\n} from \"@paperclipai/plugin-sdk/ui\";\nimport { PLUGIN_ID } from \"../manifest.js\";\n\ntype AgentInfo = { id: string; name: string; role: string; status: string };\ntype ProjectInfo = { id: string; name: string; visibility?: string };\ntype SecretInfo = { id: string; name: string; key?: string; status?: string };\ntype SecretRef = { type: \"secret_ref\"; secretId: string };\ntype GrantForm = { key: string; agentId: string; tokenSecretId: string };\ntype GrantConfig = { agentId: string; tokenRef: SecretRef };\ntype PluginConfig = {\n gatewayUrl: string;\n adminApiKeyRef?: SecretRef;\n agentGrants: GrantConfig[];\n};\ntype NamespaceAssignment = {\n id: string;\n companyId: string;\n scopeType: \"agent\" | \"project\";\n scopeId: string;\n label: string;\n namespace: string;\n authorizedAgentIds: string[];\n};\ntype MemoryDocument = {\n id: string;\n namespace: string;\n assignmentId: string;\n title: string;\n kind: \"text\" | \"url\" | \"file\";\n mimeType: string | null;\n fileName: string | null;\n sourceUrl: string | null;\n status: string;\n content?: string | null;\n createdAt: string;\n updatedAt: string;\n};\ntype Catalog = {\n assignments: NamespaceAssignment[];\n documents: MemoryDocument[];\n agents: AgentInfo[];\n projects: ProjectInfo[];\n configured: boolean;\n gatewayUrl: string;\n};\ntype AgentAccess = { subjectType: \"agent\" | \"user\"; subjectId: string; subjectDisplayName?: string | null };\n\nconst DEFAULT_GATEWAY = \"https://otomatik.tail77a9ab.ts.net:18443/mcp\";\nconst LEGACY_GATEWAYS = new Set([\"http://127.0.0.1:6768/mcp\", \"http://localhost:6768/mcp\"]);\nconst CONFIG_PATH = `/api/plugins/${encodeURIComponent(PLUGIN_ID)}/config`;\nconst BINARY_MAX_BYTES = 6 * 1024 * 1024;\nconst TEXT_EXTENSIONS = new Set([\"txt\", \"md\", \"markdown\", \"html\", \"htm\", \"json\", \"csv\"]);\nconst BINARY_TYPES = new Map<string, string>([\n [\"pdf\", \"application/pdf\"], [\"png\", \"image/png\"], [\"jpg\", \"image/jpeg\"], [\"jpeg\", \"image/jpeg\"],\n [\"gif\", \"image/gif\"], [\"webp\", \"image/webp\"],\n]);\n\nasync function hostFetchJson<T>(path: string, init: RequestInit = {}): Promise<T> {\n const headers = new Headers(init.headers ?? undefined);\n if (init.body && !(init.body instanceof FormData) && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n const response = await fetch(path, { credentials: \"include\", ...init, headers });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = text || `Richiesta non riuscita (HTTP ${response.status}).`;\n try { message = String((JSON.parse(text) as { error?: string }).error ?? message); } catch { /* keep response text */ }\n throw new Error(message);\n }\n return await response.json() as T;\n}\n\nfunction secretId(value: unknown): string {\n return typeof value === \"object\" && value !== null && (value as { type?: unknown }).type === \"secret_ref\"\n && typeof (value as { secretId?: unknown }).secretId === \"string\" ? (value as { secretId: string }).secretId : \"\";\n}\n\nfunction displayError(value: unknown): string {\n if (value instanceof Error) return value.message;\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const error = value as { message?: unknown; code?: unknown; details?: unknown };\n if (typeof error.message === \"string\" && error.message.trim()) return error.message;\n if (typeof error.details === \"string\" && error.details.trim()) return error.details;\n if (typeof error.code === \"string\" && error.code.trim()) return `Operazione non riuscita (${error.code}).`;\n }\n return \"Operazione non riuscita. Riprova o controlla la configurazione del plugin.\";\n}\n\nfunction pluginConfig(configJson?: Record<string, unknown> | null): PluginConfig {\n const config = configJson ?? {};\n const grants: GrantConfig[] = Array.isArray(config.agentGrants) ? config.agentGrants.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") return [];\n const row = entry as Record<string, unknown>;\n if (typeof row.agentId !== \"string\" || !row.agentId) return [];\n const token = secretId(row.tokenRef);\n return token ? [{ agentId: row.agentId, tokenRef: { type: \"secret_ref\", secretId: token } }] : [];\n }) : [];\n const adminRef = secretId(config.adminApiKeyRef);\n return {\n gatewayUrl: typeof config.gatewayUrl === \"string\" && !LEGACY_GATEWAYS.has(config.gatewayUrl.trim()) ? config.gatewayUrl : DEFAULT_GATEWAY,\n ...(adminRef ? { adminApiKeyRef: { type: \"secret_ref\", secretId: adminRef } } : {}),\n agentGrants: grants,\n };\n}\n\nconst pageStyle: CSSProperties = { padding: 24, width: \"100%\", maxWidth: 1480, margin: \"0 auto\", color: \"var(--foreground)\" };\nconst panelStyle: CSSProperties = { border: \"1px solid var(--border)\", borderRadius: 10, background: \"var(--card, transparent)\" };\nconst mutedStyle: CSSProperties = { color: \"var(--muted-foreground)\" };\nconst inputStyle: CSSProperties = { width: \"100%\", border: \"1px solid var(--border)\", borderRadius: 7, background: \"var(--background)\", color: \"var(--foreground)\", padding: \"9px 11px\", minHeight: 38 };\nconst primaryButtonStyle: CSSProperties = { border: \"1px solid var(--primary)\", borderRadius: 7, background: \"var(--primary)\", color: \"var(--primary-foreground, white)\", padding: \"9px 14px\", fontWeight: 600, cursor: \"pointer\" };\nconst secondaryButtonStyle: CSSProperties = { border: \"1px solid var(--border)\", borderRadius: 7, background: \"transparent\", color: \"var(--foreground)\", padding: \"8px 12px\", cursor: \"pointer\" };\n\nexport function SupermemorySettingsPage() {\n const { companyId } = useHostContext();\n const [agents, setAgents] = useState<AgentInfo[]>([]);\n const [secrets, setSecrets] = useState<SecretInfo[]>([]);\n const [config, setConfig] = useState<PluginConfig>({ gatewayUrl: DEFAULT_GATEWAY, agentGrants: [] });\n const [grantRows, setGrantRows] = useState<GrantForm[]>([]);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n if (!companyId) { setLoading(false); setError(\"Seleziona un\u2019organizzazione.\"); return; }\n setLoading(true);\n const load = async () => {\n const [configResponse, agentResponse, secretResponse] = await Promise.all([\n hostFetchJson<{ configJson?: Record<string, unknown> | null } | null>(`${CONFIG_PATH}?companyId=${encodeURIComponent(companyId)}`),\n hostFetchJson<AgentInfo[]>(`/api/companies/${encodeURIComponent(companyId)}/agents`),\n hostFetchJson<SecretInfo[]>(`/api/companies/${encodeURIComponent(companyId)}/secrets`),\n ]);\n if (cancelled) return;\n const loadedConfig = pluginConfig(configResponse?.configJson);\n setConfig(loadedConfig);\n setGrantRows(loadedConfig.agentGrants.map((grant, index) => ({ key: `grant-${index}-${grant.agentId}`, agentId: grant.agentId, tokenSecretId: secretId(grant.tokenRef) })));\n setAgents(agentResponse.filter((agent) => ![\"terminated\", \"pending_approval\"].includes(agent.status)));\n setSecrets(secretResponse.filter((secret) => secret.status !== \"deleted\"));\n setError(null);\n };\n void load().catch((cause: unknown) => { if (!cancelled) setError(displayError(cause)); })\n .finally(() => { if (!cancelled) setLoading(false); });\n return () => { cancelled = true; };\n }, [companyId]);\n\n function updateGrant(index: number, patch: Partial<GrantForm>) {\n const next = grantRows.map((row, rowIndex) => rowIndex === index ? { ...row, ...patch } : row);\n setGrantRows(next);\n }\n\n function addGrant() {\n setGrantRows((current) => [...current, { key: `grant-new-${Date.now()}`, agentId: \"\", tokenSecretId: \"\" }]);\n }\n\n function removeGrant(index: number) {\n setGrantRows((current) => current.filter((_, rowIndex) => rowIndex !== index));\n }\n\n async function save(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!companyId) return;\n setSaving(true); setError(null); setSuccess(false);\n try {\n if (grantRows.some((row) => Boolean(row.agentId) !== Boolean(row.tokenSecretId))) throw new Error(\"Completa sia l\u2019agente sia il secret ACL per ogni riga.\");\n const cleaned = grantRows.filter((row) => row.agentId && row.tokenSecretId);\n if (cleaned.some((row, index) => cleaned.findIndex((candidate) => candidate.agentId === row.agentId) !== index)) {\n throw new Error(\"Ogni agente pu\u00F2 comparire una sola volta.\");\n }\n const nextConfig: Record<string, unknown> = {\n gatewayUrl: config.gatewayUrl.trim() || DEFAULT_GATEWAY,\n agentGrants: cleaned.map((row) => ({ agentId: row.agentId, tokenRef: { type: \"secret_ref\", secretId: row.tokenSecretId } })),\n };\n if (config.adminApiKeyRef?.secretId) nextConfig.adminApiKeyRef = config.adminApiKeyRef;\n await hostFetchJson(CONFIG_PATH, { method: \"POST\", body: JSON.stringify({ companyId, configJson: nextConfig }) });\n setConfig(pluginConfig(nextConfig));\n setGrantRows(cleaned.map((row, index) => ({ key: `grant-${index}-${row.agentId}`, agentId: row.agentId, tokenSecretId: row.tokenSecretId })));\n setSuccess(true);\n } catch (cause) { setError(displayError(cause)); }\n finally { setSaving(false); }\n }\n\n if (loading) return <main style={pageStyle}><p>Caricamento configurazione\u2026</p></main>;\n return (\n <main style={{ ...pageStyle, maxWidth: 1000, display: \"grid\", gap: 22 }}>\n <header>\n <h1 style={{ fontSize: 25, margin: 0, fontWeight: 650 }}>Configurazione Supermemory</h1>\n <p style={{ ...mutedStyle, marginTop: 8, maxWidth: 760 }}>Scegli gli agenti Paperclip dall\u2019elenco e collega per ciascuno il suo secret ACL. Le chiavi restano nei Secrets Paperclip: non vengono mostrate n\u00E9 copiate nei prompt.</p>\n </header>\n {error ? <div role=\"alert\" style={{ ...panelStyle, padding: 12, borderColor: \"var(--destructive, #b91c1c)\" }}>{error}</div> : null}\n {success ? <div role=\"status\" style={{ ...panelStyle, padding: 12 }}>Configurazione salvata.</div> : null}\n <form onSubmit={save} style={{ display: \"grid\", gap: 18 }}>\n <section style={{ ...panelStyle, padding: 18, display: \"grid\", gap: 14 }}>\n <h2 style={{ margin: 0, fontSize: 17 }}>Connessioni self-hosted</h2>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Gateway ACL Paperclip\n <input style={inputStyle} value={config.gatewayUrl} onChange={(event) => setConfig((current) => ({ ...current, gatewayUrl: event.target.value }))} />\n <span style={mutedStyle}>Default OTOMATIK: HTTPS Tailscale `otomatik.tail77a9ab.ts.net:18443`. L\u2019API Supermemory resta interna al server.</span>\n </label>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Secret con la chiave master Supermemory Local\n <select style={inputStyle} value={config.adminApiKeyRef?.secretId ?? \"\"} onChange={(event) => setConfig((current) => ({\n ...current,\n ...(event.target.value ? { adminApiKeyRef: { type: \"secret_ref\", secretId: event.target.value } } : { adminApiKeyRef: undefined }),\n }))}>\n <option value=\"\">Non configurato</option>\n {secrets.map((secret) => <option key={secret.id} value={secret.id}>{secret.name}{secret.key ? ` \u00B7 ${secret.key}` : \"\"}</option>)}\n </select>\n <span style={mutedStyle}>Serve per autenticare il gateway nelle azioni Owner della libreria Memory e nelle ricerche di namespace assegnati. Crea o importa il secret da <a href=\"/company/settings/secrets\" style={{ textDecoration: \"underline\" }}>Secrets</a>.</span>\n </label>\n <p style={{ ...mutedStyle, margin: 0, fontSize: 12 }}>Il plugin risolve la chiave master solo nelle azioni di gestione autorizzate all\u2019Owner e nelle ricerche di agenti gi\u00E0 autorizzati. Non \u00E8 esposta agli agenti come valore.</p>\n </section>\n\n <section style={{ ...panelStyle, padding: 18, display: \"grid\", gap: 14 }}>\n <div style={{ display: \"flex\", gap: 12, alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div><h2 style={{ margin: 0, fontSize: 17 }}>Agenti autorizzati</h2><p style={{ ...mutedStyle, margin: \"5px 0 0\", fontSize: 13 }}>Il selettore mostra il nome dell\u2019agente; Paperclip conserva l\u2019ID corretto senza chiederti di copiarlo.</p></div>\n <button type=\"button\" style={secondaryButtonStyle} onClick={addGrant}>\uFF0B Aggiungi agente</button>\n </div>\n {grantRows.length === 0 ? <p style={{ ...mutedStyle, margin: 0 }}>Nessun agente autorizzato.</p> : grantRows.map((row, index) => (\n <div key={row.key} style={{ ...panelStyle, padding: 14, display: \"grid\", gridTemplateColumns: \"minmax(180px, 1fr) minmax(180px, 1fr) auto\", gap: 12, alignItems: \"end\" }}>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Agente Paperclip\n <select style={inputStyle} value={row.agentId} onChange={(event) => updateGrant(index, { agentId: event.target.value })}>\n <option value=\"\">Scegli un agente\u2026</option>\n {agents.map((agent) => <option key={agent.id} value={agent.id}>{agent.name} \u00B7 {agent.role}</option>)}\n </select>\n </label>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Secret ACL individuale\n <select style={inputStyle} value={row.tokenSecretId} onChange={(event) => updateGrant(index, { tokenSecretId: event.target.value })}>\n <option value=\"\">Scegli un secret\u2026</option>\n {secrets.map((secret) => <option key={secret.id} value={secret.id}>{secret.name}{secret.key ? ` \u00B7 ${secret.key}` : \"\"}</option>)}\n </select>\n </label>\n <button type=\"button\" aria-label=\"Rimuovi agente\" style={secondaryButtonStyle} onClick={() => removeGrant(index)}>Rimuovi</button>\n </div>\n ))}\n <p style={{ ...mutedStyle, margin: 0, fontSize: 12 }}>Il token deve gi\u00E0 essere associato sul gateway a questo agente, alla stessa organizzazione Paperclip e al suo ruolo.</p>\n </section>\n <div><button type=\"submit\" style={primaryButtonStyle} disabled={saving}>{saving ? \"Salvataggio\u2026\" : \"Salva configurazione\"}</button></div>\n </form>\n </main>\n );\n}\n\nexport function MemorySidebarLink({ context }: PluginSidebarProps) {\n const navigation = useHostNavigation();\n if (!context.companyId) return null;\n const href = navigation.resolveHref(\"/memory\");\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n return (\n <a {...navigation.linkProps(\"/memory\")} aria-current={isActive ? \"page\" : undefined}\n className={`flex items-center gap-2.5 mx-2 rounded-lg px-2 py-1.5 pointer-coarse:py-1 text-(length:--text-compact) font-medium transition-colors ${isActive ? \"bg-sidebar-accent text-sidebar-accent-foreground\" : \"text-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"}`}>\n <span data-plugin-sidebar-icon=\"true\" aria-hidden=\"true\" className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9 3.5a3 3 0 0 0-3 3v.4a3 3 0 0 0-2.5 3v1.2a3 3 0 0 0 2.5 3v.4a3 3 0 0 0 3 3h1V3.5H9Z\" />\n <path d=\"M15 3.5a3 3 0 0 1 3 3v.4a3 3 0 0 1 2.5 3v1.2a3 3 0 0 1-2.5 3v.4a3 3 0 0 1-3 3h-1V3.5h1Z\" />\n <path d=\"M8 8h2m-2 5h2m4-5h2m-2 5h2\" />\n </svg>\n </span>\n <span data-plugin-sidebar-label=\"true\" className=\"flex-1 truncate\">Memory</span>\n </a>\n );\n}\n\nfunction readAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => reject(new Error(\"Non riesco a leggere il file selezionato.\"));\n reader.onload = () => {\n const result = typeof reader.result === \"string\" ? reader.result : \"\";\n const comma = result.indexOf(\",\");\n if (comma < 0) reject(new Error(\"Formato file non valido.\"));\n else resolve(result.slice(comma + 1));\n };\n reader.readAsDataURL(file);\n });\n}\n\nexport function MemoryPage() {\n const { companyId } = useHostContext();\n const toast = usePluginToast();\n const loadCatalog = usePluginAction(\"memory-catalog\");\n const saveAssignment = usePluginAction(\"memory-assignment-save\");\n const disableAssignment = usePluginAction(\"memory-assignment-disable\");\n const readDocument = usePluginAction(\"memory-document-read\");\n const saveText = usePluginAction(\"memory-text-save\");\n const uploadFile = usePluginAction(\"memory-file-upload\");\n const deleteDocument = usePluginAction(\"memory-document-delete\");\n const navigation = useHostNavigation();\n const [catalog, setCatalog] = useState<Catalog | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [activeAssignmentId, setActiveAssignmentId] = useState(\"\");\n const [activeDocumentKey, setActiveDocumentKey] = useState(\"\");\n const [document, setDocument] = useState<MemoryDocument | null>(null);\n const [title, setTitle] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [mode, setMode] = useState<\"read\" | \"edit\" | \"raw\">(\"read\");\n const [dirty, setDirty] = useState(false);\n const [scopeType, setScopeType] = useState<\"agent\" | \"project\">(\"project\");\n const [scopeId, setScopeId] = useState(\"\");\n const [allowedAgentIds, setAllowedAgentIds] = useState<string[]>([]);\n const [showAssignment, setShowAssignment] = useState(false);\n const [showUrlForm, setShowUrlForm] = useState(false);\n const [urlInput, setUrlInput] = useState(\"\");\n\n const refreshCatalog = useCallback(async (keepAssignmentId?: string) => {\n if (!companyId) return;\n const data = await loadCatalog({ companyId }) as Catalog;\n setCatalog(data);\n setActiveAssignmentId((current) => {\n const next = keepAssignmentId ?? current;\n return data.assignments.some((assignment) => assignment.id === next) ? next : data.assignments[0]?.id ?? \"\";\n });\n }, [companyId, loadCatalog]);\n\n useEffect(() => {\n let cancelled = false;\n if (!companyId) { setLoading(false); setError(\"Seleziona un\u2019organizzazione Paperclip.\"); return; }\n setLoading(true);\n void loadCatalog({ companyId }).then((result) => {\n if (cancelled) return;\n const data = result as Catalog;\n setCatalog(data);\n setActiveAssignmentId(data.assignments[0]?.id ?? \"\");\n setError(null);\n }).catch((cause: unknown) => {\n if (cancelled) return;\n setError(displayError(cause));\n }).finally(() => { if (!cancelled) setLoading(false); });\n return () => { cancelled = true; };\n }, [companyId, loadCatalog]);\n\n const activeAssignment = catalog?.assignments.find((assignment) => assignment.id === activeAssignmentId) ?? null;\n const visibleDocuments = (catalog?.documents ?? []).filter((item) => item.assignmentId === activeAssignmentId);\n const selectedDocumentSummary = visibleDocuments.find((item) => `${item.assignmentId}:${item.id}` === activeDocumentKey) ?? null;\n\n useEffect(() => {\n let cancelled = false;\n if (activeDocumentKey === \"draft\") return;\n if (!companyId || !selectedDocumentSummary) {\n setDocument(null); setTitle(\"\"); setContent(\"\"); setDirty(false);\n return;\n }\n setBusy(true);\n void readDocument({ companyId, assignmentId: selectedDocumentSummary.assignmentId, namespace: selectedDocumentSummary.namespace, documentId: selectedDocumentSummary.id })\n .then((result) => {\n if (cancelled) return;\n const next = result as MemoryDocument;\n setDocument(next); setTitle(next.title); setContent(next.content ?? \"\"); setDirty(false); setMode(\"read\");\n }).catch((cause: unknown) => { if (!cancelled) setError(displayError(cause)); })\n .finally(() => { if (!cancelled) setBusy(false); });\n return () => { cancelled = true; };\n }, [companyId, activeDocumentKey, selectedDocumentSummary?.id, selectedDocumentSummary?.namespace, selectedDocumentSummary?.assignmentId, readDocument]);\n\n function startTextDocument() {\n if (!activeAssignment) return;\n setDocument({ id: \"\", namespace: activeAssignment.namespace, assignmentId: activeAssignment.id, title: \"Nuovo documento.md\", kind: \"text\", mimeType: \"text/markdown\", fileName: null, sourceUrl: null, status: \"draft\", content: \"\", createdAt: \"\", updatedAt: \"\" });\n setTitle(\"Nuovo documento.md\"); setContent(\"\"); setActiveDocumentKey(\"draft\"); setDirty(true); setMode(\"edit\");\n }\n\n function editField(setter: (value: string) => void, value: string) {\n setter(value); setDirty(true);\n }\n\n async function persistText(kind: \"text\" | \"url\" = \"text\", nextContent = content, nextTitle = title, documentId = document?.id || null): Promise<boolean> {\n if (!companyId || !activeAssignment) { setError(\"Seleziona un namespace prima di salvare.\"); return false; }\n setBusy(true); setError(null);\n try {\n const result = await saveText({ companyId, assignmentId: activeAssignment.id, documentId, title: nextTitle, content: nextContent, kind }) as { document: MemoryDocument };\n const saved = result.document;\n await refreshCatalog(activeAssignment.id);\n setDocument({ ...saved, content: nextContent }); setTitle(saved.title); setContent(nextContent); setActiveDocumentKey(`${activeAssignment.id}:${saved.id}`); setDirty(false); setMode(\"read\");\n toast({ tone: \"success\", title: \"Memoria salvata\", body: \"Supermemory ha messo il contenuto in coda per l\u2019indicizzazione.\" });\n return true;\n } catch (cause) { const message = displayError(cause); setError(message); toast({ tone: \"error\", title: \"Salvataggio non riuscito\", body: message }); }\n finally { setBusy(false); }\n return false;\n }\n\n async function handleFile(file: File) {\n if (!companyId || !activeAssignment) { setError(\"Crea o seleziona prima un namespace.\"); return; }\n const extension = file.name.split(\".\").pop()?.toLowerCase() ?? \"\";\n setBusy(true); setError(null);\n try {\n if (TEXT_EXTENSIONS.has(extension)) {\n if (file.size > 1_000_000) throw new Error(\"Il testo non pu\u00F2 superare 1 MB.\");\n const fileText = await file.text();\n const result = await saveText({ companyId, assignmentId: activeAssignment.id, title: file.name, content: fileText, kind: \"text\" }) as { document: MemoryDocument };\n await refreshCatalog(activeAssignment.id);\n setActiveDocumentKey(`${activeAssignment.id}:${result.document.id}`);\n toast({ tone: \"success\", title: \"File aggiunto\", body: \"Supermemory ha messo il testo in coda per l\u2019indicizzazione.\" });\n return;\n }\n const expectedMime = BINARY_TYPES.get(extension);\n if (!expectedMime || expectedMime !== file.type) throw new Error(\"Formato non supportato. Local documenta PDF, PNG, JPG/JPEG, GIF e WebP, oltre ai file testuali .txt/.md/.html/.json/.csv.\");\n if (file.size > BINARY_MAX_BYTES) throw new Error(\"Il file binario non pu\u00F2 superare 6 MiB tramite il bridge Paperclip.\");\n const base64 = await readAsBase64(file);\n const result = await uploadFile({ companyId, assignmentId: activeAssignment.id, fileName: file.name, mimeType: file.type, base64 }) as { document: MemoryDocument };\n await refreshCatalog(activeAssignment.id);\n setActiveDocumentKey(`${activeAssignment.id}:${result.document.id}`);\n toast({ tone: \"success\", title: \"File caricato\", body: \"Supermemory ha messo il file in coda per l\u2019indicizzazione.\" });\n } catch (cause) { const message = displayError(cause); setError(message); toast({ tone: \"error\", title: \"Caricamento non riuscito\", body: message }); }\n finally { setBusy(false); }\n }\n\n function onFilesChange(event: ChangeEvent<HTMLInputElement>) {\n const file = event.target.files?.[0];\n if (file) void handleFile(file);\n event.target.value = \"\";\n }\n\n function onDrop(event: DragEvent<HTMLDivElement>) {\n event.preventDefault();\n if (!activeAssignment) { setError(\"Prima assegna o seleziona un namespace; poi puoi caricare il PDF.\"); return; }\n const file = event.dataTransfer.files.item(0);\n if (file) void handleFile(file);\n }\n\n async function addUrl(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n let parsed: URL;\n try { parsed = new URL(urlInput); } catch { setError(\"Inserisci un URL valido.\"); return; }\n const urlTitle = parsed.hostname + parsed.pathname;\n const saved = await persistText(\"url\", parsed.toString(), urlTitle.slice(0, 240), null);\n if (saved) { setShowUrlForm(false); setUrlInput(\"\"); }\n }\n\n async function saveAssignmentForm(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!companyId || !catalog) return;\n setBusy(true); setError(null);\n const source = scopeType === \"agent\" ? catalog.agents.find((agent) => agent.id === scopeId) : catalog.projects.find((project) => project.id === scopeId);\n if (!source) { setBusy(false); setError(\"Seleziona un agente o un progetto.\"); return; }\n const authorized = scopeType === \"agent\" ? [scopeId] : allowedAgentIds;\n try {\n await saveAssignment({ companyId, scopeType, scopeId, label: source.name, authorizedAgentIds: authorized });\n await refreshCatalog();\n setShowAssignment(false); setScopeId(\"\"); setAllowedAgentIds([]);\n toast({ tone: \"success\", title: \"Namespace assegnato\", body: \"Lo spazio di memoria \u00E8 limitato all\u2019assegnazione e agli agenti indicati.\" });\n } catch (cause) { const message = displayError(cause); setError(message); }\n finally { setBusy(false); }\n }\n\n async function removeAssignment(assignment: NamespaceAssignment) {\n if (!companyId || !window.confirm(`Disattivare l\u2019accesso al namespace \u201C${assignment.label}\u201D? I documenti restano in Supermemory.`)) return;\n setBusy(true); setError(null);\n try { await disableAssignment({ companyId, assignmentId: assignment.id }); await refreshCatalog(); setActiveDocumentKey(\"\"); setDocument(null); }\n catch (cause) { setError(displayError(cause)); }\n finally { setBusy(false); }\n }\n\n async function removeDocument() {\n if (!companyId || !activeAssignment || !document?.id || !window.confirm(`Eliminare definitivamente \u201C${document.title}\u201D da Supermemory?`)) return;\n setBusy(true); setError(null);\n try { await deleteDocument({ companyId, assignmentId: activeAssignment.id, documentId: document.id }); await refreshCatalog(activeAssignment.id); setDocument(null); setActiveDocumentKey(\"\"); }\n catch (cause) { setError(displayError(cause)); }\n finally { setBusy(false); }\n }\n\n const namespacePreview = companyId && scopeId ? `paperclip_${companyId}_${scopeType}_${scopeId}` : \"Il namespace verr\u00E0 generato con ID organizzazione + target\";\n\n if (loading) return <main style={pageStyle}><p>Caricamento Memory\u2026</p></main>;\n if (error && !catalog) return (\n <main style={{ ...pageStyle, maxWidth: 760 }}>\n <h1 style={{ fontSize: 24 }}>Memory</h1>\n <div role=\"alert\" style={{ ...panelStyle, padding: 18, display: \"grid\", gap: 10 }}>\n <strong>Accesso riservato all\u2019Owner dell\u2019organizzazione.</strong>\n <span style={mutedStyle}>{error}</span>\n <span style={mutedStyle}>I documenti e le assegnazioni non sono visibili agli altri membri dell\u2019organizzazione.</span>\n </div>\n </main>\n );\n\n return (\n <main style={pageStyle}>\n <header style={{ display: \"flex\", alignItems: \"start\", justifyContent: \"space-between\", gap: 16, marginBottom: 20 }}>\n <div>\n <h1 style={{ fontSize: 26, fontWeight: 650, margin: 0 }}>Memory</h1>\n <p style={{ ...mutedStyle, margin: \"6px 0 0\", maxWidth: 760 }}>Gestisci namespace e contenuti Supermemory per questa organizzazione. Questa libreria \u00E8 visibile solo agli Owner.</p>\n </div>\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\", justifyContent: \"end\" }}>\n <button type=\"button\" style={secondaryButtonStyle} onClick={() => setShowAssignment((value) => !value)}>\uFF0B Assegna namespace</button>\n <a {...navigation.linkProps(\"/company/settings/instance/plugins/paperclipai.supermemory\")} style={{ ...secondaryButtonStyle, textDecoration: \"none\" }}>Configurazione</a>\n </div>\n </header>\n\n {error ? <div role=\"alert\" style={{ ...panelStyle, padding: 12, marginBottom: 16, borderColor: \"var(--destructive, #b91c1c)\" }}>{error}</div> : null}\n {!catalog?.configured ? (\n <div style={{ ...panelStyle, padding: 14, marginBottom: 16 }}><strong>Chiave master non configurata.</strong><span style={{ ...mutedStyle, marginLeft: 6 }}>Le assegnazioni saranno salvate, ma l\u2019indicizzazione e la ricerca nei namespace restano disattivate finch\u00E9 non selezioni il secret Supermemory Local nella configurazione del plugin.</span></div>\n ) : null}\n\n {showAssignment ? (\n <form onSubmit={saveAssignmentForm} style={{ ...panelStyle, padding: 18, display: \"grid\", gap: 13, marginBottom: 18 }}>\n <h2 style={{ fontSize: 17, margin: 0 }}>Assegna un namespace</h2>\n <div style={{ display: \"grid\", gridTemplateColumns: \"minmax(160px, 220px) minmax(220px, 1fr)\", gap: 12 }}>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Ambito\n <select style={inputStyle} value={scopeType} onChange={(event) => { setScopeType(event.target.value as \"agent\" | \"project\"); setScopeId(\"\"); setAllowedAgentIds([]); }}><option value=\"project\">Progetto</option><option value=\"agent\">Agente</option></select>\n </label>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>{scopeType === \"project\" ? \"Progetto Paperclip\" : \"Agente Paperclip\"}\n <select style={inputStyle} value={scopeId} onChange={(event) => setScopeId(event.target.value)}>\n <option value=\"\">Scegli\u2026</option>\n {(scopeType === \"project\" ? catalog?.projects ?? [] : catalog?.agents ?? []).map((item) => <option key={item.id} value={item.id}>{item.name}</option>)}\n </select>\n </label>\n </div>\n {scopeType === \"project\" ? <fieldset style={{ border: \"1px solid var(--border)\", borderRadius: 8, padding: 12 }}>\n <legend style={{ fontSize: 13, padding: \"0 5px\" }}>Agenti autorizzati a leggere questo namespace</legend>\n <p style={{ ...mutedStyle, fontSize: 12, margin: \"0 0 8px\" }}>Elenco esplicito usato dal plugin insieme al projectId del run. Seleziona solo agenti autorizzati sul progetto in Paperclip.</p>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n {(catalog?.agents ?? []).map((agent) => <label key={agent.id} style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6, border: \"1px solid var(--border)\", borderRadius: 999, padding: \"5px 9px\", fontSize: 12 }}>\n <input type=\"checkbox\" checked={allowedAgentIds.includes(agent.id)} onChange={(event) => setAllowedAgentIds((current) => event.target.checked ? [...current, agent.id] : current.filter((id) => id !== agent.id))} />{agent.name}\n </label>)}\n </div>\n </fieldset> : null}\n <div style={{ ...mutedStyle, fontSize: 12 }}>Namespace isolato per questa organizzazione: <code style={{ overflowWrap: \"anywhere\" }}>{namespacePreview}</code>. Supermemory lo crea al primo contenuto.</div>\n <div style={{ display: \"flex\", gap: 8 }}><button style={primaryButtonStyle} disabled={busy}>{busy ? \"Salvataggio\u2026\" : \"Salva assegnazione\"}</button><button type=\"button\" style={secondaryButtonStyle} onClick={() => setShowAssignment(false)}>Annulla</button></div>\n </form>\n ) : null}\n\n <section style={{ display: \"grid\", gridTemplateColumns: \"minmax(230px, 285px) minmax(0, 1fr)\", gap: 18, minHeight: 640 }}>\n <aside style={{ ...panelStyle, padding: 14, display: \"flex\", flexDirection: \"column\", minWidth: 0 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8, marginBottom: 10 }}>\n <h2 style={{ fontSize: 15, margin: 0 }}>Namespace e file</h2>\n <span style={{ ...mutedStyle, fontSize: 12 }}>{catalog?.assignments.length ?? 0}</span>\n </div>\n {!catalog?.assignments.length ? <div style={{ ...mutedStyle, fontSize: 13, padding: \"12px 2px\" }}>Nessun namespace. Usa \u201CAssegna namespace\u201D per iniziare.</div> : null}\n <div style={{ display: \"grid\", gap: 12, overflowY: \"auto\" }}>\n {(catalog?.assignments ?? []).map((assignment) => {\n const docs = catalog?.documents.filter((item) => item.assignmentId === assignment.id) ?? [];\n const selected = assignment.id === activeAssignmentId;\n return <div key={assignment.id} style={{ border: `1px solid ${selected ? \"var(--ring, var(--primary))\" : \"var(--border)\"}`, borderRadius: 8, overflow: \"hidden\" }}>\n <button type=\"button\" onClick={() => { setActiveAssignmentId(assignment.id); setActiveDocumentKey(\"\"); setDocument(null); }} style={{ width: \"100%\", textAlign: \"left\", background: selected ? \"var(--accent, rgba(127,127,127,.12))\" : \"transparent\", border: 0, color: \"var(--foreground)\", padding: 11, cursor: \"pointer\" }}>\n <strong style={{ display: \"block\", fontSize: 13 }}>{assignment.label}</strong>\n <span style={{ ...mutedStyle, display: \"block\", fontSize: 11, marginTop: 3 }}>{assignment.scopeType === \"project\" ? \"Progetto\" : \"Agente\"} \u00B7 {assignment.authorizedAgentIds.length} agenti</span>\n </button>\n {selected ? <div style={{ borderTop: \"1px solid var(--border)\", padding: 8, display: \"grid\", gap: 3 }}>\n {docs.map((item) => <button key={`${item.assignmentId}:${item.id}`} type=\"button\" onClick={() => setActiveDocumentKey(`${item.assignmentId}:${item.id}`)} style={{ display: \"flex\", gap: 7, alignItems: \"center\", border: 0, borderRadius: 5, padding: \"7px 5px\", textAlign: \"left\", background: activeDocumentKey === `${item.assignmentId}:${item.id}` ? \"var(--accent, rgba(127,127,127,.12))\" : \"transparent\", color: \"var(--foreground)\", cursor: \"pointer\", minWidth: 0 }}>\n <span aria-hidden=\"true\">{item.kind === \"url\" ? \"\u2197\" : item.kind === \"file\" ? \"\u25A7\" : \"\u25A4\"}</span><span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", flex: 1, fontSize: 12 }}>{item.title}</span>\n </button>)}\n {!docs.length ? <span style={{ ...mutedStyle, fontSize: 11, padding: \"4px 5px\" }}>Nessun contenuto</span> : null}\n <button type=\"button\" onClick={() => void removeAssignment(assignment)} style={{ ...secondaryButtonStyle, padding: \"5px 7px\", fontSize: 11, marginTop: 5 }}>Disattiva assegnazione</button>\n </div> : null}\n </div>;\n })}\n </div>\n {activeAssignment ? <div style={{ borderTop: \"1px solid var(--border)\", paddingTop: 12, marginTop: \"auto\", display: \"grid\", gap: 7 }}>\n <button type=\"button\" style={secondaryButtonStyle} onClick={startTextDocument} disabled={busy}>\uFF0B Nuovo testo</button>\n <button type=\"button\" style={secondaryButtonStyle} onClick={() => setShowUrlForm((current) => !current)} disabled={busy}>\uFF0B Aggiungi URL</button>\n <label style={{ ...secondaryButtonStyle, textAlign: \"center\", cursor: busy ? \"wait\" : \"pointer\" }}>\uFF0B Carica file\n <input type=\"file\" hidden disabled={busy} accept=\".pdf,.png,.jpg,.jpeg,.gif,.webp,.txt,.md,.markdown,.html,.htm,.json,.csv\" onChange={onFilesChange} />\n </label>\n </div> : null}\n </aside>\n\n <section style={{ ...panelStyle, minWidth: 0, display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}>\n <div onDragOver={(event) => event.preventDefault()} onDrop={onDrop} style={{ padding: 16, borderBottom: \"1px solid var(--border)\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"start\", gap: 14, flexWrap: \"wrap\" }}>\n <div style={{ minWidth: 0, flex: \"1 1 280px\" }}>\n <h2 style={{ fontSize: 16, margin: 0 }}>{activeAssignment?.label ?? \"Seleziona un namespace\"}</h2>\n {activeAssignment ? <code style={{ display: \"block\", marginTop: 5, fontSize: 11, color: \"var(--muted-foreground)\", overflowWrap: \"anywhere\" }}>{activeAssignment.namespace}</code> : null}\n </div>\n {document ? <div style={{ display: \"flex\", alignItems: \"center\", gap: 4, border: \"1px solid var(--border)\", borderRadius: 7, padding: 3 }}>\n {([\"read\", \"edit\", \"raw\"] as const).map((tab) => <button type=\"button\" key={tab} onClick={() => setMode(tab)} style={{ border: 0, borderRadius: 5, padding: \"6px 10px\", background: mode === tab ? \"var(--accent, rgba(127,127,127,.18))\" : \"transparent\", color: \"var(--foreground)\", cursor: \"pointer\", fontSize: 12 }}>{tab === \"read\" ? \"Leggi\" : tab === \"edit\" ? \"Modifica\" : \"Raw\"}</button>)}\n </div> : null}\n </div>\n\n {showUrlForm && activeAssignment ? <form onSubmit={addUrl} style={{ margin: 14, padding: 14, display: \"grid\", gap: 9, border: \"1px solid var(--border)\", borderRadius: 8 }}>\n <strong style={{ fontSize: 13 }}>Aggiungi pagina web</strong>\n <input style={inputStyle} type=\"url\" required placeholder=\"https://example.com/documentazione\" value={urlInput} onChange={(event) => setUrlInput(event.target.value)} />\n <span style={{ ...mutedStyle, fontSize: 12 }}>L\u2019URL viene passato a Supermemory Local. L\u2019estrazione web richiede Firecrawl configurato e invia la pagina al servizio Firecrawl.</span>\n <div style={{ display: \"flex\", gap: 8 }}><button style={primaryButtonStyle} disabled={busy}>Indicizza URL</button><button type=\"button\" style={secondaryButtonStyle} onClick={() => setShowUrlForm(false)}>Annulla</button></div>\n </form> : null}\n\n {!activeAssignment ? (\n <div style={{ flex: 1, display: \"grid\", placeItems: \"center\", minHeight: 420, padding: 28 }}>\n <div style={{ width: \"min(100%, 600px)\", border: \"1px dashed var(--border)\", borderRadius: 12, padding: 28, textAlign: \"center\" }}>\n <strong>Prima assegna un namespace</strong>\n <p style={{ ...mutedStyle, fontSize: 13, lineHeight: 1.55 }}>Non c\u2019\u00E8 uno spazio di memoria attivo in questa organizzazione. Assegna un progetto o un agente; poi selezionalo e carica il PDF.</p>\n <button type=\"button\" style={primaryButtonStyle} onClick={() => setShowAssignment(true)}>\uFF0B Assegna namespace</button>\n </div>\n </div>\n ) : !document ? (\n <div onDragOver={(event) => event.preventDefault()} onDrop={onDrop} style={{ flex: 1, display: \"grid\", placeItems: \"center\", minHeight: 420, padding: 28 }}>\n <div style={{ width: \"min(100%, 600px)\", border: \"1px dashed var(--border)\", borderRadius: 12, padding: 28, textAlign: \"center\" }}>\n <div style={{ fontSize: 28, marginBottom: 10 }}>\u21E7</div>\n <strong>Trascina qui un file</strong>\n <p style={{ ...mutedStyle, fontSize: 13, lineHeight: 1.55 }}>Testo: TXT, Markdown, HTML, JSON e CSV (max 1 MB). File binari verificati per Supermemory Local: PDF, PNG, JPG/JPEG, GIF e WebP (max 6 MiB in questa interfaccia). Puoi anche aggiungere un URL pubblico.</p>\n <span style={{ ...mutedStyle, fontSize: 12 }}>Office, audio e video sono supportati da alcune versioni del servizio hosted, ma non sono documentati per il server Local installato.</span>\n </div>\n </div>\n ) : (\n <div style={{ flex: 1, minHeight: 400, padding: 18, display: \"flex\", flexDirection: \"column\", gap: 14, overflow: \"auto\" }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"minmax(0, 1fr) auto\", gap: 12, alignItems: \"end\" }}>\n <label style={{ display: \"grid\", gap: 6, fontSize: 12 }}>Titolo\n <input style={inputStyle} value={title} readOnly={mode === \"read\" || mode === \"raw\" || document.kind === \"file\"} onChange={(event) => editField(setTitle, event.target.value)} />\n </label>\n <span style={{ ...mutedStyle, fontSize: 11, whiteSpace: \"nowrap\" }}>{document.status === \"done\" ? \"Indicizzato\" : `Stato: ${document.status}`}</span>\n </div>\n {mode === \"read\" ? document.kind === \"file\" ? (\n <div style={{ ...panelStyle, padding: 18 }}><strong>File binario indicizzato</strong><p style={{ ...mutedStyle, marginBottom: 0 }}>Nome: {document.fileName ?? document.title}<br />Tipo: {document.mimeType ?? \"non specificato\"}<br />Supermemory conserva il file per la ricerca. Per sostituirlo, elimina questa voce e carica la versione aggiornata.</p></div>\n ) : document.kind === \"url\" ? <div style={{ ...panelStyle, padding: 18, overflowWrap: \"anywhere\" }}><strong>Pagina indicizzata</strong><p><a href={document.sourceUrl ?? content} target=\"_blank\" rel=\"noopener noreferrer\" style={{ textDecoration: \"underline\" }}>{document.sourceUrl ?? content}</a></p><p style={{ ...mutedStyle, marginBottom: 0 }}>Supermemory conserva l\u2019indice estratto; per aggiornare il contenuto salva di nuovo l\u2019URL.</p></div>\n : <div style={{ ...panelStyle, padding: 16, overflow: \"auto\" }}><MarkdownBlock content={content} /></div>\n : null}\n {mode === \"edit\" ? document.kind === \"file\" ? <div style={{ ...panelStyle, padding: 18 }}><strong>Il contenuto del file non \u00E8 modificabile in-place.</strong><p style={{ ...mutedStyle, marginBottom: 0 }}>Per aggiornarlo, elimina il documento e carica il nuovo file. Il file originale non \u00E8 recuperato dal catalogo Paperclip.</p></div>\n : <textarea style={{ ...inputStyle, minHeight: 380, resize: \"vertical\", fontFamily: \"var(--font-mono, ui-monospace, monospace)\", lineHeight: 1.6 }} value={content} onChange={(event) => editField(setContent, event.target.value)} />\n : null}\n {mode === \"raw\" ? <pre style={{ ...panelStyle, padding: 16, margin: 0, overflow: \"auto\", whiteSpace: \"pre-wrap\", overflowWrap: \"anywhere\", fontSize: 12 }}>{JSON.stringify({ ...document, title, content }, null, 2)}</pre> : null}\n <div style={{ display: \"flex\", gap: 8, justifyContent: \"space-between\", borderTop: \"1px solid var(--border)\", paddingTop: 12 }}>\n <button type=\"button\" style={{ ...secondaryButtonStyle, color: \"var(--destructive, #b91c1c)\" }} onClick={() => void removeDocument()} disabled={busy || !document.id}>Elimina documento</button>\n <div style={{ display: \"flex\", gap: 8 }}>\n {mode === \"edit\" ? <><button type=\"button\" style={secondaryButtonStyle} onClick={() => { setContent(document.content ?? \"\"); setTitle(document.title); setDirty(false); setMode(\"read\"); }}>Annulla</button><button type=\"button\" style={primaryButtonStyle} disabled={busy || !dirty} onClick={() => void persistText(document.kind === \"url\" ? \"url\" : \"text\")}>{busy ? \"Salvataggio\u2026\" : \"Salva modifiche\"}</button></> : null}\n </div>\n </div>\n </div>\n )}\n {busy ? <div aria-live=\"polite\" style={{ borderTop: \"1px solid var(--border)\", padding: \"8px 14px\", fontSize: 12, ...mutedStyle }}>Operazione in corso\u2026</div> : null}\n </section>\n </section>\n\n <footer style={{ ...mutedStyle, fontSize: 11, lineHeight: 1.6, marginTop: 12 }}>\n Le assegnazioni progetto sono controllate con <code>projectId</code> del run Paperclip e la allowlist degli agenti qui selezionati. Le informazioni restano separate per organizzazione. I namespace vengono creati da Supermemory al primo contenuto; disattivare un\u2019assegnazione revoca l\u2019accesso ma non cancella i documenti.\n </footer>\n </main>\n );\n}\n\nexport default { SupermemorySettingsPage, MemoryPage, MemorySidebarLink };\n", "import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nexport const PLUGIN_ID = \"paperclipai.supermemory\";\nexport const SEARCH_TOOL = \"search-approved-memory\";\nexport const SAVE_TOOL = \"submit-memory-candidate\";\nexport const MEMORY_SETTINGS_PAGE = \"supermemory-settings\";\nexport const MEMORY_PAGE = \"supermemory-memory\";\nexport const MEMORY_SIDEBAR = \"supermemory-sidebar\";\nexport const MEMORY_ROUTE = \"memory\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: PLUGIN_ID,\n apiVersion: 1,\n version: \"0.2.5\",\n minimumHostVersion: \"2026.1023.0\",\n displayName: \"Supermemory (self-hosted)\",\n description: \"Memory tools and an Owner-managed memory library for self-hosted Supermemory, with company-, agent-, and project-scoped access.\",\n author: \"Otomatik\",\n categories: [\"connector\", \"automation\", \"ui\"],\n capabilities: [\n \"agent.tools.register\",\n \"agents.read\",\n \"projects.read\",\n \"access.members.read\",\n \"http.outbound\",\n \"instance.settings.register\",\n \"secrets.read-ref\",\n \"ui.page.register\",\n \"ui.sidebar.register\",\n ],\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n instanceConfigSchema: {\n type: \"object\",\n properties: {\n gatewayUrl: {\n type: \"string\",\n title: \"Gateway Supermemory su Tailscale HTTPS\",\n description: \"URL HTTPS tailnet del gateway ACL e delle operazioni Owner. Esempio OTOMATIK: https://otomatik.tail77a9ab.ts.net:18443/mcp. Supermemory Local resta privato sul server.\",\n default: \"https://otomatik.tail77a9ab.ts.net:18443/mcp\",\n },\n localApiUrl: {\n type: \"string\",\n title: \"Legacy Supermemory Local API URL\",\n description: \"Legacy value retained for existing configurations; ignored since plugin 0.2.3. The Local API is reached only by the server-side gateway.\",\n },\n adminApiKeyRef: {\n // Paperclip persists a secret-ref format as an object binding, even\n // though the format marker historically describes a string picker.\n type: [\"string\", \"object\"],\n format: \"secret-ref\",\n title: \"Secret con la chiave master Supermemory Local\",\n description: \"Usata come credenziale per le route Owner del gateway Tailscale. Viene risolta solo dopo il controllo Owner o per una ricerca con namespace assegnato esplicitamente; non viene esposta nei prompt.\",\n },\n agentGrants: {\n type: \"array\",\n title: \"Authorized agents\",\n description: \"Only listed Paperclip agents can use the memory tools. Each one uses its own ACL gateway token secret, already bound to the same agent, company, and role.\",\n items: {\n type: \"object\",\n title: \"Agent grant\",\n required: [\"agentId\", \"tokenRef\"],\n properties: {\n agentId: {\n type: \"string\",\n title: \"Paperclip agent\",\n minLength: 1,\n },\n tokenRef: {\n type: [\"string\", \"object\"],\n format: \"secret-ref\",\n title: \"This agent's ACL token secret\",\n description: \"Select the Paperclip company secret containing only this agent's Supermemory ACL token.\",\n },\n },\n },\n default: [],\n },\n },\n },\n tools: [\n {\n name: SEARCH_TOOL,\n displayName: \"Search approved Supermemory\",\n description: \"Search this agent's explicitly authorized company/team compartments and any assigned agent/project namespaces. Project memory is available only when the Paperclip run is in that project and the agent is on its explicit allowlist. Do not search for credentials or personal records.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", minLength: 1, maxLength: 300 },\n searchMode: { type: \"string\", enum: [\"hybrid\", \"memories\", \"chunks\"], default: \"hybrid\" },\n limit: { type: \"integer\", minimum: 1, maximum: 5, default: 3 },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: SAVE_TOOL,\n displayName: \"Submit a Supermemory candidate\",\n description: \"Submit one durable, non-sensitive fact or decision to this agent's role staging compartment for human review. This does not publish it to shared approved memory. Never submit credentials, personal data, customer cases, legal/health/workplace records, or full chat transcripts.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n content: { type: \"string\", minLength: 20, maxLength: 1200 },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n ],\n ui: {\n slots: [\n {\n type: \"settingsPage\",\n id: MEMORY_SETTINGS_PAGE,\n displayName: \"Supermemory settings\",\n exportName: \"SupermemorySettingsPage\",\n },\n {\n type: \"page\",\n id: MEMORY_PAGE,\n displayName: \"Memory\",\n exportName: \"MemoryPage\",\n routePath: MEMORY_ROUTE,\n },\n {\n type: \"sidebar\",\n id: MEMORY_SIDEBAR,\n displayName: \"Memory\",\n exportName: \"MemorySidebarLink\",\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { useCallback, useEffect, useState, type CSSProperties, type DragEvent, type ChangeEvent, type FormEvent } from \"react\";\nimport {\n MarkdownBlock,\n useHostContext,\n useHostNavigation,\n usePluginAction,\n usePluginToast,\n type PluginSidebarProps,\n} from \"@paperclipai/plugin-sdk/ui\";\nimport { PLUGIN_ID } from \"../manifest.js\";\n\ntype AgentInfo = { id: string; name: string; role: string; status: string };\ntype ProjectInfo = { id: string; name: string; visibility?: string };\ntype SecretInfo = { id: string; name: string; key?: string; status?: string };\ntype SecretRef = { type: \"secret_ref\"; secretId: string };\ntype GrantForm = { key: string; agentId: string; tokenSecretId: string };\ntype GrantConfig = { agentId: string; tokenRef: SecretRef };\ntype PluginConfig = {\n gatewayUrl: string;\n adminApiKeyRef?: SecretRef;\n agentGrants: GrantConfig[];\n};\ntype NamespaceAssignment = {\n id: string;\n companyId: string;\n scopeType: \"agent\" | \"project\";\n scopeId: string;\n label: string;\n namespace: string;\n authorizedAgentIds: string[];\n};\ntype MemoryDocument = {\n id: string;\n namespace: string;\n assignmentId: string;\n title: string;\n kind: \"text\" | \"url\" | \"file\";\n mimeType: string | null;\n fileName: string | null;\n sourceUrl: string | null;\n status: string;\n content?: string | null;\n createdAt: string;\n updatedAt: string;\n};\ntype Catalog = {\n assignments: NamespaceAssignment[];\n documents: MemoryDocument[];\n agents: AgentInfo[];\n projects: ProjectInfo[];\n configured: boolean;\n gatewayUrl: string;\n};\ntype AgentAccess = { subjectType: \"agent\" | \"user\"; subjectId: string; subjectDisplayName?: string | null };\n\nconst DEFAULT_GATEWAY = \"https://otomatik.tail77a9ab.ts.net:18443/mcp\";\nconst LEGACY_GATEWAYS = new Set([\"http://127.0.0.1:6768/mcp\", \"http://localhost:6768/mcp\"]);\nconst CONFIG_PATH = `/api/plugins/${encodeURIComponent(PLUGIN_ID)}/config`;\nconst BINARY_MAX_BYTES = 6 * 1024 * 1024;\nconst TEXT_EXTENSIONS = new Set([\"txt\", \"md\", \"markdown\", \"html\", \"htm\", \"json\", \"csv\"]);\nconst BINARY_TYPES = new Map<string, string>([\n [\"pdf\", \"application/pdf\"], [\"png\", \"image/png\"], [\"jpg\", \"image/jpeg\"], [\"jpeg\", \"image/jpeg\"],\n [\"gif\", \"image/gif\"], [\"webp\", \"image/webp\"],\n]);\n\nasync function hostFetchJson<T>(path: string, init: RequestInit = {}): Promise<T> {\n const headers = new Headers(init.headers ?? undefined);\n if (init.body && !(init.body instanceof FormData) && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n const response = await fetch(path, { credentials: \"include\", ...init, headers });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = text || `Richiesta non riuscita (HTTP ${response.status}).`;\n try { message = String((JSON.parse(text) as { error?: string }).error ?? message); } catch { /* keep response text */ }\n throw new Error(message);\n }\n return await response.json() as T;\n}\n\nfunction secretId(value: unknown): string {\n return typeof value === \"object\" && value !== null && (value as { type?: unknown }).type === \"secret_ref\"\n && typeof (value as { secretId?: unknown }).secretId === \"string\" ? (value as { secretId: string }).secretId : \"\";\n}\n\nfunction displayError(value: unknown): string {\n if (value instanceof Error) return value.message;\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const error = value as { message?: unknown; code?: unknown; details?: unknown };\n if (typeof error.message === \"string\" && error.message.trim()) return error.message;\n if (typeof error.details === \"string\" && error.details.trim()) return error.details;\n if (typeof error.code === \"string\" && error.code.trim()) return `Operazione non riuscita (${error.code}).`;\n }\n return \"Operazione non riuscita. Riprova o controlla la configurazione del plugin.\";\n}\n\nfunction pluginConfig(configJson?: Record<string, unknown> | null): PluginConfig {\n const config = configJson ?? {};\n const grants: GrantConfig[] = Array.isArray(config.agentGrants) ? config.agentGrants.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") return [];\n const row = entry as Record<string, unknown>;\n if (typeof row.agentId !== \"string\" || !row.agentId) return [];\n const token = secretId(row.tokenRef);\n return token ? [{ agentId: row.agentId, tokenRef: { type: \"secret_ref\", secretId: token } }] : [];\n }) : [];\n const adminRef = secretId(config.adminApiKeyRef);\n return {\n gatewayUrl: typeof config.gatewayUrl === \"string\" && !LEGACY_GATEWAYS.has(config.gatewayUrl.trim()) ? config.gatewayUrl : DEFAULT_GATEWAY,\n ...(adminRef ? { adminApiKeyRef: { type: \"secret_ref\", secretId: adminRef } } : {}),\n agentGrants: grants,\n };\n}\n\nconst pageStyle: CSSProperties = { padding: 24, width: \"100%\", maxWidth: 1480, margin: \"0 auto\", color: \"var(--foreground)\" };\nconst panelStyle: CSSProperties = { border: \"1px solid var(--border)\", borderRadius: 10, background: \"var(--card, transparent)\" };\nconst mutedStyle: CSSProperties = { color: \"var(--muted-foreground)\" };\nconst inputStyle: CSSProperties = { width: \"100%\", border: \"1px solid var(--border)\", borderRadius: 7, background: \"var(--background)\", color: \"var(--foreground)\", padding: \"9px 11px\", minHeight: 38 };\nconst primaryButtonStyle: CSSProperties = { border: \"1px solid var(--primary)\", borderRadius: 7, background: \"var(--primary)\", color: \"var(--primary-foreground, white)\", padding: \"9px 14px\", fontWeight: 600, cursor: \"pointer\" };\nconst secondaryButtonStyle: CSSProperties = { border: \"1px solid var(--border)\", borderRadius: 7, background: \"transparent\", color: \"var(--foreground)\", padding: \"8px 12px\", cursor: \"pointer\" };\n\nexport function SupermemorySettingsPage() {\n const { companyId } = useHostContext();\n const [agents, setAgents] = useState<AgentInfo[]>([]);\n const [secrets, setSecrets] = useState<SecretInfo[]>([]);\n const [config, setConfig] = useState<PluginConfig>({ gatewayUrl: DEFAULT_GATEWAY, agentGrants: [] });\n const [grantRows, setGrantRows] = useState<GrantForm[]>([]);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n if (!companyId) { setLoading(false); setError(\"Seleziona un\u2019organizzazione.\"); return; }\n setLoading(true);\n const load = async () => {\n const [configResponse, agentResponse, secretResponse] = await Promise.all([\n hostFetchJson<{ configJson?: Record<string, unknown> | null } | null>(`${CONFIG_PATH}?companyId=${encodeURIComponent(companyId)}`),\n hostFetchJson<AgentInfo[]>(`/api/companies/${encodeURIComponent(companyId)}/agents`),\n hostFetchJson<SecretInfo[]>(`/api/companies/${encodeURIComponent(companyId)}/secrets`),\n ]);\n if (cancelled) return;\n const loadedConfig = pluginConfig(configResponse?.configJson);\n setConfig(loadedConfig);\n setGrantRows(loadedConfig.agentGrants.map((grant, index) => ({ key: `grant-${index}-${grant.agentId}`, agentId: grant.agentId, tokenSecretId: secretId(grant.tokenRef) })));\n setAgents(agentResponse.filter((agent) => ![\"terminated\", \"pending_approval\"].includes(agent.status)));\n setSecrets(secretResponse.filter((secret) => secret.status !== \"deleted\"));\n setError(null);\n };\n void load().catch((cause: unknown) => { if (!cancelled) setError(displayError(cause)); })\n .finally(() => { if (!cancelled) setLoading(false); });\n return () => { cancelled = true; };\n }, [companyId]);\n\n function updateGrant(index: number, patch: Partial<GrantForm>) {\n const next = grantRows.map((row, rowIndex) => rowIndex === index ? { ...row, ...patch } : row);\n setGrantRows(next);\n }\n\n function addGrant() {\n setGrantRows((current) => [...current, { key: `grant-new-${Date.now()}`, agentId: \"\", tokenSecretId: \"\" }]);\n }\n\n function removeGrant(index: number) {\n setGrantRows((current) => current.filter((_, rowIndex) => rowIndex !== index));\n }\n\n async function save(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!companyId) return;\n setSaving(true); setError(null); setSuccess(false);\n try {\n if (grantRows.some((row) => Boolean(row.agentId) !== Boolean(row.tokenSecretId))) throw new Error(\"Completa sia l\u2019agente sia il secret ACL per ogni riga.\");\n const cleaned = grantRows.filter((row) => row.agentId && row.tokenSecretId);\n if (cleaned.some((row, index) => cleaned.findIndex((candidate) => candidate.agentId === row.agentId) !== index)) {\n throw new Error(\"Ogni agente pu\u00F2 comparire una sola volta.\");\n }\n const nextConfig: Record<string, unknown> = {\n gatewayUrl: config.gatewayUrl.trim() || DEFAULT_GATEWAY,\n agentGrants: cleaned.map((row) => ({ agentId: row.agentId, tokenRef: { type: \"secret_ref\", secretId: row.tokenSecretId } })),\n };\n if (config.adminApiKeyRef?.secretId) nextConfig.adminApiKeyRef = config.adminApiKeyRef;\n await hostFetchJson(CONFIG_PATH, { method: \"POST\", body: JSON.stringify({ companyId, configJson: nextConfig }) });\n setConfig(pluginConfig(nextConfig));\n setGrantRows(cleaned.map((row, index) => ({ key: `grant-${index}-${row.agentId}`, agentId: row.agentId, tokenSecretId: row.tokenSecretId })));\n setSuccess(true);\n } catch (cause) { setError(displayError(cause)); }\n finally { setSaving(false); }\n }\n\n if (loading) return <main style={pageStyle}><p>Caricamento configurazione\u2026</p></main>;\n return (\n <main style={{ ...pageStyle, maxWidth: 1000, display: \"grid\", gap: 22 }}>\n <header>\n <h1 style={{ fontSize: 25, margin: 0, fontWeight: 650 }}>Configurazione Supermemory</h1>\n <p style={{ ...mutedStyle, marginTop: 8, maxWidth: 760 }}>Scegli gli agenti Paperclip dall\u2019elenco e collega per ciascuno il suo secret ACL. Le chiavi restano nei Secrets Paperclip: non vengono mostrate n\u00E9 copiate nei prompt.</p>\n </header>\n {error ? <div role=\"alert\" style={{ ...panelStyle, padding: 12, borderColor: \"var(--destructive, #b91c1c)\" }}>{error}</div> : null}\n {success ? <div role=\"status\" style={{ ...panelStyle, padding: 12 }}>Configurazione salvata.</div> : null}\n <form onSubmit={save} style={{ display: \"grid\", gap: 18 }}>\n <section style={{ ...panelStyle, padding: 18, display: \"grid\", gap: 14 }}>\n <h2 style={{ margin: 0, fontSize: 17 }}>Connessioni self-hosted</h2>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Gateway ACL Paperclip\n <input style={inputStyle} value={config.gatewayUrl} onChange={(event) => setConfig((current) => ({ ...current, gatewayUrl: event.target.value }))} />\n <span style={mutedStyle}>Default OTOMATIK: HTTPS Tailscale `otomatik.tail77a9ab.ts.net:18443`. L\u2019API Supermemory resta interna al server.</span>\n </label>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Secret con la chiave master Supermemory Local\n <select style={inputStyle} value={config.adminApiKeyRef?.secretId ?? \"\"} onChange={(event) => setConfig((current) => ({\n ...current,\n ...(event.target.value ? { adminApiKeyRef: { type: \"secret_ref\", secretId: event.target.value } } : { adminApiKeyRef: undefined }),\n }))}>\n <option value=\"\">Non configurato</option>\n {secrets.map((secret) => <option key={secret.id} value={secret.id}>{secret.name}{secret.key ? ` \u00B7 ${secret.key}` : \"\"}</option>)}\n </select>\n <span style={mutedStyle}>Serve per autenticare il gateway nelle azioni Owner della libreria Memory e nelle ricerche di namespace assegnati. Crea o importa il secret da <a href=\"/company/settings/secrets\" style={{ textDecoration: \"underline\" }}>Secrets</a>.</span>\n </label>\n <p style={{ ...mutedStyle, margin: 0, fontSize: 12 }}>Il plugin risolve la chiave master solo nelle azioni di gestione autorizzate all\u2019Owner e nelle ricerche di agenti gi\u00E0 autorizzati. Non \u00E8 esposta agli agenti come valore.</p>\n </section>\n\n <section style={{ ...panelStyle, padding: 18, display: \"grid\", gap: 14 }}>\n <div style={{ display: \"flex\", gap: 12, alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div><h2 style={{ margin: 0, fontSize: 17 }}>Agenti autorizzati</h2><p style={{ ...mutedStyle, margin: \"5px 0 0\", fontSize: 13 }}>Il selettore mostra il nome dell\u2019agente; Paperclip conserva l\u2019ID corretto senza chiederti di copiarlo.</p></div>\n <button type=\"button\" style={secondaryButtonStyle} onClick={addGrant}>\uFF0B Aggiungi agente</button>\n </div>\n {grantRows.length === 0 ? <p style={{ ...mutedStyle, margin: 0 }}>Nessun agente autorizzato.</p> : grantRows.map((row, index) => (\n <div key={row.key} style={{ ...panelStyle, padding: 14, display: \"grid\", gridTemplateColumns: \"minmax(180px, 1fr) minmax(180px, 1fr) auto\", gap: 12, alignItems: \"end\" }}>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Agente Paperclip\n <select style={inputStyle} value={row.agentId} onChange={(event) => updateGrant(index, { agentId: event.target.value })}>\n <option value=\"\">Scegli un agente\u2026</option>\n {agents.map((agent) => <option key={agent.id} value={agent.id}>{agent.name} \u00B7 {agent.role}</option>)}\n </select>\n </label>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Secret ACL individuale\n <select style={inputStyle} value={row.tokenSecretId} onChange={(event) => updateGrant(index, { tokenSecretId: event.target.value })}>\n <option value=\"\">Scegli un secret\u2026</option>\n {secrets.map((secret) => <option key={secret.id} value={secret.id}>{secret.name}{secret.key ? ` \u00B7 ${secret.key}` : \"\"}</option>)}\n </select>\n </label>\n <button type=\"button\" aria-label=\"Rimuovi agente\" style={secondaryButtonStyle} onClick={() => removeGrant(index)}>Rimuovi</button>\n </div>\n ))}\n <p style={{ ...mutedStyle, margin: 0, fontSize: 12 }}>Il token deve gi\u00E0 essere associato sul gateway a questo agente, alla stessa organizzazione Paperclip e al suo ruolo.</p>\n </section>\n <div><button type=\"submit\" style={primaryButtonStyle} disabled={saving}>{saving ? \"Salvataggio\u2026\" : \"Salva configurazione\"}</button></div>\n </form>\n </main>\n );\n}\n\nexport function MemorySidebarLink({ context }: PluginSidebarProps) {\n const navigation = useHostNavigation();\n if (!context.companyId) return null;\n const href = navigation.resolveHref(\"/memory\");\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n return (\n <a {...navigation.linkProps(\"/memory\")} aria-current={isActive ? \"page\" : undefined}\n className={`flex items-center gap-2.5 mx-2 rounded-lg px-2 py-1.5 pointer-coarse:py-1 text-(length:--text-compact) font-medium transition-colors ${isActive ? \"bg-sidebar-accent text-sidebar-accent-foreground\" : \"text-foreground/80 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"}`}>\n <span data-plugin-sidebar-icon=\"true\" aria-hidden=\"true\" className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9 3.5a3 3 0 0 0-3 3v.4a3 3 0 0 0-2.5 3v1.2a3 3 0 0 0 2.5 3v.4a3 3 0 0 0 3 3h1V3.5H9Z\" />\n <path d=\"M15 3.5a3 3 0 0 1 3 3v.4a3 3 0 0 1 2.5 3v1.2a3 3 0 0 1-2.5 3v.4a3 3 0 0 1-3 3h-1V3.5h1Z\" />\n <path d=\"M8 8h2m-2 5h2m4-5h2m-2 5h2\" />\n </svg>\n </span>\n <span data-plugin-sidebar-label=\"true\" className=\"flex-1 truncate\">Memory</span>\n </a>\n );\n}\n\nfunction readAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => reject(new Error(\"Non riesco a leggere il file selezionato.\"));\n reader.onload = () => {\n const result = typeof reader.result === \"string\" ? reader.result : \"\";\n const comma = result.indexOf(\",\");\n if (comma < 0) reject(new Error(\"Formato file non valido.\"));\n else resolve(result.slice(comma + 1));\n };\n reader.readAsDataURL(file);\n });\n}\n\nexport function MemoryPage() {\n const { companyId } = useHostContext();\n const toast = usePluginToast();\n const loadCatalog = usePluginAction(\"memory-catalog\");\n const saveAssignment = usePluginAction(\"memory-assignment-save\");\n const disableAssignment = usePluginAction(\"memory-assignment-disable\");\n const readDocument = usePluginAction(\"memory-document-read\");\n const saveText = usePluginAction(\"memory-text-save\");\n const uploadFile = usePluginAction(\"memory-file-upload\");\n const deleteDocument = usePluginAction(\"memory-document-delete\");\n const navigation = useHostNavigation();\n const [catalog, setCatalog] = useState<Catalog | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [activeAssignmentId, setActiveAssignmentId] = useState(\"\");\n const [activeDocumentKey, setActiveDocumentKey] = useState(\"\");\n const [document, setDocument] = useState<MemoryDocument | null>(null);\n const [title, setTitle] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [mode, setMode] = useState<\"read\" | \"edit\" | \"raw\">(\"read\");\n const [dirty, setDirty] = useState(false);\n const [scopeType, setScopeType] = useState<\"agent\" | \"project\">(\"project\");\n const [scopeId, setScopeId] = useState(\"\");\n const [allowedAgentIds, setAllowedAgentIds] = useState<string[]>([]);\n const [editingAssignmentId, setEditingAssignmentId] = useState(\"\");\n const [showAssignment, setShowAssignment] = useState(false);\n const [showUrlForm, setShowUrlForm] = useState(false);\n const [urlInput, setUrlInput] = useState(\"\");\n\n const refreshCatalog = useCallback(async (keepAssignmentId?: string) => {\n if (!companyId) return;\n const data = await loadCatalog({ companyId }) as Catalog;\n setCatalog(data);\n setActiveAssignmentId((current) => {\n const next = keepAssignmentId ?? current;\n return data.assignments.some((assignment) => assignment.id === next) ? next : data.assignments[0]?.id ?? \"\";\n });\n }, [companyId, loadCatalog]);\n\n useEffect(() => {\n let cancelled = false;\n if (!companyId) { setLoading(false); setError(\"Seleziona un\u2019organizzazione Paperclip.\"); return; }\n setLoading(true);\n void loadCatalog({ companyId }).then((result) => {\n if (cancelled) return;\n const data = result as Catalog;\n setCatalog(data);\n setActiveAssignmentId(data.assignments[0]?.id ?? \"\");\n setError(null);\n }).catch((cause: unknown) => {\n if (cancelled) return;\n setError(displayError(cause));\n }).finally(() => { if (!cancelled) setLoading(false); });\n return () => { cancelled = true; };\n }, [companyId, loadCatalog]);\n\n const activeAssignment = catalog?.assignments.find((assignment) => assignment.id === activeAssignmentId) ?? null;\n const editingAssignment = catalog?.assignments.find((assignment) => assignment.id === editingAssignmentId) ?? null;\n const visibleDocuments = (catalog?.documents ?? []).filter((item) => item.assignmentId === activeAssignmentId);\n const selectedDocumentSummary = visibleDocuments.find((item) => `${item.assignmentId}:${item.id}` === activeDocumentKey) ?? null;\n\n useEffect(() => {\n let cancelled = false;\n if (activeDocumentKey === \"draft\") return;\n if (!companyId || !selectedDocumentSummary) {\n setDocument(null); setTitle(\"\"); setContent(\"\"); setDirty(false);\n return;\n }\n setBusy(true);\n void readDocument({ companyId, assignmentId: selectedDocumentSummary.assignmentId, namespace: selectedDocumentSummary.namespace, documentId: selectedDocumentSummary.id })\n .then((result) => {\n if (cancelled) return;\n const next = result as MemoryDocument;\n setDocument(next); setTitle(next.title); setContent(next.content ?? \"\"); setDirty(false); setMode(\"read\");\n }).catch((cause: unknown) => { if (!cancelled) setError(displayError(cause)); })\n .finally(() => { if (!cancelled) setBusy(false); });\n return () => { cancelled = true; };\n }, [companyId, activeDocumentKey, selectedDocumentSummary?.id, selectedDocumentSummary?.namespace, selectedDocumentSummary?.assignmentId, readDocument]);\n\n function startTextDocument() {\n if (!activeAssignment) return;\n setDocument({ id: \"\", namespace: activeAssignment.namespace, assignmentId: activeAssignment.id, title: \"Nuovo documento.md\", kind: \"text\", mimeType: \"text/markdown\", fileName: null, sourceUrl: null, status: \"draft\", content: \"\", createdAt: \"\", updatedAt: \"\" });\n setTitle(\"Nuovo documento.md\"); setContent(\"\"); setActiveDocumentKey(\"draft\"); setDirty(true); setMode(\"edit\");\n }\n\n function editField(setter: (value: string) => void, value: string) {\n setter(value); setDirty(true);\n }\n\n async function persistText(kind: \"text\" | \"url\" = \"text\", nextContent = content, nextTitle = title, documentId = document?.id || null): Promise<boolean> {\n if (!companyId || !activeAssignment) { setError(\"Seleziona un namespace prima di salvare.\"); return false; }\n setBusy(true); setError(null);\n try {\n const result = await saveText({ companyId, assignmentId: activeAssignment.id, documentId, title: nextTitle, content: nextContent, kind }) as { document: MemoryDocument };\n const saved = result.document;\n await refreshCatalog(activeAssignment.id);\n setDocument({ ...saved, content: nextContent }); setTitle(saved.title); setContent(nextContent); setActiveDocumentKey(`${activeAssignment.id}:${saved.id}`); setDirty(false); setMode(\"read\");\n toast({ tone: \"success\", title: \"Memoria salvata\", body: \"Supermemory ha messo il contenuto in coda per l\u2019indicizzazione.\" });\n return true;\n } catch (cause) { const message = displayError(cause); setError(message); toast({ tone: \"error\", title: \"Salvataggio non riuscito\", body: message }); }\n finally { setBusy(false); }\n return false;\n }\n\n async function handleFile(file: File) {\n if (!companyId || !activeAssignment) { setError(\"Crea o seleziona prima un namespace.\"); return; }\n const extension = file.name.split(\".\").pop()?.toLowerCase() ?? \"\";\n setBusy(true); setError(null);\n try {\n if (TEXT_EXTENSIONS.has(extension)) {\n if (file.size > 1_000_000) throw new Error(\"Il testo non pu\u00F2 superare 1 MB.\");\n const fileText = await file.text();\n const result = await saveText({ companyId, assignmentId: activeAssignment.id, title: file.name, content: fileText, kind: \"text\" }) as { document: MemoryDocument };\n await refreshCatalog(activeAssignment.id);\n setActiveDocumentKey(`${activeAssignment.id}:${result.document.id}`);\n toast({ tone: \"success\", title: \"File aggiunto\", body: \"Supermemory ha messo il testo in coda per l\u2019indicizzazione.\" });\n return;\n }\n const expectedMime = BINARY_TYPES.get(extension);\n if (!expectedMime || expectedMime !== file.type) throw new Error(\"Formato non supportato. Local documenta PDF, PNG, JPG/JPEG, GIF e WebP, oltre ai file testuali .txt/.md/.html/.json/.csv.\");\n if (file.size > BINARY_MAX_BYTES) throw new Error(\"Il file binario non pu\u00F2 superare 6 MiB tramite il bridge Paperclip.\");\n const base64 = await readAsBase64(file);\n const result = await uploadFile({ companyId, assignmentId: activeAssignment.id, fileName: file.name, mimeType: file.type, base64 }) as { document: MemoryDocument };\n await refreshCatalog(activeAssignment.id);\n setActiveDocumentKey(`${activeAssignment.id}:${result.document.id}`);\n toast({ tone: \"success\", title: \"File caricato\", body: \"Supermemory ha messo il file in coda per l\u2019indicizzazione.\" });\n } catch (cause) { const message = displayError(cause); setError(message); toast({ tone: \"error\", title: \"Caricamento non riuscito\", body: message }); }\n finally { setBusy(false); }\n }\n\n function onFilesChange(event: ChangeEvent<HTMLInputElement>) {\n const file = event.target.files?.[0];\n if (file) void handleFile(file);\n event.target.value = \"\";\n }\n\n function onDrop(event: DragEvent<HTMLDivElement>) {\n event.preventDefault();\n if (!activeAssignment) { setError(\"Prima assegna o seleziona un namespace; poi puoi caricare il PDF.\"); return; }\n const file = event.dataTransfer.files.item(0);\n if (file) void handleFile(file);\n }\n\n async function addUrl(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n let parsed: URL;\n try { parsed = new URL(urlInput); } catch { setError(\"Inserisci un URL valido.\"); return; }\n const urlTitle = parsed.hostname + parsed.pathname;\n const saved = await persistText(\"url\", parsed.toString(), urlTitle.slice(0, 240), null);\n if (saved) { setShowUrlForm(false); setUrlInput(\"\"); }\n }\n\n async function saveAssignmentForm(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!companyId || !catalog) return;\n setBusy(true); setError(null);\n const source = scopeType === \"agent\" ? catalog.agents.find((agent) => agent.id === scopeId) : catalog.projects.find((project) => project.id === scopeId);\n if (!source) { setBusy(false); setError(\"Seleziona un agente o un progetto.\"); return; }\n const authorized = scopeType === \"agent\" ? [scopeId] : allowedAgentIds;\n try {\n const saved = await saveAssignment({ companyId, ...(editingAssignmentId ? { assignmentId: editingAssignmentId } : {}), scopeType, scopeId, label: source.name, authorizedAgentIds: authorized }) as NamespaceAssignment;\n await refreshCatalog(saved.id);\n setShowAssignment(false); setScopeId(\"\"); setAllowedAgentIds([]); setEditingAssignmentId(\"\");\n toast({ tone: \"success\", title: editingAssignmentId ? \"Assegnazione aggiornata\" : \"Namespace assegnato\", body: \"Il namespace esistente e i suoi documenti restano intatti; sono cambiati l\u2019ambito Paperclip e gli agenti autorizzati.\" });\n } catch (cause) { const message = displayError(cause); setError(message); }\n finally { setBusy(false); }\n }\n\n function editAssignment(assignment: NamespaceAssignment) {\n setEditingAssignmentId(assignment.id);\n setScopeType(assignment.scopeType);\n setScopeId(assignment.scopeId);\n setAllowedAgentIds(assignment.authorizedAgentIds);\n setShowAssignment(true);\n setError(null);\n }\n\n async function removeAssignment(assignment: NamespaceAssignment) {\n if (!companyId || !window.confirm(`Disattivare l\u2019accesso al namespace \u201C${assignment.label}\u201D? I documenti restano in Supermemory.`)) return;\n setBusy(true); setError(null);\n try { await disableAssignment({ companyId, assignmentId: assignment.id }); await refreshCatalog(); setActiveDocumentKey(\"\"); setDocument(null); }\n catch (cause) { setError(displayError(cause)); }\n finally { setBusy(false); }\n }\n\n async function removeDocument() {\n if (!companyId || !activeAssignment || !document?.id || !window.confirm(`Eliminare definitivamente \u201C${document.title}\u201D da Supermemory?`)) return;\n setBusy(true); setError(null);\n try { await deleteDocument({ companyId, assignmentId: activeAssignment.id, documentId: document.id }); await refreshCatalog(activeAssignment.id); setDocument(null); setActiveDocumentKey(\"\"); }\n catch (cause) { setError(displayError(cause)); }\n finally { setBusy(false); }\n }\n\n const namespacePreview = editingAssignment?.namespace ?? (companyId && scopeId ? `paperclip_${companyId}_${scopeType}_${scopeId}` : \"Il namespace verr\u00E0 generato con ID organizzazione + target\");\n\n if (loading) return <main style={pageStyle}><p>Caricamento Memory\u2026</p></main>;\n if (error && !catalog) return (\n <main style={{ ...pageStyle, maxWidth: 760 }}>\n <h1 style={{ fontSize: 24 }}>Memory</h1>\n <div role=\"alert\" style={{ ...panelStyle, padding: 18, display: \"grid\", gap: 10 }}>\n <strong>Accesso riservato all\u2019Owner dell\u2019organizzazione.</strong>\n <span style={mutedStyle}>{error}</span>\n <span style={mutedStyle}>I documenti e le assegnazioni non sono visibili agli altri membri dell\u2019organizzazione.</span>\n </div>\n </main>\n );\n\n return (\n <main style={pageStyle}>\n <header style={{ display: \"flex\", alignItems: \"start\", justifyContent: \"space-between\", gap: 16, marginBottom: 20 }}>\n <div>\n <h1 style={{ fontSize: 26, fontWeight: 650, margin: 0 }}>Memory</h1>\n <p style={{ ...mutedStyle, margin: \"6px 0 0\", maxWidth: 760 }}>Gestisci namespace e contenuti Supermemory per questa organizzazione. Questa libreria \u00E8 visibile solo agli Owner.</p>\n </div>\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\", justifyContent: \"end\" }}>\n <button type=\"button\" style={secondaryButtonStyle} onClick={() => {\n if (showAssignment && !editingAssignmentId) { setShowAssignment(false); return; }\n setEditingAssignmentId(\"\"); setScopeType(\"project\"); setScopeId(\"\"); setAllowedAgentIds([]); setShowAssignment(true);\n }}>\uFF0B Assegna namespace</button>\n <a {...navigation.linkProps(\"/company/settings/instance/plugins/paperclipai.supermemory\")} style={{ ...secondaryButtonStyle, textDecoration: \"none\" }}>Configurazione</a>\n </div>\n </header>\n\n {error ? <div role=\"alert\" style={{ ...panelStyle, padding: 12, marginBottom: 16, borderColor: \"var(--destructive, #b91c1c)\" }}>{error}</div> : null}\n {!catalog?.configured ? (\n <div style={{ ...panelStyle, padding: 14, marginBottom: 16 }}><strong>Chiave master non configurata.</strong><span style={{ ...mutedStyle, marginLeft: 6 }}>Le assegnazioni saranno salvate, ma l\u2019indicizzazione e la ricerca nei namespace restano disattivate finch\u00E9 non selezioni il secret Supermemory Local nella configurazione del plugin.</span></div>\n ) : null}\n\n {showAssignment ? (\n <form onSubmit={saveAssignmentForm} style={{ ...panelStyle, padding: 18, display: \"grid\", gap: 13, marginBottom: 18 }}>\n <h2 style={{ fontSize: 17, margin: 0 }}>{editingAssignmentId ? \"Modifica assegnazione del namespace\" : \"Assegna un namespace\"}</h2>\n <div style={{ display: \"grid\", gridTemplateColumns: \"minmax(160px, 220px) minmax(220px, 1fr)\", gap: 12 }}>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>Ambito\n <select style={inputStyle} value={scopeType} onChange={(event) => { setScopeType(event.target.value as \"agent\" | \"project\"); setScopeId(\"\"); setAllowedAgentIds([]); }}><option value=\"project\">Progetto</option><option value=\"agent\">Agente</option></select>\n </label>\n <label style={{ display: \"grid\", gap: 6, fontSize: 13 }}>{scopeType === \"project\" ? \"Progetto Paperclip\" : \"Agente Paperclip\"}\n <select style={inputStyle} value={scopeId} onChange={(event) => setScopeId(event.target.value)}>\n <option value=\"\">Scegli\u2026</option>\n {(scopeType === \"project\" ? catalog?.projects ?? [] : catalog?.agents ?? []).map((item) => <option key={item.id} value={item.id}>{item.name}</option>)}\n </select>\n </label>\n </div>\n {scopeType === \"project\" ? <fieldset style={{ border: \"1px solid var(--border)\", borderRadius: 8, padding: 12 }}>\n <legend style={{ fontSize: 13, padding: \"0 5px\" }}>Agenti autorizzati a leggere questo namespace</legend>\n <p style={{ ...mutedStyle, fontSize: 12, margin: \"0 0 8px\" }}>Elenco esplicito usato dal plugin insieme al projectId del run. Seleziona solo agenti autorizzati sul progetto in Paperclip.</p>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n {(catalog?.agents ?? []).map((agent) => <label key={agent.id} style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6, border: \"1px solid var(--border)\", borderRadius: 999, padding: \"5px 9px\", fontSize: 12 }}>\n <input type=\"checkbox\" checked={allowedAgentIds.includes(agent.id)} onChange={(event) => setAllowedAgentIds((current) => event.target.checked ? [...current, agent.id] : current.filter((id) => id !== agent.id))} />{agent.name}\n </label>)}\n </div>\n </fieldset> : null}\n <div style={{ ...mutedStyle, fontSize: 12 }}>{editingAssignmentId ? \"Il namespace fisico e i documenti non cambiano. Cambiano il progetto/agente associato e la allowlist di accesso.\" : \"Namespace isolato per questa organizzazione: Supermemory lo crea al primo contenuto.\"} <code style={{ overflowWrap: \"anywhere\" }}>{namespacePreview}</code></div>\n <div style={{ display: \"flex\", gap: 8 }}><button style={primaryButtonStyle} disabled={busy}>{busy ? \"Salvataggio\u2026\" : editingAssignmentId ? \"Salva modifiche\" : \"Salva assegnazione\"}</button><button type=\"button\" style={secondaryButtonStyle} onClick={() => { setShowAssignment(false); setEditingAssignmentId(\"\"); }}>Annulla</button></div>\n </form>\n ) : null}\n\n <section style={{ display: \"grid\", gridTemplateColumns: \"minmax(230px, 285px) minmax(0, 1fr)\", gap: 18, minHeight: 640 }}>\n <aside style={{ ...panelStyle, padding: 14, display: \"flex\", flexDirection: \"column\", minWidth: 0 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8, marginBottom: 10 }}>\n <h2 style={{ fontSize: 15, margin: 0 }}>Namespace e file</h2>\n <span style={{ ...mutedStyle, fontSize: 12 }}>{catalog?.assignments.length ?? 0}</span>\n </div>\n {!catalog?.assignments.length ? <div style={{ ...mutedStyle, fontSize: 13, padding: \"12px 2px\" }}>Nessun namespace. Usa \u201CAssegna namespace\u201D per iniziare.</div> : null}\n <div style={{ display: \"grid\", gap: 12, overflowY: \"auto\" }}>\n {(catalog?.assignments ?? []).map((assignment) => {\n const docs = catalog?.documents.filter((item) => item.assignmentId === assignment.id) ?? [];\n const selected = assignment.id === activeAssignmentId;\n return <div key={assignment.id} style={{ border: `1px solid ${selected ? \"var(--ring, var(--primary))\" : \"var(--border)\"}`, borderRadius: 8, overflow: \"hidden\" }}>\n <button type=\"button\" onClick={() => { setActiveAssignmentId(assignment.id); setActiveDocumentKey(\"\"); setDocument(null); }} style={{ width: \"100%\", textAlign: \"left\", background: selected ? \"var(--accent, rgba(127,127,127,.12))\" : \"transparent\", border: 0, color: \"var(--foreground)\", padding: 11, cursor: \"pointer\" }}>\n <strong style={{ display: \"block\", fontSize: 13 }}>{assignment.label}</strong>\n <span style={{ ...mutedStyle, display: \"block\", fontSize: 11, marginTop: 3 }}>{assignment.scopeType === \"project\" ? \"Progetto\" : \"Agente\"} \u00B7 {assignment.authorizedAgentIds.length} agenti</span>\n </button>\n {selected ? <div style={{ borderTop: \"1px solid var(--border)\", padding: 8, display: \"grid\", gap: 3 }}>\n {docs.map((item) => <button key={`${item.assignmentId}:${item.id}`} type=\"button\" onClick={() => setActiveDocumentKey(`${item.assignmentId}:${item.id}`)} style={{ display: \"flex\", gap: 7, alignItems: \"center\", border: 0, borderRadius: 5, padding: \"7px 5px\", textAlign: \"left\", background: activeDocumentKey === `${item.assignmentId}:${item.id}` ? \"var(--accent, rgba(127,127,127,.12))\" : \"transparent\", color: \"var(--foreground)\", cursor: \"pointer\", minWidth: 0 }}>\n <span aria-hidden=\"true\">{item.kind === \"url\" ? \"\u2197\" : item.kind === \"file\" ? \"\u25A7\" : \"\u25A4\"}</span><span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", flex: 1, fontSize: 12 }}>{item.title}</span>\n </button>)}\n {!docs.length ? <span style={{ ...mutedStyle, fontSize: 11, padding: \"4px 5px\" }}>Nessun contenuto</span> : null}\n <button type=\"button\" onClick={() => editAssignment(assignment)} style={{ ...secondaryButtonStyle, padding: \"5px 7px\", fontSize: 11, marginTop: 5 }}>Modifica assegnazione</button>\n <button type=\"button\" onClick={() => void removeAssignment(assignment)} style={{ ...secondaryButtonStyle, padding: \"5px 7px\", fontSize: 11, marginTop: 5 }}>Disattiva assegnazione</button>\n </div> : null}\n </div>;\n })}\n </div>\n {activeAssignment ? <div style={{ borderTop: \"1px solid var(--border)\", paddingTop: 12, marginTop: \"auto\", display: \"grid\", gap: 7 }}>\n <button type=\"button\" style={secondaryButtonStyle} onClick={startTextDocument} disabled={busy}>\uFF0B Nuovo testo</button>\n <button type=\"button\" style={secondaryButtonStyle} onClick={() => setShowUrlForm((current) => !current)} disabled={busy}>\uFF0B Aggiungi URL</button>\n <label style={{ ...secondaryButtonStyle, textAlign: \"center\", cursor: busy ? \"wait\" : \"pointer\" }}>\uFF0B Carica file\n <input type=\"file\" hidden disabled={busy} accept=\".pdf,.png,.jpg,.jpeg,.gif,.webp,.txt,.md,.markdown,.html,.htm,.json,.csv\" onChange={onFilesChange} />\n </label>\n </div> : null}\n </aside>\n\n <section style={{ ...panelStyle, minWidth: 0, display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}>\n <div onDragOver={(event) => event.preventDefault()} onDrop={onDrop} style={{ padding: 16, borderBottom: \"1px solid var(--border)\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"start\", gap: 14, flexWrap: \"wrap\" }}>\n <div style={{ minWidth: 0, flex: \"1 1 280px\" }}>\n <h2 style={{ fontSize: 16, margin: 0 }}>{activeAssignment?.label ?? \"Seleziona un namespace\"}</h2>\n {activeAssignment ? <code style={{ display: \"block\", marginTop: 5, fontSize: 11, color: \"var(--muted-foreground)\", overflowWrap: \"anywhere\" }}>{activeAssignment.namespace}</code> : null}\n </div>\n {document ? <div style={{ display: \"flex\", alignItems: \"center\", gap: 4, border: \"1px solid var(--border)\", borderRadius: 7, padding: 3 }}>\n {([\"read\", \"edit\", \"raw\"] as const).map((tab) => <button type=\"button\" key={tab} onClick={() => setMode(tab)} style={{ border: 0, borderRadius: 5, padding: \"6px 10px\", background: mode === tab ? \"var(--accent, rgba(127,127,127,.18))\" : \"transparent\", color: \"var(--foreground)\", cursor: \"pointer\", fontSize: 12 }}>{tab === \"read\" ? \"Leggi\" : tab === \"edit\" ? \"Modifica\" : \"Raw\"}</button>)}\n </div> : null}\n </div>\n\n {showUrlForm && activeAssignment ? <form onSubmit={addUrl} style={{ margin: 14, padding: 14, display: \"grid\", gap: 9, border: \"1px solid var(--border)\", borderRadius: 8 }}>\n <strong style={{ fontSize: 13 }}>Aggiungi pagina web</strong>\n <input style={inputStyle} type=\"url\" required placeholder=\"https://example.com/documentazione\" value={urlInput} onChange={(event) => setUrlInput(event.target.value)} />\n <span style={{ ...mutedStyle, fontSize: 12 }}>L\u2019URL viene passato a Supermemory Local. L\u2019estrazione web richiede Firecrawl configurato e invia la pagina al servizio Firecrawl.</span>\n <div style={{ display: \"flex\", gap: 8 }}><button style={primaryButtonStyle} disabled={busy}>Indicizza URL</button><button type=\"button\" style={secondaryButtonStyle} onClick={() => setShowUrlForm(false)}>Annulla</button></div>\n </form> : null}\n\n {!activeAssignment ? (\n <div style={{ flex: 1, display: \"grid\", placeItems: \"center\", minHeight: 420, padding: 28 }}>\n <div style={{ width: \"min(100%, 600px)\", border: \"1px dashed var(--border)\", borderRadius: 12, padding: 28, textAlign: \"center\" }}>\n <strong>Prima assegna un namespace</strong>\n <p style={{ ...mutedStyle, fontSize: 13, lineHeight: 1.55 }}>Non c\u2019\u00E8 uno spazio di memoria attivo in questa organizzazione. Assegna un progetto o un agente; poi selezionalo e carica il PDF.</p>\n <button type=\"button\" style={primaryButtonStyle} onClick={() => setShowAssignment(true)}>\uFF0B Assegna namespace</button>\n </div>\n </div>\n ) : !document ? (\n <div onDragOver={(event) => event.preventDefault()} onDrop={onDrop} style={{ flex: 1, display: \"grid\", placeItems: \"center\", minHeight: 420, padding: 28 }}>\n <div style={{ width: \"min(100%, 600px)\", border: \"1px dashed var(--border)\", borderRadius: 12, padding: 28, textAlign: \"center\" }}>\n <div style={{ fontSize: 28, marginBottom: 10 }}>\u21E7</div>\n <strong>Trascina qui un file</strong>\n <p style={{ ...mutedStyle, fontSize: 13, lineHeight: 1.55 }}>Testo: TXT, Markdown, HTML, JSON e CSV (max 1 MB). File binari verificati per Supermemory Local: PDF, PNG, JPG/JPEG, GIF e WebP (max 6 MiB in questa interfaccia). Puoi anche aggiungere un URL pubblico.</p>\n <span style={{ ...mutedStyle, fontSize: 12 }}>Office, audio e video sono supportati da alcune versioni del servizio hosted, ma non sono documentati per il server Local installato.</span>\n </div>\n </div>\n ) : (\n <div style={{ flex: 1, minHeight: 400, padding: 18, display: \"flex\", flexDirection: \"column\", gap: 14, overflow: \"auto\" }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"minmax(0, 1fr) auto\", gap: 12, alignItems: \"end\" }}>\n <label style={{ display: \"grid\", gap: 6, fontSize: 12 }}>Titolo\n <input style={inputStyle} value={title} readOnly={mode === \"read\" || mode === \"raw\" || document.kind === \"file\"} onChange={(event) => editField(setTitle, event.target.value)} />\n </label>\n <span style={{ ...mutedStyle, fontSize: 11, whiteSpace: \"nowrap\" }}>{document.status === \"done\" ? \"Indicizzato\" : `Stato: ${document.status}`}</span>\n </div>\n {mode === \"read\" ? document.kind === \"file\" ? (\n <div style={{ ...panelStyle, padding: 18 }}><strong>File binario indicizzato</strong><p style={{ ...mutedStyle, marginBottom: 0 }}>Nome: {document.fileName ?? document.title}<br />Tipo: {document.mimeType ?? \"non specificato\"}<br />Supermemory conserva il file per la ricerca. Per sostituirlo, elimina questa voce e carica la versione aggiornata.</p></div>\n ) : document.kind === \"url\" ? <div style={{ ...panelStyle, padding: 18, overflowWrap: \"anywhere\" }}><strong>Pagina indicizzata</strong><p><a href={document.sourceUrl ?? content} target=\"_blank\" rel=\"noopener noreferrer\" style={{ textDecoration: \"underline\" }}>{document.sourceUrl ?? content}</a></p><p style={{ ...mutedStyle, marginBottom: 0 }}>Supermemory conserva l\u2019indice estratto; per aggiornare il contenuto salva di nuovo l\u2019URL.</p></div>\n : <div style={{ ...panelStyle, padding: 16, overflow: \"auto\" }}><MarkdownBlock content={content} /></div>\n : null}\n {mode === \"edit\" ? document.kind === \"file\" ? <div style={{ ...panelStyle, padding: 18 }}><strong>Il contenuto del file non \u00E8 modificabile in-place.</strong><p style={{ ...mutedStyle, marginBottom: 0 }}>Per aggiornarlo, elimina il documento e carica il nuovo file. Il file originale non \u00E8 recuperato dal catalogo Paperclip.</p></div>\n : <textarea style={{ ...inputStyle, minHeight: 380, resize: \"vertical\", fontFamily: \"var(--font-mono, ui-monospace, monospace)\", lineHeight: 1.6 }} value={content} onChange={(event) => editField(setContent, event.target.value)} />\n : null}\n {mode === \"raw\" ? <pre style={{ ...panelStyle, padding: 16, margin: 0, overflow: \"auto\", whiteSpace: \"pre-wrap\", overflowWrap: \"anywhere\", fontSize: 12 }}>{JSON.stringify({ ...document, title, content }, null, 2)}</pre> : null}\n <div style={{ display: \"flex\", gap: 8, justifyContent: \"space-between\", borderTop: \"1px solid var(--border)\", paddingTop: 12 }}>\n <button type=\"button\" style={{ ...secondaryButtonStyle, color: \"var(--destructive, #b91c1c)\" }} onClick={() => void removeDocument()} disabled={busy || !document.id}>Elimina documento</button>\n <div style={{ display: \"flex\", gap: 8 }}>\n {mode === \"edit\" ? <><button type=\"button\" style={secondaryButtonStyle} onClick={() => { setContent(document.content ?? \"\"); setTitle(document.title); setDirty(false); setMode(\"read\"); }}>Annulla</button><button type=\"button\" style={primaryButtonStyle} disabled={busy || !dirty} onClick={() => void persistText(document.kind === \"url\" ? \"url\" : \"text\")}>{busy ? \"Salvataggio\u2026\" : \"Salva modifiche\"}</button></> : null}\n </div>\n </div>\n </div>\n )}\n {busy ? <div aria-live=\"polite\" style={{ borderTop: \"1px solid var(--border)\", padding: \"8px 14px\", fontSize: 12, ...mutedStyle }}>Operazione in corso\u2026</div> : null}\n </section>\n </section>\n\n <footer style={{ ...mutedStyle, fontSize: 11, lineHeight: 1.6, marginTop: 12 }}>\n Le assegnazioni progetto sono controllate con <code>projectId</code> del run Paperclip e la allowlist degli agenti qui selezionati. Le informazioni restano separate per organizzazione. I namespace vengono creati da Supermemory al primo contenuto; disattivare un\u2019assegnazione revoca l\u2019accesso ma non cancella i documenti.\n </footer>\n </main>\n );\n}\n\nexport default { SupermemorySettingsPage, MemoryPage, MemorySidebarLink };\n", "import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nexport const PLUGIN_ID = \"paperclipai.supermemory\";\nexport const SEARCH_TOOL = \"search-approved-memory\";\nexport const SAVE_TOOL = \"submit-memory-candidate\";\nexport const MEMORY_SETTINGS_PAGE = \"supermemory-settings\";\nexport const MEMORY_PAGE = \"supermemory-memory\";\nexport const MEMORY_SIDEBAR = \"supermemory-sidebar\";\nexport const MEMORY_ROUTE = \"memory\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: PLUGIN_ID,\n apiVersion: 1,\n version: \"0.2.7\",\n minimumHostVersion: \"2026.1023.0\",\n displayName: \"Supermemory (self-hosted)\",\n description: \"Memory tools and an Owner-managed memory library for self-hosted Supermemory, with company-, agent-, and project-scoped access.\",\n author: \"Otomatik\",\n categories: [\"connector\", \"automation\", \"ui\"],\n capabilities: [\n \"agent.tools.register\",\n \"agents.read\",\n \"projects.read\",\n \"access.members.read\",\n \"http.outbound\",\n \"instance.settings.register\",\n \"secrets.read-ref\",\n \"ui.page.register\",\n \"ui.sidebar.register\",\n ],\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n instanceConfigSchema: {\n type: \"object\",\n properties: {\n gatewayUrl: {\n type: \"string\",\n title: \"Gateway Supermemory su Tailscale HTTPS\",\n description: \"URL HTTPS tailnet del gateway ACL e delle operazioni Owner. Esempio OTOMATIK: https://otomatik.tail77a9ab.ts.net:18443/mcp. Supermemory Local resta privato sul server.\",\n default: \"https://otomatik.tail77a9ab.ts.net:18443/mcp\",\n },\n localApiUrl: {\n type: \"string\",\n title: \"Legacy Supermemory Local API URL\",\n description: \"Legacy value retained for existing configurations; ignored since plugin 0.2.3. The Local API is reached only by the server-side gateway.\",\n },\n adminApiKeyRef: {\n // Paperclip persists a secret-ref format as an object binding, even\n // though the format marker historically describes a string picker.\n type: [\"string\", \"object\"],\n format: \"secret-ref\",\n title: \"Secret con la chiave master Supermemory Local\",\n description: \"Usata come credenziale per le route Owner del gateway Tailscale. Viene risolta solo dopo il controllo Owner o per una ricerca con namespace assegnato esplicitamente; non viene esposta nei prompt.\",\n },\n agentGrants: {\n type: \"array\",\n title: \"Authorized agents\",\n description: \"Only listed Paperclip agents can use the memory tools. Each one uses its own ACL gateway token secret, already bound to the same agent, company, and role.\",\n items: {\n type: \"object\",\n title: \"Agent grant\",\n required: [\"agentId\", \"tokenRef\"],\n properties: {\n agentId: {\n type: \"string\",\n title: \"Paperclip agent\",\n minLength: 1,\n },\n tokenRef: {\n type: [\"string\", \"object\"],\n format: \"secret-ref\",\n title: \"This agent's ACL token secret\",\n description: \"Select the Paperclip company secret containing only this agent's Supermemory ACL token.\",\n },\n },\n },\n default: [],\n },\n },\n },\n tools: [\n {\n name: SEARCH_TOOL,\n displayName: \"Search approved Supermemory\",\n description: \"Search this agent's explicitly authorized company/team compartments and any assigned agent/project namespaces. Project memory is available only when the Paperclip run is in that project and the agent is on its explicit allowlist. Do not search for credentials or personal records.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", minLength: 1, maxLength: 300 },\n searchMode: { type: \"string\", enum: [\"hybrid\", \"memories\", \"chunks\"], default: \"hybrid\" },\n limit: { type: \"integer\", minimum: 1, maximum: 5, default: 3 },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: SAVE_TOOL,\n displayName: \"Submit a Supermemory candidate\",\n description: \"Submit one durable, non-sensitive fact or decision to this agent's role staging compartment for human review. This does not publish it to shared approved memory. Never submit credentials, personal data, customer cases, legal/health/workplace records, or full chat transcripts.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n content: { type: \"string\", minLength: 20, maxLength: 1200 },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n ],\n ui: {\n slots: [\n {\n type: \"settingsPage\",\n id: MEMORY_SETTINGS_PAGE,\n displayName: \"Supermemory settings\",\n exportName: \"SupermemorySettingsPage\",\n },\n {\n type: \"page\",\n id: MEMORY_PAGE,\n displayName: \"Memory\",\n exportName: \"MemoryPage\",\n routePath: MEMORY_ROUTE,\n },\n {\n type: \"sidebar\",\n id: MEMORY_SIDEBAR,\n displayName: \"Memory\",\n exportName: \"MemorySidebarLink\",\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["result"]
|
|
7
7
|
}
|