@agent-native/core 0.35.3 → 0.36.0

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.
Files changed (62) hide show
  1. package/dist/cli/index.js +1 -1
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/cli/skills.d.ts.map +1 -1
  4. package/dist/cli/skills.js +171 -11
  5. package/dist/cli/skills.js.map +1 -1
  6. package/dist/client/AssistantChat.d.ts.map +1 -1
  7. package/dist/client/AssistantChat.js +17 -21
  8. package/dist/client/AssistantChat.js.map +1 -1
  9. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  10. package/dist/client/MultiTabAssistantChat.js +18 -5
  11. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  12. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  13. package/dist/client/agent-chat-adapter.js +68 -24
  14. package/dist/client/agent-chat-adapter.js.map +1 -1
  15. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  16. package/dist/client/composer/ComposerPlusMenu.js +174 -8
  17. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  18. package/dist/client/composer/PromptComposer.d.ts +2 -0
  19. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  20. package/dist/client/composer/PromptComposer.js +2 -2
  21. package/dist/client/composer/PromptComposer.js.map +1 -1
  22. package/dist/client/composer/TiptapComposer.js +1 -1
  23. package/dist/client/composer/TiptapComposer.js.map +1 -1
  24. package/dist/client/context-xray/ContextMeter.d.ts +2 -1
  25. package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
  26. package/dist/client/context-xray/ContextMeter.js +19 -25
  27. package/dist/client/context-xray/ContextMeter.js.map +1 -1
  28. package/dist/client/context-xray/ContextXRayPanel.d.ts +1 -3
  29. package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
  30. package/dist/client/context-xray/ContextXRayPanel.js +27 -24
  31. package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
  32. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  33. package/dist/client/conversation/AgentConversation.js +2 -1
  34. package/dist/client/conversation/AgentConversation.js.map +1 -1
  35. package/dist/client/sse-event-processor.d.ts +1 -0
  36. package/dist/client/sse-event-processor.d.ts.map +1 -1
  37. package/dist/client/sse-event-processor.js +62 -15
  38. package/dist/client/sse-event-processor.js.map +1 -1
  39. package/dist/client/tool-display.d.ts +4 -0
  40. package/dist/client/tool-display.d.ts.map +1 -0
  41. package/dist/client/tool-display.js +28 -0
  42. package/dist/client/tool-display.js.map +1 -0
  43. package/dist/client/use-chat-threads.d.ts.map +1 -1
  44. package/dist/client/use-chat-threads.js +40 -31
  45. package/dist/client/use-chat-threads.js.map +1 -1
  46. package/dist/client/use-external-value.d.ts.map +1 -1
  47. package/dist/client/use-external-value.js +14 -7
  48. package/dist/client/use-external-value.js.map +1 -1
  49. package/dist/extensions/html-shell.d.ts +3 -2
  50. package/dist/extensions/html-shell.d.ts.map +1 -1
  51. package/dist/extensions/html-shell.js +12 -2
  52. package/dist/extensions/html-shell.js.map +1 -1
  53. package/dist/extensions/routes.js +2 -7
  54. package/dist/extensions/routes.js.map +1 -1
  55. package/dist/server/core-routes-plugin.js +2 -2
  56. package/dist/server/core-routes-plugin.js.map +1 -1
  57. package/dist/server/security-headers.d.ts +16 -19
  58. package/dist/server/security-headers.d.ts.map +1 -1
  59. package/dist/server/security-headers.js +24 -25
  60. package/dist/server/security-headers.js.map +1 -1
  61. package/docs/content/external-agents.md +1 -1
  62. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerPlusMenu.d.ts","sourceRoot":"","sources":["../../../src/client/composer/ComposerPlusMenu.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C,UAAU,qBAAqB;IAC7B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAC/B;AAkCD,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,IAAa,GACd,EAAE,qBAAqB,2CAKvB"}
1
+ {"version":3,"file":"ComposerPlusMenu.d.ts","sourceRoot":"","sources":["../../../src/client/composer/ComposerPlusMenu.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ/C,UAAU,qBAAqB;IAC7B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAC/B;AAwJD,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,IAAa,GACd,EAAE,qBAAqB,2CAKvB"}
@@ -1,13 +1,106 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useState, useRef, useEffect } from "react";
3
- import { IconPlus, IconUpload, IconBulb, IconClock, IconBolt, IconTool, IconPlugConnected, IconLoader2, IconCheck, IconArrowLeft, } from "@tabler/icons-react";
2
+ import { useState, useRef, useEffect, useMemo } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { IconPlus, IconUpload, IconBulb, IconClock, IconBolt, IconTool, IconPlugConnected, IconPhotoPlus, IconLoader2, IconCheck, IconArrowLeft, IconX, } from "@tabler/icons-react";
4
5
  import { ComposerPrimitive } from "@assistant-ui/react";
5
6
  import { cn } from "../utils.js";
6
7
  import { Popover, PopoverTrigger, PopoverContent, } from "../components/ui/popover.js";
7
8
  import { useOrg } from "../org/hooks.js";
8
9
  import { agentNativePath } from "../api-path.js";
9
10
  import { formatMcpServerError, getMcpUrlValidationError, useCreateMcpServer, testMcpServerUrl, } from "../resources/use-mcp-servers.js";
11
+ import { setAgentChatContextItem } from "../agent-chat.js";
10
12
  import { Tooltip, TooltipContent, TooltipTrigger, } from "../components/ui/tooltip.js";
