@agent-native/core 0.128.2 → 0.128.4
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/corpus/core/CHANGELOG.md +13 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/chat/legacy-chart-shorthand.tsx +479 -0
- package/corpus/core/src/client/chat/markdown-renderer.tsx +23 -3
- package/corpus/core/src/extensions/actions.ts +1 -1
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +12 -0
- package/corpus/templates/analytics/actions/generate-chart.ts +2 -2
- package/corpus/templates/chat/README.md +2 -0
- package/dist/client/chat/legacy-chart-shorthand.d.ts +29 -0
- package/dist/client/chat/legacy-chart-shorthand.d.ts.map +1 -0
- package/dist/client/chat/legacy-chart-shorthand.js +330 -0
- package/dist/client/chat/legacy-chart-shorthand.js.map +1 -0
- package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
- package/dist/client/chat/markdown-renderer.js +8 -2
- package/dist/client/chat/markdown-renderer.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/extensions/actions.js +1 -1
- package/dist/extensions/actions.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
- package/dist/provider-api/actions/provider-api.d.ts +8 -8
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/templates/chat/README.md +2 -0
- package/package.json +3 -3
- package/src/client/chat/legacy-chart-shorthand.tsx +479 -0
- package/src/client/chat/markdown-renderer.tsx +23 -3
- package/src/extensions/actions.ts +1 -1
- package/src/templates/chat/README.md +2 -0
- package/corpus/core/src/cli/sync-builder-starter-manifest.ts +0 -631
- package/dist/cli/sync-builder-starter-manifest.d.ts +0 -79
- package/dist/cli/sync-builder-starter-manifest.d.ts.map +0 -1
- package/dist/cli/sync-builder-starter-manifest.js +0 -426
- package/dist/cli/sync-builder-starter-manifest.js.map +0 -1
- package/src/cli/sync-builder-starter-manifest.ts +0 -631
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/extensions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER } from \"../action-ui.js\";\nimport { AgentActionStopError, type ActionRunContext } from \"../action.js\";\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport type { AgentChatAttachment } from \"../agent/types.js\";\nimport { writeAppState } from \"../application-state/script-helpers.js\";\nimport { getDbExec, isPostgres } from \"../db/client.js\";\nimport { readResource } from \"../resources/script-helpers.js\";\nimport {\n getRequestOrgId,\n getRequestRunContext,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport { resolveAccess } from \"../sharing/access.js\";\nimport {\n readWorkspaceFile,\n type WorkspaceFilesScope,\n} from \"../workspace-files/store.js\";\nimport { ExtensionContentEditError } from \"./content-patch.js\";\nimport type {\n ExtensionContentEdit,\n ExtensionLegacyPatch,\n} from \"./content-patch.js\";\nimport {\n getLocalExtension,\n isLocalExtensionRow,\n listLocalExtensions,\n type LocalExtensionRow,\n} from \"./local.js\";\nimport { extensionPath } from \"./path.js\";\nimport {\n addExtensionSlotTarget,\n installExtensionSlot,\n uninstallExtensionSlot,\n listExtensionsForSlot,\n listSlotsForExtension,\n} from \"./slots/store.js\";\nimport {\n createExtension,\n deleteExtension,\n ensureExtensionsTables,\n findRecentDuplicateExtension,\n getHiddenExtensionIdsForCurrentUser,\n getExtension,\n getExtensionHistoryVersion,\n globalHideExtension,\n globalUnhideExtension,\n hideExtension,\n listExtensionHistory,\n listExtensions,\n notifyExtensionChangeForResource,\n restoreExtensionHistoryVersion,\n unhideExtension,\n updateExtension,\n updateExtensionContent,\n type ExtensionHistoryDetail,\n type ExtensionHistoryEntry,\n type ExtensionRow,\n} from \"./store.js\";\n\n// A 200k extension body containing JSON-sensitive HTML/JS characters (quotes,\n// backslashes, and newlines) expands to about 400k characters when pretty-JSON\n// serialized by the agent loop. A history detail can carry the current and\n// previous bodies plus both bodies again in its line diff (about 1.6M chars in\n// the same worst-common-case fixture). These caps add roughly 25% headroom for\n// the surrounding metadata and indentation while still bounding tool context.\nconst GET_EXTENSION_MAX_RESULT_CHARS = 500_000;\nconst GET_EXTENSION_HISTORY_MAX_RESULT_CHARS = 2_000_000;\n\nexport function createExtensionActionEntries(): Record<string, ActionEntry> {\n return {\n \"list-extensions\": {\n tool: {\n description:\n \"List extensions visible in the current user's Extensions list/sidebar. Use this for browsing or when you only know a display name. If <current-screen> or <current-url> already contains extensionId for the current extension, use get-extension or update-extension with that id directly instead of listing. Do not query the legacy tools table directly for extension management.\",\n parameters: {\n type: \"object\",\n properties: {\n search: {\n type: \"string\",\n description:\n \"Optional case-insensitive filter matched against id, name, description, and owner email. Example: Connect Zoom.\",\n },\n includeHidden: {\n type: \"boolean\",\n description:\n \"Include extensions the current user has hidden from their list. Defaults to false.\",\n },\n includeGloballyHidden: {\n type: \"boolean\",\n description:\n \"Include extensions an admin/owner has globally hidden from everyone (via global-hide-extension). Defaults to false. Use this to find ids to unhide for everyone.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full Alpine.js content. Defaults to false to keep results concise.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum results to return. Defaults to 100.\",\n },\n },\n },\n },\n run: async (args) => {\n const includeHidden = coerceBoolean(args?.includeHidden);\n const includeGloballyHidden = coerceBoolean(\n args?.includeGloballyHidden,\n );\n const includeContent = coerceBoolean(args?.includeContent);\n const search = String(args?.search ?? \"\")\n .trim()\n .toLowerCase();\n const limit = coerceLimit(args?.limit);\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n\n let rows: Array<ExtensionRow | LocalExtensionRow> =\n await listExtensions({\n includeHidden,\n includeGloballyHidden,\n });\n const localRows = await listLocalExtensions();\n const allRows: Array<ExtensionRow | LocalExtensionRow> = [\n ...rows,\n ...localRows,\n ];\n if (search) {\n rows = allRows.filter((row) =>\n [row.id, row.name, row.description, row.ownerEmail]\n .join(\"\\n\")\n .toLowerCase()\n .includes(search),\n );\n } else {\n rows = allRows;\n }\n\n rows = rows.slice(0, limit);\n const extensions = await Promise.all(\n rows.map((row) => summarizeExtension(row, hiddenIds, includeContent)),\n );\n return {\n ok: true,\n count: extensions.length,\n extensions,\n };\n },\n readOnly: true,\n },\n\n \"get-extension\": {\n tool: {\n description:\n \"Get one existing extension by id. Use this when <current-screen> or <current-url> contains extensionId for the current extension; do not call list-extensions just to rediscover that id. Defaults to including the full Alpine.js content once per run so you can make a targeted update-extension edit; repeated unchanged reads return compact metadata unless forceContent=true.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to read. Prefer the extensionId from <current-screen> or <current-url> when the user refers to the current extension.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full Alpine.js content. Defaults to true for targeted edits.\",\n },\n forceContent: {\n type: \"boolean\",\n description:\n \"Return full content even if this run already read the same unchanged body. Use sparingly; prefer update-extension edits after the first read.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const includeContent =\n args?.includeContent === undefined\n ? true\n : coerceBoolean(args.includeContent);\n const forceContent = coerceBoolean(args?.forceContent);\n const localExtension = await getLocalExtension(id);\n if (localExtension) {\n return {\n ok: true,\n extension: await summarizeExtensionForAgentRead(\n localExtension,\n new Set(),\n includeContent,\n forceContent,\n ),\n };\n }\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n extension: await summarizeExtensionForAgentRead(\n extension,\n hiddenIds,\n includeContent,\n forceContent,\n ),\n };\n },\n // Result is JSON including the full Alpine content; account for JSON\n // escaping and envelope metadata instead of matching the source cap.\n maxResultChars: GET_EXTENSION_MAX_RESULT_CHARS,\n readOnly: true,\n },\n\n \"list-extension-history\": {\n tool: {\n description:\n \"List saved history snapshots for one extension. Use this when the user asks what changed, wants a changelog, or wants to pick an older version to restore. If the user is viewing the extension, use the extensionId from <current-screen> or <current-url>.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id whose history should be listed.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum versions to return. Defaults to 50.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full HTML content for each version. Defaults to false.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionReadonlyHistoryMessage(id);\n if (localMessage) return localMessage;\n const history = await listExtensionHistory(id, {\n limit:\n args?.limit === undefined ? undefined : coerceLimit(args.limit),\n includeContent: coerceBoolean(args?.includeContent),\n });\n return {\n ok: true,\n count: history.length,\n history,\n };\n },\n readOnly: true,\n },\n\n \"get-extension-history-version\": {\n tool: {\n description:\n \"Get one extension history version with its previous-version diff. Use after list-extension-history when the user wants to inspect exactly what changed. Full HTML bodies are omitted by default; set includeContent=true only when restoring or manually comparing full source.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id whose history version should be read.\",\n },\n version: {\n type: \"number\",\n description: \"History version number to inspect.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full HTML for the current and previous versions. Defaults to false to keep agent context compact.\",\n },\n },\n required: [\"id\", \"version\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionReadonlyHistoryMessage(id);\n if (localMessage) return localMessage;\n const version = Number(args?.version);\n if (!Number.isInteger(version) || version < 1) {\n return \"Error: version must be a positive integer.\";\n }\n const detail = await getExtensionHistoryVersion(id, version);\n if (!detail) {\n return `Error: extension history version not found: ${id}#${version}`;\n }\n return {\n ok: true,\n ...compactExtensionHistoryDetail(\n detail,\n coerceBoolean(args?.includeContent),\n ),\n };\n },\n // With includeContent, history can contain current + previous source and\n // repeat both in the diff, so it needs more headroom than get-extension.\n maxResultChars: GET_EXTENSION_HISTORY_MAX_RESULT_CHARS,\n readOnly: true,\n },\n\n \"render-inline-extension\": {\n tool: {\n description:\n \"Render a one-time, transient sandboxed Alpine.js mini-app directly inside the chat. Use this for generated UI that should answer the current turn inline without saving anything to the Extensions view: calculators, adjustable controls, knobs, pickers, visualizers, temporary dashboards, and interactive results. The content must be a self-contained Alpine.js HTML body snippet that can use appAction(), appFetch(), dbQuery(), extensionFetch(), extensionData, agentNative.ui.output(value, opts?), and agentNative.chat.send()/sendToAgentChat(). Use appAction() or extensionData for writes; dbQuery() is for read-only inspection of known app SQL tables. Use agentNative.ui.output for passive current values from knobs, sliders, and selections; it writes application state at inline-ui:<inline extension id>:output, which the agent can read later with readAppState when the user says to use that value. Use agentNative.chat.send for visible submit/apply actions. For transient UIs, extensionData is browser-local throwaway state; use application_state/appFetch, appAction, ui.output, or chat.send for anything the agent or app must observe. Use semantic Tailwind colors (bg-background, text-foreground, bg-primary, etc.) so it inherits the parent app theme. Use create-extension instead when the user wants the UI saved or reusable.\",\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"Short display name for the inline UI.\",\n },\n description: {\n type: \"string\",\n description: \"One-sentence summary of what the inline UI does.\",\n },\n content: {\n type: \"string\",\n description:\n \"Self-contained Alpine.js HTML body snippet. Do not include a full app build, React code, or source files. Required unless contentFromAttachment is set.\",\n },\n contentFromAttachment: {\n type: \"string\",\n description:\n 'Render a pasted/attached HTML file verbatim without re-typing it. Set to an attachment name or \"latest\".',\n },\n context: {\n type: \"string\",\n description:\n \"Optional JSON object passed to the iframe as slotContext for initial inputs from chat.\",\n },\n initialHeight: {\n type: \"number\",\n description:\n \"Optional initial iframe height in pixels before auto-resize reports. Defaults to 260.\",\n },\n },\n required: [\"name\"],\n },\n },\n chatUI: {\n renderer: ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER,\n title: \"Inline extension\",\n },\n maxResultChars: 220_000,\n readOnly: true,\n run: async (args, ctx) => {\n const name = String(args?.name ?? \"\").trim();\n if (!name) return \"Error: name is required.\";\n const resolved = resolveExtensionContent(args, ctx);\n if (\"error\" in resolved) return resolved.error;\n const content = resolved.content.trim();\n if (!content) return \"Error: content is required.\";\n const description = String(args?.description ?? \"\").trim();\n const id = `inline-${Date.now().toString(36)}-${Math.random()\n .toString(36)\n .slice(2, 8)}`;\n return {\n ok: true,\n inlineExtension: {\n mode: \"transient\",\n id,\n name,\n description,\n content,\n context: parseInlineContext(args?.context),\n initialHeight: coerceInlineHeight(args?.initialHeight),\n },\n next: \"Rendered inline in chat only. It is not saved in the Extensions view.\",\n };\n },\n },\n\n \"show-extension-inline\": {\n tool: {\n description:\n \"Render an existing saved extension inline in the chat. Use this when the user asks to load, reopen, reuse, or show a saved extension/widget/dashboard/calculator/mini-app in the conversation. Inline extensions can expose passive current values through agentNative.ui.output(value, opts?), which writes application state at inline-ui:<extension id>:output for the agent to read later with readAppState. Pass id when known; otherwise pass a search string and the action will use the best visible extension match.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to render inline.\",\n },\n search: {\n type: \"string\",\n description:\n \"Fallback search matched against id, name, description, and owner email when id is unknown.\",\n },\n context: {\n type: \"string\",\n description:\n \"Optional JSON object passed to the iframe as slotContext for chat-provided inputs.\",\n },\n initialHeight: {\n type: \"number\",\n description:\n \"Optional initial iframe height in pixels before auto-resize reports. Defaults to 260.\",\n },\n },\n },\n },\n chatUI: {\n renderer: ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER,\n title: \"Inline extension\",\n },\n readOnly: true,\n run: async (args) => {\n let id = String(args?.id ?? \"\").trim();\n const search = String(args?.search ?? \"\")\n .trim()\n .toLowerCase();\n\n if (!id && search) {\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n const rows: Array<ExtensionRow | LocalExtensionRow> = [\n ...(await listExtensions({\n includeHidden: false,\n includeGloballyHidden: false,\n })),\n ...(await listLocalExtensions()),\n ];\n const match = rows.find((row) =>\n [row.id, row.name, row.description, row.ownerEmail]\n .join(\"\\n\")\n .toLowerCase()\n .includes(search),\n );\n if (match) {\n id = match.id;\n } else {\n return {\n ok: false,\n error: `No extension matched \"${args?.search}\".`,\n available: await Promise.all(\n rows\n .slice(0, 10)\n .map((row) => summarizeExtension(row, hiddenIds, false)),\n ),\n };\n }\n }\n\n if (!id) return \"Error: provide id or search.\";\n\n const localExtension = await getLocalExtension(id);\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n if (localExtension) {\n const summary = await summarizeExtension(\n localExtension,\n hiddenIds,\n false,\n );\n return {\n ok: true,\n inlineExtension: {\n mode: \"persisted\",\n id: summary.id,\n name: summary.name,\n description: summary.description,\n path: summary.path,\n updatedAt: summary.updatedAt,\n context: parseInlineContext(args?.context),\n initialHeight: coerceInlineHeight(args?.initialHeight),\n },\n };\n }\n\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n const summary = await summarizeExtension(extension, hiddenIds, false);\n return {\n ok: true,\n inlineExtension: {\n mode: \"persisted\",\n id: summary.id,\n name: summary.name,\n description: summary.description,\n path: summary.path,\n updatedAt: summary.updatedAt,\n context: parseInlineContext(args?.context),\n initialHeight: coerceInlineHeight(args?.initialHeight),\n },\n };\n },\n },\n\n \"create-extension\": {\n tool: {\n description:\n 'Create a persisted sandboxed Alpine.js mini-app extension and render it inline in the chat. Use this when the user wants generated UI that should be saved, reusable, or visible in the Extensions view: extensions, widgets, dashboards, calculators, mini-apps, and reusable interactive utilities. For one-time chat-only UI, use render-inline-extension instead. The content must be a self-contained Alpine.js HTML body snippet that can use appAction(), appFetch(), dbQuery(), extensionFetch(), extensionData, agentNative.ui.output(value, opts?), and agentNative.chat.send()/sendToAgentChat(). Use appAction() for app data writes and extensionData for extension-owned persisted UI state; dbQuery() is for read-only inspection of known app SQL tables. Use agentNative.ui.output for passive current values from knobs, sliders, and selections; it writes application state at inline-ui:<extension id>:output, which the agent can read later with readAppState when the user says to use that value. Use agentNative.chat.send for visible submit/apply actions. Persist reusable user-edited state with extensionData: if the extension has checkboxes, todos, notes, filters, preferences, or any control whose value should survive reload/reopen, load that state on init and save changes with extensionData, usually at user scope, instead of keeping it only in Alpine state. IMPORTANT — hosting a pasted file: if the user pasted a large HTML/Alpine file (it appears in your context as an <attachment name=\"pasted-text-…\"> block) and asked you to host it as-is, do NOT copy that file into `content`. Instead leave `content` empty and pass `contentFromAttachment` set to that attachment\\'s name (or the literal \"latest\" for the most recent pasted block) — the server reads the file verbatim. Re-emitting a large pasted file as `content` regularly gets cut off mid-stream and stalls the turn. IMPORTANT — cloning a large extension that lives as a workspace resource (not a chat attachment): leave `content` empty and pass `contentFromWorkspaceFile` set to the resource path (e.g. \"intuit-analytics-extension.html\"); the server reads the full file. Do NOT try to reconstruct the body with run-code or route create-extension through run-code (mutating actions are not callable there). Prefer appAction(name, params) for app data and actions, including read actions mounted as GET; do not call template /api/* routes from appFetch because the extension bridge only allows framework /_agent-native/* paths. Parse JSON string action results before aggregating; use dbQuery() only for known existing SQL tables and never for writes. Keep the initial create-extension payload compact and working; for complex extensions, create a useful v1 first, then use focused update-extension edits for refinements rather than assembling one enormous initial tool input. For any non-trivial component (more than a couple of state fields, any methods, any string formatting, any branching) put the component in a <script> block via Alpine.data(\\'name\\', () => ({...})) and reference it with x-data=\"name\" — do NOT cram methods, template literals, or branching logic into an inline x-data=\"{...}\" attribute (HTML parser pitfalls cause ReferenceError failures). Define every variable referenced from x-text/x-show/x-if/x-for on the data object\\'s initial state. If the extension\\'s value depends on an LLM call, require a real key via \\\\${keys.OPENAI_API_KEY}/\\\\${keys.ANTHROPIC_API_KEY} (and tell the user to add it in the Dispatch Vault, or in app Settings → API Keys & Connections for standalone apps, if missing) or route the AI work to the agent chat — never ship a stubbed analysis step that renders a placeholder/boolean as the result.',\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description:\n 'Short display name for the extension. Do not include \"app\" — e.g. name a todo app \"Todos\", a weather app \"Weather\".',\n },\n description: {\n type: \"string\",\n description: \"One-sentence summary of what the extension does.\",\n },\n content: {\n type: \"string\",\n description:\n \"Self-contained Alpine.js HTML body snippet. The iframe canvas already has modest default padding, so avoid duplicate outer padding unless the design needs it. Use semantic Tailwind colors (bg-background, text-foreground, bg-primary, etc.) for native theming. Do not include a full app build, React code, or source files. Required UNLESS you pass contentFromAttachment instead.\",\n },\n contentFromAttachment: {\n type: \"string\",\n description:\n 'Host a pasted/attached file verbatim WITHOUT re-typing it. Set this to the name of an attachment on the current turn (e.g. \"pasted-text-1718000000000-ab12cd.txt\") or the literal \"latest\" for the most recent pasted block; the server resolves it into the extension content. Use this instead of `content` whenever the user pasted a large file to host — it avoids re-emitting thousands of tokens. When set, leave `content` empty.',\n },\n contentFromWorkspaceFile: {\n type: \"string\",\n description:\n 'Host a workspace/shared resource file verbatim WITHOUT re-typing it. Set this to the resource path (e.g. \"intuit-analytics-extension.html\"); the server reads the full file and uses it as the extension content. Use this — NOT run-code or contentFromAttachment — when cloning a large extension body that already exists as a workspace resource. When set, leave `content` empty.',\n },\n icon: {\n type: \"string\",\n description: \"Optional icon name or short label.\",\n },\n },\n required: [\"name\"],\n },\n },\n chatUI: {\n renderer: ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER,\n title: \"Extension\",\n },\n run: async (args, ctx) => {\n const name = String(args?.name ?? \"\").trim();\n if (!name) return \"Error: name is required.\";\n const resolved = await resolveExtensionContentAsync(args, ctx);\n if (\"error\" in resolved) return resolved.error;\n const content = resolved.content.trim();\n if (!content) return \"Error: content is required.\";\n const description = String(args?.description ?? \"\").trim();\n const icon = args?.icon ? String(args.icon) : undefined;\n\n // Idempotency: if an identical extension was created in the last 5\n // minutes (e.g. a connection drop caused the agent to retry this tool\n // call), return the existing one instead of creating a duplicate.\n // Keyed on the FULL create inputs (name + content + description + icon),\n // so two creates that differ in ANY of them are treated as distinct\n // rather than silently collapsed — only a byte-identical re-create (the\n // retry case) recovers the existing row.\n const existing = await findRecentDuplicateExtension({\n name,\n content,\n description,\n icon,\n });\n if (existing) {\n const existingPath = extensionPath(existing.id, existing.name);\n try {\n await writeAppState(\"navigate\", {\n view: \"extensions\",\n extensionId: existing.id,\n path: existingPath,\n _writeId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n });\n } catch {\n // Non-fatal — agent can still mention the path in its reply.\n }\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n // Compact summary (contentLength + contentHash, no full body). Echoing\n // the whole HTML back is pure token waste — the agent just supplied it.\n extension: await summarizeExtension(existing, hiddenIds, false),\n path: existingPath,\n next: `Extension was already created in this session (recovered from a connection retry). The user is being navigated to it — no further navigation tool calls needed.`,\n };\n }\n\n const extension = await createExtension({\n name,\n description,\n content,\n icon,\n });\n const path = extensionPath(extension.id, extension.name);\n\n // Auto-navigate so the user lands on the new extension instead of\n // having to read the JSON response and click a link. Writes a\n // one-shot `navigate` app-state command the UI consumes and clears.\n try {\n await writeAppState(\"navigate\", {\n view: \"extensions\",\n extensionId: extension.id,\n path,\n // Unique-per-write token so the UI's `use-navigation-state` hook\n // can dedup race-driven re-reads of the same command.\n _writeId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n });\n } catch {\n // Non-fatal — agent can still mention the path in its reply.\n }\n\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n // Compact summary (contentLength + contentHash, no full body). Echoing\n // the whole HTML back is pure token waste — the agent just supplied it.\n extension: await summarizeExtension(extension, hiddenIds, false),\n path,\n next: `Created. The user is being navigated to the new extension automatically — no further navigation tool calls needed.`,\n };\n },\n },\n\n \"update-extension\": {\n tool: {\n description:\n 'Update an existing sandboxed Alpine.js mini-app extension. Pass exactly three fields: `id`, `operation`, and `payloadJson`. `payloadJson` is a JSON object encoded as a string so model gateways cannot fill its optional members with invalid empty placeholders. For operation=\"edit\", pass {\"edits\":[...]} or {\"patches\":[...]} and optional format=true. For operation=\"replace\", pass exactly one of content, contentFromAttachment, or contentFromWorkspaceFile; use this operation only for a user-requested broad visual rewrite or complete replacement body. For operation=\"metadata\", pass name, description, or icon. Change sharing through set-resource-visibility instead. If the user is viewing the extension, use the extensionId from <current-screen> or <current-url> directly.',\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to update. Prefer the extensionId from <current-screen> or <current-url> for the current extension.\",\n },\n operation: {\n type: \"string\",\n enum: [\"edit\", \"replace\", \"metadata\"],\n description:\n 'The single update mode: \"edit\" for focused patches/edits, \"replace\" for an explicitly authorized complete body replacement, or \"metadata\" for name/description/icon.',\n },\n payloadJson: {\n type: \"string\",\n minLength: 2,\n description:\n 'A non-empty JSON object encoded as a string. edit example: {\"edits\":[{\"op\":\"replace\",\"find\":\"old\",\"replace\":\"new\"}],\"format\":true}. replace example: {\"contentFromAttachment\":\"latest\"}. metadata example: {\"name\":\"New name\"}.',\n },\n },\n required: [\"id\", \"operation\", \"payloadJson\"],\n additionalProperties: false,\n },\n },\n run: async (args, ctx) => {\n const normalizedUpdate = normalizeUpdateExtensionArgs(args);\n if (\"error\" in normalizedUpdate) return normalizedUpdate.error;\n args = normalizedUpdate.args;\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n if (\n args?.name !== undefined &&\n (typeof args.name !== \"string\" || args.name.trim().length === 0)\n ) {\n return \"Error: extension name must be a non-empty string. No changes were applied.\";\n }\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n\n if (\n typeof args?.visibility === \"string\" &&\n args.visibility.trim().toLowerCase() === \"public\"\n ) {\n const message =\n \"Public extension sharing is not supported. Use visibility=private or visibility=org. No content changes were applied; do not retry visibility=public.\";\n throw new AgentActionStopError(message, {\n errorCode: \"extension_public_visibility_unsupported\",\n toolResult: JSON.stringify(\n {\n error: \"extension_public_visibility_unsupported\",\n message,\n recoverable: false,\n next: \"Retry only with visibility=private or visibility=org.\",\n },\n null,\n 2,\n ),\n });\n }\n\n const attachmentRef =\n typeof args?.contentFromAttachment === \"string\"\n ? args.contentFromAttachment.trim()\n : \"\";\n const workspaceFileRef =\n typeof args?.contentFromWorkspaceFile === \"string\"\n ? args.contentFromWorkspaceFile.trim()\n : \"\";\n const fullReplacementRequested =\n (typeof args?.content === \"string\" &&\n args.content.trim().length > 0) ||\n attachmentRef.length > 0 ||\n workspaceFileRef.length > 0;\n if (\n fullReplacementRequested &&\n !coerceBoolean(args?.allowFullReplacement)\n ) {\n const message =\n \"Full extension-body replacement requires allowFullReplacement=true. No changes were applied. If the user's request includes a broad visual rewrite such as changing layout, compactness, visible sections, naming, or padding, retry once with allowFullReplacement=true; otherwise read the current extension and use focused patches/edits for a data-only repair. Do not retry unchanged arguments.\";\n throw new ExtensionContentEditError(message);\n }\n\n // Full-replacement content can come inline (`content`) or by reference\n // (`contentFromAttachment`) so the model never has to re-type a large\n // pasted file. Inline wins only when NON-EMPTY — the docstring tells\n // callers to leave `content` empty when using `contentFromAttachment`,\n // so an empty/blank `content` must fall through to the attachment\n // instead of blanking the extension (mirrors resolveExtensionContent).\n let replacementContent =\n typeof args?.content === \"string\" && args.content.trim().length > 0\n ? args.content\n : undefined;\n if (\n replacementContent === undefined &&\n (attachmentRef.length > 0 || workspaceFileRef.length > 0)\n ) {\n const resolved = await resolveExtensionContentAsync(args, ctx);\n if (\"error\" in resolved) return resolved.error;\n replacementContent = resolved.content;\n }\n\n let result = null;\n const patches = parsePatches((args as any).patches);\n if (args?.patches !== undefined && !patches) {\n return \"Error: patches must be a JSON array of { find, replace } objects.\";\n }\n const edits = parseEdits((args as any).edits);\n if (args?.edits !== undefined && !edits) {\n return \"Error: edits must be a JSON array of supported extension edit operations.\";\n }\n const hasContentUpdate =\n replacementContent !== undefined ||\n (patches?.length ?? 0) > 0 ||\n (edits?.length ?? 0) > 0 ||\n coerceBoolean(args?.format);\n if (hasContentUpdate) {\n try {\n result = await updateExtensionContent(id, {\n content: replacementContent,\n allowFullReplacement: coerceBoolean(args?.allowFullReplacement),\n patches,\n edits,\n format: coerceBoolean(args?.format),\n });\n } catch (error) {\n if (!(error instanceof ExtensionContentEditError)) throw error;\n const message =\n `The extension edit was not applied: ${error.message} ` +\n \"Do not retry the same arguments. Read the current extension and submit one focused patch or edit with an exact target.\";\n throw new AgentActionStopError(message, {\n errorCode: \"extension_content_edit_failed\",\n toolResult: JSON.stringify(\n {\n error: \"extension_content_edit_failed\",\n message: error.message,\n recoverable: false,\n next: \"Read the current extension with get-extension, then make one focused update-extension patches/edits call. Do not retry unchanged arguments.\",\n },\n null,\n 2,\n ),\n });\n }\n }\n\n const meta: Record<string, string> = {};\n if (args?.name !== undefined) meta.name = String(args.name).trim();\n if (args?.description !== undefined) {\n meta.description = String(args.description).trim();\n }\n if (args?.icon !== undefined) meta.icon = String(args.icon);\n if (args?.visibility !== undefined)\n meta.visibility = String(args.visibility);\n if (Object.keys(meta).length > 0) {\n result = await updateExtension(id, meta as any);\n }\n\n if (!result && !hasContentUpdate && Object.keys(meta).length === 0) {\n return \"Error: update-extension received no actual changes. Choose one operation and provide a non-empty payloadJson object; empty placeholder fields are not an update.\";\n }\n if (!result) result = await getExtension(id);\n if (!result) return `Error: extension not found: ${id}`;\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n extension: await summarizeExtension(result, hiddenIds, false),\n };\n },\n },\n\n \"extension-data-set\": {\n tool: {\n description:\n \"Write a value to an extension's extensionData store (the tool_data table) from the agent side. Use this when the agent needs to update or seed data that an extension reads via extensionData.get() at render time. Requires editor access to the extension.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: {\n type: \"string\",\n description: \"Extension id whose data store to write to.\",\n },\n collection: {\n type: \"string\",\n description: \"Collection name within the extension's data store.\",\n },\n itemId: {\n type: \"string\",\n description:\n \"Item id within the collection. Upserts if it already exists.\",\n },\n data: {\n description:\n \"The data value to store. Objects are JSON-serialized automatically.\",\n },\n scope: {\n type: \"string\",\n enum: [\"user\", \"org\"],\n description:\n \"Storage scope. 'user' (default) is private to the current user; 'org' is shared across the organization.\",\n },\n },\n required: [\"extensionId\", \"collection\", \"itemId\", \"data\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const collection = String(args?.collection ?? \"\").trim();\n const itemId = String(args?.itemId ?? \"\").trim();\n if (!extensionId || !collection || !itemId)\n return \"Error: extensionId, collection, and itemId are required.\";\n if (args?.data === undefined) return \"Error: data is required.\";\n\n await ensureExtensionsTables();\n const access = await resolveAccess(\"extension\", extensionId);\n if (\n !access ||\n (access.resource as ExtensionRow | undefined)?.archivedAt ||\n access.role === \"viewer\"\n )\n return `Error: editor access required for extension ${extensionId}.`;\n\n const userEmail = getRequestUserEmail()?.toLowerCase() ?? \"\";\n const scope = args?.scope === \"org\" ? \"org\" : \"user\";\n const orgId = getRequestOrgId();\n if (scope === \"org\" && !orgId)\n return \"Error: org context required for scope=org.\";\n\n const data =\n typeof args.data === \"string\" ? args.data : JSON.stringify(args.data);\n const MAX_BYTES = 1024 * 1024;\n if (Buffer.byteLength(data, \"utf8\") > MAX_BYTES)\n return `Error: data exceeds ${MAX_BYTES} byte limit. Store large payloads in file storage instead.`;\n\n const now = new Date().toISOString();\n const scopeKey = scope === \"org\" ? `org:${orgId}` : userEmail;\n const client = getDbExec();\n const pg = isPostgres();\n const conflictClause = pg\n ? `ON CONFLICT (tool_id, collection, scope_key, item_id)\n DO UPDATE SET data = EXCLUDED.data, updated_at = EXCLUDED.updated_at`\n : `ON CONFLICT (tool_id, collection, scope_key, item_id)\n DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`;\n\n await client.execute({\n sql: `UPDATE tools SET updated_at = ? WHERE id = ?`,\n args: [now, extensionId],\n });\n await client.execute({\n sql: `INSERT INTO tool_data (id, tool_id, collection, item_id, data, owner_email, scope, org_id, scope_key, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ${conflictClause}`,\n args: [\n randomUUID(),\n extensionId,\n collection,\n itemId,\n data,\n userEmail,\n scope,\n scope === \"org\" ? orgId! : null,\n scopeKey,\n now,\n now,\n ],\n });\n await notifyExtensionChangeForResource(extensionId);\n\n return {\n ok: true,\n id: itemId,\n extensionId,\n collection,\n scope,\n updatedAt: now,\n };\n },\n },\n\n \"extension-data-get\": {\n tool: {\n description:\n \"Read items from an extension's extensionData store (the tool_data table) from the agent side. Use this to inspect what data an extension currently has stored, or to verify a write succeeded. Requires viewer access to the extension.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: {\n type: \"string\",\n description: \"Extension id whose data store to read from.\",\n },\n collection: {\n type: \"string\",\n description: \"Collection name within the extension's data store.\",\n },\n itemId: {\n type: \"string\",\n description:\n \"Optional specific item id. If omitted, lists all items in the collection.\",\n },\n scope: {\n type: \"string\",\n enum: [\"user\", \"org\", \"all\"],\n description:\n \"Storage scope to read. 'user' (default) reads the current user's items; 'org' reads organization-shared items; 'all' reads both.\",\n },\n limit: {\n type: \"number\",\n description:\n \"Maximum items to return when listing (default 100, max 1000).\",\n },\n },\n required: [\"extensionId\", \"collection\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const collection = String(args?.collection ?? \"\").trim();\n if (!extensionId || !collection)\n return \"Error: extensionId and collection are required.\";\n\n await ensureExtensionsTables();\n const access = await resolveAccess(\"extension\", extensionId);\n if (\n !access ||\n (access.resource as ExtensionRow | undefined)?.archivedAt\n )\n return `Error: no access to extension ${extensionId}.`;\n\n const userEmail = getRequestUserEmail()?.toLowerCase() ?? \"\";\n const scope = args?.scope ?? \"user\";\n const orgId = getRequestOrgId();\n if ((scope === \"org\" || scope === \"all\") && !orgId)\n return \"Error: org context required for scope=org or scope=all.\";\n const itemId = args?.itemId ? String(args.itemId).trim() : null;\n const limit = Math.min(Math.max(1, Number(args?.limit) || 100), 1000);\n const client = getDbExec();\n\n if (itemId) {\n const scopeClause =\n scope === \"org\"\n ? `AND scope = 'org' AND org_id = ?`\n : scope === \"all\"\n ? `AND ((scope = 'user' AND lower(owner_email) = ?) OR (scope = 'org' AND org_id = ?))`\n : `AND scope = 'user' AND lower(owner_email) = ?`;\n const scopeArgs =\n scope === \"org\"\n ? [orgId ?? \"\"]\n : scope === \"all\"\n ? [userEmail, orgId ?? \"\"]\n : [userEmail];\n\n const result = await client.execute({\n sql: `SELECT COALESCE(item_id, id) AS id, data, scope, owner_email, updated_at\n FROM tool_data\n WHERE tool_id = ? AND collection = ? AND COALESCE(item_id, id) = ? ${scopeClause}`,\n args: [extensionId, collection, itemId, ...scopeArgs],\n });\n const row = result.rows?.[0];\n if (!row) return { found: false, extensionId, collection, itemId };\n return { found: true, ...row };\n }\n\n const scopeClause =\n scope === \"org\"\n ? `AND scope = 'org' AND org_id = ?`\n : scope === \"all\"\n ? `AND ((scope = 'user' AND lower(owner_email) = ?) OR (scope = 'org' AND org_id = ?))`\n : `AND scope = 'user' AND lower(owner_email) = ?`;\n const scopeArgs =\n scope === \"org\"\n ? [orgId ?? \"\"]\n : scope === \"all\"\n ? [userEmail, orgId ?? \"\"]\n : [userEmail];\n\n const result = await client.execute({\n sql: `SELECT COALESCE(item_id, id) AS id, data, scope, owner_email, updated_at\n FROM tool_data\n WHERE tool_id = ? AND collection = ? ${scopeClause}\n ORDER BY updated_at DESC\n LIMIT ?`,\n args: [extensionId, collection, ...scopeArgs, limit],\n });\n return {\n extensionId,\n collection,\n scope,\n count: result.rows?.length ?? 0,\n items: result.rows ?? [],\n };\n },\n },\n\n \"delete-extension\": {\n tool: {\n description:\n \"Archive an extension everywhere it is shared. Archiving is a soft delete: the extension and its history, data, sharing, and slot configuration are retained, but it disappears from normal lists. Requires owner/admin access. If the user only wants a shared extension removed from their own sidebar/list, use hide-extension instead.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to archive. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n try {\n const ok = await deleteExtension(id);\n if (!ok) return `Error: extension not found: ${id}`;\n return { ok: true, archived: summarizeDeletedExtension(extension) };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message ?? String(err),\n next: \"If the user wants this gone only from their own view, call hide-extension with the same id.\",\n };\n }\n },\n },\n\n \"restore-extension-history-version\": {\n tool: {\n description:\n \"Restore an extension's name, description, icon, and HTML content from a saved history version. Requires editor access. This does not restore sharing visibility or ownership.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to restore.\",\n },\n version: {\n type: \"number\",\n description:\n \"Saved history version number to restore. Use list-extension-history first if unsure.\",\n },\n },\n required: [\"id\", \"version\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionReadonlyHistoryMessage(id);\n if (localMessage) return localMessage;\n const version = Number(args?.version);\n if (!Number.isInteger(version) || version < 1) {\n return \"Error: version must be a positive integer.\";\n }\n const result = await restoreExtensionHistoryVersion(id, version);\n if (!result) {\n return `Error: extension history version not found: ${id}#${version}`;\n }\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n restoredVersion: version,\n extension: await summarizeExtension(result, hiddenIds, false),\n };\n },\n },\n\n \"hide-extension\": {\n tool: {\n description:\n \"Hide an accessible extension from the current user's Extensions list/sidebar without deleting it for anyone else. Use this when the user says to remove a shared extension from their view, or when delete-extension reports that the current user is not owner/admin.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to hide for the current user. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n await hideExtension(id);\n return { ok: true, hidden: summarizeDeletedExtension(extension) };\n },\n },\n\n \"unhide-extension\": {\n tool: {\n description:\n \"Restore an extension the current user previously hid so it appears in their Extensions list/sidebar again. Use list-extensions with includeHidden=true to find hidden ids.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to restore for the current user.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n await unhideExtension(id);\n return { ok: true, id };\n },\n },\n\n \"global-hide-extension\": {\n tool: {\n description:\n \"Globally hide an extension from EVERYONE's Extensions list/sidebar (not just the current user) by stamping it hidden. Requires owner/admin access. Use this for an admin takedown of a shared/org extension. The extension is not deleted and stays accessible by id; use global-unhide-extension to reverse. For removing an extension only from your own view, use hide-extension instead.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to hide for everyone. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n await globalHideExtension(id);\n return {\n ok: true,\n globallyHidden: summarizeDeletedExtension(extension),\n };\n },\n },\n\n \"global-unhide-extension\": {\n tool: {\n description:\n \"Reverse a global hide so the extension reappears in everyone's Extensions list/sidebar again. Requires owner/admin access. Use list-extensions with includeGloballyHidden=true to find globally-hidden ids.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to unhide for everyone.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n await globalUnhideExtension(id);\n return { ok: true, id };\n },\n },\n\n \"add-extension-slot-target\": {\n tool: {\n description:\n 'Declare that an extension can render in a UI extension-point slot of an app (e.g. \"mail.contact-sidebar.bottom\"). Apps drop ExtensionSlot components in their UI; this action registers an extension as installable into one of those slots. Slot IDs follow the convention <app>.<area>.<position>. Caller must have editor access to the extension.',\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n slotId: {\n type: \"string\",\n description:\n 'Slot identifier — e.g. \"mail.contact-sidebar.bottom\".',\n },\n config: {\n type: \"string\",\n description:\n \"Optional JSON string with slot-specific config (defaults, hints, etc.).\",\n },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const localMessage = await localExtensionEditMessage(extensionId);\n if (localMessage) return localMessage;\n const row = await addExtensionSlotTarget(\n extensionId,\n slotId,\n args?.config ? String(args.config) : undefined,\n );\n return { ok: true, slot: row };\n },\n },\n\n \"install-extension\": {\n tool: {\n description:\n \"Install an extension as a widget in an extension-point slot for the current user. The extension must already declare the slot via add-extension-slot-target. Per-user installation — only affects the calling user's view. Use after creating an extension that targets a slot, or when the user asks to add an existing widget to a slot.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: {\n type: \"string\",\n description: \"Extension id to install.\",\n },\n slotId: {\n type: \"string\",\n description:\n 'Slot identifier — e.g. \"mail.contact-sidebar.bottom\".',\n },\n position: {\n type: \"number\",\n description:\n \"Optional integer position within the slot (lower = earlier). Defaults to end.\",\n },\n config: {\n type: \"string\",\n description:\n \"Optional JSON string with per-install config (overrides, settings).\",\n },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const localMessage = await localExtensionEditMessage(extensionId);\n if (localMessage) return localMessage;\n const position =\n args?.position !== undefined && args.position !== null\n ? Number(args.position)\n : undefined;\n const row = await installExtensionSlot(extensionId, slotId, {\n position: Number.isFinite(position as number) ? position : undefined,\n config: args?.config ? String(args.config) : undefined,\n });\n return { ok: true, install: row };\n },\n },\n\n \"uninstall-extension\": {\n tool: {\n description:\n \"Remove an extension from an extension-point slot for the current user. Does not delete the extension itself.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n slotId: { type: \"string\", description: \"Slot identifier.\" },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const localMessage = await localExtensionEditMessage(extensionId);\n if (localMessage) return localMessage;\n await uninstallExtensionSlot(extensionId, slotId);\n return { ok: true };\n },\n },\n\n \"list-extensions-for-slot\": {\n tool: {\n description:\n \"List extensions the current user has access to that declare a given extension-point slot. Use to discover what's available to install into a slot the user mentioned.\",\n parameters: {\n type: \"object\",\n properties: {\n slotId: { type: \"string\", description: \"Slot identifier.\" },\n },\n required: [\"slotId\"],\n },\n },\n run: async (args) => {\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!slotId) return \"Error: slotId is required.\";\n return { extensions: await listExtensionsForSlot(slotId) };\n },\n readOnly: true,\n },\n\n \"list-extension-slots\": {\n tool: {\n description:\n \"List the extension-point slots a specific extension declares it can render in. Caller must have viewer access to the extension.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n },\n required: [\"extensionId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n return { slots: await listSlotsForExtension(extensionId) };\n },\n readOnly: true,\n },\n };\n}\n\nasync function summarizeExtension(\n row: ExtensionRow | LocalExtensionRow,\n hiddenIds: Set<string>,\n includeContent: boolean,\n) {\n const local = isLocalExtensionRow(row);\n const access = local\n ? ({ role: \"viewer\" } as const)\n : await resolveAccess(\"extension\", row.id).catch(() => null);\n return {\n id: row.id,\n name: row.name,\n path: extensionPath(row.id, row.name),\n description: row.description,\n icon: row.icon,\n ownerEmail: row.ownerEmail,\n visibility: row.visibility,\n role: access?.role ?? null,\n canEdit: access\n ? [\"owner\", \"admin\", \"editor\"].includes(access.role)\n : false,\n canDelete: access ? [\"owner\", \"admin\"].includes(access.role) : false,\n hidden: hiddenIds.has(row.id),\n globallyHidden: row.hiddenAt != null,\n hiddenAt: row.hiddenAt,\n hiddenBy: row.hiddenBy,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n contentLength: row.content.length,\n contentHash: contentFingerprint(row.content),\n ...(local ? { source: row.source } : {}),\n ...(includeContent ? { content: row.content } : {}),\n };\n}\n\nasync function summarizeExtensionForAgentRead(\n row: ExtensionRow | LocalExtensionRow,\n hiddenIds: Set<string>,\n includeContent: boolean,\n forceContent: boolean,\n) {\n if (!includeContent) {\n return summarizeExtension(row, hiddenIds, false);\n }\n\n const fingerprint = contentFingerprint(row.content);\n const runCtx = getRequestRunContext();\n const reads = runCtx ? (runCtx.extensionContentReads ??= {}) : undefined;\n const alreadySent = !forceContent && reads?.[row.id] === fingerprint;\n if (!alreadySent && reads) {\n reads[row.id] = fingerprint;\n }\n\n const summary = await summarizeExtension(row, hiddenIds, !alreadySent);\n if (!alreadySent) return summary;\n\n return {\n ...summary,\n contentOmitted: {\n reason: \"unchanged-content-already-returned-this-run\",\n contentHash: fingerprint,\n contentLength: row.content.length,\n next: 'Use the content already returned earlier in this run and call update-extension with operation=\"edit\" plus focused edits/patches inside payloadJson. Set forceContent=true only if you truly need the full body again.',\n },\n };\n}\n\nfunction compactExtensionHistoryDetail(\n detail: ExtensionHistoryDetail,\n includeContent: boolean,\n): ExtensionHistoryDetail & {\n diffOmitted?: { omittedLines: number; maxLines: number };\n} {\n const diffMaxLines = 400;\n const fullDiff = detail.diff ?? [];\n const diff =\n fullDiff.length > diffMaxLines\n ? [...fullDiff.slice(0, 200), ...fullDiff.slice(fullDiff.length - 200)]\n : fullDiff;\n return {\n ...detail,\n entry: compactHistoryEntry(detail.entry, includeContent),\n previous: detail.previous\n ? compactHistoryEntry(detail.previous, includeContent)\n : null,\n diff,\n ...(fullDiff.length > diff.length\n ? {\n diffOmitted: {\n omittedLines: fullDiff.length - diff.length,\n maxLines: diffMaxLines,\n },\n }\n : {}),\n };\n}\n\nfunction compactHistoryEntry(\n entry: ExtensionHistoryEntry,\n includeContent: boolean,\n): ExtensionHistoryEntry & { contentHash?: string } {\n const content = entry.content ?? \"\";\n const withHash = {\n ...entry,\n ...(content ? { contentHash: contentFingerprint(content) } : {}),\n };\n if (includeContent) return withHash;\n const { content: _content, ...withoutContent } = withHash;\n return withoutContent;\n}\n\nfunction contentFingerprint(content: string): string {\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash * 33) ^ content.charCodeAt(i);\n }\n return `${content.length.toString(36)}-${(hash >>> 0).toString(36)}`;\n}\n\nasync function localExtensionEditMessage(id: string): Promise<string | null> {\n const localExtension = await getLocalExtension(id);\n if (!localExtension) return null;\n return `Error: extension \"${id}\" is backed by local files at ${localExtension.source.entryPath}. Edit that file or ${localExtension.source.manifestPath} in the workspace instead of using SQL-backed extension actions.`;\n}\n\nasync function localExtensionReadonlyHistoryMessage(\n id: string,\n): Promise<string | null> {\n const localExtension = await getLocalExtension(id);\n if (!localExtension) return null;\n return `Error: extension \"${id}\" is backed by local files at ${localExtension.source.entryPath}. Use Git or your editor's file history for versions.`;\n}\n\nfunction summarizeDeletedExtension(row: ExtensionRow) {\n return {\n id: row.id,\n name: row.name,\n ownerEmail: row.ownerEmail,\n visibility: row.visibility,\n };\n}\n\n/**\n * Filename prefix the composer stamps on a \"Pasted text\" attachment chip\n * (`createPastedTextFile` in `client/composer/pasted-text.ts`). The agent sees\n * these as `<attachment name=\"pasted-text-…\">` blocks, so a model hosting a\n * pasted file can reference it by that name via `contentFromAttachment`.\n */\nconst PASTED_TEXT_ATTACHMENT_PREFIX = \"pasted-text-\";\n\n/** Keyword refs that mean \"use the most recent pasted block above\". */\nconst LATEST_ATTACHMENT_KEYWORDS = new Set([\n \"latest\",\n \"last\",\n \"paste\",\n \"pasted\",\n \"pasted-text\",\n \"attachment\",\n \"above\",\n]);\n\n/** Strip the `<attachment …>\\n…\\n</attachment>` wrapper if one is present. */\nfunction unwrapAttachmentEnvelope(text: string): string {\n const match = text.match(/^<attachment\\b[^>]*>\\n([\\s\\S]*)\\n<\\/attachment>$/);\n return match ? match[1] : text;\n}\n\n/**\n * Resolve the HTML body for create/update-extension from either the inline\n * `content` argument or a `contentFromAttachment` handle pointing at a pasted /\n * uploaded text attachment on the current turn. The by-reference path lets the\n * model host a large pasted file without re-emitting it as a tool argument —\n * which frequently gets cut off mid-stream and triggers a continuation loop.\n *\n * Resolution is forgiving: an exact attachment-name match wins, then a keyword\n * (\"latest\"/\"pasted\"/…) or a near-miss name falls back to the most recent\n * pasted-text attachment (or the only text attachment).\n */\nfunction resolveExtensionContent(\n args: Record<string, string> | undefined,\n ctx: ActionRunContext | undefined,\n): { content: string } | { error: string } {\n const inline = args?.content !== undefined ? String(args.content) : undefined;\n if (inline !== undefined && inline.trim().length > 0) {\n return { content: inline };\n }\n\n const ref =\n args?.contentFromAttachment !== undefined\n ? String(args.contentFromAttachment).trim()\n : \"\";\n if (!ref) {\n return {\n error:\n \"Error: provide either content (inline Alpine.js HTML) or contentFromAttachment (the name of a pasted/attached file to host verbatim).\",\n };\n }\n\n const textAttachments = (ctx?.attachments ?? []).filter(\n (att): att is AgentChatAttachment & { text: string } =>\n typeof att.text === \"string\" && att.text.trim().length > 0,\n );\n if (textAttachments.length === 0) {\n return {\n error:\n \"Error: contentFromAttachment was set but this turn has no readable text attachment. Re-send the file as an attachment, or pass the HTML inline via content.\",\n };\n }\n\n const lower = ref.toLowerCase();\n let match = textAttachments.find(\n (att) => (att.name ?? \"\").trim().toLowerCase() === lower,\n );\n if (!match) {\n const pasted = textAttachments.filter((att) =>\n (att.name ?? \"\").startsWith(PASTED_TEXT_ATTACHMENT_PREFIX),\n );\n const pool = pasted.length > 0 ? pasted : textAttachments;\n if (\n LATEST_ATTACHMENT_KEYWORDS.has(lower) ||\n pasted.length === 1 ||\n textAttachments.length === 1\n ) {\n match = pool[pool.length - 1];\n }\n }\n\n if (!match) {\n const names = textAttachments\n .map((att) => att.name || \"(unnamed)\")\n .join(\", \");\n return {\n error: `Error: no attachment matched contentFromAttachment=\"${ref}\". Available text attachments: ${names}. Pass one of those names exactly, or \"latest\" for the most recent pasted block.`,\n };\n }\n\n const resolved = unwrapAttachmentEnvelope(match.text);\n // Fail fast instead of hosting corrupted content. The client caps an\n // outbound attachment at MAX_OUTBOUND_ATTACHMENT_CHARS (200k) and appends a\n // trailing notice ending \"...omitted from the submitted attachment.]\" (see\n // truncateOutboundAttachment in agent-chat-adapter.ts). Hosting that verbatim\n // would bake a half file + the notice into the extension body; reject it with\n // an actionable message so the user shrinks/splits the file instead.\n if (/omitted from the submitted attachment\\.\\]\\s*$/.test(resolved)) {\n return {\n error:\n \"Error: the pasted file is too large to host verbatim (it was truncated above 200,000 characters before reaching the server, so hosting it would corrupt the extension). Reduce the file or split it into smaller extensions, then try again.\",\n };\n }\n return { content: resolved };\n}\n\n/**\n * Resolve the workspace-files bridge scope exactly the way run-code's\n * workspaceRead/workspaceWrite do: org-preferred (org → shared owner) with the\n * requesting user's email as the solo fallback. Kept in lockstep with\n * `resolveScope` in `workspace-files/tool.ts`.\n */\nfunction workspaceFilesBridgeScope(): WorkspaceFilesScope | null {\n const orgId = getRequestOrgId();\n if (orgId) return { scope: \"org\", scopeId: orgId };\n const email = getRequestUserEmail();\n if (email) return { scope: \"user\", scopeId: email };\n return null;\n}\n\n/**\n * Read a workspace/shared/personal resource file's FULL content by path.\n *\n * Precedence (single, documented rule so this never silently resolves a\n * different file than the agent inspected):\n * 1. The run-code `workspace-files` bridge scope (org → shared owner, else the\n * user's email). This is the SAME owner/scope `workspaceRead` /\n * `workspaceWrite` use, so a body the agent staged via `workspaceWrite` is\n * resolved here verbatim — the two paths cannot diverge.\n * 2. User-managed Resources (personal override → org/shared → workspace\n * default) as a fallback, for pre-built resources that were created in the\n * Resources panel rather than staged through the bridge.\n *\n * Unlike attachments, resource content is not capped/truncated on the way in, so\n * this is the correct path for cloning a large extension body that already\n * exists as a workspace resource (e.g. a per-customer dashboard).\n */\nasync function readWorkspaceFileContent(path: string): Promise<string | null> {\n const trimmed = path.trim();\n if (!trimmed) return null;\n // 1) Bridge parity — resolve exactly the file workspaceRead/workspaceWrite see.\n const bridgeScope = workspaceFilesBridgeScope();\n if (bridgeScope) {\n let bridgeFile: Awaited<ReturnType<typeof readWorkspaceFile>>;\n try {\n bridgeFile = await readWorkspaceFile(bridgeScope, trimmed);\n } catch {\n // A THROW here is a transient store error or invalid path — NOT a\n // definitive \"not found\". Fail closed rather than silently hosting a\n // possibly-different same-path Resources body than workspaceRead\n // inspected. A retry re-runs this read cleanly.\n return null;\n }\n // A null result means the file genuinely does not exist in the bridge scope;\n // fall through to user-managed Resources for pre-built resource-panel files.\n if (bridgeFile && typeof bridgeFile.content === \"string\") {\n return bridgeFile.content;\n }\n }\n // 2) Fallback — user-managed Resources by scope precedence.\n for (const scope of [\"personal\", \"shared\", \"workspace\"] as const) {\n try {\n const content = await readResource(trimmed, { scope });\n if (typeof content === \"string\") return content;\n } catch {\n // A given scope can throw (e.g. `personal` when no user identity is\n // resolvable in this context). Don't let one scope abort the lookup —\n // fall through and try the next one.\n }\n }\n return null;\n}\n\n/**\n * Resolve the extension HTML body from (in priority order) inline `content`, a\n * `contentFromWorkspaceFile` resource path, or a `contentFromAttachment` handle.\n *\n * The workspace-file path exists because a large extension body frequently lives\n * as a workspace resource (not a chat attachment). Without it the model has no\n * viable route — inline is too large to shuttle reliably, contentFromAttachment\n * only sees chat attachments, and mutating actions cannot run from run-code — so\n * it loops and the run aborts with no_progress.\n */\nasync function resolveExtensionContentAsync(\n args: Record<string, string> | undefined,\n ctx: ActionRunContext | undefined,\n): Promise<{ content: string } | { error: string }> {\n const inline = args?.content !== undefined ? String(args.content) : undefined;\n if (inline !== undefined && inline.trim().length > 0) {\n return { content: inline };\n }\n\n const wsRef =\n args?.contentFromWorkspaceFile !== undefined\n ? String(args.contentFromWorkspaceFile).trim()\n : \"\";\n if (wsRef) {\n const content = await readWorkspaceFileContent(wsRef);\n if (content === null) {\n return {\n error: `Error: contentFromWorkspaceFile=\"${wsRef}\" did not match any readable workspace/shared/personal resource file. Check the exact path (e.g. \"intuit-analytics-extension.html\"), or pass the HTML inline via content.`,\n };\n }\n if (content.trim().length === 0) {\n return {\n error: `Error: workspace file \"${wsRef}\" is empty. Pass non-empty HTML inline via content, or point contentFromWorkspaceFile at a file with content.`,\n };\n }\n return { content };\n }\n\n return resolveExtensionContent(args, ctx);\n}\n\nfunction coerceBoolean(value: unknown): boolean {\n return value === true || value === \"true\";\n}\n\nfunction normalizeUpdateExtensionArgs(\n args: any,\n): { args: Record<string, unknown> } | { error: string } {\n const hasCompactContract =\n args?.operation !== undefined || args?.payloadJson !== undefined;\n if (!hasCompactContract) {\n const legacyArgs = { ...((args ?? {}) as Record<string, unknown>) };\n const hasInvalidPlaceholderSignal =\n (typeof legacyArgs.visibility === \"string\" &&\n legacyArgs.visibility.trim().length === 0) ||\n [legacyArgs.patches, legacyArgs.edits].some(\n (value) =>\n value !== null &&\n typeof value === \"object\" &&\n (Array.isArray(value)\n ? value.length > 0 &&\n value.every(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n Object.keys(item).length === 0,\n )\n : Object.keys(value).length === 0),\n );\n if (hasInvalidPlaceholderSignal) {\n for (const [key, value] of Object.entries(legacyArgs)) {\n if (key === \"id\") continue;\n const empty =\n value === false ||\n value === null ||\n (typeof value === \"string\" && value.trim().length === 0) ||\n (Array.isArray(value) &&\n (value.length === 0 ||\n value.every(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n Object.keys(item).length === 0,\n ))) ||\n (typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0);\n if (empty) delete legacyArgs[key];\n }\n delete legacyArgs.visibility;\n }\n return { args: legacyArgs };\n }\n\n const operation = String(args?.operation ?? \"\").trim();\n if (!([\"edit\", \"replace\", \"metadata\"] as const).includes(operation as any)) {\n return {\n error:\n 'Error: operation must be \"edit\", \"replace\", or \"metadata\". No changes were applied.',\n };\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(String(args?.payloadJson ?? \"\"));\n } catch {\n return {\n error:\n \"Error: payloadJson must be a valid JSON object encoded as a string. No changes were applied.\",\n };\n }\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return {\n error:\n \"Error: payloadJson must decode to a non-empty JSON object. No changes were applied.\",\n };\n }\n\n const payloadRecord = payload as Record<string, unknown>;\n const allowedByOperation: Record<string, Set<string>> = {\n edit: new Set([\"patches\", \"edits\", \"format\"]),\n replace: new Set([\n \"content\",\n \"contentFromAttachment\",\n \"contentFromWorkspaceFile\",\n \"format\",\n ]),\n metadata: new Set([\"name\", \"description\", \"icon\"]),\n };\n const unexpected = Object.keys(payloadRecord).filter(\n (key) => !allowedByOperation[operation].has(key),\n );\n if (unexpected.length > 0) {\n return {\n error: `Error: operation=${operation} does not accept ${unexpected.join(\", \")}. No changes were applied.`,\n };\n }\n\n if (operation === \"edit\") {\n const patches = parsePatches(payloadRecord.patches);\n const edits = parseEdits(payloadRecord.edits);\n const hasEdit =\n (patches?.length ?? 0) > 0 ||\n (edits?.length ?? 0) > 0 ||\n coerceBoolean(payloadRecord.format);\n if (!hasEdit) {\n return {\n error:\n \"Error: operation=edit requires at least one valid patch/edit or format=true. No changes were applied.\",\n };\n }\n }\n\n if (operation === \"replace\") {\n const replacementSources = [\n payloadRecord.content,\n payloadRecord.contentFromAttachment,\n payloadRecord.contentFromWorkspaceFile,\n ].filter((value) => typeof value === \"string\" && value.trim().length > 0);\n if (replacementSources.length !== 1) {\n return {\n error:\n \"Error: operation=replace requires exactly one non-empty content, contentFromAttachment, or contentFromWorkspaceFile value. No changes were applied.\",\n };\n }\n }\n\n if (operation === \"metadata\") {\n const keys = Object.keys(payloadRecord);\n if (keys.length === 0) {\n return {\n error:\n \"Error: operation=metadata requires name, description, or icon. No changes were applied.\",\n };\n }\n if (\n payloadRecord.name !== undefined &&\n (typeof payloadRecord.name !== \"string\" ||\n payloadRecord.name.trim().length === 0)\n ) {\n return {\n error:\n \"Error: extension name must be a non-empty string. No changes were applied.\",\n };\n }\n }\n\n return {\n args: {\n id: String(args?.id ?? \"\").trim(),\n ...payloadRecord,\n ...(operation === \"replace\" ? { allowFullReplacement: true } : {}),\n },\n };\n}\n\nfunction parseInlineContext(\n value: unknown,\n): Record<string, unknown> | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n const parsed =\n typeof value === \"string\"\n ? (() => {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n })()\n : value;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n}\n\nfunction coerceInlineHeight(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n const height = Number(value);\n if (!Number.isFinite(height) || height <= 0) return undefined;\n return Math.min(Math.max(Math.round(height), 120), 1000);\n}\n\nfunction coerceLimit(value: unknown): number {\n const limit = Number(value ?? 100);\n if (!Number.isFinite(limit)) return 100;\n return Math.min(Math.max(1, Math.floor(limit)), 500);\n}\n\nfunction parsePatches(value: unknown): ExtensionLegacyPatch[] | undefined {\n if (value === undefined) return undefined;\n const parsed = parseJsonArray(value);\n if (!Array.isArray(parsed)) return undefined;\n if (\n parsed.some(\n (patch) =>\n !patch ||\n typeof patch.find !== \"string\" ||\n typeof patch.replace !== \"string\",\n )\n ) {\n return undefined;\n }\n return parsed;\n}\n\nfunction parseEdits(value: unknown): ExtensionContentEdit[] | undefined {\n if (value === undefined) return undefined;\n const parsed = parseJsonArray(value);\n if (!Array.isArray(parsed)) return undefined;\n return parsed.every(isValidContentEdit)\n ? (parsed as ExtensionContentEdit[])\n : undefined;\n}\n\nfunction parseJsonArray(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction isValidContentEdit(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n const edit = value as Record<string, unknown>;\n const op = edit.op ?? \"replace\";\n if (typeof op !== \"string\") return false;\n\n switch (op) {\n case \"replace\":\n return typeof edit.find === \"string\" && typeof edit.replace === \"string\";\n case \"insert-before\":\n case \"insert-after\":\n return (\n typeof edit.marker === \"string\" && typeof edit.content === \"string\"\n );\n case \"replace-between\":\n return (\n typeof edit.start === \"string\" &&\n typeof edit.end === \"string\" &&\n typeof edit.content === \"string\"\n );\n case \"replace-section\":\n return (\n typeof edit.section === \"string\" && typeof edit.content === \"string\"\n );\n case \"wrap-section\":\n return (\n typeof edit.section === \"string\" &&\n typeof edit.before === \"string\" &&\n typeof edit.after === \"string\"\n );\n case \"remove-section\":\n return typeof edit.section === \"string\";\n case \"regex-replace\":\n return (\n typeof edit.pattern === \"string\" && typeof edit.replace === \"string\"\n );\n default:\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/extensions/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER } from \"../action-ui.js\";\nimport { AgentActionStopError, type ActionRunContext } from \"../action.js\";\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport type { AgentChatAttachment } from \"../agent/types.js\";\nimport { writeAppState } from \"../application-state/script-helpers.js\";\nimport { getDbExec, isPostgres } from \"../db/client.js\";\nimport { readResource } from \"../resources/script-helpers.js\";\nimport {\n getRequestOrgId,\n getRequestRunContext,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport { resolveAccess } from \"../sharing/access.js\";\nimport {\n readWorkspaceFile,\n type WorkspaceFilesScope,\n} from \"../workspace-files/store.js\";\nimport { ExtensionContentEditError } from \"./content-patch.js\";\nimport type {\n ExtensionContentEdit,\n ExtensionLegacyPatch,\n} from \"./content-patch.js\";\nimport {\n getLocalExtension,\n isLocalExtensionRow,\n listLocalExtensions,\n type LocalExtensionRow,\n} from \"./local.js\";\nimport { extensionPath } from \"./path.js\";\nimport {\n addExtensionSlotTarget,\n installExtensionSlot,\n uninstallExtensionSlot,\n listExtensionsForSlot,\n listSlotsForExtension,\n} from \"./slots/store.js\";\nimport {\n createExtension,\n deleteExtension,\n ensureExtensionsTables,\n findRecentDuplicateExtension,\n getHiddenExtensionIdsForCurrentUser,\n getExtension,\n getExtensionHistoryVersion,\n globalHideExtension,\n globalUnhideExtension,\n hideExtension,\n listExtensionHistory,\n listExtensions,\n notifyExtensionChangeForResource,\n restoreExtensionHistoryVersion,\n unhideExtension,\n updateExtension,\n updateExtensionContent,\n type ExtensionHistoryDetail,\n type ExtensionHistoryEntry,\n type ExtensionRow,\n} from \"./store.js\";\n\n// A 200k extension body containing JSON-sensitive HTML/JS characters (quotes,\n// backslashes, and newlines) expands to about 400k characters when pretty-JSON\n// serialized by the agent loop. A history detail can carry the current and\n// previous bodies plus both bodies again in its line diff (about 1.6M chars in\n// the same worst-common-case fixture). These caps add roughly 25% headroom for\n// the surrounding metadata and indentation while still bounding tool context.\nconst GET_EXTENSION_MAX_RESULT_CHARS = 500_000;\nconst GET_EXTENSION_HISTORY_MAX_RESULT_CHARS = 2_000_000;\n\nexport function createExtensionActionEntries(): Record<string, ActionEntry> {\n return {\n \"list-extensions\": {\n tool: {\n description:\n \"List extensions visible in the current user's Extensions list/sidebar. Use this for browsing or when you only know a display name. If <current-screen> or <current-url> already contains extensionId for the current extension, use get-extension or update-extension with that id directly instead of listing. Do not query the legacy tools table directly for extension management.\",\n parameters: {\n type: \"object\",\n properties: {\n search: {\n type: \"string\",\n description:\n \"Optional case-insensitive filter matched against id, name, description, and owner email. Example: Connect Zoom.\",\n },\n includeHidden: {\n type: \"boolean\",\n description:\n \"Include extensions the current user has hidden from their list. Defaults to false.\",\n },\n includeGloballyHidden: {\n type: \"boolean\",\n description:\n \"Include extensions an admin/owner has globally hidden from everyone (via global-hide-extension). Defaults to false. Use this to find ids to unhide for everyone.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full Alpine.js content. Defaults to false to keep results concise.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum results to return. Defaults to 100.\",\n },\n },\n },\n },\n run: async (args) => {\n const includeHidden = coerceBoolean(args?.includeHidden);\n const includeGloballyHidden = coerceBoolean(\n args?.includeGloballyHidden,\n );\n const includeContent = coerceBoolean(args?.includeContent);\n const search = String(args?.search ?? \"\")\n .trim()\n .toLowerCase();\n const limit = coerceLimit(args?.limit);\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n\n let rows: Array<ExtensionRow | LocalExtensionRow> =\n await listExtensions({\n includeHidden,\n includeGloballyHidden,\n });\n const localRows = await listLocalExtensions();\n const allRows: Array<ExtensionRow | LocalExtensionRow> = [\n ...rows,\n ...localRows,\n ];\n if (search) {\n rows = allRows.filter((row) =>\n [row.id, row.name, row.description, row.ownerEmail]\n .join(\"\\n\")\n .toLowerCase()\n .includes(search),\n );\n } else {\n rows = allRows;\n }\n\n rows = rows.slice(0, limit);\n const extensions = await Promise.all(\n rows.map((row) => summarizeExtension(row, hiddenIds, includeContent)),\n );\n return {\n ok: true,\n count: extensions.length,\n extensions,\n };\n },\n readOnly: true,\n },\n\n \"get-extension\": {\n tool: {\n description:\n \"Get one existing extension by id. Use this when <current-screen> or <current-url> contains extensionId for the current extension; do not call list-extensions just to rediscover that id. Defaults to including the full Alpine.js content once per run so you can make a targeted update-extension edit; repeated unchanged reads return compact metadata unless forceContent=true.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to read. Prefer the extensionId from <current-screen> or <current-url> when the user refers to the current extension.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full Alpine.js content. Defaults to true for targeted edits.\",\n },\n forceContent: {\n type: \"boolean\",\n description:\n \"Return full content even if this run already read the same unchanged body. Use sparingly; prefer update-extension edits after the first read.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const includeContent =\n args?.includeContent === undefined\n ? true\n : coerceBoolean(args.includeContent);\n const forceContent = coerceBoolean(args?.forceContent);\n const localExtension = await getLocalExtension(id);\n if (localExtension) {\n return {\n ok: true,\n extension: await summarizeExtensionForAgentRead(\n localExtension,\n new Set(),\n includeContent,\n forceContent,\n ),\n };\n }\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n extension: await summarizeExtensionForAgentRead(\n extension,\n hiddenIds,\n includeContent,\n forceContent,\n ),\n };\n },\n // Result is JSON including the full Alpine content; account for JSON\n // escaping and envelope metadata instead of matching the source cap.\n maxResultChars: GET_EXTENSION_MAX_RESULT_CHARS,\n readOnly: true,\n },\n\n \"list-extension-history\": {\n tool: {\n description:\n \"List saved history snapshots for one extension. Use this when the user asks what changed, wants a changelog, or wants to pick an older version to restore. If the user is viewing the extension, use the extensionId from <current-screen> or <current-url>.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id whose history should be listed.\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum versions to return. Defaults to 50.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full HTML content for each version. Defaults to false.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionReadonlyHistoryMessage(id);\n if (localMessage) return localMessage;\n const history = await listExtensionHistory(id, {\n limit:\n args?.limit === undefined ? undefined : coerceLimit(args.limit),\n includeContent: coerceBoolean(args?.includeContent),\n });\n return {\n ok: true,\n count: history.length,\n history,\n };\n },\n readOnly: true,\n },\n\n \"get-extension-history-version\": {\n tool: {\n description:\n \"Get one extension history version with its previous-version diff. Use after list-extension-history when the user wants to inspect exactly what changed. Full HTML bodies are omitted by default; set includeContent=true only when restoring or manually comparing full source.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id whose history version should be read.\",\n },\n version: {\n type: \"number\",\n description: \"History version number to inspect.\",\n },\n includeContent: {\n type: \"boolean\",\n description:\n \"Include full HTML for the current and previous versions. Defaults to false to keep agent context compact.\",\n },\n },\n required: [\"id\", \"version\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionReadonlyHistoryMessage(id);\n if (localMessage) return localMessage;\n const version = Number(args?.version);\n if (!Number.isInteger(version) || version < 1) {\n return \"Error: version must be a positive integer.\";\n }\n const detail = await getExtensionHistoryVersion(id, version);\n if (!detail) {\n return `Error: extension history version not found: ${id}#${version}`;\n }\n return {\n ok: true,\n ...compactExtensionHistoryDetail(\n detail,\n coerceBoolean(args?.includeContent),\n ),\n };\n },\n // With includeContent, history can contain current + previous source and\n // repeat both in the diff, so it needs more headroom than get-extension.\n maxResultChars: GET_EXTENSION_HISTORY_MAX_RESULT_CHARS,\n readOnly: true,\n },\n\n \"render-inline-extension\": {\n tool: {\n description:\n \"Render a one-time, transient sandboxed Alpine.js mini-app directly inside the chat. Use this for generated UI that should answer the current turn inline without saving anything to the Extensions view: calculators, adjustable controls, knobs, pickers, visualizers, temporary dashboards, and interactive results. The content must be a self-contained Alpine.js HTML body snippet that can use appAction(), appFetch(), dbQuery(), extensionFetch(), extensionData, agentNative.ui.output(value, opts?), and agentNative.chat.send()/sendToAgentChat(). Use appAction() or extensionData for writes; dbQuery() is for read-only inspection of known app SQL tables. Use agentNative.ui.output for passive current values from knobs, sliders, and selections; it writes application state at inline-ui:<inline extension id>:output, which the agent can read later with readAppState when the user says to use that value. Use agentNative.chat.send for visible submit/apply actions. For transient UIs, extensionData is browser-local throwaway state; use application_state/appFetch, appAction, ui.output, or chat.send for anything the agent or app must observe. Use semantic Tailwind colors (bg-background, text-foreground, bg-primary, etc.) so it inherits the parent app theme. Use create-extension instead when the user wants the UI saved or reusable.\",\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"Short display name for the inline UI.\",\n },\n description: {\n type: \"string\",\n description: \"One-sentence summary of what the inline UI does.\",\n },\n content: {\n type: \"string\",\n description:\n \"Self-contained Alpine.js HTML body snippet. Do not include a full app build, React code, or source files. Required unless contentFromAttachment is set.\",\n },\n contentFromAttachment: {\n type: \"string\",\n description:\n 'Render a pasted/attached HTML file verbatim without re-typing it. Set to an attachment name or \"latest\".',\n },\n context: {\n type: \"string\",\n description:\n \"Optional JSON object passed to the iframe as slotContext for initial inputs from chat.\",\n },\n initialHeight: {\n type: \"number\",\n description:\n \"Optional initial iframe height in pixels before auto-resize reports. Defaults to 260.\",\n },\n },\n required: [\"name\"],\n },\n },\n chatUI: {\n renderer: ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER,\n title: \"Inline extension\",\n },\n maxResultChars: 220_000,\n readOnly: true,\n run: async (args, ctx) => {\n const name = String(args?.name ?? \"\").trim();\n if (!name) return \"Error: name is required.\";\n const resolved = resolveExtensionContent(args, ctx);\n if (\"error\" in resolved) return resolved.error;\n const content = resolved.content.trim();\n if (!content) return \"Error: content is required.\";\n const description = String(args?.description ?? \"\").trim();\n const id = `inline-${Date.now().toString(36)}-${Math.random()\n .toString(36)\n .slice(2, 8)}`;\n return {\n ok: true,\n inlineExtension: {\n mode: \"transient\",\n id,\n name,\n description,\n content,\n context: parseInlineContext(args?.context),\n initialHeight: coerceInlineHeight(args?.initialHeight),\n },\n next: \"Rendered inline in chat only. It is not saved in the Extensions view.\",\n };\n },\n },\n\n \"show-extension-inline\": {\n tool: {\n description:\n \"Render an existing saved extension inline in the chat. Use this when the user asks to load, reopen, reuse, or show a saved extension/widget/dashboard/calculator/mini-app in the conversation. Inline extensions can expose passive current values through agentNative.ui.output(value, opts?), which writes application state at inline-ui:<extension id>:output for the agent to read later with readAppState. Pass id when known; otherwise pass a search string and the action will use the best visible extension match.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to render inline.\",\n },\n search: {\n type: \"string\",\n description:\n \"Fallback search matched against id, name, description, and owner email when id is unknown.\",\n },\n context: {\n type: \"string\",\n description:\n \"Optional JSON object passed to the iframe as slotContext for chat-provided inputs.\",\n },\n initialHeight: {\n type: \"number\",\n description:\n \"Optional initial iframe height in pixels before auto-resize reports. Defaults to 260.\",\n },\n },\n },\n },\n chatUI: {\n renderer: ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER,\n title: \"Inline extension\",\n },\n readOnly: true,\n run: async (args) => {\n let id = String(args?.id ?? \"\").trim();\n const search = String(args?.search ?? \"\")\n .trim()\n .toLowerCase();\n\n if (!id && search) {\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n const rows: Array<ExtensionRow | LocalExtensionRow> = [\n ...(await listExtensions({\n includeHidden: false,\n includeGloballyHidden: false,\n })),\n ...(await listLocalExtensions()),\n ];\n const match = rows.find((row) =>\n [row.id, row.name, row.description, row.ownerEmail]\n .join(\"\\n\")\n .toLowerCase()\n .includes(search),\n );\n if (match) {\n id = match.id;\n } else {\n return {\n ok: false,\n error: `No extension matched \"${args?.search}\".`,\n available: await Promise.all(\n rows\n .slice(0, 10)\n .map((row) => summarizeExtension(row, hiddenIds, false)),\n ),\n };\n }\n }\n\n if (!id) return \"Error: provide id or search.\";\n\n const localExtension = await getLocalExtension(id);\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n if (localExtension) {\n const summary = await summarizeExtension(\n localExtension,\n hiddenIds,\n false,\n );\n return {\n ok: true,\n inlineExtension: {\n mode: \"persisted\",\n id: summary.id,\n name: summary.name,\n description: summary.description,\n path: summary.path,\n updatedAt: summary.updatedAt,\n context: parseInlineContext(args?.context),\n initialHeight: coerceInlineHeight(args?.initialHeight),\n },\n };\n }\n\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n const summary = await summarizeExtension(extension, hiddenIds, false);\n return {\n ok: true,\n inlineExtension: {\n mode: \"persisted\",\n id: summary.id,\n name: summary.name,\n description: summary.description,\n path: summary.path,\n updatedAt: summary.updatedAt,\n context: parseInlineContext(args?.context),\n initialHeight: coerceInlineHeight(args?.initialHeight),\n },\n };\n },\n },\n\n \"create-extension\": {\n tool: {\n description:\n 'Create a persisted sandboxed Alpine.js mini-app extension and render it inline in the chat. Use this when the user wants generated UI that should be saved, reusable, or visible in the Extensions view: extensions, widgets, dashboards, calculators, mini-apps, and reusable interactive utilities. For one-time chat-only UI, use render-inline-extension instead. The content must be a self-contained Alpine.js HTML body snippet that can use appAction(), appFetch(), dbQuery(), extensionFetch(), extensionData, agentNative.ui.output(value, opts?), and agentNative.chat.send()/sendToAgentChat(). Use appAction() for app data writes and extensionData for extension-owned persisted UI state; dbQuery() is for read-only inspection of known app SQL tables. Use agentNative.ui.output for passive current values from knobs, sliders, and selections; it writes application state at inline-ui:<extension id>:output, which the agent can read later with readAppState when the user says to use that value. Use agentNative.chat.send for visible submit/apply actions. Persist reusable user-edited state with extensionData: if the extension has checkboxes, todos, notes, filters, preferences, or any control whose value should survive reload/reopen, load that state on init and save changes with extensionData, usually at user scope, instead of keeping it only in Alpine state. IMPORTANT — hosting a pasted file: if the user pasted a large HTML/Alpine file (it appears in your context as an <attachment name=\"pasted-text-…\"> block) and asked you to host it as-is, do NOT copy that file into `content`. Instead leave `content` empty and pass `contentFromAttachment` set to that attachment\\'s name (or the literal \"latest\" for the most recent pasted block) — the server reads the file verbatim. Re-emitting a large pasted file as `content` regularly gets cut off mid-stream and stalls the turn. IMPORTANT — cloning a large extension that lives as a workspace resource (not a chat attachment): leave `content` empty and pass `contentFromWorkspaceFile` set to the resource path (e.g. \"intuit-analytics-extension.html\"); the server reads the full file. Do NOT try to reconstruct the body with run-code or route create-extension through run-code (mutating actions are not callable there). Prefer appAction(name, params) for app data and actions, including read actions mounted as GET; do not call template /api/* routes from appFetch because the extension bridge only allows framework /_agent-native/* paths. Parse JSON string action results before aggregating; use dbQuery() only for known existing SQL tables and never for writes. Keep the initial create-extension payload compact and working; for complex extensions, create a useful v1 first, then use focused update-extension edits for refinements rather than assembling one enormous initial tool input. For any non-trivial component (more than a couple of state fields, any methods, any string formatting, any branching) put the component in a <script> block via Alpine.data(\\'name\\', () => ({...})) and reference it with x-data=\"name\" — do NOT cram methods, template literals, or branching logic into an inline x-data=\"{...}\" attribute (HTML parser pitfalls cause ReferenceError failures). Define every variable referenced from x-text/x-show/x-if/x-for on the data object\\'s initial state. If the extension\\'s value depends on an LLM call, require a real key via \\\\${keys.OPENAI_API_KEY}/\\\\${keys.ANTHROPIC_API_KEY} (and tell the user to add it in the Dispatch Vault, or in app Settings → API Keys & Connections for standalone apps, if missing) or route the AI work to the agent chat — never ship a stubbed analysis step that renders a placeholder/boolean as the result.',\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description:\n 'Short display name for the extension. Do not include \"app\" — e.g. name a todo app \"Todos\", a weather app \"Weather\".',\n },\n description: {\n type: \"string\",\n description: \"One-sentence summary of what the extension does.\",\n },\n content: {\n type: \"string\",\n description:\n \"Self-contained Alpine.js HTML body snippet. The iframe canvas already has modest default padding, so avoid duplicate outer padding unless the design needs it. Use semantic Tailwind colors (bg-background, text-foreground, bg-primary, etc.) for native theming. Do not include a full app build, React code, or source files. Required UNLESS you pass contentFromAttachment instead.\",\n },\n contentFromAttachment: {\n type: \"string\",\n description:\n 'Host a pasted/attached file verbatim WITHOUT re-typing it. Set this to the name of an attachment on the current turn (e.g. \"pasted-text-1718000000000-ab12cd.txt\") or the literal \"latest\" for the most recent pasted block; the server resolves it into the extension content. Use this instead of `content` whenever the user pasted a large file to host — it avoids re-emitting thousands of tokens. When set, leave `content` empty.',\n },\n contentFromWorkspaceFile: {\n type: \"string\",\n description:\n 'Host a workspace/shared resource file verbatim WITHOUT re-typing it. Set this to the resource path (e.g. \"intuit-analytics-extension.html\"); the server reads the full file and uses it as the extension content. Use this — NOT run-code or contentFromAttachment — when cloning a large extension body that already exists as a workspace resource. When set, leave `content` empty.',\n },\n icon: {\n type: \"string\",\n description: \"Optional icon name or short label.\",\n },\n },\n required: [\"name\"],\n },\n },\n chatUI: {\n renderer: ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER,\n title: \"Extension\",\n },\n run: async (args, ctx) => {\n const name = String(args?.name ?? \"\").trim();\n if (!name) return \"Error: name is required.\";\n const resolved = await resolveExtensionContentAsync(args, ctx);\n if (\"error\" in resolved) return resolved.error;\n const content = resolved.content.trim();\n if (!content) return \"Error: content is required.\";\n const description = String(args?.description ?? \"\").trim();\n const icon = args?.icon ? String(args.icon) : undefined;\n\n // Idempotency: if an identical extension was created in the last 5\n // minutes (e.g. a connection drop caused the agent to retry this tool\n // call), return the existing one instead of creating a duplicate.\n // Keyed on the FULL create inputs (name + content + description + icon),\n // so two creates that differ in ANY of them are treated as distinct\n // rather than silently collapsed — only a byte-identical re-create (the\n // retry case) recovers the existing row.\n const existing = await findRecentDuplicateExtension({\n name,\n content,\n description,\n icon,\n });\n if (existing) {\n const existingPath = extensionPath(existing.id, existing.name);\n try {\n await writeAppState(\"navigate\", {\n view: \"extensions\",\n extensionId: existing.id,\n path: existingPath,\n _writeId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n });\n } catch {\n // Non-fatal — agent can still mention the path in its reply.\n }\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n // Compact summary (contentLength + contentHash, no full body). Echoing\n // the whole HTML back is pure token waste — the agent just supplied it.\n extension: await summarizeExtension(existing, hiddenIds, false),\n path: existingPath,\n next: `Extension was already created in this session (recovered from a connection retry). The user is being navigated to it — no further navigation tool calls needed.`,\n };\n }\n\n const extension = await createExtension({\n name,\n description,\n content,\n icon,\n });\n const path = extensionPath(extension.id, extension.name);\n\n // Auto-navigate so the user lands on the new extension instead of\n // having to read the JSON response and click a link. Writes a\n // one-shot `navigate` app-state command the UI consumes and clears.\n try {\n await writeAppState(\"navigate\", {\n view: \"extensions\",\n extensionId: extension.id,\n path,\n // Unique-per-write token so the UI's `use-navigation-state` hook\n // can dedup race-driven re-reads of the same command.\n _writeId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n });\n } catch {\n // Non-fatal — agent can still mention the path in its reply.\n }\n\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n // Compact summary (contentLength + contentHash, no full body). Echoing\n // the whole HTML back is pure token waste — the agent just supplied it.\n extension: await summarizeExtension(extension, hiddenIds, false),\n path,\n next: `Created. The user is being navigated to the new extension automatically — no further navigation tool calls needed.`,\n };\n },\n },\n\n \"update-extension\": {\n tool: {\n description:\n 'Update an existing sandboxed Alpine.js mini-app extension. Pass exactly three fields: `id`, `operation`, and `payloadJson`. `payloadJson` is a JSON object encoded as a string so model gateways cannot fill its optional members with invalid empty placeholders. For operation=\"edit\", pass {\"edits\":[...]} or {\"patches\":[...]} and optional format=true — prefer several small, targeted edits over one large one; a single edit/replace body over roughly 8KB risks the model truncating its own payloadJson mid-generation, which arrives here as an empty or malformed call that must be retried from scratch. For operation=\"replace\", pass exactly one of content, contentFromAttachment, or contentFromWorkspaceFile; use this operation only for a user-requested broad visual rewrite or complete replacement body. Do not inline large static datasets (full metric histories, big arrays) into the HTML/JS body — store them with extension-data-set and fetch them at runtime via extensionData.list()/get() instead, so edits stay small regardless of dataset size. For operation=\"metadata\", pass name, description, or icon. Change sharing through set-resource-visibility instead. If the user is viewing the extension, use the extensionId from <current-screen> or <current-url> directly.',\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to update. Prefer the extensionId from <current-screen> or <current-url> for the current extension.\",\n },\n operation: {\n type: \"string\",\n enum: [\"edit\", \"replace\", \"metadata\"],\n description:\n 'The single update mode: \"edit\" for focused patches/edits, \"replace\" for an explicitly authorized complete body replacement, or \"metadata\" for name/description/icon.',\n },\n payloadJson: {\n type: \"string\",\n minLength: 2,\n description:\n 'A non-empty JSON object encoded as a string. edit example: {\"edits\":[{\"op\":\"replace\",\"find\":\"old\",\"replace\":\"new\"}],\"format\":true}. replace example: {\"contentFromAttachment\":\"latest\"}. metadata example: {\"name\":\"New name\"}.',\n },\n },\n required: [\"id\", \"operation\", \"payloadJson\"],\n additionalProperties: false,\n },\n },\n run: async (args, ctx) => {\n const normalizedUpdate = normalizeUpdateExtensionArgs(args);\n if (\"error\" in normalizedUpdate) return normalizedUpdate.error;\n args = normalizedUpdate.args;\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n if (\n args?.name !== undefined &&\n (typeof args.name !== \"string\" || args.name.trim().length === 0)\n ) {\n return \"Error: extension name must be a non-empty string. No changes were applied.\";\n }\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n\n if (\n typeof args?.visibility === \"string\" &&\n args.visibility.trim().toLowerCase() === \"public\"\n ) {\n const message =\n \"Public extension sharing is not supported. Use visibility=private or visibility=org. No content changes were applied; do not retry visibility=public.\";\n throw new AgentActionStopError(message, {\n errorCode: \"extension_public_visibility_unsupported\",\n toolResult: JSON.stringify(\n {\n error: \"extension_public_visibility_unsupported\",\n message,\n recoverable: false,\n next: \"Retry only with visibility=private or visibility=org.\",\n },\n null,\n 2,\n ),\n });\n }\n\n const attachmentRef =\n typeof args?.contentFromAttachment === \"string\"\n ? args.contentFromAttachment.trim()\n : \"\";\n const workspaceFileRef =\n typeof args?.contentFromWorkspaceFile === \"string\"\n ? args.contentFromWorkspaceFile.trim()\n : \"\";\n const fullReplacementRequested =\n (typeof args?.content === \"string\" &&\n args.content.trim().length > 0) ||\n attachmentRef.length > 0 ||\n workspaceFileRef.length > 0;\n if (\n fullReplacementRequested &&\n !coerceBoolean(args?.allowFullReplacement)\n ) {\n const message =\n \"Full extension-body replacement requires allowFullReplacement=true. No changes were applied. If the user's request includes a broad visual rewrite such as changing layout, compactness, visible sections, naming, or padding, retry once with allowFullReplacement=true; otherwise read the current extension and use focused patches/edits for a data-only repair. Do not retry unchanged arguments.\";\n throw new ExtensionContentEditError(message);\n }\n\n // Full-replacement content can come inline (`content`) or by reference\n // (`contentFromAttachment`) so the model never has to re-type a large\n // pasted file. Inline wins only when NON-EMPTY — the docstring tells\n // callers to leave `content` empty when using `contentFromAttachment`,\n // so an empty/blank `content` must fall through to the attachment\n // instead of blanking the extension (mirrors resolveExtensionContent).\n let replacementContent =\n typeof args?.content === \"string\" && args.content.trim().length > 0\n ? args.content\n : undefined;\n if (\n replacementContent === undefined &&\n (attachmentRef.length > 0 || workspaceFileRef.length > 0)\n ) {\n const resolved = await resolveExtensionContentAsync(args, ctx);\n if (\"error\" in resolved) return resolved.error;\n replacementContent = resolved.content;\n }\n\n let result = null;\n const patches = parsePatches((args as any).patches);\n if (args?.patches !== undefined && !patches) {\n return \"Error: patches must be a JSON array of { find, replace } objects.\";\n }\n const edits = parseEdits((args as any).edits);\n if (args?.edits !== undefined && !edits) {\n return \"Error: edits must be a JSON array of supported extension edit operations.\";\n }\n const hasContentUpdate =\n replacementContent !== undefined ||\n (patches?.length ?? 0) > 0 ||\n (edits?.length ?? 0) > 0 ||\n coerceBoolean(args?.format);\n if (hasContentUpdate) {\n try {\n result = await updateExtensionContent(id, {\n content: replacementContent,\n allowFullReplacement: coerceBoolean(args?.allowFullReplacement),\n patches,\n edits,\n format: coerceBoolean(args?.format),\n });\n } catch (error) {\n if (!(error instanceof ExtensionContentEditError)) throw error;\n const message =\n `The extension edit was not applied: ${error.message} ` +\n \"Do not retry the same arguments. Read the current extension and submit one focused patch or edit with an exact target.\";\n throw new AgentActionStopError(message, {\n errorCode: \"extension_content_edit_failed\",\n toolResult: JSON.stringify(\n {\n error: \"extension_content_edit_failed\",\n message: error.message,\n recoverable: false,\n next: \"Read the current extension with get-extension, then make one focused update-extension patches/edits call. Do not retry unchanged arguments.\",\n },\n null,\n 2,\n ),\n });\n }\n }\n\n const meta: Record<string, string> = {};\n if (args?.name !== undefined) meta.name = String(args.name).trim();\n if (args?.description !== undefined) {\n meta.description = String(args.description).trim();\n }\n if (args?.icon !== undefined) meta.icon = String(args.icon);\n if (args?.visibility !== undefined)\n meta.visibility = String(args.visibility);\n if (Object.keys(meta).length > 0) {\n result = await updateExtension(id, meta as any);\n }\n\n if (!result && !hasContentUpdate && Object.keys(meta).length === 0) {\n return \"Error: update-extension received no actual changes. Choose one operation and provide a non-empty payloadJson object; empty placeholder fields are not an update.\";\n }\n if (!result) result = await getExtension(id);\n if (!result) return `Error: extension not found: ${id}`;\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n extension: await summarizeExtension(result, hiddenIds, false),\n };\n },\n },\n\n \"extension-data-set\": {\n tool: {\n description:\n \"Write a value to an extension's extensionData store (the tool_data table) from the agent side. Use this when the agent needs to update or seed data that an extension reads via extensionData.get() at render time. Requires editor access to the extension.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: {\n type: \"string\",\n description: \"Extension id whose data store to write to.\",\n },\n collection: {\n type: \"string\",\n description: \"Collection name within the extension's data store.\",\n },\n itemId: {\n type: \"string\",\n description:\n \"Item id within the collection. Upserts if it already exists.\",\n },\n data: {\n description:\n \"The data value to store. Objects are JSON-serialized automatically.\",\n },\n scope: {\n type: \"string\",\n enum: [\"user\", \"org\"],\n description:\n \"Storage scope. 'user' (default) is private to the current user; 'org' is shared across the organization.\",\n },\n },\n required: [\"extensionId\", \"collection\", \"itemId\", \"data\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const collection = String(args?.collection ?? \"\").trim();\n const itemId = String(args?.itemId ?? \"\").trim();\n if (!extensionId || !collection || !itemId)\n return \"Error: extensionId, collection, and itemId are required.\";\n if (args?.data === undefined) return \"Error: data is required.\";\n\n await ensureExtensionsTables();\n const access = await resolveAccess(\"extension\", extensionId);\n if (\n !access ||\n (access.resource as ExtensionRow | undefined)?.archivedAt ||\n access.role === \"viewer\"\n )\n return `Error: editor access required for extension ${extensionId}.`;\n\n const userEmail = getRequestUserEmail()?.toLowerCase() ?? \"\";\n const scope = args?.scope === \"org\" ? \"org\" : \"user\";\n const orgId = getRequestOrgId();\n if (scope === \"org\" && !orgId)\n return \"Error: org context required for scope=org.\";\n\n const data =\n typeof args.data === \"string\" ? args.data : JSON.stringify(args.data);\n const MAX_BYTES = 1024 * 1024;\n if (Buffer.byteLength(data, \"utf8\") > MAX_BYTES)\n return `Error: data exceeds ${MAX_BYTES} byte limit. Store large payloads in file storage instead.`;\n\n const now = new Date().toISOString();\n const scopeKey = scope === \"org\" ? `org:${orgId}` : userEmail;\n const client = getDbExec();\n const pg = isPostgres();\n const conflictClause = pg\n ? `ON CONFLICT (tool_id, collection, scope_key, item_id)\n DO UPDATE SET data = EXCLUDED.data, updated_at = EXCLUDED.updated_at`\n : `ON CONFLICT (tool_id, collection, scope_key, item_id)\n DO UPDATE SET data = excluded.data, updated_at = excluded.updated_at`;\n\n await client.execute({\n sql: `UPDATE tools SET updated_at = ? WHERE id = ?`,\n args: [now, extensionId],\n });\n await client.execute({\n sql: `INSERT INTO tool_data (id, tool_id, collection, item_id, data, owner_email, scope, org_id, scope_key, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ${conflictClause}`,\n args: [\n randomUUID(),\n extensionId,\n collection,\n itemId,\n data,\n userEmail,\n scope,\n scope === \"org\" ? orgId! : null,\n scopeKey,\n now,\n now,\n ],\n });\n await notifyExtensionChangeForResource(extensionId);\n\n return {\n ok: true,\n id: itemId,\n extensionId,\n collection,\n scope,\n updatedAt: now,\n };\n },\n },\n\n \"extension-data-get\": {\n tool: {\n description:\n \"Read items from an extension's extensionData store (the tool_data table) from the agent side. Use this to inspect what data an extension currently has stored, or to verify a write succeeded. Requires viewer access to the extension.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: {\n type: \"string\",\n description: \"Extension id whose data store to read from.\",\n },\n collection: {\n type: \"string\",\n description: \"Collection name within the extension's data store.\",\n },\n itemId: {\n type: \"string\",\n description:\n \"Optional specific item id. If omitted, lists all items in the collection.\",\n },\n scope: {\n type: \"string\",\n enum: [\"user\", \"org\", \"all\"],\n description:\n \"Storage scope to read. 'user' (default) reads the current user's items; 'org' reads organization-shared items; 'all' reads both.\",\n },\n limit: {\n type: \"number\",\n description:\n \"Maximum items to return when listing (default 100, max 1000).\",\n },\n },\n required: [\"extensionId\", \"collection\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const collection = String(args?.collection ?? \"\").trim();\n if (!extensionId || !collection)\n return \"Error: extensionId and collection are required.\";\n\n await ensureExtensionsTables();\n const access = await resolveAccess(\"extension\", extensionId);\n if (\n !access ||\n (access.resource as ExtensionRow | undefined)?.archivedAt\n )\n return `Error: no access to extension ${extensionId}.`;\n\n const userEmail = getRequestUserEmail()?.toLowerCase() ?? \"\";\n const scope = args?.scope ?? \"user\";\n const orgId = getRequestOrgId();\n if ((scope === \"org\" || scope === \"all\") && !orgId)\n return \"Error: org context required for scope=org or scope=all.\";\n const itemId = args?.itemId ? String(args.itemId).trim() : null;\n const limit = Math.min(Math.max(1, Number(args?.limit) || 100), 1000);\n const client = getDbExec();\n\n if (itemId) {\n const scopeClause =\n scope === \"org\"\n ? `AND scope = 'org' AND org_id = ?`\n : scope === \"all\"\n ? `AND ((scope = 'user' AND lower(owner_email) = ?) OR (scope = 'org' AND org_id = ?))`\n : `AND scope = 'user' AND lower(owner_email) = ?`;\n const scopeArgs =\n scope === \"org\"\n ? [orgId ?? \"\"]\n : scope === \"all\"\n ? [userEmail, orgId ?? \"\"]\n : [userEmail];\n\n const result = await client.execute({\n sql: `SELECT COALESCE(item_id, id) AS id, data, scope, owner_email, updated_at\n FROM tool_data\n WHERE tool_id = ? AND collection = ? AND COALESCE(item_id, id) = ? ${scopeClause}`,\n args: [extensionId, collection, itemId, ...scopeArgs],\n });\n const row = result.rows?.[0];\n if (!row) return { found: false, extensionId, collection, itemId };\n return { found: true, ...row };\n }\n\n const scopeClause =\n scope === \"org\"\n ? `AND scope = 'org' AND org_id = ?`\n : scope === \"all\"\n ? `AND ((scope = 'user' AND lower(owner_email) = ?) OR (scope = 'org' AND org_id = ?))`\n : `AND scope = 'user' AND lower(owner_email) = ?`;\n const scopeArgs =\n scope === \"org\"\n ? [orgId ?? \"\"]\n : scope === \"all\"\n ? [userEmail, orgId ?? \"\"]\n : [userEmail];\n\n const result = await client.execute({\n sql: `SELECT COALESCE(item_id, id) AS id, data, scope, owner_email, updated_at\n FROM tool_data\n WHERE tool_id = ? AND collection = ? ${scopeClause}\n ORDER BY updated_at DESC\n LIMIT ?`,\n args: [extensionId, collection, ...scopeArgs, limit],\n });\n return {\n extensionId,\n collection,\n scope,\n count: result.rows?.length ?? 0,\n items: result.rows ?? [],\n };\n },\n },\n\n \"delete-extension\": {\n tool: {\n description:\n \"Archive an extension everywhere it is shared. Archiving is a soft delete: the extension and its history, data, sharing, and slot configuration are retained, but it disappears from normal lists. Requires owner/admin access. If the user only wants a shared extension removed from their own sidebar/list, use hide-extension instead.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to archive. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n try {\n const ok = await deleteExtension(id);\n if (!ok) return `Error: extension not found: ${id}`;\n return { ok: true, archived: summarizeDeletedExtension(extension) };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message ?? String(err),\n next: \"If the user wants this gone only from their own view, call hide-extension with the same id.\",\n };\n }\n },\n },\n\n \"restore-extension-history-version\": {\n tool: {\n description:\n \"Restore an extension's name, description, icon, and HTML content from a saved history version. Requires editor access. This does not restore sharing visibility or ownership.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to restore.\",\n },\n version: {\n type: \"number\",\n description:\n \"Saved history version number to restore. Use list-extension-history first if unsure.\",\n },\n },\n required: [\"id\", \"version\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionReadonlyHistoryMessage(id);\n if (localMessage) return localMessage;\n const version = Number(args?.version);\n if (!Number.isInteger(version) || version < 1) {\n return \"Error: version must be a positive integer.\";\n }\n const result = await restoreExtensionHistoryVersion(id, version);\n if (!result) {\n return `Error: extension history version not found: ${id}#${version}`;\n }\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n return {\n ok: true,\n restoredVersion: version,\n extension: await summarizeExtension(result, hiddenIds, false),\n };\n },\n },\n\n \"hide-extension\": {\n tool: {\n description:\n \"Hide an accessible extension from the current user's Extensions list/sidebar without deleting it for anyone else. Use this when the user says to remove a shared extension from their view, or when delete-extension reports that the current user is not owner/admin.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to hide for the current user. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n await hideExtension(id);\n return { ok: true, hidden: summarizeDeletedExtension(extension) };\n },\n },\n\n \"unhide-extension\": {\n tool: {\n description:\n \"Restore an extension the current user previously hid so it appears in their Extensions list/sidebar again. Use list-extensions with includeHidden=true to find hidden ids.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to restore for the current user.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n await unhideExtension(id);\n return { ok: true, id };\n },\n },\n\n \"global-hide-extension\": {\n tool: {\n description:\n \"Globally hide an extension from EVERYONE's Extensions list/sidebar (not just the current user) by stamping it hidden. Requires owner/admin access. Use this for an admin takedown of a shared/org extension. The extension is not deleted and stays accessible by id; use global-unhide-extension to reverse. For removing an extension only from your own view, use hide-extension instead.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description:\n \"Extension id to hide for everyone. Use list-extensions first if you only know the display name.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n const extension = await getExtension(id);\n if (!extension) return `Error: extension not found: ${id}`;\n\n await globalHideExtension(id);\n return {\n ok: true,\n globallyHidden: summarizeDeletedExtension(extension),\n };\n },\n },\n\n \"global-unhide-extension\": {\n tool: {\n description:\n \"Reverse a global hide so the extension reappears in everyone's Extensions list/sidebar again. Requires owner/admin access. Use list-extensions with includeGloballyHidden=true to find globally-hidden ids.\",\n parameters: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Extension id to unhide for everyone.\",\n },\n },\n required: [\"id\"],\n },\n },\n run: async (args) => {\n const id = String(args?.id ?? \"\").trim();\n if (!id) return \"Error: id is required.\";\n const localMessage = await localExtensionEditMessage(id);\n if (localMessage) return localMessage;\n await globalUnhideExtension(id);\n return { ok: true, id };\n },\n },\n\n \"add-extension-slot-target\": {\n tool: {\n description:\n 'Declare that an extension can render in a UI extension-point slot of an app (e.g. \"mail.contact-sidebar.bottom\"). Apps drop ExtensionSlot components in their UI; this action registers an extension as installable into one of those slots. Slot IDs follow the convention <app>.<area>.<position>. Caller must have editor access to the extension.',\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n slotId: {\n type: \"string\",\n description:\n 'Slot identifier — e.g. \"mail.contact-sidebar.bottom\".',\n },\n config: {\n type: \"string\",\n description:\n \"Optional JSON string with slot-specific config (defaults, hints, etc.).\",\n },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const localMessage = await localExtensionEditMessage(extensionId);\n if (localMessage) return localMessage;\n const row = await addExtensionSlotTarget(\n extensionId,\n slotId,\n args?.config ? String(args.config) : undefined,\n );\n return { ok: true, slot: row };\n },\n },\n\n \"install-extension\": {\n tool: {\n description:\n \"Install an extension as a widget in an extension-point slot for the current user. The extension must already declare the slot via add-extension-slot-target. Per-user installation — only affects the calling user's view. Use after creating an extension that targets a slot, or when the user asks to add an existing widget to a slot.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: {\n type: \"string\",\n description: \"Extension id to install.\",\n },\n slotId: {\n type: \"string\",\n description:\n 'Slot identifier — e.g. \"mail.contact-sidebar.bottom\".',\n },\n position: {\n type: \"number\",\n description:\n \"Optional integer position within the slot (lower = earlier). Defaults to end.\",\n },\n config: {\n type: \"string\",\n description:\n \"Optional JSON string with per-install config (overrides, settings).\",\n },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const localMessage = await localExtensionEditMessage(extensionId);\n if (localMessage) return localMessage;\n const position =\n args?.position !== undefined && args.position !== null\n ? Number(args.position)\n : undefined;\n const row = await installExtensionSlot(extensionId, slotId, {\n position: Number.isFinite(position as number) ? position : undefined,\n config: args?.config ? String(args.config) : undefined,\n });\n return { ok: true, install: row };\n },\n },\n\n \"uninstall-extension\": {\n tool: {\n description:\n \"Remove an extension from an extension-point slot for the current user. Does not delete the extension itself.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n slotId: { type: \"string\", description: \"Slot identifier.\" },\n },\n required: [\"extensionId\", \"slotId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n if (!slotId) return \"Error: slotId is required.\";\n const localMessage = await localExtensionEditMessage(extensionId);\n if (localMessage) return localMessage;\n await uninstallExtensionSlot(extensionId, slotId);\n return { ok: true };\n },\n },\n\n \"list-extensions-for-slot\": {\n tool: {\n description:\n \"List extensions the current user has access to that declare a given extension-point slot. Use to discover what's available to install into a slot the user mentioned.\",\n parameters: {\n type: \"object\",\n properties: {\n slotId: { type: \"string\", description: \"Slot identifier.\" },\n },\n required: [\"slotId\"],\n },\n },\n run: async (args) => {\n const slotId = String(args?.slotId ?? \"\").trim();\n if (!slotId) return \"Error: slotId is required.\";\n return { extensions: await listExtensionsForSlot(slotId) };\n },\n readOnly: true,\n },\n\n \"list-extension-slots\": {\n tool: {\n description:\n \"List the extension-point slots a specific extension declares it can render in. Caller must have viewer access to the extension.\",\n parameters: {\n type: \"object\",\n properties: {\n extensionId: { type: \"string\", description: \"Extension id.\" },\n },\n required: [\"extensionId\"],\n },\n },\n run: async (args) => {\n const extensionId = String(args?.extensionId ?? \"\").trim();\n if (!extensionId) return \"Error: extensionId is required.\";\n return { slots: await listSlotsForExtension(extensionId) };\n },\n readOnly: true,\n },\n };\n}\n\nasync function summarizeExtension(\n row: ExtensionRow | LocalExtensionRow,\n hiddenIds: Set<string>,\n includeContent: boolean,\n) {\n const local = isLocalExtensionRow(row);\n const access = local\n ? ({ role: \"viewer\" } as const)\n : await resolveAccess(\"extension\", row.id).catch(() => null);\n return {\n id: row.id,\n name: row.name,\n path: extensionPath(row.id, row.name),\n description: row.description,\n icon: row.icon,\n ownerEmail: row.ownerEmail,\n visibility: row.visibility,\n role: access?.role ?? null,\n canEdit: access\n ? [\"owner\", \"admin\", \"editor\"].includes(access.role)\n : false,\n canDelete: access ? [\"owner\", \"admin\"].includes(access.role) : false,\n hidden: hiddenIds.has(row.id),\n globallyHidden: row.hiddenAt != null,\n hiddenAt: row.hiddenAt,\n hiddenBy: row.hiddenBy,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n contentLength: row.content.length,\n contentHash: contentFingerprint(row.content),\n ...(local ? { source: row.source } : {}),\n ...(includeContent ? { content: row.content } : {}),\n };\n}\n\nasync function summarizeExtensionForAgentRead(\n row: ExtensionRow | LocalExtensionRow,\n hiddenIds: Set<string>,\n includeContent: boolean,\n forceContent: boolean,\n) {\n if (!includeContent) {\n return summarizeExtension(row, hiddenIds, false);\n }\n\n const fingerprint = contentFingerprint(row.content);\n const runCtx = getRequestRunContext();\n const reads = runCtx ? (runCtx.extensionContentReads ??= {}) : undefined;\n const alreadySent = !forceContent && reads?.[row.id] === fingerprint;\n if (!alreadySent && reads) {\n reads[row.id] = fingerprint;\n }\n\n const summary = await summarizeExtension(row, hiddenIds, !alreadySent);\n if (!alreadySent) return summary;\n\n return {\n ...summary,\n contentOmitted: {\n reason: \"unchanged-content-already-returned-this-run\",\n contentHash: fingerprint,\n contentLength: row.content.length,\n next: 'Use the content already returned earlier in this run and call update-extension with operation=\"edit\" plus focused edits/patches inside payloadJson. Set forceContent=true only if you truly need the full body again.',\n },\n };\n}\n\nfunction compactExtensionHistoryDetail(\n detail: ExtensionHistoryDetail,\n includeContent: boolean,\n): ExtensionHistoryDetail & {\n diffOmitted?: { omittedLines: number; maxLines: number };\n} {\n const diffMaxLines = 400;\n const fullDiff = detail.diff ?? [];\n const diff =\n fullDiff.length > diffMaxLines\n ? [...fullDiff.slice(0, 200), ...fullDiff.slice(fullDiff.length - 200)]\n : fullDiff;\n return {\n ...detail,\n entry: compactHistoryEntry(detail.entry, includeContent),\n previous: detail.previous\n ? compactHistoryEntry(detail.previous, includeContent)\n : null,\n diff,\n ...(fullDiff.length > diff.length\n ? {\n diffOmitted: {\n omittedLines: fullDiff.length - diff.length,\n maxLines: diffMaxLines,\n },\n }\n : {}),\n };\n}\n\nfunction compactHistoryEntry(\n entry: ExtensionHistoryEntry,\n includeContent: boolean,\n): ExtensionHistoryEntry & { contentHash?: string } {\n const content = entry.content ?? \"\";\n const withHash = {\n ...entry,\n ...(content ? { contentHash: contentFingerprint(content) } : {}),\n };\n if (includeContent) return withHash;\n const { content: _content, ...withoutContent } = withHash;\n return withoutContent;\n}\n\nfunction contentFingerprint(content: string): string {\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash * 33) ^ content.charCodeAt(i);\n }\n return `${content.length.toString(36)}-${(hash >>> 0).toString(36)}`;\n}\n\nasync function localExtensionEditMessage(id: string): Promise<string | null> {\n const localExtension = await getLocalExtension(id);\n if (!localExtension) return null;\n return `Error: extension \"${id}\" is backed by local files at ${localExtension.source.entryPath}. Edit that file or ${localExtension.source.manifestPath} in the workspace instead of using SQL-backed extension actions.`;\n}\n\nasync function localExtensionReadonlyHistoryMessage(\n id: string,\n): Promise<string | null> {\n const localExtension = await getLocalExtension(id);\n if (!localExtension) return null;\n return `Error: extension \"${id}\" is backed by local files at ${localExtension.source.entryPath}. Use Git or your editor's file history for versions.`;\n}\n\nfunction summarizeDeletedExtension(row: ExtensionRow) {\n return {\n id: row.id,\n name: row.name,\n ownerEmail: row.ownerEmail,\n visibility: row.visibility,\n };\n}\n\n/**\n * Filename prefix the composer stamps on a \"Pasted text\" attachment chip\n * (`createPastedTextFile` in `client/composer/pasted-text.ts`). The agent sees\n * these as `<attachment name=\"pasted-text-…\">` blocks, so a model hosting a\n * pasted file can reference it by that name via `contentFromAttachment`.\n */\nconst PASTED_TEXT_ATTACHMENT_PREFIX = \"pasted-text-\";\n\n/** Keyword refs that mean \"use the most recent pasted block above\". */\nconst LATEST_ATTACHMENT_KEYWORDS = new Set([\n \"latest\",\n \"last\",\n \"paste\",\n \"pasted\",\n \"pasted-text\",\n \"attachment\",\n \"above\",\n]);\n\n/** Strip the `<attachment …>\\n…\\n</attachment>` wrapper if one is present. */\nfunction unwrapAttachmentEnvelope(text: string): string {\n const match = text.match(/^<attachment\\b[^>]*>\\n([\\s\\S]*)\\n<\\/attachment>$/);\n return match ? match[1] : text;\n}\n\n/**\n * Resolve the HTML body for create/update-extension from either the inline\n * `content` argument or a `contentFromAttachment` handle pointing at a pasted /\n * uploaded text attachment on the current turn. The by-reference path lets the\n * model host a large pasted file without re-emitting it as a tool argument —\n * which frequently gets cut off mid-stream and triggers a continuation loop.\n *\n * Resolution is forgiving: an exact attachment-name match wins, then a keyword\n * (\"latest\"/\"pasted\"/…) or a near-miss name falls back to the most recent\n * pasted-text attachment (or the only text attachment).\n */\nfunction resolveExtensionContent(\n args: Record<string, string> | undefined,\n ctx: ActionRunContext | undefined,\n): { content: string } | { error: string } {\n const inline = args?.content !== undefined ? String(args.content) : undefined;\n if (inline !== undefined && inline.trim().length > 0) {\n return { content: inline };\n }\n\n const ref =\n args?.contentFromAttachment !== undefined\n ? String(args.contentFromAttachment).trim()\n : \"\";\n if (!ref) {\n return {\n error:\n \"Error: provide either content (inline Alpine.js HTML) or contentFromAttachment (the name of a pasted/attached file to host verbatim).\",\n };\n }\n\n const textAttachments = (ctx?.attachments ?? []).filter(\n (att): att is AgentChatAttachment & { text: string } =>\n typeof att.text === \"string\" && att.text.trim().length > 0,\n );\n if (textAttachments.length === 0) {\n return {\n error:\n \"Error: contentFromAttachment was set but this turn has no readable text attachment. Re-send the file as an attachment, or pass the HTML inline via content.\",\n };\n }\n\n const lower = ref.toLowerCase();\n let match = textAttachments.find(\n (att) => (att.name ?? \"\").trim().toLowerCase() === lower,\n );\n if (!match) {\n const pasted = textAttachments.filter((att) =>\n (att.name ?? \"\").startsWith(PASTED_TEXT_ATTACHMENT_PREFIX),\n );\n const pool = pasted.length > 0 ? pasted : textAttachments;\n if (\n LATEST_ATTACHMENT_KEYWORDS.has(lower) ||\n pasted.length === 1 ||\n textAttachments.length === 1\n ) {\n match = pool[pool.length - 1];\n }\n }\n\n if (!match) {\n const names = textAttachments\n .map((att) => att.name || \"(unnamed)\")\n .join(\", \");\n return {\n error: `Error: no attachment matched contentFromAttachment=\"${ref}\". Available text attachments: ${names}. Pass one of those names exactly, or \"latest\" for the most recent pasted block.`,\n };\n }\n\n const resolved = unwrapAttachmentEnvelope(match.text);\n // Fail fast instead of hosting corrupted content. The client caps an\n // outbound attachment at MAX_OUTBOUND_ATTACHMENT_CHARS (200k) and appends a\n // trailing notice ending \"...omitted from the submitted attachment.]\" (see\n // truncateOutboundAttachment in agent-chat-adapter.ts). Hosting that verbatim\n // would bake a half file + the notice into the extension body; reject it with\n // an actionable message so the user shrinks/splits the file instead.\n if (/omitted from the submitted attachment\\.\\]\\s*$/.test(resolved)) {\n return {\n error:\n \"Error: the pasted file is too large to host verbatim (it was truncated above 200,000 characters before reaching the server, so hosting it would corrupt the extension). Reduce the file or split it into smaller extensions, then try again.\",\n };\n }\n return { content: resolved };\n}\n\n/**\n * Resolve the workspace-files bridge scope exactly the way run-code's\n * workspaceRead/workspaceWrite do: org-preferred (org → shared owner) with the\n * requesting user's email as the solo fallback. Kept in lockstep with\n * `resolveScope` in `workspace-files/tool.ts`.\n */\nfunction workspaceFilesBridgeScope(): WorkspaceFilesScope | null {\n const orgId = getRequestOrgId();\n if (orgId) return { scope: \"org\", scopeId: orgId };\n const email = getRequestUserEmail();\n if (email) return { scope: \"user\", scopeId: email };\n return null;\n}\n\n/**\n * Read a workspace/shared/personal resource file's FULL content by path.\n *\n * Precedence (single, documented rule so this never silently resolves a\n * different file than the agent inspected):\n * 1. The run-code `workspace-files` bridge scope (org → shared owner, else the\n * user's email). This is the SAME owner/scope `workspaceRead` /\n * `workspaceWrite` use, so a body the agent staged via `workspaceWrite` is\n * resolved here verbatim — the two paths cannot diverge.\n * 2. User-managed Resources (personal override → org/shared → workspace\n * default) as a fallback, for pre-built resources that were created in the\n * Resources panel rather than staged through the bridge.\n *\n * Unlike attachments, resource content is not capped/truncated on the way in, so\n * this is the correct path for cloning a large extension body that already\n * exists as a workspace resource (e.g. a per-customer dashboard).\n */\nasync function readWorkspaceFileContent(path: string): Promise<string | null> {\n const trimmed = path.trim();\n if (!trimmed) return null;\n // 1) Bridge parity — resolve exactly the file workspaceRead/workspaceWrite see.\n const bridgeScope = workspaceFilesBridgeScope();\n if (bridgeScope) {\n let bridgeFile: Awaited<ReturnType<typeof readWorkspaceFile>>;\n try {\n bridgeFile = await readWorkspaceFile(bridgeScope, trimmed);\n } catch {\n // A THROW here is a transient store error or invalid path — NOT a\n // definitive \"not found\". Fail closed rather than silently hosting a\n // possibly-different same-path Resources body than workspaceRead\n // inspected. A retry re-runs this read cleanly.\n return null;\n }\n // A null result means the file genuinely does not exist in the bridge scope;\n // fall through to user-managed Resources for pre-built resource-panel files.\n if (bridgeFile && typeof bridgeFile.content === \"string\") {\n return bridgeFile.content;\n }\n }\n // 2) Fallback — user-managed Resources by scope precedence.\n for (const scope of [\"personal\", \"shared\", \"workspace\"] as const) {\n try {\n const content = await readResource(trimmed, { scope });\n if (typeof content === \"string\") return content;\n } catch {\n // A given scope can throw (e.g. `personal` when no user identity is\n // resolvable in this context). Don't let one scope abort the lookup —\n // fall through and try the next one.\n }\n }\n return null;\n}\n\n/**\n * Resolve the extension HTML body from (in priority order) inline `content`, a\n * `contentFromWorkspaceFile` resource path, or a `contentFromAttachment` handle.\n *\n * The workspace-file path exists because a large extension body frequently lives\n * as a workspace resource (not a chat attachment). Without it the model has no\n * viable route — inline is too large to shuttle reliably, contentFromAttachment\n * only sees chat attachments, and mutating actions cannot run from run-code — so\n * it loops and the run aborts with no_progress.\n */\nasync function resolveExtensionContentAsync(\n args: Record<string, string> | undefined,\n ctx: ActionRunContext | undefined,\n): Promise<{ content: string } | { error: string }> {\n const inline = args?.content !== undefined ? String(args.content) : undefined;\n if (inline !== undefined && inline.trim().length > 0) {\n return { content: inline };\n }\n\n const wsRef =\n args?.contentFromWorkspaceFile !== undefined\n ? String(args.contentFromWorkspaceFile).trim()\n : \"\";\n if (wsRef) {\n const content = await readWorkspaceFileContent(wsRef);\n if (content === null) {\n return {\n error: `Error: contentFromWorkspaceFile=\"${wsRef}\" did not match any readable workspace/shared/personal resource file. Check the exact path (e.g. \"intuit-analytics-extension.html\"), or pass the HTML inline via content.`,\n };\n }\n if (content.trim().length === 0) {\n return {\n error: `Error: workspace file \"${wsRef}\" is empty. Pass non-empty HTML inline via content, or point contentFromWorkspaceFile at a file with content.`,\n };\n }\n return { content };\n }\n\n return resolveExtensionContent(args, ctx);\n}\n\nfunction coerceBoolean(value: unknown): boolean {\n return value === true || value === \"true\";\n}\n\nfunction normalizeUpdateExtensionArgs(\n args: any,\n): { args: Record<string, unknown> } | { error: string } {\n const hasCompactContract =\n args?.operation !== undefined || args?.payloadJson !== undefined;\n if (!hasCompactContract) {\n const legacyArgs = { ...((args ?? {}) as Record<string, unknown>) };\n const hasInvalidPlaceholderSignal =\n (typeof legacyArgs.visibility === \"string\" &&\n legacyArgs.visibility.trim().length === 0) ||\n [legacyArgs.patches, legacyArgs.edits].some(\n (value) =>\n value !== null &&\n typeof value === \"object\" &&\n (Array.isArray(value)\n ? value.length > 0 &&\n value.every(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n Object.keys(item).length === 0,\n )\n : Object.keys(value).length === 0),\n );\n if (hasInvalidPlaceholderSignal) {\n for (const [key, value] of Object.entries(legacyArgs)) {\n if (key === \"id\") continue;\n const empty =\n value === false ||\n value === null ||\n (typeof value === \"string\" && value.trim().length === 0) ||\n (Array.isArray(value) &&\n (value.length === 0 ||\n value.every(\n (item) =>\n item !== null &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n Object.keys(item).length === 0,\n ))) ||\n (typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0);\n if (empty) delete legacyArgs[key];\n }\n delete legacyArgs.visibility;\n }\n return { args: legacyArgs };\n }\n\n const operation = String(args?.operation ?? \"\").trim();\n if (!([\"edit\", \"replace\", \"metadata\"] as const).includes(operation as any)) {\n return {\n error:\n 'Error: operation must be \"edit\", \"replace\", or \"metadata\". No changes were applied.',\n };\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(String(args?.payloadJson ?? \"\"));\n } catch {\n return {\n error:\n \"Error: payloadJson must be a valid JSON object encoded as a string. No changes were applied.\",\n };\n }\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return {\n error:\n \"Error: payloadJson must decode to a non-empty JSON object. No changes were applied.\",\n };\n }\n\n const payloadRecord = payload as Record<string, unknown>;\n const allowedByOperation: Record<string, Set<string>> = {\n edit: new Set([\"patches\", \"edits\", \"format\"]),\n replace: new Set([\n \"content\",\n \"contentFromAttachment\",\n \"contentFromWorkspaceFile\",\n \"format\",\n ]),\n metadata: new Set([\"name\", \"description\", \"icon\"]),\n };\n const unexpected = Object.keys(payloadRecord).filter(\n (key) => !allowedByOperation[operation].has(key),\n );\n if (unexpected.length > 0) {\n return {\n error: `Error: operation=${operation} does not accept ${unexpected.join(\", \")}. No changes were applied.`,\n };\n }\n\n if (operation === \"edit\") {\n const patches = parsePatches(payloadRecord.patches);\n const edits = parseEdits(payloadRecord.edits);\n const hasEdit =\n (patches?.length ?? 0) > 0 ||\n (edits?.length ?? 0) > 0 ||\n coerceBoolean(payloadRecord.format);\n if (!hasEdit) {\n return {\n error:\n \"Error: operation=edit requires at least one valid patch/edit or format=true. No changes were applied.\",\n };\n }\n }\n\n if (operation === \"replace\") {\n const replacementSources = [\n payloadRecord.content,\n payloadRecord.contentFromAttachment,\n payloadRecord.contentFromWorkspaceFile,\n ].filter((value) => typeof value === \"string\" && value.trim().length > 0);\n if (replacementSources.length !== 1) {\n return {\n error:\n \"Error: operation=replace requires exactly one non-empty content, contentFromAttachment, or contentFromWorkspaceFile value. No changes were applied.\",\n };\n }\n }\n\n if (operation === \"metadata\") {\n const keys = Object.keys(payloadRecord);\n if (keys.length === 0) {\n return {\n error:\n \"Error: operation=metadata requires name, description, or icon. No changes were applied.\",\n };\n }\n if (\n payloadRecord.name !== undefined &&\n (typeof payloadRecord.name !== \"string\" ||\n payloadRecord.name.trim().length === 0)\n ) {\n return {\n error:\n \"Error: extension name must be a non-empty string. No changes were applied.\",\n };\n }\n }\n\n return {\n args: {\n id: String(args?.id ?? \"\").trim(),\n ...payloadRecord,\n ...(operation === \"replace\" ? { allowFullReplacement: true } : {}),\n },\n };\n}\n\nfunction parseInlineContext(\n value: unknown,\n): Record<string, unknown> | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n const parsed =\n typeof value === \"string\"\n ? (() => {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n })()\n : value;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n}\n\nfunction coerceInlineHeight(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n const height = Number(value);\n if (!Number.isFinite(height) || height <= 0) return undefined;\n return Math.min(Math.max(Math.round(height), 120), 1000);\n}\n\nfunction coerceLimit(value: unknown): number {\n const limit = Number(value ?? 100);\n if (!Number.isFinite(limit)) return 100;\n return Math.min(Math.max(1, Math.floor(limit)), 500);\n}\n\nfunction parsePatches(value: unknown): ExtensionLegacyPatch[] | undefined {\n if (value === undefined) return undefined;\n const parsed = parseJsonArray(value);\n if (!Array.isArray(parsed)) return undefined;\n if (\n parsed.some(\n (patch) =>\n !patch ||\n typeof patch.find !== \"string\" ||\n typeof patch.replace !== \"string\",\n )\n ) {\n return undefined;\n }\n return parsed;\n}\n\nfunction parseEdits(value: unknown): ExtensionContentEdit[] | undefined {\n if (value === undefined) return undefined;\n const parsed = parseJsonArray(value);\n if (!Array.isArray(parsed)) return undefined;\n return parsed.every(isValidContentEdit)\n ? (parsed as ExtensionContentEdit[])\n : undefined;\n}\n\nfunction parseJsonArray(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction isValidContentEdit(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n const edit = value as Record<string, unknown>;\n const op = edit.op ?? \"replace\";\n if (typeof op !== \"string\") return false;\n\n switch (op) {\n case \"replace\":\n return typeof edit.find === \"string\" && typeof edit.replace === \"string\";\n case \"insert-before\":\n case \"insert-after\":\n return (\n typeof edit.marker === \"string\" && typeof edit.content === \"string\"\n );\n case \"replace-between\":\n return (\n typeof edit.start === \"string\" &&\n typeof edit.end === \"string\" &&\n typeof edit.content === \"string\"\n );\n case \"replace-section\":\n return (\n typeof edit.section === \"string\" && typeof edit.content === \"string\"\n );\n case \"wrap-section\":\n return (\n typeof edit.section === \"string\" &&\n typeof edit.before === \"string\" &&\n typeof edit.after === \"string\"\n );\n case \"remove-section\":\n return typeof edit.section === \"string\";\n case \"regex-replace\":\n return (\n typeof edit.pattern === \"string\" && typeof edit.replace === \"string\"\n );\n default:\n return false;\n }\n}\n"]}
|