paperclip-plugin-supermemory-otomatik 0.2.8 → 0.2.10
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 +2 -2
- package/dist/manifest.js +1 -1
- package/dist/manifest.js.map +1 -1
- package/dist/ui/index.js +43 -4
- package/dist/ui/index.js.map +2 -2
- package/dist/worker.js +84 -26
- package/dist/worker.js.map +2 -2
- package/package.json +1 -1
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.10**.
|
|
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.
|
|
@@ -58,7 +58,7 @@ The page mirrors the Instructions layout: left content list, **Leggi / Modifica
|
|
|
58
58
|
|
|
59
59
|
Text and URL content can be edited and reindexed. Binary file contents cannot be retrieved into the editor; delete the catalog item and upload a replacement to update one. Office, audio and video formats appear in some hosted Supermemory documentation but are not documented for the installed Supermemory Local server, so this plugin does not offer them as verified Local formats.
|
|
60
60
|
|
|
61
|
-
PDFs are also text-extracted locally in the Paperclip worker and sent to Supermemory as linked text documents. This provides searchable content even when the Local binary PDF OCR provider cannot process a file. Deleting a PDF removes both its binary source and all linked extracted-text documents from Supermemory.
|
|
61
|
+
PDFs are also text-extracted locally in the Paperclip worker and sent to Supermemory as linked text documents. This provides searchable content even when the Local binary PDF OCR provider cannot process a file. Existing PDFs uploaded before this feature can be reindexed from their document card by selecting the same PDF file; this adds the extracted text without uploading a duplicate binary. Deleting a PDF removes both its binary source and all linked extracted-text documents from Supermemory.
|
|
62
62
|
|
|
63
63
|
The content is indexed as retrieval/reference material (`taskType: "superrag"`) rather than used to update a personal profile. Text, URL, file, search, update, and delete requests all pass through the ACL gateway. The plugin sends file bytes as JSON/base64 through Paperclip; the gateway converts them to multipart before forwarding them to Local. Supermemory returns an asynchronous status; `queued` means indexing has started, not finished.
|
|
64
64
|
|
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.10",
|
|
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.10\",\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
|
@@ -273,6 +273,7 @@ function MemoryPage() {
|
|
|
273
273
|
const readDocument = usePluginAction("memory-document-read");
|
|
274
274
|
const saveText = usePluginAction("memory-text-save");
|
|
275
275
|
const uploadFile = usePluginAction("memory-file-upload");
|
|
276
|
+
const reindexPdfText = usePluginAction("memory-file-reindex-text");
|
|
276
277
|
const deleteDocument = usePluginAction("memory-document-delete");
|
|
277
278
|
const navigation = useHostNavigation();
|
|
278
279
|
const pageRef = useRef(null);
|
|
@@ -457,6 +458,40 @@ function MemoryPage() {
|
|
|
457
458
|
setBusy(false);
|
|
458
459
|
}
|
|
459
460
|
}
|
|
461
|
+
async function reindexExistingPdf(file) {
|
|
462
|
+
if (!companyId || !activeAssignment || !document || document.kind !== "file") {
|
|
463
|
+
setError("Seleziona prima il PDF da reindicizzare.");
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
if (file.name !== (document.fileName ?? document.title) || file.type !== "application/pdf") {
|
|
467
|
+
setError("Seleziona lo stesso PDF gi\xE0 presente nella libreria.");
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
if (file.size > BINARY_MAX_BYTES) {
|
|
471
|
+
setError("Il PDF non pu\xF2 superare 6 MiB tramite il bridge Paperclip.");
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
setBusy(true);
|
|
475
|
+
setError(null);
|
|
476
|
+
try {
|
|
477
|
+
const base64 = await readAsBase64(file);
|
|
478
|
+
const result = await reindexPdfText({ companyId, assignmentId: activeAssignment.id, documentId: document.id, fileName: file.name, mimeType: file.type, base64 });
|
|
479
|
+
await refreshCatalog(activeAssignment.id);
|
|
480
|
+
setDocument((current) => current?.id === result.document.id ? { ...current, ...result.document } : result.document);
|
|
481
|
+
toast({ tone: "success", title: "Testo PDF indicizzato", body: "L\u2019estratto testuale \xE8 collegato al documento esistente e ricercabile in Supermemory." });
|
|
482
|
+
} catch (cause) {
|
|
483
|
+
const message = displayError(cause);
|
|
484
|
+
setError(message);
|
|
485
|
+
toast({ tone: "error", title: "Reindicizzazione non riuscita", body: message });
|
|
486
|
+
} finally {
|
|
487
|
+
setBusy(false);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
function onReindexPdfChange(event) {
|
|
491
|
+
const file = event.target.files?.[0];
|
|
492
|
+
if (file) void reindexExistingPdf(file);
|
|
493
|
+
event.target.value = "";
|
|
494
|
+
}
|
|
460
495
|
function onFilesChange(event) {
|
|
461
496
|
const file = event.target.files?.[0];
|
|
462
497
|
if (file) void handleFile(file);
|
|
@@ -712,7 +747,7 @@ function MemoryPage() {
|
|
|
712
747
|
/* @__PURE__ */ jsxs("div", { style: { flex: 1, minHeight: 0, overflow: "auto", display: mode === "edit" && document.kind !== "file" ? "flex" : "block" }, children: [
|
|
713
748
|
mode === "read" ? document.kind === "file" ? /* @__PURE__ */ jsxs("div", { style: { ...panelStyle, padding: 18 }, children: [
|
|
714
749
|
/* @__PURE__ */ jsx("strong", { children: document.indexedTextDocumentIds?.length ? "PDF ricevuto e testo estratto" : "File PDF conservato da Supermemory" }),
|
|
715
|
-
/* @__PURE__ */ jsxs("p", { style: { ...mutedStyle, marginBottom:
|
|
750
|
+
/* @__PURE__ */ jsxs("p", { style: { ...mutedStyle, marginBottom: 12 }, children: [
|
|
716
751
|
"Nome: ",
|
|
717
752
|
document.fileName ?? document.title,
|
|
718
753
|
/* @__PURE__ */ jsx("br", {}),
|
|
@@ -730,11 +765,15 @@ function MemoryPage() {
|
|
|
730
765
|
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
731
766
|
"Non \xE8 disponibile un indice testuale collegato. Stato del file: ",
|
|
732
767
|
document.binaryProcessingStatus ?? document.status,
|
|
733
|
-
";
|
|
768
|
+
"; la ricerca potrebbe non trovare il contenuto."
|
|
734
769
|
] }),
|
|
735
770
|
/* @__PURE__ */ jsx("br", {}),
|
|
736
|
-
"Per
|
|
737
|
-
] })
|
|
771
|
+
"Per sostituire il file, elimina questa voce e carica la versione aggiornata."
|
|
772
|
+
] }),
|
|
773
|
+
document.mimeType === "application/pdf" ? /* @__PURE__ */ jsxs("label", { style: { ...secondaryButtonStyle, display: "inline-flex", alignItems: "center", cursor: busy ? "wait" : "pointer" }, children: [
|
|
774
|
+
busy ? "Indicizzazione\u2026" : "Estrai / reindicizza testo dal PDF",
|
|
775
|
+
/* @__PURE__ */ jsx("input", { type: "file", hidden: true, disabled: busy, accept: ".pdf,application/pdf", onChange: onReindexPdfChange })
|
|
776
|
+
] }) : null
|
|
738
777
|
] }) : document.kind === "url" ? /* @__PURE__ */ jsxs("div", { style: { ...panelStyle, padding: 18, overflowWrap: "anywhere" }, children: [
|
|
739
778
|
/* @__PURE__ */ jsx("strong", { children: "Pagina indicizzata" }),
|
|
740
779
|
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("a", { href: document.sourceUrl ?? content, target: "_blank", rel: "noopener noreferrer", style: { textDecoration: "underline" }, children: document.sourceUrl ?? content }) }),
|
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, useLayoutEffect, useRef, 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 indexedTextDocumentIds?: string[];\n indexedTextStatus?: string | null;\n binaryProcessingStatus?: string | null;\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 pageRef = useRef<HTMLElement | null>(null);\n const [pageHeight, setPageHeight] = useState<number | null>(null);\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 useLayoutEffect(() => {\n const measure = () => {\n const page = pageRef.current;\n if (!page) return;\n const viewportHeight = window.visualViewport?.height ?? window.innerHeight;\n const top = Math.max(0, page.getBoundingClientRect().top);\n const available = Math.max(360, Math.floor(viewportHeight - top - 16));\n setPageHeight((current) => current === null || Math.abs(current - available) > 1 ? available : current);\n };\n measure();\n window.addEventListener(\"resize\", measure);\n window.addEventListener(\"scroll\", measure, true);\n window.visualViewport?.addEventListener(\"resize\", measure);\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n if (pageRef.current?.parentElement) observer?.observe(pageRef.current.parentElement);\n return () => {\n window.removeEventListener(\"resize\", measure);\n window.removeEventListener(\"scroll\", measure, true);\n window.visualViewport?.removeEventListener(\"resize\", measure);\n observer?.disconnect();\n };\n }, []);\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 ref={pageRef} style={{ ...pageStyle, boxSizing: \"border-box\", height: pageHeight ?? \"calc(100vh - 160px)\", minHeight: 0, display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}>\n <header style={{ display: \"flex\", alignItems: \"start\", justifyContent: \"space-between\", gap: 16, marginBottom: 20, flexShrink: 0 }}>\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)\", flexShrink: 0 }}>{error}</div> : null}\n {!catalog?.configured ? (\n <div style={{ ...panelStyle, padding: 14, marginBottom: 16, flexShrink: 0 }}><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, maxHeight: \"min(38vh, 340px)\", overflowY: \"auto\", flexShrink: 0 }}>\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, flex: 1, minHeight: 0, overflow: \"hidden\" }}>\n <aside style={{ ...panelStyle, padding: 14, display: \"flex\", flexDirection: \"column\", minWidth: 0, minHeight: 0, overflow: \"hidden\" }}>\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: \"flex\", flexDirection: \"column\", gap: 12, flex: 1, minHeight: 0, 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, minHeight: 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: 0, padding: 18, display: \"flex\", flexDirection: \"column\", gap: 14, overflow: \"hidden\" }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"minmax(0, 1fr) auto\", gap: 12, alignItems: \"end\", flexShrink: 0 }}>\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.kind === \"file\" && document.indexedTextDocumentIds?.length\n ? `Testo: ${document.indexedTextStatus ?? document.status}`\n : document.status === \"done\" ? \"Indicizzato\" : `Stato: ${document.status}`}</span>\n </div>\n <div style={{ flex: 1, minHeight: 0, overflow: \"auto\", display: mode === \"edit\" && document.kind !== \"file\" ? \"flex\" : \"block\" }}>\n {mode === \"read\" ? document.kind === \"file\" ? (\n <div style={{ ...panelStyle, padding: 18 }}><strong>{document.indexedTextDocumentIds?.length ? \"PDF ricevuto e testo estratto\" : \"File PDF conservato da Supermemory\"}</strong><p style={{ ...mutedStyle, marginBottom: 0 }}>Nome: {document.fileName ?? document.title}<br />Tipo: {document.mimeType ?? \"non specificato\"}<br />{document.indexedTextDocumentIds?.length\n ? <>Testo estratto e inviato a Supermemory in {document.indexedTextDocumentIds.length} documento/i. Stato dell\u2019indice testuale: {document.indexedTextStatus ?? document.status}. Stato del file originale: {document.binaryProcessingStatus ?? \"non disponibile\"}.</>\n : <>Non \u00E8 disponibile un indice testuale collegato. Stato del file: {document.binaryProcessingStatus ?? document.status}; finch\u00E9 l\u2019elaborazione non termina, la ricerca potrebbe non trovare il contenuto.</>}<br />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 }}><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 file aggiornato.</p></div>\n : <textarea style={{ ...inputStyle, flex: 1, minHeight: 0, resize: \"none\", 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, whiteSpace: \"pre-wrap\", overflowWrap: \"anywhere\", fontSize: 12 }}>{JSON.stringify({ ...document, title, content }, null, 2)}</pre> : null}\n </div>\n <div style={{ display: \"flex\", gap: 8, justifyContent: \"space-between\", borderTop: \"1px solid var(--border)\", paddingTop: 12, flexShrink: 0 }}>\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, flexShrink: 0 }}>\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.8\",\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, useLayoutEffect, useRef, 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 indexedTextDocumentIds?: string[];\n indexedTextStatus?: string | null;\n binaryProcessingStatus?: string | null;\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 reindexPdfText = usePluginAction(\"memory-file-reindex-text\");\n const deleteDocument = usePluginAction(\"memory-document-delete\");\n const navigation = useHostNavigation();\n const pageRef = useRef<HTMLElement | null>(null);\n const [pageHeight, setPageHeight] = useState<number | null>(null);\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 useLayoutEffect(() => {\n const measure = () => {\n const page = pageRef.current;\n if (!page) return;\n const viewportHeight = window.visualViewport?.height ?? window.innerHeight;\n const top = Math.max(0, page.getBoundingClientRect().top);\n const available = Math.max(360, Math.floor(viewportHeight - top - 16));\n setPageHeight((current) => current === null || Math.abs(current - available) > 1 ? available : current);\n };\n measure();\n window.addEventListener(\"resize\", measure);\n window.addEventListener(\"scroll\", measure, true);\n window.visualViewport?.addEventListener(\"resize\", measure);\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n if (pageRef.current?.parentElement) observer?.observe(pageRef.current.parentElement);\n return () => {\n window.removeEventListener(\"resize\", measure);\n window.removeEventListener(\"scroll\", measure, true);\n window.visualViewport?.removeEventListener(\"resize\", measure);\n observer?.disconnect();\n };\n }, []);\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 async function reindexExistingPdf(file: File) {\n if (!companyId || !activeAssignment || !document || document.kind !== \"file\") { setError(\"Seleziona prima il PDF da reindicizzare.\"); return; }\n if (file.name !== (document.fileName ?? document.title) || file.type !== \"application/pdf\") { setError(\"Seleziona lo stesso PDF gi\u00E0 presente nella libreria.\"); return; }\n if (file.size > BINARY_MAX_BYTES) { setError(\"Il PDF non pu\u00F2 superare 6 MiB tramite il bridge Paperclip.\"); return; }\n setBusy(true); setError(null);\n try {\n const base64 = await readAsBase64(file);\n const result = await reindexPdfText({ companyId, assignmentId: activeAssignment.id, documentId: document.id, fileName: file.name, mimeType: file.type, base64 }) as { document: MemoryDocument };\n await refreshCatalog(activeAssignment.id);\n setDocument((current) => current?.id === result.document.id ? { ...current, ...result.document } : result.document);\n toast({ tone: \"success\", title: \"Testo PDF indicizzato\", body: \"L\u2019estratto testuale \u00E8 collegato al documento esistente e ricercabile in Supermemory.\" });\n } catch (cause) { const message = displayError(cause); setError(message); toast({ tone: \"error\", title: \"Reindicizzazione non riuscita\", body: message }); }\n finally { setBusy(false); }\n }\n\n function onReindexPdfChange(event: ChangeEvent<HTMLInputElement>) {\n const file = event.target.files?.[0];\n if (file) void reindexExistingPdf(file);\n event.target.value = \"\";\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 ref={pageRef} style={{ ...pageStyle, boxSizing: \"border-box\", height: pageHeight ?? \"calc(100vh - 160px)\", minHeight: 0, display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}>\n <header style={{ display: \"flex\", alignItems: \"start\", justifyContent: \"space-between\", gap: 16, marginBottom: 20, flexShrink: 0 }}>\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)\", flexShrink: 0 }}>{error}</div> : null}\n {!catalog?.configured ? (\n <div style={{ ...panelStyle, padding: 14, marginBottom: 16, flexShrink: 0 }}><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, maxHeight: \"min(38vh, 340px)\", overflowY: \"auto\", flexShrink: 0 }}>\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, flex: 1, minHeight: 0, overflow: \"hidden\" }}>\n <aside style={{ ...panelStyle, padding: 14, display: \"flex\", flexDirection: \"column\", minWidth: 0, minHeight: 0, overflow: \"hidden\" }}>\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: \"flex\", flexDirection: \"column\", gap: 12, flex: 1, minHeight: 0, 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, minHeight: 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: 0, padding: 18, display: \"flex\", flexDirection: \"column\", gap: 14, overflow: \"hidden\" }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"minmax(0, 1fr) auto\", gap: 12, alignItems: \"end\", flexShrink: 0 }}>\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.kind === \"file\" && document.indexedTextDocumentIds?.length\n ? `Testo: ${document.indexedTextStatus ?? document.status}`\n : document.status === \"done\" ? \"Indicizzato\" : `Stato: ${document.status}`}</span>\n </div>\n <div style={{ flex: 1, minHeight: 0, overflow: \"auto\", display: mode === \"edit\" && document.kind !== \"file\" ? \"flex\" : \"block\" }}>\n {mode === \"read\" ? document.kind === \"file\" ? (\n <div style={{ ...panelStyle, padding: 18 }}><strong>{document.indexedTextDocumentIds?.length ? \"PDF ricevuto e testo estratto\" : \"File PDF conservato da Supermemory\"}</strong><p style={{ ...mutedStyle, marginBottom: 12 }}>Nome: {document.fileName ?? document.title}<br />Tipo: {document.mimeType ?? \"non specificato\"}<br />{document.indexedTextDocumentIds?.length\n ? <>Testo estratto e inviato a Supermemory in {document.indexedTextDocumentIds.length} documento/i. Stato dell\u2019indice testuale: {document.indexedTextStatus ?? document.status}. Stato del file originale: {document.binaryProcessingStatus ?? \"non disponibile\"}.</>\n : <>Non \u00E8 disponibile un indice testuale collegato. Stato del file: {document.binaryProcessingStatus ?? document.status}; la ricerca potrebbe non trovare il contenuto.</>}<br />Per sostituire il file, elimina questa voce e carica la versione aggiornata.</p>\n {document.mimeType === \"application/pdf\" ? <label style={{ ...secondaryButtonStyle, display: \"inline-flex\", alignItems: \"center\", cursor: busy ? \"wait\" : \"pointer\" }}>{busy ? \"Indicizzazione\u2026\" : \"Estrai / reindicizza testo dal PDF\"}<input type=\"file\" hidden disabled={busy} accept=\".pdf,application/pdf\" onChange={onReindexPdfChange} /></label> : null}\n </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 }}><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 file aggiornato.</p></div>\n : <textarea style={{ ...inputStyle, flex: 1, minHeight: 0, resize: \"none\", 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, whiteSpace: \"pre-wrap\", overflowWrap: \"anywhere\", fontSize: 12 }}>{JSON.stringify({ ...document, title, content }, null, 2)}</pre> : null}\n </div>\n <div style={{ display: \"flex\", gap: 8, justifyContent: \"space-between\", borderTop: \"1px solid var(--border)\", paddingTop: 12, flexShrink: 0 }}>\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, flexShrink: 0 }}>\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.10\",\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
|
}
|