13
+ const DEFAULT_ASSETS_PICKER_URL = "https://assets.agent-native.com/picker";
14
+ const EMBED_PROTOCOL = "agent-native.embed";
15
+ const EMBED_VERSION = 1;
16
+ function assetPickerUrl() {
17
+ const env = import.meta.env ?? {};
18
+ return env.VITE_AGENT_NATIVE_ASSETS_PICKER_URL || DEFAULT_ASSETS_PICKER_URL;
19
+ }
20
+ function withEmbeddedParams(url) {
21
+ try {
22
+ const parsed = new URL(url, window.location.href);
23
+ parsed.searchParams.set("embedded", "1");
24
+ parsed.searchParams.set("mediaType", "image");
25
+ return parsed.toString();
26
+ }
27
+ catch {
28
+ const separator = url.includes("?") ? "&" : "?";
29
+ return `${url}${separator}embedded=1&mediaType=image`;
30
+ }
31
+ }
32
+ function assetPickerOrigin(url) {
33
+ try {
34
+ return new URL(url, window.location.href).origin;
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ function embedEnvelope(type, options = {}) {
41
+ return {
42
+ protocol: EMBED_PROTOCOL,
43
+ version: EMBED_VERSION,
44
+ type,
45
+ ...options,
46
+ };
47
+ }
48
+ function isEmbedEnvelope(value) {
49
+ if (!value || typeof value !== "object" || Array.isArray(value))
50
+ return false;
51
+ const candidate = value;
52
+ return (candidate.protocol === EMBED_PROTOCOL &&
53
+ candidate.version === EMBED_VERSION &&
54
+ typeof candidate.type === "string");
55
+ }
56
+ function assetString(value) {
57
+ return typeof value === "string" && value.trim() ? value.trim() : null;
58
+ }
59
+ function assetImageSource(payload) {
60
+ if (!payload || typeof payload !== "object")
61
+ return null;
62
+ const asset = payload;
63
+ return (assetString(asset.url) ??
64
+ assetString(asset.previewUrl) ??
65
+ assetString(asset.downloadUrl) ??
66
+ assetString(asset.embedUrl));
67
+ }
68
+ function assetTitle(payload, url) {
69
+ if (payload && typeof payload === "object") {
70
+ const title = assetString(payload.title);
71
+ if (title)
72
+ return title;
73
+ const prompt = assetString(payload.prompt);
74
+ if (prompt)
75
+ return prompt.slice(0, 80);
76
+ }
77
+ try {
78
+ const name = new URL(url).pathname.split("/").filter(Boolean).pop();
79
+ return name ? decodeURIComponent(name) : "Generated image";
80
+ }
81
+ catch {
82
+ return "Generated image";
83
+ }
84
+ }
85
+ function assetContext(payload, url) {
86
+ const lines = [`Image URL: ${url}`];
87
+ if (payload && typeof payload === "object") {
88
+ const asset = payload;
89
+ const assetId = assetString(asset.assetId);
90
+ const libraryId = assetString(asset.libraryId);
91
+ const prompt = assetString(asset.prompt);
92
+ const altText = assetString(asset.altText);
93
+ if (assetId)
94
+ lines.push(`Asset ID: ${assetId}`);
95
+ if (libraryId)
96
+ lines.push(`Library ID: ${libraryId}`);
97
+ if (prompt)
98
+ lines.push(`Prompt: ${prompt}`);
99
+ if (altText)
100
+ lines.push(`Alt text: ${altText}`);
101
+ }
102
+ return lines.join("\n");
103
+ }
11
104
  function slugifyName(value) {
12
105
  return (value
13
106
  .toLowerCase()
@@ -25,6 +118,7 @@ export function ComposerPlusMenu({ onSelectMode, mode = "full", }) {
25
118
  }
26
119
  function ComposerPlusMenuFull({ onSelectMode, }) {
27
120
  const [open, setOpen] = useState(false);
121
+ const [assetsPickerOpen, setAssetsPickerOpen] = useState(false);
28
122
  const [view, setView] = useState("menu");
29
123
  // MCP state
30
124
  const { data: org } = useOrg();
@@ -243,11 +337,13 @@ function ComposerPlusMenuFull({ onSelectMode, }) {
243
337
  },
244
338
  },
245
339
  {
246
- icon: _jsx(IconBulb, { className: "h-3.5 w-3.5" }),
247
- label: "Create Skill",
248
- desc: "Teach the agent a new ability",
249
- action: openSkillFlyout,
250
- hoverAction: openSkillFlyout,
340
+ icon: _jsx(IconPhotoPlus, { className: "h-3.5 w-3.5" }),
341
+ label: "Generate Image",
342
+ desc: "Open the Assets image picker",
343
+ action: () => {
344
+ setOpen(false);
345
+ setAssetsPickerOpen(true);
346
+ },
251
347
  },
252
348
  {
253
349
  icon: _jsx(IconClock, { className: "h-3.5 w-3.5" }),
@@ -282,6 +378,13 @@ function ComposerPlusMenuFull({ onSelectMode, }) {
282
378
  desc: "Expose external tools to the agent",
283
379
  action: () => setView("mcp-server"),
284
380
  },
381
+ {
382
+ icon: _jsx(IconBulb, { className: "h-3.5 w-3.5" }),
383
+ label: "Create Skill",
384
+ desc: "Teach the agent a new ability",
385
+ action: openSkillFlyout,
386
+ hoverAction: openSkillFlyout,
387
+ },
285
388
  ];
286
389
  const backButton = (_jsxs("button", { type: "button", onClick: () => {
287
390
  clearMcpFeedback();
@@ -354,6 +457,69 @@ function ComposerPlusMenuFull({ onSelectMode, }) {
354
457
  fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace',
355
458
  }, placeholder: "Authorization: Bearer sk-..." }), mcpTestResult && (_jsxs("div", { className: cn("flex items-start gap-1 text-[11px] leading-snug", mcpTestResult.ok
356
459
  ? "text-green-600 dark:text-green-400"
357
- : "text-red-600 dark:text-red-400"), children: [mcpTestResult.ok && (_jsx(IconCheck, { className: "mt-0.5 h-3 w-3 shrink-0" })), _jsx("span", { className: "min-w-0 break-words", children: mcpTestResult.message })] })), mcpError && (_jsx("div", { className: "break-words text-[11px] leading-snug text-red-600 dark:text-red-400", children: mcpError }))] }), _jsxs("div", { className: "mt-2.5 flex items-center justify-between gap-2", children: [_jsx("button", { type: "button", onClick: runMcpTest, disabled: !mcpUrl.trim() || mcpBusy, className: "rounded-md border border-border bg-background px-2.5 py-1.5 text-[11px] font-medium text-foreground hover:bg-accent disabled:opacity-40 disabled:pointer-events-none", children: "Test" }), _jsx("button", { type: "button", onClick: submitMcpServer, disabled: !mcpName.trim() || !mcpUrl.trim() || mcpBusy, className: "rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none", children: mcpBusy ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : ("Connect") })] })] }))] })] })] }));
460
+ : "text-red-600 dark:text-red-400"), children: [mcpTestResult.ok && (_jsx(IconCheck, { className: "mt-0.5 h-3 w-3 shrink-0" })), _jsx("span", { className: "min-w-0 break-words", children: mcpTestResult.message })] })), mcpError && (_jsx("div", { className: "break-words text-[11px] leading-snug text-red-600 dark:text-red-400", children: mcpError }))] }), _jsxs("div", { className: "mt-2.5 flex items-center justify-between gap-2", children: [_jsx("button", { type: "button", onClick: runMcpTest, disabled: !mcpUrl.trim() || mcpBusy, className: "rounded-md border border-border bg-background px-2.5 py-1.5 text-[11px] font-medium text-foreground hover:bg-accent disabled:opacity-40 disabled:pointer-events-none", children: "Test" }), _jsx("button", { type: "button", onClick: submitMcpServer, disabled: !mcpName.trim() || !mcpUrl.trim() || mcpBusy, className: "rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none", children: mcpBusy ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : ("Connect") })] })] }))] })] }), _jsx(AssetsPickerModal, { open: assetsPickerOpen, onOpenChange: setAssetsPickerOpen })] }));
461
+ }
462
+ function AssetsPickerModal({ open, onOpenChange, }) {
463
+ const iframeRef = useRef(null);
464
+ const sourceUrl = useMemo(() => assetPickerUrl(), []);
465
+ const iframeUrl = useMemo(() => withEmbeddedParams(sourceUrl), [sourceUrl]);
466
+ const targetOrigin = useMemo(() => assetPickerOrigin(iframeUrl), [iframeUrl]);
467
+ useEffect(() => {
468
+ if (!open || !targetOrigin)
469
+ return;
470
+ const handleMessage = (event) => {
471
+ if (event.source !== iframeRef.current?.contentWindow)
472
+ return;
473
+ if (event.origin !== targetOrigin)
474
+ return;
475
+ if (!isEmbedEnvelope(event.data))
476
+ return;
477
+ if (event.data.type === "ready") {
478
+ iframeRef.current?.contentWindow?.postMessage(embedEnvelope("message", {
479
+ name: "configure",
480
+ payload: { mediaType: "image", count: 3 },
481
+ }), targetOrigin);
482
+ return;
483
+ }
484
+ if (event.data.type !== "message")
485
+ return;
486
+ if (event.data.name === "close") {
487
+ onOpenChange(false);
488
+ return;
489
+ }
490
+ if (event.data.name !== "chooseImage" &&
491
+ event.data.name !== "chooseAsset")
492
+ return;
493
+ const url = assetImageSource(event.data.payload);
494
+ if (!url)
495
+ return;
496
+ const title = assetTitle(event.data.payload, url);
497
+ const assetId = event.data.payload && typeof event.data.payload === "object"
498
+ ? assetString(event.data.payload.assetId)
499
+ : null;
500
+ setAgentChatContextItem({
501
+ key: `asset-image:${assetId ?? url}`,
502
+ title: `Image: ${title}`,
503
+ context: assetContext(event.data.payload, url),
504
+ });
505
+ onOpenChange(false);
506
+ };
507
+ const handleKey = (event) => {
508
+ if (event.key === "Escape")
509
+ onOpenChange(false);
510
+ };
511
+ window.addEventListener("message", handleMessage);
512
+ window.addEventListener("keydown", handleKey);
513
+ return () => {
514
+ window.removeEventListener("message", handleMessage);
515
+ window.removeEventListener("keydown", handleKey);
516
+ };
517
+ }, [onOpenChange, open, targetOrigin]);
518
+ if (!open || typeof document === "undefined")
519
+ return null;
520
+ return createPortal(_jsx("div", { className: "fixed inset-0 z-[280] flex items-center justify-center bg-black/50 p-3", role: "dialog", "aria-modal": "true", "aria-labelledby": "composer-assets-picker-title", onMouseDown: (event) => {
521
+ if (event.target === event.currentTarget)
522
+ onOpenChange(false);
523
+ }, children: _jsxs("div", { className: "flex h-[min(86vh,760px)] w-[min(96vw,1040px)] flex-col overflow-hidden rounded-xl border border-border bg-background shadow-2xl", children: [_jsxs("div", { className: "flex h-12 shrink-0 items-center justify-between border-b border-border px-4", children: [_jsx("div", { id: "composer-assets-picker-title", className: "text-sm font-medium text-foreground", children: "Generate image" }), _jsx("button", { type: "button", onClick: () => onOpenChange(false), className: "flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", "aria-label": "Close image picker", children: _jsx(IconX, { className: "h-4 w-4" }) })] }), targetOrigin ? (_jsx("iframe", { ref: iframeRef, src: iframeUrl, title: "Assets image picker", className: "min-h-0 flex-1 border-0 bg-background", sandbox: "allow-scripts allow-same-origin allow-forms allow-popups allow-downloads", allow: "clipboard-read; clipboard-write; microphone; fullscreen", referrerPolicy: "strict-origin-when-cross-origin" })) : (_jsx("div", { className: "flex min-h-0 flex-1 items-center justify-center p-8 text-center text-sm text-muted-foreground", children: "The configured image picker URL is not valid." }))] }) }), document.body);
358
524
  }
359
525
  //# sourceMappingURL=ComposerPlusMenu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerPlusMenu.js","sourceRoot":"","sources":["../../../src/client/composer/ComposerPlusMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport {\n IconPlus,\n IconUpload,\n IconBulb,\n IconClock,\n IconBolt,\n IconTool,\n IconPlugConnected,\n IconLoader2,\n IconCheck,\n IconArrowLeft,\n} from \"@tabler/icons-react\";\nimport { ComposerPrimitive } from \"@assistant-ui/react\";\nimport { cn } from \"../utils.js\";\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"../components/ui/popover.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n formatMcpServerError,\n getMcpUrlValidationError,\n useCreateMcpServer,\n testMcpServerUrl,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport type { ComposerMode } from \"./types.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\n\ninterface ComposerPlusMenuProps {\n onSelectMode?: (mode: ComposerMode) => void;\n /**\n * \"full\" (default): full + menu with Upload File, Create Skill, Schedule Task,\n * Automation, Extension, MCP Server. \"upload-only\": clicking + opens the file\n * picker directly — no popover, no other modes. Use for prompt popovers\n * (create extension, create deck, create dashboard, etc.) where the only thing\n * to attach is a file.\n */\n mode?: \"full\" | \"upload-only\";\n}\n\ntype View = \"menu\" | \"mcp-server\" | \"skill-upload\";\n\nfunction slugifyName(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"uploaded-skill\"\n );\n}\n\nfunction UploadOnlyAttachButton() {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">\n <ComposerPrimitive.AddAttachment asChild>\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n aria-label=\"Upload\"\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </ComposerPrimitive.AddAttachment>\n </span>\n </TooltipTrigger>\n <TooltipContent>Upload</TooltipContent>\n </Tooltip>\n );\n}\n\nexport function ComposerPlusMenu({\n onSelectMode,\n mode = \"full\",\n}: ComposerPlusMenuProps) {\n if (mode === \"upload-only\") {\n return <UploadOnlyAttachButton />;\n }\n return <ComposerPlusMenuFull onSelectMode={onSelectMode} />;\n}\n\nfunction ComposerPlusMenuFull({\n onSelectMode,\n}: Pick<ComposerPlusMenuProps, \"onSelectMode\">) {\n const [open, setOpen] = useState(false);\n const [view, setView] = useState<View>(\"menu\");\n\n // MCP state\n const { data: org } = useOrg();\n const canCreateOrgMcp =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const hasOrg = !!org?.orgId;\n const defaultMcpScope: McpServerScope =\n hasOrg && canCreateOrgMcp ? \"org\" : \"user\";\n const [mcpScope, setMcpScope] = useState<McpServerScope>(defaultMcpScope);\n const [mcpName, setMcpName] = useState(\"\");\n const [mcpUrl, setMcpUrl] = useState(\"\");\n const [mcpDescription, setMcpDescription] = useState(\"\");\n const [mcpHeadersText, setMcpHeadersText] = useState(\"\");\n const [mcpBusy, setMcpBusy] = useState(false);\n const [mcpError, setMcpError] = useState<string | null>(null);\n const [mcpTestResult, setMcpTestResult] = useState<{\n ok: boolean;\n message: string;\n } | null>(null);\n const createMcp = useCreateMcpServer();\n\n const inputRef = useRef<HTMLInputElement>(null);\n const fileUploadRef = useRef<HTMLButtonElement>(null);\n const skillFileInputRef = useRef<HTMLInputElement>(null);\n const skillHoverTimerRef = useRef<number | null>(null);\n const [skillUploadSlug, setSkillUploadSlug] = useState(\"\");\n const [skillUploadContent, setSkillUploadContent] = useState(\"\");\n const [skillUploadFileName, setSkillUploadFileName] = useState(\"\");\n const [skillUploadStatus, setSkillUploadStatus] = useState<{\n kind: \"ok\" | \"err\";\n message: string;\n } | null>(null);\n const [skillUploadBusy, setSkillUploadBusy] = useState(false);\n const [skillFlyoutOpen, setSkillFlyoutOpen] = useState(false);\n const [skillFlyoutSide, setSkillFlyoutSide] = useState<\"right\" | \"left\">(\n \"right\",\n );\n const skillFlyoutCloseTimerRef = useRef<number | null>(null);\n const openSkillFlyout = (rowEl?: HTMLElement | null) => {\n if (skillFlyoutCloseTimerRef.current) {\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = null;\n }\n if (rowEl && typeof window !== \"undefined\") {\n const rect = rowEl.getBoundingClientRect();\n const FLYOUT_WIDTH = 248;\n setSkillFlyoutSide(\n window.innerWidth - rect.right < FLYOUT_WIDTH ? \"left\" : \"right\",\n );\n }\n setSkillFlyoutOpen(true);\n };\n const scheduleSkillFlyoutClose = () => {\n if (skillFlyoutCloseTimerRef.current)\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = window.setTimeout(() => {\n setSkillFlyoutOpen(false);\n }, 160);\n };\n\n useEffect(() => {\n if (open) {\n setView(\"menu\");\n setMcpScope(defaultMcpScope);\n setMcpName(\"\");\n setMcpUrl(\"\");\n setMcpDescription(\"\");\n setMcpHeadersText(\"\");\n setMcpError(null);\n setMcpTestResult(null);\n setMcpBusy(false);\n setSkillUploadSlug(\"\");\n setSkillUploadContent(\"\");\n setSkillUploadFileName(\"\");\n setSkillUploadStatus(null);\n setSkillUploadBusy(false);\n setSkillFlyoutOpen(false);\n }\n }, [open, defaultMcpScope]);\n\n useEffect(() => {\n if (view === \"mcp-server\") {\n setMcpError(null);\n setMcpTestResult(null);\n const t = setTimeout(() => inputRef.current?.focus(), 50);\n return () => clearTimeout(t);\n }\n }, [view]);\n\n const clearMcpFeedback = () => {\n setMcpError(null);\n setMcpTestResult(null);\n };\n\n const parseHeaderLines = (\n text: string,\n ): Record<string, string> | undefined => {\n const out: Record<string, string> = {};\n for (const line of text.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const idx = trimmed.indexOf(\":\");\n if (idx <= 0) continue;\n const key = trimmed.slice(0, idx).trim();\n const val = trimmed.slice(idx + 1).trim();\n if (!key || !val) continue;\n out[key] = val;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n };\n\n const submitMcpServer = async () => {\n const name = mcpName.trim();\n const url = mcpUrl.trim();\n if (!name || !url || mcpBusy) return;\n const validationError = getMcpUrlValidationError(url);\n if (validationError) {\n setMcpError(validationError);\n setMcpTestResult(null);\n return;\n }\n setMcpError(null);\n setMcpBusy(true);\n try {\n await createMcp.mutateAsync({\n scope: mcpScope,\n name,\n url,\n headers: parseHeaderLines(mcpHeadersText),\n description: mcpDescription.trim() || undefined,\n });\n setOpen(false);\n } catch (err: any) {\n setMcpError(formatMcpServerError(err));\n } finally {\n setMcpBusy(false);\n }\n };\n\n const runMcpTest = async () => {\n const url = mcpUrl.trim();\n if (!url || mcpBusy) return;\n const validationError = getMcpUrlValidationError(url);\n if (validationError) {\n setMcpTestResult({ ok: false, message: validationError });\n setMcpError(null);\n return;\n }\n setMcpTestResult(null);\n setMcpError(null);\n setMcpBusy(true);\n try {\n const res = await testMcpServerUrl(url, parseHeaderLines(mcpHeadersText));\n if (res.ok) {\n setMcpTestResult({\n ok: true,\n message: `${res.toolCount ?? 0} tool${res.toolCount === 1 ? \"\" : \"s\"} available`,\n });\n } else {\n setMcpTestResult({ ok: false, message: res.error ?? \"Failed\" });\n }\n } catch (err: any) {\n setMcpTestResult({ ok: false, message: formatMcpServerError(err) });\n } finally {\n setMcpBusy(false);\n }\n };\n\n const handleSkillFileSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const file = files[0];\n const text = await file.text();\n const baseName = file.name.replace(/\\.[^./]+$/, \"\");\n const slug = slugifyName(\n baseName.toLowerCase() === \"skill\" ? \"uploaded-skill\" : baseName,\n );\n setSkillUploadSlug(slug);\n setSkillUploadContent(text);\n setSkillUploadFileName(file.name);\n setSkillUploadStatus(null);\n setView(\"skill-upload\");\n };\n\n const submitSkillUpload = async () => {\n if (skillUploadBusy) return;\n const slug = slugifyName(skillUploadSlug || \"uploaded-skill\");\n const path = `skills/${slug}/SKILL.md`;\n setSkillUploadBusy(true);\n setSkillUploadStatus(null);\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n path,\n content: skillUploadContent,\n mimeType: \"text/markdown\",\n shared: false,\n }),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(body || `Upload failed (${res.status})`);\n }\n setSkillUploadStatus({\n kind: \"ok\",\n message: `Skill \"${skillUploadFileName || `${slug}/SKILL.md`}\" added`,\n });\n window.setTimeout(() => setOpen(false), 1200);\n } catch (err: any) {\n setSkillUploadStatus({\n kind: \"err\",\n message: err?.message || \"Failed to save skill file\",\n });\n } finally {\n setSkillUploadBusy(false);\n }\n };\n\n const menuItems: {\n icon: React.ReactNode;\n label: string;\n desc: string;\n action: () => void;\n hoverAction?: () => void;\n }[] = [\n {\n icon: <IconUpload className=\"h-3.5 w-3.5\" />,\n label: \"Upload File\",\n desc: \"Images, PDFs, text/code, JSON, CSV\",\n action: () => {\n setOpen(false);\n setTimeout(() => fileUploadRef.current?.click(), 0);\n },\n },\n {\n icon: <IconBulb className=\"h-3.5 w-3.5\" />,\n label: \"Create Skill\",\n desc: \"Teach the agent a new ability\",\n action: openSkillFlyout,\n hoverAction: openSkillFlyout,\n },\n {\n icon: <IconClock className=\"h-3.5 w-3.5\" />,\n label: \"Schedule Task\",\n desc: \"Run something on a schedule\",\n action: () => {\n onSelectMode?.(\"job\");\n setOpen(false);\n },\n },\n {\n icon: <IconBolt className=\"h-3.5 w-3.5\" />,\n label: \"Create Automation\",\n desc: \"Set up a when-X-do-Y rule\",\n action: () => {\n onSelectMode?.(\"automation\");\n setOpen(false);\n },\n },\n {\n icon: <IconTool className=\"h-3.5 w-3.5\" />,\n label: \"Create Extension\",\n desc: \"Build a mini app extension\",\n action: () => {\n onSelectMode?.(\"extension\");\n setOpen(false);\n },\n },\n {\n icon: <IconPlugConnected className=\"h-3.5 w-3.5\" />,\n label: \"Connect MCP Server\",\n desc: \"Expose external tools to the agent\",\n action: () => setView(\"mcp-server\"),\n },\n ];\n\n const backButton = (\n <button\n type=\"button\"\n onClick={() => {\n clearMcpFeedback();\n setView(\"menu\");\n }}\n className=\"flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground mb-1.5\"\n >\n <IconArrowLeft className=\"h-3 w-3\" />\n Back\n </button>\n );\n\n return (\n <>\n {/* Hidden button to trigger the native file upload */}\n <ComposerPrimitive.AddAttachment asChild>\n <button\n ref={fileUploadRef}\n type=\"button\"\n className=\"hidden\"\n style={{ display: \"none\" }}\n tabIndex={-1}\n aria-hidden\n />\n </ComposerPrimitive.AddAttachment>\n <input\n ref={skillFileInputRef}\n type=\"file\"\n accept=\".md,text/markdown\"\n className=\"hidden\"\n onChange={(e) => {\n void handleSkillFileSelected(e.target.files);\n e.target.value = \"\";\n }}\n />\n\n <Popover open={open} onOpenChange={setOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Add...</TooltipContent>\n </Tooltip>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className={cn(\n \"p-0 rounded-lg\",\n view === \"skill-upload\" || view === \"mcp-server\"\n ? \"max-h-[70vh] w-[calc(100vw-24px)] max-w-[380px] overflow-y-auto\"\n : \"w-[260px]\",\n )}\n style={{ fontSize: 13, lineHeight: \"normal\" }}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n {view === \"menu\" && (\n <div className=\"py-1\">\n {menuItems.map((item) => {\n const isSkill = item.label === \"Create Skill\";\n return (\n <div\n key={item.label}\n className={cn(\"relative\", isSkill && \"group/skill\")}\n onMouseEnter={(e) => {\n if (isSkill) {\n openSkillFlyout(e.currentTarget);\n return;\n }\n if (!item.hoverAction) return;\n if (skillHoverTimerRef.current)\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = window.setTimeout(() => {\n item.hoverAction?.();\n }, 180);\n }}\n onMouseLeave={() => {\n if (isSkill) {\n scheduleSkillFlyoutClose();\n return;\n }\n if (skillHoverTimerRef.current) {\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = null;\n }\n }}\n >\n <button\n type=\"button\"\n onClick={item.action}\n className={cn(\n \"flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50\",\n isSkill && skillFlyoutOpen && \"bg-accent/50\",\n )}\n >\n <span className=\"text-muted-foreground\">{item.icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[12px] font-medium text-foreground\">\n {item.label}\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n {item.desc}\n </div>\n </div>\n {isSkill && (\n <span className=\"ml-auto text-muted-foreground/60\">\n ›\n </span>\n )}\n </button>\n {isSkill && skillFlyoutOpen && (\n <div\n role=\"menu\"\n onMouseEnter={() => openSkillFlyout()}\n onMouseLeave={scheduleSkillFlyoutClose}\n className={cn(\n \"absolute top-0 z-20 w-[240px] rounded-lg border border-border bg-popover py-1 shadow-md\",\n skillFlyoutSide === \"right\"\n ? \"left-full ml-1\"\n : \"right-full mr-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelectMode?.(\"skill\");\n setSkillFlyoutOpen(false);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconBulb className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Create new skill\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Describe a skill and let the agent draft it\n </div>\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSkillFlyoutOpen(false);\n skillFileInputRef.current?.click();\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconUpload className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Upload skill file\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Import an existing SKILL.md file\n </div>\n </div>\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {view === \"skill-upload\" && (\n <div className=\"p-3\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"mb-1.5 flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground\"\n >\n <IconArrowLeft className=\"h-3 w-3\" />\n Back\n </button>\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Upload skill file\n </label>\n <p className=\"mb-2 text-[10px] leading-relaxed text-muted-foreground/60\">\n Review the content from{\" \"}\n <span className=\"font-mono\">\n {skillUploadFileName || \"the selected file\"}\n </span>{\" \"}\n before saving.\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Skill name\n </label>\n <input\n value={skillUploadSlug}\n onChange={(e) => setSkillUploadSlug(e.target.value)}\n className=\"mb-2 w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"my-skill\"\n />\n <p className=\"mb-2 text-[10px] text-muted-foreground/60\">\n Saved at{\" \"}\n <span className=\"font-mono\">\n skills/{slugifyName(skillUploadSlug || \"uploaded-skill\")}\n /SKILL.md\n </span>\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Content\n </label>\n <textarea\n value={skillUploadContent}\n onChange={(e) => setSkillUploadContent(e.target.value)}\n rows={10}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 font-mono text-[11px] leading-relaxed text-foreground outline-none focus:ring-1 focus:ring-accent\"\n />\n {skillUploadStatus && (\n <div\n className={cn(\n \"mt-2 text-[11px] leading-snug\",\n skillUploadStatus.kind === \"ok\"\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\",\n )}\n >\n {skillUploadStatus.message}\n </div>\n )}\n <div className=\"mt-2.5 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground hover:bg-accent/40\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submitSkillUpload}\n disabled={\n skillUploadBusy ||\n !skillUploadContent.trim() ||\n !skillUploadSlug.trim()\n }\n className=\"rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none\"\n >\n {skillUploadBusy ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n </div>\n </div>\n )}\n\n {view === \"mcp-server\" && (\n <div className=\"p-3\">\n {backButton}\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Connect MCP Server\n </label>\n <p className=\"mb-2 text-[10px] text-muted-foreground/60 leading-relaxed\">\n Point at any Streamable HTTP MCP server. Its tools become\n available to the agent. Use Personal for private or staging\n servers; use Organization only for vetted servers the whole org\n should share.\n </p>\n <div className=\"space-y-2\">\n <div className=\"flex gap-1 rounded-md border border-border p-0.5\">\n <button\n type=\"button\"\n onClick={() => setMcpScope(\"user\")}\n className={cn(\n \"flex-1 rounded px-2 py-1 text-[11px] font-medium\",\n mcpScope === \"user\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n Personal\n </button>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() =>\n hasOrg && canCreateOrgMcp && setMcpScope(\"org\")\n }\n disabled={!hasOrg || !canCreateOrgMcp}\n className={cn(\n \"flex-1 rounded px-2 py-1 text-[11px] font-medium\",\n mcpScope === \"org\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n (!hasOrg || !canCreateOrgMcp) &&\n \"cursor-not-allowed opacity-50 hover:text-muted-foreground\",\n )}\n >\n Organization\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {!hasOrg\n ? \"Join an organization to share MCP servers\"\n : !canCreateOrgMcp\n ? \"Only owners and admins can add org-scope servers\"\n : undefined}\n </TooltipContent>\n </Tooltip>\n </div>\n <input\n ref={inputRef}\n value={mcpName}\n onChange={(e) => {\n setMcpName(e.target.value);\n clearMcpFeedback();\n }}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"Server name (e.g. zapier-staging)\"\n />\n <input\n value={mcpUrl}\n onChange={(e) => {\n setMcpUrl(e.target.value);\n clearMcpFeedback();\n }}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"https://mcp.example.com/\"\n />\n <input\n value={mcpDescription}\n onChange={(e) => {\n setMcpDescription(e.target.value);\n clearMcpFeedback();\n }}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"Description (optional)\"\n />\n <div>\n <label className=\"block text-[10px] font-medium text-foreground\">\n Headers\n </label>\n <p className=\"mt-0.5 text-[10px] leading-snug text-muted-foreground/70\">\n Optional. One per line, for example Authorization: Bearer\n sk-...\n </p>\n </div>\n <textarea\n value={mcpHeadersText}\n onChange={(e) => {\n setMcpHeadersText(e.target.value);\n clearMcpFeedback();\n }}\n rows={2}\n className=\"w-full resize-y rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n }}\n placeholder=\"Authorization: Bearer sk-...\"\n />\n {mcpTestResult && (\n <div\n className={cn(\n \"flex items-start gap-1 text-[11px] leading-snug\",\n mcpTestResult.ok\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\",\n )}\n >\n {mcpTestResult.ok && (\n <IconCheck className=\"mt-0.5 h-3 w-3 shrink-0\" />\n )}\n <span className=\"min-w-0 break-words\">\n {mcpTestResult.message}\n </span>\n </div>\n )}\n {mcpError && (\n <div className=\"break-words text-[11px] leading-snug text-red-600 dark:text-red-400\">\n {mcpError}\n </div>\n )}\n </div>\n <div className=\"mt-2.5 flex items-center justify-between gap-2\">\n <button\n type=\"button\"\n onClick={runMcpTest}\n disabled={!mcpUrl.trim() || mcpBusy}\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-[11px] font-medium text-foreground hover:bg-accent disabled:opacity-40 disabled:pointer-events-none\"\n >\n Test\n </button>\n <button\n type=\"button\"\n onClick={submitMcpServer}\n disabled={!mcpName.trim() || !mcpUrl.trim() || mcpBusy}\n className=\"rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none\"\n >\n {mcpBusy ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Connect\"\n )}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n </>\n );\n}\n"]}
1
+ {"version":3,"file":"ComposerPlusMenu.js","sourceRoot":"","sources":["../../../src/client/composer/ComposerPlusMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useRef, useEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n IconPlus,\n IconUpload,\n IconBulb,\n IconClock,\n IconBolt,\n IconTool,\n IconPlugConnected,\n IconPhotoPlus,\n IconLoader2,\n IconCheck,\n IconArrowLeft,\n IconX,\n} from \"@tabler/icons-react\";\nimport { ComposerPrimitive } from \"@assistant-ui/react\";\nimport { cn } from \"../utils.js\";\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"../components/ui/popover.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n formatMcpServerError,\n getMcpUrlValidationError,\n useCreateMcpServer,\n testMcpServerUrl,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport type { ComposerMode } from \"./types.js\";\nimport { setAgentChatContextItem } from \"../agent-chat.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\n\ninterface ComposerPlusMenuProps {\n onSelectMode?: (mode: ComposerMode) => void;\n /**\n * \"full\" (default): full + menu with Upload File, Create Skill, Schedule Task,\n * Automation, Extension, MCP Server. \"upload-only\": clicking + opens the file\n * picker directly — no popover, no other modes. Use for prompt popovers\n * (create extension, create deck, create dashboard, etc.) where the only thing\n * to attach is a file.\n */\n mode?: \"full\" | \"upload-only\";\n}\n\ntype View = \"menu\" | \"mcp-server\" | \"skill-upload\";\n\nconst DEFAULT_ASSETS_PICKER_URL = \"https://assets.agent-native.com/picker\";\nconst EMBED_PROTOCOL = \"agent-native.embed\";\nconst EMBED_VERSION = 1;\n\ninterface EmbedEnvelope<TPayload = unknown> {\n protocol?: string;\n version?: number;\n type?: string;\n name?: string;\n payload?: TPayload;\n}\n\ninterface AssetPickerPayload {\n assetId?: unknown;\n url?: unknown;\n previewUrl?: unknown;\n downloadUrl?: unknown;\n embedUrl?: unknown;\n altText?: unknown;\n title?: unknown;\n prompt?: unknown;\n mediaType?: unknown;\n libraryId?: unknown;\n}\n\nfunction assetPickerUrl() {\n const env = (import.meta.env as Record<string, string | undefined>) ?? {};\n return env.VITE_AGENT_NATIVE_ASSETS_PICKER_URL || DEFAULT_ASSETS_PICKER_URL;\n}\n\nfunction withEmbeddedParams(url: string): string {\n try {\n const parsed = new URL(url, window.location.href);\n parsed.searchParams.set(\"embedded\", \"1\");\n parsed.searchParams.set(\"mediaType\", \"image\");\n return parsed.toString();\n } catch {\n const separator = url.includes(\"?\") ? \"&\" : \"?\";\n return `${url}${separator}embedded=1&mediaType=image`;\n }\n}\n\nfunction assetPickerOrigin(url: string): string | null {\n try {\n return new URL(url, window.location.href).origin;\n } catch {\n return null;\n }\n}\n\nfunction embedEnvelope(\n type: \"message\" | \"ready\",\n options: { name?: string; payload?: unknown } = {},\n): EmbedEnvelope {\n return {\n protocol: EMBED_PROTOCOL,\n version: EMBED_VERSION,\n type,\n ...options,\n };\n}\n\nfunction isEmbedEnvelope(value: unknown): value is EmbedEnvelope {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as EmbedEnvelope;\n return (\n candidate.protocol === EMBED_PROTOCOL &&\n candidate.version === EMBED_VERSION &&\n typeof candidate.type === \"string\"\n );\n}\n\nfunction assetString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction assetImageSource(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\") return null;\n const asset = payload as AssetPickerPayload;\n return (\n assetString(asset.url) ??\n assetString(asset.previewUrl) ??\n assetString(asset.downloadUrl) ??\n assetString(asset.embedUrl)\n );\n}\n\nfunction assetTitle(payload: unknown, url: string): string {\n if (payload && typeof payload === \"object\") {\n const title = assetString((payload as AssetPickerPayload).title);\n if (title) return title;\n const prompt = assetString((payload as AssetPickerPayload).prompt);\n if (prompt) return prompt.slice(0, 80);\n }\n try {\n const name = new URL(url).pathname.split(\"/\").filter(Boolean).pop();\n return name ? decodeURIComponent(name) : \"Generated image\";\n } catch {\n return \"Generated image\";\n }\n}\n\nfunction assetContext(payload: unknown, url: string): string {\n const lines = [`Image URL: ${url}`];\n if (payload && typeof payload === \"object\") {\n const asset = payload as AssetPickerPayload;\n const assetId = assetString(asset.assetId);\n const libraryId = assetString(asset.libraryId);\n const prompt = assetString(asset.prompt);\n const altText = assetString(asset.altText);\n if (assetId) lines.push(`Asset ID: ${assetId}`);\n if (libraryId) lines.push(`Library ID: ${libraryId}`);\n if (prompt) lines.push(`Prompt: ${prompt}`);\n if (altText) lines.push(`Alt text: ${altText}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction slugifyName(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"uploaded-skill\"\n );\n}\n\nfunction UploadOnlyAttachButton() {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">\n <ComposerPrimitive.AddAttachment asChild>\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n aria-label=\"Upload\"\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </ComposerPrimitive.AddAttachment>\n </span>\n </TooltipTrigger>\n <TooltipContent>Upload</TooltipContent>\n </Tooltip>\n );\n}\n\nexport function ComposerPlusMenu({\n onSelectMode,\n mode = \"full\",\n}: ComposerPlusMenuProps) {\n if (mode === \"upload-only\") {\n return <UploadOnlyAttachButton />;\n }\n return <ComposerPlusMenuFull onSelectMode={onSelectMode} />;\n}\n\nfunction ComposerPlusMenuFull({\n onSelectMode,\n}: Pick<ComposerPlusMenuProps, \"onSelectMode\">) {\n const [open, setOpen] = useState(false);\n const [assetsPickerOpen, setAssetsPickerOpen] = useState(false);\n const [view, setView] = useState<View>(\"menu\");\n\n // MCP state\n const { data: org } = useOrg();\n const canCreateOrgMcp =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const hasOrg = !!org?.orgId;\n const defaultMcpScope: McpServerScope =\n hasOrg && canCreateOrgMcp ? \"org\" : \"user\";\n const [mcpScope, setMcpScope] = useState<McpServerScope>(defaultMcpScope);\n const [mcpName, setMcpName] = useState(\"\");\n const [mcpUrl, setMcpUrl] = useState(\"\");\n const [mcpDescription, setMcpDescription] = useState(\"\");\n const [mcpHeadersText, setMcpHeadersText] = useState(\"\");\n const [mcpBusy, setMcpBusy] = useState(false);\n const [mcpError, setMcpError] = useState<string | null>(null);\n const [mcpTestResult, setMcpTestResult] = useState<{\n ok: boolean;\n message: string;\n } | null>(null);\n const createMcp = useCreateMcpServer();\n\n const inputRef = useRef<HTMLInputElement>(null);\n const fileUploadRef = useRef<HTMLButtonElement>(null);\n const skillFileInputRef = useRef<HTMLInputElement>(null);\n const skillHoverTimerRef = useRef<number | null>(null);\n const [skillUploadSlug, setSkillUploadSlug] = useState(\"\");\n const [skillUploadContent, setSkillUploadContent] = useState(\"\");\n const [skillUploadFileName, setSkillUploadFileName] = useState(\"\");\n const [skillUploadStatus, setSkillUploadStatus] = useState<{\n kind: \"ok\" | \"err\";\n message: string;\n } | null>(null);\n const [skillUploadBusy, setSkillUploadBusy] = useState(false);\n const [skillFlyoutOpen, setSkillFlyoutOpen] = useState(false);\n const [skillFlyoutSide, setSkillFlyoutSide] = useState<\"right\" | \"left\">(\n \"right\",\n );\n const skillFlyoutCloseTimerRef = useRef<number | null>(null);\n const openSkillFlyout = (rowEl?: HTMLElement | null) => {\n if (skillFlyoutCloseTimerRef.current) {\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = null;\n }\n if (rowEl && typeof window !== \"undefined\") {\n const rect = rowEl.getBoundingClientRect();\n const FLYOUT_WIDTH = 248;\n setSkillFlyoutSide(\n window.innerWidth - rect.right < FLYOUT_WIDTH ? \"left\" : \"right\",\n );\n }\n setSkillFlyoutOpen(true);\n };\n const scheduleSkillFlyoutClose = () => {\n if (skillFlyoutCloseTimerRef.current)\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = window.setTimeout(() => {\n setSkillFlyoutOpen(false);\n }, 160);\n };\n\n useEffect(() => {\n if (open) {\n setView(\"menu\");\n setMcpScope(defaultMcpScope);\n setMcpName(\"\");\n setMcpUrl(\"\");\n setMcpDescription(\"\");\n setMcpHeadersText(\"\");\n setMcpError(null);\n setMcpTestResult(null);\n setMcpBusy(false);\n setSkillUploadSlug(\"\");\n setSkillUploadContent(\"\");\n setSkillUploadFileName(\"\");\n setSkillUploadStatus(null);\n setSkillUploadBusy(false);\n setSkillFlyoutOpen(false);\n }\n }, [open, defaultMcpScope]);\n\n useEffect(() => {\n if (view === \"mcp-server\") {\n setMcpError(null);\n setMcpTestResult(null);\n const t = setTimeout(() => inputRef.current?.focus(), 50);\n return () => clearTimeout(t);\n }\n }, [view]);\n\n const clearMcpFeedback = () => {\n setMcpError(null);\n setMcpTestResult(null);\n };\n\n const parseHeaderLines = (\n text: string,\n ): Record<string, string> | undefined => {\n const out: Record<string, string> = {};\n for (const line of text.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const idx = trimmed.indexOf(\":\");\n if (idx <= 0) continue;\n const key = trimmed.slice(0, idx).trim();\n const val = trimmed.slice(idx + 1).trim();\n if (!key || !val) continue;\n out[key] = val;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n };\n\n const submitMcpServer = async () => {\n const name = mcpName.trim();\n const url = mcpUrl.trim();\n if (!name || !url || mcpBusy) return;\n const validationError = getMcpUrlValidationError(url);\n if (validationError) {\n setMcpError(validationError);\n setMcpTestResult(null);\n return;\n }\n setMcpError(null);\n setMcpBusy(true);\n try {\n await createMcp.mutateAsync({\n scope: mcpScope,\n name,\n url,\n headers: parseHeaderLines(mcpHeadersText),\n description: mcpDescription.trim() || undefined,\n });\n setOpen(false);\n } catch (err: any) {\n setMcpError(formatMcpServerError(err));\n } finally {\n setMcpBusy(false);\n }\n };\n\n const runMcpTest = async () => {\n const url = mcpUrl.trim();\n if (!url || mcpBusy) return;\n const validationError = getMcpUrlValidationError(url);\n if (validationError) {\n setMcpTestResult({ ok: false, message: validationError });\n setMcpError(null);\n return;\n }\n setMcpTestResult(null);\n setMcpError(null);\n setMcpBusy(true);\n try {\n const res = await testMcpServerUrl(url, parseHeaderLines(mcpHeadersText));\n if (res.ok) {\n setMcpTestResult({\n ok: true,\n message: `${res.toolCount ?? 0} tool${res.toolCount === 1 ? \"\" : \"s\"} available`,\n });\n } else {\n setMcpTestResult({ ok: false, message: res.error ?? \"Failed\" });\n }\n } catch (err: any) {\n setMcpTestResult({ ok: false, message: formatMcpServerError(err) });\n } finally {\n setMcpBusy(false);\n }\n };\n\n const handleSkillFileSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const file = files[0];\n const text = await file.text();\n const baseName = file.name.replace(/\\.[^./]+$/, \"\");\n const slug = slugifyName(\n baseName.toLowerCase() === \"skill\" ? \"uploaded-skill\" : baseName,\n );\n setSkillUploadSlug(slug);\n setSkillUploadContent(text);\n setSkillUploadFileName(file.name);\n setSkillUploadStatus(null);\n setView(\"skill-upload\");\n };\n\n const submitSkillUpload = async () => {\n if (skillUploadBusy) return;\n const slug = slugifyName(skillUploadSlug || \"uploaded-skill\");\n const path = `skills/${slug}/SKILL.md`;\n setSkillUploadBusy(true);\n setSkillUploadStatus(null);\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n path,\n content: skillUploadContent,\n mimeType: \"text/markdown\",\n shared: false,\n }),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(body || `Upload failed (${res.status})`);\n }\n setSkillUploadStatus({\n kind: \"ok\",\n message: `Skill \"${skillUploadFileName || `${slug}/SKILL.md`}\" added`,\n });\n window.setTimeout(() => setOpen(false), 1200);\n } catch (err: any) {\n setSkillUploadStatus({\n kind: \"err\",\n message: err?.message || \"Failed to save skill file\",\n });\n } finally {\n setSkillUploadBusy(false);\n }\n };\n\n const menuItems: {\n icon: React.ReactNode;\n label: string;\n desc: string;\n action: () => void;\n hoverAction?: () => void;\n }[] = [\n {\n icon: <IconUpload className=\"h-3.5 w-3.5\" />,\n label: \"Upload File\",\n desc: \"Images, PDFs, text/code, JSON, CSV\",\n action: () => {\n setOpen(false);\n setTimeout(() => fileUploadRef.current?.click(), 0);\n },\n },\n {\n icon: <IconPhotoPlus className=\"h-3.5 w-3.5\" />,\n label: \"Generate Image\",\n desc: \"Open the Assets image picker\",\n action: () => {\n setOpen(false);\n setAssetsPickerOpen(true);\n },\n },\n {\n icon: <IconClock className=\"h-3.5 w-3.5\" />,\n label: \"Schedule Task\",\n desc: \"Run something on a schedule\",\n action: () => {\n onSelectMode?.(\"job\");\n setOpen(false);\n },\n },\n {\n icon: <IconBolt className=\"h-3.5 w-3.5\" />,\n label: \"Create Automation\",\n desc: \"Set up a when-X-do-Y rule\",\n action: () => {\n onSelectMode?.(\"automation\");\n setOpen(false);\n },\n },\n {\n icon: <IconTool className=\"h-3.5 w-3.5\" />,\n label: \"Create Extension\",\n desc: \"Build a mini app extension\",\n action: () => {\n onSelectMode?.(\"extension\");\n setOpen(false);\n },\n },\n {\n icon: <IconPlugConnected className=\"h-3.5 w-3.5\" />,\n label: \"Connect MCP Server\",\n desc: \"Expose external tools to the agent\",\n action: () => setView(\"mcp-server\"),\n },\n {\n icon: <IconBulb className=\"h-3.5 w-3.5\" />,\n label: \"Create Skill\",\n desc: \"Teach the agent a new ability\",\n action: openSkillFlyout,\n hoverAction: openSkillFlyout,\n },\n ];\n\n const backButton = (\n <button\n type=\"button\"\n onClick={() => {\n clearMcpFeedback();\n setView(\"menu\");\n }}\n className=\"flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground mb-1.5\"\n >\n <IconArrowLeft className=\"h-3 w-3\" />\n Back\n </button>\n );\n\n return (\n <>\n {/* Hidden button to trigger the native file upload */}\n <ComposerPrimitive.AddAttachment asChild>\n <button\n ref={fileUploadRef}\n type=\"button\"\n className=\"hidden\"\n style={{ display: \"none\" }}\n tabIndex={-1}\n aria-hidden\n />\n </ComposerPrimitive.AddAttachment>\n <input\n ref={skillFileInputRef}\n type=\"file\"\n accept=\".md,text/markdown\"\n className=\"hidden\"\n onChange={(e) => {\n void handleSkillFileSelected(e.target.files);\n e.target.value = \"\";\n }}\n />\n\n <Popover open={open} onOpenChange={setOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Add...</TooltipContent>\n </Tooltip>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className={cn(\n \"p-0 rounded-lg\",\n view === \"skill-upload\" || view === \"mcp-server\"\n ? \"max-h-[70vh] w-[calc(100vw-24px)] max-w-[380px] overflow-y-auto\"\n : \"w-[260px]\",\n )}\n style={{ fontSize: 13, lineHeight: \"normal\" }}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n {view === \"menu\" && (\n <div className=\"py-1\">\n {menuItems.map((item) => {\n const isSkill = item.label === \"Create Skill\";\n return (\n <div\n key={item.label}\n className={cn(\"relative\", isSkill && \"group/skill\")}\n onMouseEnter={(e) => {\n if (isSkill) {\n openSkillFlyout(e.currentTarget);\n return;\n }\n if (!item.hoverAction) return;\n if (skillHoverTimerRef.current)\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = window.setTimeout(() => {\n item.hoverAction?.();\n }, 180);\n }}\n onMouseLeave={() => {\n if (isSkill) {\n scheduleSkillFlyoutClose();\n return;\n }\n if (skillHoverTimerRef.current) {\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = null;\n }\n }}\n >\n <button\n type=\"button\"\n onClick={item.action}\n className={cn(\n \"flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50\",\n isSkill && skillFlyoutOpen && \"bg-accent/50\",\n )}\n >\n <span className=\"text-muted-foreground\">{item.icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[12px] font-medium text-foreground\">\n {item.label}\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n {item.desc}\n </div>\n </div>\n {isSkill && (\n <span className=\"ml-auto text-muted-foreground/60\">\n ›\n </span>\n )}\n </button>\n {isSkill && skillFlyoutOpen && (\n <div\n role=\"menu\"\n onMouseEnter={() => openSkillFlyout()}\n onMouseLeave={scheduleSkillFlyoutClose}\n className={cn(\n \"absolute top-0 z-20 w-[240px] rounded-lg border border-border bg-popover py-1 shadow-md\",\n skillFlyoutSide === \"right\"\n ? \"left-full ml-1\"\n : \"right-full mr-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelectMode?.(\"skill\");\n setSkillFlyoutOpen(false);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconBulb className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Create new skill\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Describe a skill and let the agent draft it\n </div>\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSkillFlyoutOpen(false);\n skillFileInputRef.current?.click();\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconUpload className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Upload skill file\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Import an existing SKILL.md file\n </div>\n </div>\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {view === \"skill-upload\" && (\n <div className=\"p-3\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"mb-1.5 flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground\"\n >\n <IconArrowLeft className=\"h-3 w-3\" />\n Back\n </button>\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Upload skill file\n </label>\n <p className=\"mb-2 text-[10px] leading-relaxed text-muted-foreground/60\">\n Review the content from{\" \"}\n <span className=\"font-mono\">\n {skillUploadFileName || \"the selected file\"}\n </span>{\" \"}\n before saving.\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Skill name\n </label>\n <input\n value={skillUploadSlug}\n onChange={(e) => setSkillUploadSlug(e.target.value)}\n className=\"mb-2 w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"my-skill\"\n />\n <p className=\"mb-2 text-[10px] text-muted-foreground/60\">\n Saved at{\" \"}\n <span className=\"font-mono\">\n skills/{slugifyName(skillUploadSlug || \"uploaded-skill\")}\n /SKILL.md\n </span>\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Content\n </label>\n <textarea\n value={skillUploadContent}\n onChange={(e) => setSkillUploadContent(e.target.value)}\n rows={10}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 font-mono text-[11px] leading-relaxed text-foreground outline-none focus:ring-1 focus:ring-accent\"\n />\n {skillUploadStatus && (\n <div\n className={cn(\n \"mt-2 text-[11px] leading-snug\",\n skillUploadStatus.kind === \"ok\"\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\",\n )}\n >\n {skillUploadStatus.message}\n </div>\n )}\n <div className=\"mt-2.5 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground hover:bg-accent/40\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submitSkillUpload}\n disabled={\n skillUploadBusy ||\n !skillUploadContent.trim() ||\n !skillUploadSlug.trim()\n }\n className=\"rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none\"\n >\n {skillUploadBusy ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n </div>\n </div>\n )}\n\n {view === \"mcp-server\" && (\n <div className=\"p-3\">\n {backButton}\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Connect MCP Server\n </label>\n <p className=\"mb-2 text-[10px] text-muted-foreground/60 leading-relaxed\">\n Point at any Streamable HTTP MCP server. Its tools become\n available to the agent. Use Personal for private or staging\n servers; use Organization only for vetted servers the whole org\n should share.\n </p>\n <div className=\"space-y-2\">\n <div className=\"flex gap-1 rounded-md border border-border p-0.5\">\n <button\n type=\"button\"\n onClick={() => setMcpScope(\"user\")}\n className={cn(\n \"flex-1 rounded px-2 py-1 text-[11px] font-medium\",\n mcpScope === \"user\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n Personal\n </button>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() =>\n hasOrg && canCreateOrgMcp && setMcpScope(\"org\")\n }\n disabled={!hasOrg || !canCreateOrgMcp}\n className={cn(\n \"flex-1 rounded px-2 py-1 text-[11px] font-medium\",\n mcpScope === \"org\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n (!hasOrg || !canCreateOrgMcp) &&\n \"cursor-not-allowed opacity-50 hover:text-muted-foreground\",\n )}\n >\n Organization\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {!hasOrg\n ? \"Join an organization to share MCP servers\"\n : !canCreateOrgMcp\n ? \"Only owners and admins can add org-scope servers\"\n : undefined}\n </TooltipContent>\n </Tooltip>\n </div>\n <input\n ref={inputRef}\n value={mcpName}\n onChange={(e) => {\n setMcpName(e.target.value);\n clearMcpFeedback();\n }}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"Server name (e.g. zapier-staging)\"\n />\n <input\n value={mcpUrl}\n onChange={(e) => {\n setMcpUrl(e.target.value);\n clearMcpFeedback();\n }}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"https://mcp.example.com/\"\n />\n <input\n value={mcpDescription}\n onChange={(e) => {\n setMcpDescription(e.target.value);\n clearMcpFeedback();\n }}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"Description (optional)\"\n />\n <div>\n <label className=\"block text-[10px] font-medium text-foreground\">\n Headers\n </label>\n <p className=\"mt-0.5 text-[10px] leading-snug text-muted-foreground/70\">\n Optional. One per line, for example Authorization: Bearer\n sk-...\n </p>\n </div>\n <textarea\n value={mcpHeadersText}\n onChange={(e) => {\n setMcpHeadersText(e.target.value);\n clearMcpFeedback();\n }}\n rows={2}\n className=\"w-full resize-y rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n }}\n placeholder=\"Authorization: Bearer sk-...\"\n />\n {mcpTestResult && (\n <div\n className={cn(\n \"flex items-start gap-1 text-[11px] leading-snug\",\n mcpTestResult.ok\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\",\n )}\n >\n {mcpTestResult.ok && (\n <IconCheck className=\"mt-0.5 h-3 w-3 shrink-0\" />\n )}\n <span className=\"min-w-0 break-words\">\n {mcpTestResult.message}\n </span>\n </div>\n )}\n {mcpError && (\n <div className=\"break-words text-[11px] leading-snug text-red-600 dark:text-red-400\">\n {mcpError}\n </div>\n )}\n </div>\n <div className=\"mt-2.5 flex items-center justify-between gap-2\">\n <button\n type=\"button\"\n onClick={runMcpTest}\n disabled={!mcpUrl.trim() || mcpBusy}\n className=\"rounded-md border border-border bg-background px-2.5 py-1.5 text-[11px] font-medium text-foreground hover:bg-accent disabled:opacity-40 disabled:pointer-events-none\"\n >\n Test\n </button>\n <button\n type=\"button\"\n onClick={submitMcpServer}\n disabled={!mcpName.trim() || !mcpUrl.trim() || mcpBusy}\n className=\"rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none\"\n >\n {mcpBusy ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Connect\"\n )}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n <AssetsPickerModal\n open={assetsPickerOpen}\n onOpenChange={setAssetsPickerOpen}\n />\n </>\n );\n}\n\nfunction AssetsPickerModal({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const sourceUrl = useMemo(() => assetPickerUrl(), []);\n const iframeUrl = useMemo(() => withEmbeddedParams(sourceUrl), [sourceUrl]);\n const targetOrigin = useMemo(() => assetPickerOrigin(iframeUrl), [iframeUrl]);\n\n useEffect(() => {\n if (!open || !targetOrigin) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n if (event.origin !== targetOrigin) return;\n if (!isEmbedEnvelope(event.data)) return;\n\n if (event.data.type === \"ready\") {\n iframeRef.current?.contentWindow?.postMessage(\n embedEnvelope(\"message\", {\n name: \"configure\",\n payload: { mediaType: \"image\", count: 3 },\n }),\n targetOrigin,\n );\n return;\n }\n\n if (event.data.type !== \"message\") return;\n if (event.data.name === \"close\") {\n onOpenChange(false);\n return;\n }\n if (\n event.data.name !== \"chooseImage\" &&\n event.data.name !== \"chooseAsset\"\n )\n return;\n\n const url = assetImageSource(event.data.payload);\n if (!url) return;\n const title = assetTitle(event.data.payload, url);\n const assetId =\n event.data.payload && typeof event.data.payload === \"object\"\n ? assetString((event.data.payload as AssetPickerPayload).assetId)\n : null;\n setAgentChatContextItem({\n key: `asset-image:${assetId ?? url}`,\n title: `Image: ${title}`,\n context: assetContext(event.data.payload, url),\n });\n onOpenChange(false);\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onOpenChange(false);\n };\n\n window.addEventListener(\"message\", handleMessage);\n window.addEventListener(\"keydown\", handleKey);\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"keydown\", handleKey);\n };\n }, [onOpenChange, open, targetOrigin]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-[280] flex items-center justify-center bg-black/50 p-3\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"composer-assets-picker-title\"\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) onOpenChange(false);\n }}\n >\n <div className=\"flex h-[min(86vh,760px)] w-[min(96vw,1040px)] flex-col overflow-hidden rounded-xl border border-border bg-background shadow-2xl\">\n <div className=\"flex h-12 shrink-0 items-center justify-between border-b border-border px-4\">\n <div\n id=\"composer-assets-picker-title\"\n className=\"text-sm font-medium text-foreground\"\n >\n Generate image\n </div>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close image picker\"\n >\n <IconX className=\"h-4 w-4\" />\n </button>\n </div>\n {targetOrigin ? (\n <iframe\n ref={iframeRef}\n src={iframeUrl}\n title=\"Assets image picker\"\n className=\"min-h-0 flex-1 border-0 bg-background\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-downloads\"\n allow=\"clipboard-read; clipboard-write; microphone; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n />\n ) : (\n <div className=\"flex min-h-0 flex-1 items-center justify-center p-8 text-center text-sm text-muted-foreground\">\n The configured image picker URL is not valid.\n </div>\n )}\n </div>\n </div>,\n document.body,\n );\n}\n"]}
@@ -48,6 +48,8 @@ export interface PromptComposerProps {
48
48
  modeControl?: ReactNode;
49
49
  /** Explicit host-owned toolbar slot rendered directly after the "+" button. */
50
50
  toolbarSlot?: ReactNode;
51
+ /** Custom attachment button to render instead of the default "+" affordance. */
52
+ attachButton?: ReactNode;
51
53
  /** Custom action button to render instead of the default send button. */
52
54
  actionButton?: ReactNode;
53
55
  /** Extra button rendered alongside the default send button. */
@@ -1 +1 @@
1
- {"version":3,"file":"PromptComposer.d.ts","sourceRoot":"","sources":["../../../src/client/composer/PromptComposer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PromptComposer.d.ts","sourceRoot":"","sources":["../../../src/client/composer/PromptComposer.tsx"],"names":[],"mappings":"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"}
@@ -190,7 +190,7 @@ function PromptAttachmentStrip() {
190
190
  return null;
191
191
  return (_jsx("div", { className: "agent-composer-attachment-strip flex flex-wrap gap-2 px-2 pt-2", children: attachments.map((attachment) => (_jsx(AttachmentChip, { attachment: attachment, onRemove: handleRemove }, attachment.id))) }));
192
192
  }
193
- function PromptComposerInner({ onSubmit, placeholder, disabled, autoFocus, className, style, rootClassName, rootStyle, draftScope, preserveDraftOnSubmit = false, showModelSelector = true, voiceEnabled = true, attachmentsEnabled = true, plusMenuMode, initialText, initialTextKey, modeControl, toolbarSlot, actionButton, extraActionButton, layoutVariant, slashCommands, slashSkills, includeDefaultSlashCommands, includeDefaultSlashSkills, onSlashCommand, availableModels, selectedModel, selectedEngine, selectedEffort, onModelChange, onEffortChange, modelStatusChecksEnabled, onTextChange, onConnectProvider, composerRef, }) {
193
+ function PromptComposerInner({ onSubmit, placeholder, disabled, autoFocus, className, style, rootClassName, rootStyle, draftScope, preserveDraftOnSubmit = false, showModelSelector = true, voiceEnabled = true, attachmentsEnabled = true, plusMenuMode, initialText, initialTextKey, modeControl, toolbarSlot, attachButton, actionButton, extraActionButton, layoutVariant, slashCommands, slashSkills, includeDefaultSlashCommands, includeDefaultSlashSkills, onSlashCommand, availableModels, selectedModel, selectedEngine, selectedEffort, onModelChange, onEffortChange, modelStatusChecksEnabled, onTextChange, onConnectProvider, composerRef, }) {
194
194
  const localRef = useRef(null);
195
195
  const handleRef = composerRef ?? localRef;
196
196
  const hostManagedModels = Boolean(availableModels && selectedModel && onModelChange);
@@ -245,7 +245,7 @@ function PromptComposerInner({ onSubmit, placeholder, disabled, autoFocus, class
245
245
  effort: composerEffort,
246
246
  });
247
247
  }, [composerEffort, composerEngine, composerModel, onSubmit]);
248
- return (_jsxs(AgentComposerFrame, { className: cn("text-left", className), rootClassName: rootClassName, style: style, rootStyle: rootStyle, layoutVariant: layoutVariant, children: [_jsx(PromptAttachmentStrip, {}), _jsx(TiptapComposer, { focusRef: handleRef, disabled: disabled, placeholder: placeholder, initialText: initialText, initialTextKey: initialTextKey, onSubmit: handleSubmit, clearOnSubmit: !preserveDraftOnSubmit, plusMenuMode: plusMenuMode ?? (attachmentsEnabled ? "upload-only" : "hidden"), modeControl: modeControl, toolbarSlot: toolbarSlot, actionButton: actionButton, extraActionButton: extraActionButton, layoutVariant: layoutVariant, slashCommands: slashCommands, slashSkills: slashSkills, includeDefaultSlashCommands: includeDefaultSlashCommands, includeDefaultSlashSkills: includeDefaultSlashSkills, onSlashCommand: onSlashCommand, voiceEnabled: voiceEnabled, onTextChange: onTextChange, draftScope: draftScope, selectedModel: composerModel, selectedEffort: composerEffort, availableModels: composerModelGroups, onModelChange: handleModelChange, onEffortChange: handleEffortChange, providerConnectStatusEnabled: resolvedModelStatusChecksEnabled, onConnectProvider: onConnectProvider })] }));
248
+ return (_jsxs(AgentComposerFrame, { className: cn("text-left", className), rootClassName: rootClassName, style: style, rootStyle: rootStyle, layoutVariant: layoutVariant, children: [_jsx(PromptAttachmentStrip, {}), _jsx(TiptapComposer, { focusRef: handleRef, disabled: disabled, placeholder: placeholder, initialText: initialText, initialTextKey: initialTextKey, onSubmit: handleSubmit, clearOnSubmit: !preserveDraftOnSubmit, plusMenuMode: plusMenuMode ?? (attachmentsEnabled ? "upload-only" : "hidden"), attachButton: attachButton, modeControl: modeControl, toolbarSlot: toolbarSlot, actionButton: actionButton, extraActionButton: extraActionButton, layoutVariant: layoutVariant, slashCommands: slashCommands, slashSkills: slashSkills, includeDefaultSlashCommands: includeDefaultSlashCommands, includeDefaultSlashSkills: includeDefaultSlashSkills, onSlashCommand: onSlashCommand, voiceEnabled: voiceEnabled, onTextChange: onTextChange, draftScope: draftScope, selectedModel: composerModel, selectedEffort: composerEffort, availableModels: composerModelGroups, onModelChange: handleModelChange, onEffortChange: handleEffortChange, providerConnectStatusEnabled: resolvedModelStatusChecksEnabled, onConnectProvider: onConnectProvider })] }));
249
249
  }
250
250
  /**
251
251
  * Standalone composer that mirrors the agent sidebar's input experience —