@agent-native/core 0.12.22 → 0.12.24

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 (118) hide show
  1. package/dist/agent/engine/ai-sdk-engine.d.ts +2 -0
  2. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/ai-sdk-engine.js +4 -2
  4. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  5. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  6. package/dist/agent/engine/anthropic-engine.js +2 -1
  7. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  8. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  9. package/dist/agent/engine/builder-engine.js +117 -8
  10. package/dist/agent/engine/builder-engine.js.map +1 -1
  11. package/dist/agent/engine/registry.d.ts.map +1 -1
  12. package/dist/agent/engine/registry.js +24 -13
  13. package/dist/agent/engine/registry.js.map +1 -1
  14. package/dist/agent/production-agent.d.ts +1 -0
  15. package/dist/agent/production-agent.d.ts.map +1 -1
  16. package/dist/agent/production-agent.js +20 -10
  17. package/dist/agent/production-agent.js.map +1 -1
  18. package/dist/agent/thread-data-builder.d.ts +10 -0
  19. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  20. package/dist/agent/thread-data-builder.js +80 -0
  21. package/dist/agent/thread-data-builder.js.map +1 -1
  22. package/dist/agent/types.d.ts +7 -0
  23. package/dist/agent/types.d.ts.map +1 -1
  24. package/dist/agent/types.js.map +1 -1
  25. package/dist/cli/create.d.ts.map +1 -1
  26. package/dist/cli/create.js +3 -3
  27. package/dist/cli/create.js.map +1 -1
  28. package/dist/client/AgentPanel.d.ts.map +1 -1
  29. package/dist/client/AgentPanel.js +10 -2
  30. package/dist/client/AgentPanel.js.map +1 -1
  31. package/dist/client/AssistantChat.d.ts.map +1 -1
  32. package/dist/client/AssistantChat.js +169 -15
  33. package/dist/client/AssistantChat.js.map +1 -1
  34. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  35. package/dist/client/ErrorBoundary.js +3 -2
  36. package/dist/client/ErrorBoundary.js.map +1 -1
  37. package/dist/client/FeedbackButton.js +1 -1
  38. package/dist/client/FeedbackButton.js.map +1 -1
  39. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  40. package/dist/client/agent-chat-adapter.js +93 -45
  41. package/dist/client/agent-chat-adapter.js.map +1 -1
  42. package/dist/client/analytics.d.ts.map +1 -1
  43. package/dist/client/analytics.js +26 -0
  44. package/dist/client/analytics.js.map +1 -1
  45. package/dist/client/components/ui/tooltip.js +1 -1
  46. package/dist/client/components/ui/tooltip.js.map +1 -1
  47. package/dist/client/composer/PromptComposer.js +1 -1
  48. package/dist/client/composer/PromptComposer.js.map +1 -1
  49. package/dist/client/composer/TiptapComposer.d.ts +5 -0
  50. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  51. package/dist/client/composer/TiptapComposer.js +12 -7
  52. package/dist/client/composer/TiptapComposer.js.map +1 -1
  53. package/dist/client/onboarding/OnboardingPanel.js +2 -1
  54. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  55. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  56. package/dist/client/progress/RunsTray.js +18 -3
  57. package/dist/client/progress/RunsTray.js.map +1 -1
  58. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  59. package/dist/client/resources/ResourceTree.js +5 -4
  60. package/dist/client/resources/ResourceTree.js.map +1 -1
  61. package/dist/client/resources/ResourcesPanel.js +1 -1
  62. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  63. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  64. package/dist/client/settings/useBuilderStatus.js +5 -3
  65. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  66. package/dist/client/sse-event-processor.d.ts.map +1 -1
  67. package/dist/client/sse-event-processor.js +3 -0
  68. package/dist/client/sse-event-processor.js.map +1 -1
  69. package/dist/collab/client.d.ts +9 -0
  70. package/dist/collab/client.d.ts.map +1 -1
  71. package/dist/collab/client.js +36 -10
  72. package/dist/collab/client.js.map +1 -1
  73. package/dist/extensions/html-shell.d.ts.map +1 -1
  74. package/dist/extensions/html-shell.js +12 -0
  75. package/dist/extensions/html-shell.js.map +1 -1
  76. package/dist/mcp-client/errors.d.ts +2 -0
  77. package/dist/mcp-client/errors.d.ts.map +1 -0
  78. package/dist/mcp-client/errors.js +47 -0
  79. package/dist/mcp-client/errors.js.map +1 -0
  80. package/dist/mcp-client/manager.d.ts.map +1 -1
  81. package/dist/mcp-client/manager.js +44 -15
  82. package/dist/mcp-client/manager.js.map +1 -1
  83. package/dist/mcp-client/routes.d.ts +1 -2
  84. package/dist/mcp-client/routes.d.ts.map +1 -1
  85. package/dist/mcp-client/routes.js +2 -27
  86. package/dist/mcp-client/routes.js.map +1 -1
  87. package/dist/onboarding/default-steps.js +1 -1
  88. package/dist/onboarding/default-steps.js.map +1 -1
  89. package/dist/progress/store.d.ts +2 -0
  90. package/dist/progress/store.d.ts.map +1 -1
  91. package/dist/progress/store.js +44 -0
  92. package/dist/progress/store.js.map +1 -1
  93. package/dist/server/action-routes.d.ts +2 -0
  94. package/dist/server/action-routes.d.ts.map +1 -1
  95. package/dist/server/action-routes.js +4 -1
  96. package/dist/server/action-routes.js.map +1 -1
  97. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  98. package/dist/server/agent-chat-plugin.js +27 -15
  99. package/dist/server/agent-chat-plugin.js.map +1 -1
  100. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  101. package/dist/server/core-routes-plugin.js +31 -9
  102. package/dist/server/core-routes-plugin.js.map +1 -1
  103. package/dist/server/credential-provider.d.ts +8 -0
  104. package/dist/server/credential-provider.d.ts.map +1 -1
  105. package/dist/server/credential-provider.js +29 -3
  106. package/dist/server/credential-provider.js.map +1 -1
  107. package/dist/server/index.d.ts +1 -1
  108. package/dist/server/index.d.ts.map +1 -1
  109. package/dist/server/index.js +1 -1
  110. package/dist/server/index.js.map +1 -1
  111. package/dist/server/request-context.d.ts +9 -0
  112. package/dist/server/request-context.d.ts.map +1 -1
  113. package/dist/server/request-context.js +13 -0
  114. package/dist/server/request-context.js.map +1 -1
  115. package/dist/terminal/terminal-plugin.d.ts.map +1 -1
  116. package/dist/terminal/terminal-plugin.js +4 -3
  117. package/dist/terminal/terminal-plugin.js.map +1 -1
  118. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ResourcesPanel.js","sourceRoot":"","sources":["../../../src/client/resources/ResourcesPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport React, { useState, useRef, useCallback, useEffect } from \"react\";\nimport {\n IconPlus,\n IconUpload,\n IconArrowLeft,\n IconPencil,\n IconBulb,\n IconBolt,\n IconTrash,\n IconEye,\n IconCode,\n IconClock,\n IconMessageChatbot,\n IconBuildingSkyscraper,\n IconBrowser,\n IconExternalLink,\n IconLoader2,\n IconHelp,\n IconPlugConnected,\n IconCheck,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { PromptComposer } from \"../composer/PromptComposer.js\";\nimport { ResourceTree } from \"./ResourceTree.js\";\nimport { ResourceEditor } from \"./ResourceEditor.js\";\nimport { serializeFrontmatter } from \"../../resources/metadata.js\";\nimport {\n useResourceTree,\n useResource,\n useCreateResource,\n useUpdateResource,\n useDeleteResource,\n useUploadResource,\n withMcpServersFolder,\n withAgentScratchFolder,\n type ResourceScope,\n type ResourceMeta,\n} from \"./use-resources.js\";\nimport {\n formatMcpServerError,\n getMcpUrlValidationError,\n useMcpServers,\n useCreateMcpServer,\n useDeleteMcpServer,\n testMcpServerUrl,\n parseMcpVirtualId,\n type McpServerScope,\n} from \"./use-mcp-servers.js\";\nimport { McpServerDetail } from \"./McpServerDetail.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\n\nconst WORKSPACE_DOCS_URL = \"https://agent-native.com/docs/workspace\";\n\n// ─── Create Menu (unified + button) ────────────────────────────────────────\n\ntype CreateMenuView =\n | \"menu\"\n | \"file\"\n | \"skill\"\n | \"job\"\n | \"agent-mode\"\n | \"agent-prompt\"\n | \"agent-form\"\n | \"mcp-server\";\n\nconst AGENT_MODEL_OPTIONS = [\n { value: \"inherit\", label: \"Default model\" },\n { value: \"claude-sonnet-4-6\", label: \"Claude Sonnet 4.6\" },\n { value: \"claude-haiku-4-5-20251001\", label: \"Claude Haiku 4.5\" },\n] as const;\n\nfunction slugifyName(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"agent\"\n );\n}\n\nfunction buildAgentResourceContent({\n name,\n description,\n model,\n tools,\n body,\n}: {\n name: string;\n description: string;\n model: string;\n tools: string;\n body: string;\n}): string {\n const fields = [\n { key: \"name\", value: name },\n { key: \"description\", value: description },\n { key: \"model\", value: model },\n { key: \"tools\", value: tools },\n { key: \"delegate-default\", value: \"false\" },\n ];\n return serializeFrontmatter(fields) + body.trim() + \"\\n\";\n}\n\nfunction CreateMenu({\n scope,\n onCreateFile,\n onCreateResource,\n onCreateMcpServer,\n canCreateOrgMcp,\n hasOrg,\n onCreated,\n}: {\n scope: ResourceScope;\n onCreateFile: (name: string) => void;\n onCreateResource: (path: string, content: string, mimeType?: string) => void;\n onCreateMcpServer: (args: {\n scope: McpServerScope;\n name: string;\n url: string;\n headers?: Record<string, string>;\n description?: string;\n }) => Promise<void>;\n canCreateOrgMcp: boolean;\n hasOrg: boolean;\n onCreated?: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const [view, setView] = useState<CreateMenuView>(\"menu\");\n const [value, setValue] = useState(\"\");\n const [agentName, setAgentName] = useState(\"\");\n const [agentDescription, setAgentDescription] = useState(\"\");\n const [agentModel, setAgentModel] = useState<string>(\"inherit\");\n const [agentInstructions, setAgentInstructions] = useState(\n `# Role\\n\\nDefine how this agent should work.\\n\\n## Focus\\n\\n- What kinds of tasks it should handle\\n- What tone or approach it should use\\n- Important constraints or preferences\\n`,\n );\n const defaultMcpScope: McpServerScope =\n scope === \"shared\" && 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 inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (open) {\n setView(\"menu\");\n setValue(\"\");\n setAgentName(\"\");\n setAgentDescription(\"\");\n setAgentModel(\"inherit\");\n setAgentInstructions(\n `# Role\\n\\nDefine how this agent should work.\\n\\n## Focus\\n\\n- What kinds of tasks it should handle\\n- What tone or approach it should use\\n- Important constraints or preferences\\n`,\n );\n setMcpScope(defaultMcpScope);\n setMcpName(\"\");\n setMcpUrl(\"\");\n setMcpDescription(\"\");\n setMcpHeadersText(\"\");\n setMcpError(null);\n setMcpTestResult(null);\n setMcpBusy(false);\n }\n }, [open, defaultMcpScope]);\n\n useEffect(() => {\n if (view !== \"menu\" && view !== \"agent-form\") {\n setValue(\"\");\n if (view === \"mcp-server\") {\n setMcpError(null);\n setMcpTestResult(null);\n }\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 submitFile = () => {\n const trimmed = value.trim();\n if (trimmed) {\n onCreateFile(trimmed);\n setOpen(false);\n }\n };\n\n const submitSkill = (text: string = value) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n\n sendToAgentChat({\n message: `Create a skill: ${trimmed}`,\n newTab: true,\n context: `The user wants to create an agent skill. Their description: \"${trimmed}\"\n\nFollow the create-skill pattern to build this. Before writing:\n\n1. **Determine the skill name** — derive a hyphen-case name from the description (e.g. \"code review\" → \"code-review\")\n2. **Determine the skill type** — Pattern (architectural rule), Workflow (step-by-step), or Generator (scaffolding)\n3. **Write the skill** as a ${scope} resource at path \"skills/<name>/SKILL.md\" using resource-write\n\nThe skill file MUST have YAML frontmatter with name and description (under 40 words), then markdown with:\n- Clear rule/purpose statement\n- Why this skill exists\n- How to follow it (with code examples where helpful)\n- Common violations to avoid\n- Related skills\n\nTemplate for a Pattern skill:\n\\`\\`\\`markdown\n---\nname: <hyphen-case-name>\ndescription: >-\n <Under 40 words. When should this trigger?>\n---\n\n# <Skill Name>\n\n## Rule\n<One sentence: what must be true>\n\n## Why\n<Why this rule exists>\n\n## How\n<How to follow it, with code examples>\n\n## Don't\n<Common violations>\n\\`\\`\\`\n\nTemplate for a Workflow skill:\n\\`\\`\\`markdown\n---\nname: <hyphen-case-name>\ndescription: >-\n <Under 40 words. When should this trigger?>\n---\n\n# <Workflow Name>\n\n## Prerequisites\n<What must be in place>\n\n## Steps\n<Numbered steps with code examples>\n\n## Verification\n<How to confirm it worked>\n\\`\\`\\`\n\nAfter creating, update the shared AGENTS.md resource to reference the new skill in its skills table.\n\nKeep the skill concise (under 500 lines) and actionable.`,\n submit: true,\n });\n\n setOpen(false);\n onCreated?.();\n };\n\n const submitJob = (text: string = value) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n\n sendToAgentChat({\n message: `Create a recurring job: ${trimmed}`,\n newTab: true,\n context: `The user wants to create a recurring job. Their description: \"${trimmed}\"\n\nUse the manage-jobs tool with action \"create\" to create this. You need to:\n1. Derive a hyphen-case name from the description\n2. Convert the schedule to a cron expression (e.g., \"every weekday at 9am\" → \"0 9 * * 1-5\")\n3. Write clear, self-contained instructions for what the agent should do each time the job runs\n4. Create it in ${scope} scope\n\nThe job will run automatically on the schedule. Make the instructions specific — include which actions to call and what to do with results.`,\n submit: true,\n });\n\n setOpen(false);\n };\n\n const submitAgentPrompt = (text: string = value) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n\n sendToAgentChat({\n message: `Create a custom agent: ${trimmed}`,\n newTab: true,\n context: `The user wants a reusable custom sub-agent profile for the workspace. Their description: \"${trimmed}\"\n\nCreate it as a ${scope} resource under \"agents/<name>.md\" using resource-write.\n\nRequirements:\n1. Derive a hyphen-case file name from the intent\n2. Use YAML frontmatter with:\n - name\n - description\n - model (use \"inherit\" unless the request clearly needs a different model)\n - tools (set to \"inherit\")\n - delegate-default (set to false)\n3. Put the main operating instructions in the markdown body\n4. Keep it concise and directive, similar to a Claude Code-style custom agent\n\nTemplate:\n\\`\\`\\`markdown\n---\nname: Design\ndescription: >-\n Helps with product and interface design decisions.\nmodel: inherit\ntools: inherit\ndelegate-default: false\n---\n\n# Role\n\nYou are a focused design agent.\n\n## Responsibilities\n\n- ...\n\n## Approach\n\n- ...\n\\`\\`\\`\n\nThe result should be a reusable agent profile, not a one-off task response.`,\n submit: true,\n });\n\n setOpen(false);\n onCreated?.();\n };\n\n const submitAgentManual = () => {\n const trimmedName = agentName.trim();\n const trimmedDescription = agentDescription.trim();\n const trimmedInstructions = agentInstructions.trim();\n if (!trimmedName || !trimmedDescription || !trimmedInstructions) return;\n\n const slug = slugifyName(trimmedName);\n onCreateResource(\n `agents/${slug}.md`,\n buildAgentResourceContent({\n name: trimmedName,\n description: trimmedDescription,\n model: agentModel,\n tools: \"inherit\",\n body: trimmedInstructions,\n }),\n \"text/markdown\",\n );\n setOpen(false);\n onCreated?.();\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 value = trimmed.slice(idx + 1).trim();\n if (!key || !value) continue;\n out[key] = value;\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 onCreateMcpServer({\n scope: mcpScope,\n name,\n url,\n headers: parseHeaderLines(mcpHeadersText),\n description: mcpDescription.trim() || undefined,\n });\n setOpen(false);\n onCreated?.();\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 menuItems: {\n icon: React.ReactNode;\n label: string;\n desc: string;\n action: () => void;\n }[] = [\n {\n icon: <IconPlus className=\"h-3.5 w-3.5\" />,\n label: \"Create File\",\n desc: \"Add a new file at a path\",\n action: () => setView(\"file\"),\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: () => setView(\"skill\"),\n },\n {\n icon: <IconClock className=\"h-3.5 w-3.5\" />,\n label: \"Scheduled Task\",\n desc: \"Run something on a schedule\",\n action: () => setView(\"job\"),\n },\n {\n icon: <IconMessageChatbot className=\"h-3.5 w-3.5\" />,\n label: \"Create Custom Agent\",\n desc: \"Add a reusable sub-agent profile\",\n action: () => setView(\"agent-mode\"),\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 setOpen(false);\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:set-mode\", {\n detail: { mode: \"chat\" },\n }),\n );\n sendToAgentChat({\n message:\n \"Help me create a new automation. Ask me what I want to automate.\",\n context: `The user wants to create a new automation. Scope: personal. Use manage-automations with action=define to create it. Ask clarifying questions if needed about what event to trigger on, conditions, and what actions to take.`,\n submit: true,\n newTab: true,\n });\n onCreated?.();\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 return (\n <Popover open={open} onOpenChange={setOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n open && \"bg-accent/50 text-foreground\",\n )}\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Create new...</TooltipContent>\n </Tooltip>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n collisionPadding={8}\n className={cn(\n \"z-[260] p-0 text-[13px] leading-normal\",\n view === \"menu\" || view === \"file\"\n ? \"w-[260px]\"\n : \"max-h-[70vh] w-[calc(100vw-24px)] max-w-[380px] overflow-y-auto\",\n )}\n >\n {view === \"menu\" && (\n <div className=\"py-1\">\n {menuItems.map((item) => (\n <button\n key={item.label}\n onClick={item.action}\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\">{item.icon}</span>\n <div className=\"min-w-0\">\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 </button>\n ))}\n </div>\n )}\n\n {view === \"file\" && (\n <div className=\"p-3\">\n <label className=\"mb-1.5 block text-[11px] font-medium text-muted-foreground\">\n File path\n </label>\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitFile();\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setView(\"menu\");\n }\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=\"notes/ideas.md\"\n />\n <div className=\"mt-2.5 flex justify-end\">\n <button\n onClick={submitFile}\n disabled={!value.trim()}\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 Create\n </button>\n </div>\n </div>\n )}\n\n {view === \"skill\" && (\n <div className=\"p-3\">\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Create Skill\n </label>\n <p className=\"mb-2 text-[10px] text-muted-foreground/60 leading-relaxed\">\n Describe what kind of skill you want and the agent will create it.\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"e.g. A skill that reviews PRs for security issues and OWASP top 10 vulnerabilities\"\n draftScope=\"resources:create-skill\"\n onSubmit={(text) => submitSkill(text)}\n />\n </div>\n )}\n\n {view === \"job\" && (\n <div className=\"p-3\">\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Scheduled Task\n </label>\n <p className=\"mb-2 text-[10px] text-muted-foreground/60 leading-relaxed\">\n Describe what should happen and when.\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"e.g. Every weekday at 9am, check for overdue scorecards and send a Slack update\"\n draftScope=\"resources:create-job\"\n onSubmit={(text) => submitJob(text)}\n />\n </div>\n )}\n\n {view === \"agent-mode\" && (\n <div className=\"p-3\">\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Create Agent\n </label>\n <p className=\"mb-2 text-[10px] leading-relaxed text-muted-foreground/60\">\n Build a reusable sub-agent profile for this workspace.\n </p>\n <div className=\"space-y-2\">\n <button\n onClick={() => setView(\"agent-prompt\")}\n className=\"flex w-full items-start gap-2 rounded-md border border-border px-3 py-2 text-left hover:bg-accent/40\"\n >\n <IconPencil className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <div>\n <div className=\"text-[12px] font-medium text-foreground\">\n Describe It\n </div>\n <div className=\"text-[10px] text-muted-foreground/60\">\n Let the agent draft the profile from a prompt.\n </div>\n </div>\n </button>\n <button\n onClick={() => setView(\"agent-form\")}\n className=\"flex w-full items-start gap-2 rounded-md border border-border px-3 py-2 text-left hover:bg-accent/40\"\n >\n <IconMessageChatbot className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <div>\n <div className=\"text-[12px] font-medium text-foreground\">\n Fill Form\n </div>\n <div className=\"text-[10px] text-muted-foreground/60\">\n Set the fields manually and start with a markdown template.\n </div>\n </div>\n </button>\n </div>\n </div>\n )}\n\n {view === \"agent-prompt\" && (\n <div className=\"p-3\">\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Create Agent From Prompt\n </label>\n <p className=\"mb-2 text-[10px] text-muted-foreground/60 leading-relaxed\">\n Describe the agent you want. It will be saved under{\" \"}\n <code>agents/</code>.\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"e.g. A design agent that critiques layouts, suggests UI direction, and prefers concise product reasoning\"\n draftScope=\"resources:create-agent\"\n onSubmit={(text) => submitAgentPrompt(text)}\n />\n </div>\n )}\n\n {view === \"agent-form\" && (\n <div className=\"p-3\">\n <label className=\"mb-2 block text-[11px] font-semibold text-foreground\">\n Create Agent Manually\n </label>\n <div className=\"space-y-2\">\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\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=\"Agent name\"\n />\n <input\n value={agentDescription}\n onChange={(e) => setAgentDescription(e.target.value)}\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=\"Short description\"\n />\n <label className=\"block text-[11px] font-medium text-muted-foreground\">\n Model\n </label>\n <select\n value={agentModel}\n onChange={(e) => setAgentModel(e.target.value)}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none focus:ring-1 focus:ring-accent\"\n >\n {AGENT_MODEL_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <label className=\"block text-[11px] font-medium text-muted-foreground\">\n Instructions\n </label>\n <textarea\n value={agentInstructions}\n onChange={(e) => setAgentInstructions(e.target.value)}\n rows={8}\n className=\"w-full resize-y 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 style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n lineHeight: 1.5,\n }}\n />\n </div>\n <div className=\"mt-2.5 flex justify-end\">\n <button\n onClick={submitAgentManual}\n disabled={\n !agentName.trim() ||\n !agentDescription.trim() ||\n !agentInstructions.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 Create\n </button>\n </div>\n </div>\n )}\n\n {view === \"mcp-server\" && (\n <div className=\"p-3\">\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 (Zapier, Cloudflare,\n internal tools). Its tools become available to the agent. Use\n Personal for private or staging servers; use Organization only for\n vetted servers the whole org should share.{\" \"}\n <a\n href=\"https://agent-native.com/docs/mcp-clients#remote-via-ui\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-0.5 text-muted-foreground/80 underline hover:text-foreground\"\n >\n Learn more\n <IconExternalLink className=\"inline h-2.5 w-2.5\" />\n </a>\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 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// ─── PathBreadcrumb ─────────────────────────────────────────────────────────\n\nfunction PathBreadcrumb({ path }: { path: string }) {\n const parts = path.split(\"/\").filter(Boolean);\n return (\n <div className=\"flex items-center gap-0.5 text-[11px] text-muted-foreground/60 overflow-hidden\">\n {parts.map((part, i) => (\n <React.Fragment key={i}>\n {i > 0 && <span className=\"shrink-0\">/</span>}\n <span\n className={cn(\n \"truncate\",\n i === parts.length - 1 && \"text-muted-foreground\",\n )}\n >\n {part}\n </span>\n </React.Fragment>\n ))}\n </div>\n );\n}\n\n// ─── ResourcesPanel ─────────────────────────────────────────────────────────\n\nconst DEFAULT_AGENTS_MD_CLIENT = `# Agent Instructions\n\nThis file customizes how the AI agent behaves in this app. Edit it to add your own instructions, preferences, and context.\n\n## What to put here\n\n- **Preferences** — Tone, style, verbosity, response format\n- **Context** — Domain knowledge, terminology, team conventions\n- **Rules** — Things the agent should always/never do\n- **Skills** — Reference skill files for specialized tasks (create them in the \\`skills/\\` folder)\n\n## Skills\n\nCreate skill files under \\`skills/<name>/SKILL.md\\` to give the agent specialized knowledge. Reference them here:\n\n| Skill | Path | Description |\n|-------|------|-------------|\n| *(use the skill button to create one)* | \\`skills/example/SKILL.md\\` | |\n`;\n\n// BuilderBrowserCard moved to settings/BrowserSection.tsx\n\nexport function ResourcesPanel() {\n const { data: org } = useOrg();\n // Non-admin org members get read-only access to organization resources.\n // Solo deployments (no orgId) behave as owner — users can edit their own.\n const canEditOrg =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n\n const [activeScope, setActiveScope] = useState<ResourceScope>(\n canEditOrg ? \"shared\" : \"personal\",\n );\n const [selectedResourceId, setSelectedResourceId] = useState<string | null>(\n null,\n );\n const [toolbarDeleteConfirmId, setToolbarDeleteConfirmId] = useState<\n string | null\n >(null);\n const [dragOver, setDragOver] = useState(false);\n const [editorView, setEditorView] = useState<\"visual\" | \"code\">(() => {\n try {\n const v = localStorage.getItem(\"resource-editor-view\");\n if (v === \"code\") return \"code\";\n } catch {}\n return \"visual\";\n });\n\n useEffect(() => {\n setToolbarDeleteConfirmId(null);\n }, [selectedResourceId]);\n const [saveStatus, setSaveStatus] = useState<\"idle\" | \"saving\" | \"saved\">(\n \"idle\",\n );\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const sharedTreeQuery = useResourceTree(\"shared\");\n const personalTreeQuery = useResourceTree(\"personal\");\n const mcpServersQuery = useMcpServers();\n const createMcpServer = useCreateMcpServer();\n const deleteMcpServer = useDeleteMcpServer();\n\n // Merge MCP servers into each scope's tree as a virtual `mcp-servers/`\n // folder. The servers live in the settings store, not the resources\n // table — the virtual ids carry the `mcp:<scope>:<id>` prefix that\n // `handleSelect` and `handleDelete` below recognize to route back to\n // the MCP endpoints.\n const personalTree = withAgentScratchFolder(\n withMcpServersFolder(\n personalTreeQuery.data ?? [],\n mcpServersQuery.data?.user ?? [],\n ),\n );\n const sharedTree = withMcpServersFolder(\n sharedTreeQuery.data ?? [],\n mcpServersQuery.data?.org ?? [],\n );\n\n const orgRole = mcpServersQuery.data?.role ?? org?.role ?? null;\n const hasOrgForMcp = !!(mcpServersQuery.data?.orgId ?? org?.orgId);\n const canCreateOrgMcp =\n hasOrgForMcp && (orgRole === \"owner\" || orgRole === \"admin\");\n\n // Virtual MCP server currently selected in the tree (or null for a real\n // resource / nothing). Resolved by scanning both trees' mcp folders for\n // a matching virtual id.\n const selectedMcpServer = React.useMemo(() => {\n const parsed = selectedResourceId\n ? parseMcpVirtualId(selectedResourceId)\n : null;\n if (!parsed) return null;\n const list =\n parsed.scope === \"user\"\n ? (mcpServersQuery.data?.user ?? [])\n : (mcpServersQuery.data?.org ?? []);\n return list.find((s) => s.id === parsed.serverId) ?? null;\n }, [selectedResourceId, mcpServersQuery.data]);\n\n // Sync activeScope once the org role arrives (canEditOrg is resolved async).\n useEffect(() => {\n if (!canEditOrg && activeScope === \"shared\") {\n setActiveScope(\"personal\");\n }\n }, [canEditOrg, activeScope]);\n // Virtual MCP ids aren't in the resources store — skip the fetch so\n // useResource doesn't 404-flash.\n const resourceQuery = useResource(\n selectedResourceId && !parseMcpVirtualId(selectedResourceId)\n ? selectedResourceId\n : null,\n );\n const createResource = useCreateResource();\n const updateResource = useUpdateResource();\n const deleteResource = useDeleteResource();\n const uploadResource = useUploadResource();\n\n // Ensure AGENTS.md exists in the organization scope when the panel opens.\n // The server also seeds it on table init; this is a safety net. Only attempt\n // for users who can write to organization resources — non-admins would just\n // get a 403.\n const seededRef = useRef(false);\n useEffect(() => {\n if (seededRef.current || !canEditOrg) return;\n seededRef.current = true;\n fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n path: \"AGENTS.md\",\n content: DEFAULT_AGENTS_MD_CLIENT,\n shared: true,\n ifNotExists: true,\n }),\n }).catch(() => {});\n }, [canEditOrg]);\n\n // Are we viewing a file (editor) or the tree?\n const isEditing = selectedResourceId !== null;\n const isMcpSelected = !!selectedMcpServer;\n\n const handleSelect = useCallback((resource: ResourceMeta) => {\n setSelectedResourceId(resource.id);\n }, []);\n\n const handleBack = useCallback(() => {\n setSelectedResourceId(null);\n }, []);\n\n const handleCreateFile = useCallback(\n (parentPath: string, name: string, scope: ResourceScope) => {\n const path = parentPath ? `${parentPath}/${name}` : name;\n createResource.mutate(\n { path, content: \"\", shared: scope === \"shared\" },\n {\n onSuccess: (data) => {\n setSelectedResourceId(data.id);\n },\n },\n );\n },\n [createResource],\n );\n\n const handleCreateFolder = useCallback(\n (parentPath: string, name: string, scope: ResourceScope) => {\n const path = parentPath ? `${parentPath}/${name}/.keep` : `${name}/.keep`;\n createResource.mutate({ path, content: \"\", shared: scope === \"shared\" });\n },\n [createResource],\n );\n\n const handleCreateFromToolbar = useCallback(\n (name: string) => {\n createResource.mutate(\n { path: name, content: \"\", shared: activeScope === \"shared\" },\n {\n onSuccess: (data) => {\n setSelectedResourceId(data.id);\n },\n },\n );\n },\n [createResource, activeScope],\n );\n\n const handleCreateResourceFromToolbar = useCallback(\n (path: string, content: string, mimeType?: string) => {\n createResource.mutate(\n { path, content, mimeType, shared: activeScope === \"shared\" },\n {\n onSuccess: (data) => {\n setSelectedResourceId(data.id);\n },\n },\n );\n },\n [activeScope, createResource],\n );\n\n const handleDelete = useCallback(\n (id: string) => {\n const mcp = parseMcpVirtualId(id);\n if (mcp) {\n deleteMcpServer.mutate(\n { id: mcp.serverId, scope: mcp.scope },\n {\n onSuccess: () => {\n if (selectedResourceId === id) setSelectedResourceId(null);\n },\n },\n );\n return;\n }\n deleteResource.mutate(id);\n if (selectedResourceId === id) {\n setSelectedResourceId(null);\n }\n },\n [deleteResource, deleteMcpServer, selectedResourceId],\n );\n\n const handleCreateMcpServer = useCallback(\n async (args: {\n scope: McpServerScope;\n name: string;\n url: string;\n headers?: Record<string, string>;\n description?: string;\n }) => {\n const server = await createMcpServer.mutateAsync(args);\n // Select the newly-created virtual entry so the detail view opens.\n setSelectedResourceId(`mcp:${args.scope}:${server.id}`);\n },\n [createMcpServer],\n );\n\n const handleRename = useCallback(\n (id: string, newPath: string) => {\n updateResource.mutate({ id, path: newPath });\n },\n [updateResource],\n );\n\n const handleSave = useCallback(\n (content: string) => {\n if (!selectedResourceId) return;\n updateResource.mutate({ id: selectedResourceId, content });\n },\n [updateResource, selectedResourceId],\n );\n\n const handleUploadFiles = useCallback(\n (files: FileList) => {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const formData = new FormData();\n formData.append(\"file\", file);\n formData.append(\"shared\", activeScope === \"shared\" ? \"true\" : \"false\");\n uploadResource.mutate(formData);\n }\n },\n [uploadResource, activeScope],\n );\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n if (e.dataTransfer.files.length > 0) {\n handleUploadFiles(e.dataTransfer.files);\n }\n },\n [handleUploadFiles],\n );\n\n return (\n <div\n className={cn(\n \"relative flex h-full flex-col min-h-0\",\n dragOver && \"ring-2 ring-inset ring-accent\",\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* Toolbar */}\n {isEditing ? (\n <div className=\"flex shrink-0 items-center justify-between border-b border-border px-2 py-1.5\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleBack}\n aria-label=\"Back to workspace\"\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconArrowLeft className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Back to workspace</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n {selectedMcpServer ? (\n <PathBreadcrumb\n path={`mcp-servers/${selectedMcpServer.name}.json`}\n />\n ) : resourceQuery.data ? (\n <PathBreadcrumb path={resourceQuery.data.path} />\n ) : null}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {!selectedMcpServer && resourceQuery.data && (\n <span\n aria-live=\"polite\"\n className=\"mr-1 w-16 text-right text-[11px] text-muted-foreground/60\"\n >\n {saveStatus === \"saving\"\n ? \"Saving...\"\n : saveStatus === \"saved\"\n ? \"Saved\"\n : \"\"}\n </span>\n )}\n {!selectedMcpServer &&\n resourceQuery.data &&\n (resourceQuery.data.mimeType === \"text/markdown\" ||\n resourceQuery.data.path.endsWith(\".md\")) && (\n <div className=\"flex items-center gap-0.5 mr-1\">\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setEditorView(\"visual\")}\n aria-label=\"Visual editor\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md\",\n editorView === \"visual\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n )}\n >\n <IconEye className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Visual editor</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setEditorView(\"code\")}\n aria-label=\"Code editor\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md\",\n editorView === \"code\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n )}\n >\n <IconCode className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Code editor</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n )}\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => {\n if (!selectedResourceId) return;\n if (toolbarDeleteConfirmId === selectedResourceId) {\n handleDelete(selectedResourceId);\n setToolbarDeleteConfirmId(null);\n } else {\n setToolbarDeleteConfirmId(selectedResourceId);\n }\n }}\n aria-label={\n toolbarDeleteConfirmId === selectedResourceId\n ? \"Confirm delete resource\"\n : \"Delete resource\"\n }\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-destructive hover:bg-accent/50\",\n toolbarDeleteConfirmId === selectedResourceId &&\n \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {toolbarDeleteConfirmId === selectedResourceId\n ? \"Click again to delete\"\n : \"Delete resource\"}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n </div>\n ) : (\n /* Floating action buttons — absolute top-right over tree view */\n <div className=\"absolute top-1 right-1 z-10 flex items-center gap-1\">\n <CreateMenu\n scope={activeScope}\n onCreateFile={handleCreateFromToolbar}\n onCreateResource={handleCreateResourceFromToolbar}\n onCreateMcpServer={handleCreateMcpServer}\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrgForMcp}\n />\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Upload file\"\n className=\"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconUpload className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Upload file</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <a\n href={WORKSPACE_DOCS_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"What is the Workspace? — open docs\"\n className=\"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconHelp className=\"h-3.5 w-3.5\" />\n </a>\n </TooltipTrigger>\n <TooltipContent>\n What is the Workspace? — open docs\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n if (e.target.files && e.target.files.length > 0) {\n handleUploadFiles(e.target.files);\n e.target.value = \"\";\n }\n }}\n />\n </div>\n )}\n\n {/* Content: either tree OR editor (single view) */}\n <div className=\"flex flex-1 flex-col min-h-0 overflow-hidden\">\n {isEditing ? (\n selectedMcpServer ? (\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n <McpServerDetail server={selectedMcpServer} />\n </div>\n ) : selectedResourceId && resourceQuery.data ? (\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n <ResourceEditor\n resource={resourceQuery.data}\n onSave={handleSave}\n view={editorView}\n onViewChange={setEditorView}\n onSaveStatusChange={setSaveStatus}\n hideToolbar\n />\n </div>\n ) : resourceQuery.isError ? (\n <div className=\"flex flex-1 items-center justify-center text-[12px] text-destructive/70\">\n Failed to load resource\n </div>\n ) : (\n <div className=\"flex flex-1 items-center justify-center text-[12px] text-muted-foreground/50\">\n Loading...\n </div>\n )\n ) : (\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {!personalTreeQuery.isLoading &&\n !sharedTreeQuery.isLoading &&\n (personalTreeQuery.data ?? []).length === 0 &&\n (sharedTreeQuery.data ?? []).length === 0 && (\n <div className=\"mx-2 mt-2 rounded-md border border-border bg-muted/30 p-2.5 text-[11px] text-muted-foreground\">\n <p className=\"mb-1 font-medium text-foreground\">\n This is your Workspace\n </p>\n <p className=\"mb-1.5 leading-snug\">\n Files the agent reads and writes — notes, instructions,\n skills, custom agents, scheduled jobs. They live in the\n database, so they persist across sessions and deploys.\n </p>\n <p className=\"mb-2 leading-snug\">\n <span className=\"text-foreground\">Personal</span> is just\n for you.{\" \"}\n <span className=\"text-foreground\">Organization</span> is\n visible to everyone in your organization\n {org?.orgId ? \" — only admins can edit.\" : \".\"}\n </p>\n <a\n href={WORKSPACE_DOCS_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-foreground hover:underline\"\n >\n Learn more\n <IconExternalLink className=\"h-3 w-3\" />\n </a>\n </div>\n )}\n <ResourceTree\n tree={personalTree}\n isLoading={personalTreeQuery.isLoading}\n deletingId={\n deleteResource.isPending\n ? (deleteResource.variables as string)\n : deleteMcpServer.isPending\n ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`\n : null\n }\n selectedId={selectedResourceId}\n onSelect={handleSelect}\n onCreateFile={(parentPath, name) =>\n handleCreateFile(parentPath, name, \"personal\")\n }\n onCreateFolder={(parentPath, name) =>\n handleCreateFolder(parentPath, name, \"personal\")\n }\n onDelete={handleDelete}\n onRename={handleRename}\n onDrop={handleUploadFiles}\n title=\"Personal\"\n titleTooltip=\"Files visible only to you\"\n />\n <ResourceTree\n tree={sharedTree}\n isLoading={sharedTreeQuery.isLoading}\n deletingId={\n deleteResource.isPending\n ? (deleteResource.variables as string)\n : deleteMcpServer.isPending\n ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`\n : null\n }\n selectedId={selectedResourceId}\n onSelect={handleSelect}\n onCreateFile={(parentPath, name) =>\n handleCreateFile(parentPath, name, \"shared\")\n }\n onCreateFolder={(parentPath, name) =>\n handleCreateFolder(parentPath, name, \"shared\")\n }\n onDelete={handleDelete}\n onRename={handleRename}\n onDrop={handleUploadFiles}\n title=\"Organization\"\n titleTooltip={\n canEditOrg\n ? \"Files visible to everyone in your organization\"\n : \"Files visible to everyone in your organization. Read-only — only admins can edit.\"\n }\n readOnly={!canEditOrg}\n headingHint={!canEditOrg ? \"Read only\" : undefined}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ResourcesPanel.js","sourceRoot":"","sources":["../../../src/client/resources/ResourcesPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport React, { useState, useRef, useCallback, useEffect } from \"react\";\nimport {\n IconPlus,\n IconUpload,\n IconArrowLeft,\n IconPencil,\n IconBulb,\n IconBolt,\n IconTrash,\n IconEye,\n IconCode,\n IconClock,\n IconMessageChatbot,\n IconBuildingSkyscraper,\n IconBrowser,\n IconExternalLink,\n IconLoader2,\n IconHelp,\n IconPlugConnected,\n IconCheck,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { PromptComposer } from \"../composer/PromptComposer.js\";\nimport { ResourceTree } from \"./ResourceTree.js\";\nimport { ResourceEditor } from \"./ResourceEditor.js\";\nimport { serializeFrontmatter } from \"../../resources/metadata.js\";\nimport {\n useResourceTree,\n useResource,\n useCreateResource,\n useUpdateResource,\n useDeleteResource,\n useUploadResource,\n withMcpServersFolder,\n withAgentScratchFolder,\n type ResourceScope,\n type ResourceMeta,\n} from \"./use-resources.js\";\nimport {\n formatMcpServerError,\n getMcpUrlValidationError,\n useMcpServers,\n useCreateMcpServer,\n useDeleteMcpServer,\n testMcpServerUrl,\n parseMcpVirtualId,\n type McpServerScope,\n} from \"./use-mcp-servers.js\";\nimport { McpServerDetail } from \"./McpServerDetail.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\n\nconst WORKSPACE_DOCS_URL = \"https://agent-native.com/docs/workspace\";\n\n// ─── Create Menu (unified + button) ────────────────────────────────────────\n\ntype CreateMenuView =\n | \"menu\"\n | \"file\"\n | \"skill\"\n | \"job\"\n | \"agent-mode\"\n | \"agent-prompt\"\n | \"agent-form\"\n | \"mcp-server\";\n\nconst AGENT_MODEL_OPTIONS = [\n { value: \"inherit\", label: \"Default model\" },\n { value: \"claude-sonnet-4-6\", label: \"Claude Sonnet 4.6\" },\n { value: \"claude-haiku-4-5-20251001\", label: \"Claude Haiku 4.5\" },\n] as const;\n\nfunction slugifyName(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"agent\"\n );\n}\n\nfunction buildAgentResourceContent({\n name,\n description,\n model,\n tools,\n body,\n}: {\n name: string;\n description: string;\n model: string;\n tools: string;\n body: string;\n}): string {\n const fields = [\n { key: \"name\", value: name },\n { key: \"description\", value: description },\n { key: \"model\", value: model },\n { key: \"tools\", value: tools },\n { key: \"delegate-default\", value: \"false\" },\n ];\n return serializeFrontmatter(fields) + body.trim() + \"\\n\";\n}\n\nfunction CreateMenu({\n scope,\n onCreateFile,\n onCreateResource,\n onCreateMcpServer,\n canCreateOrgMcp,\n hasOrg,\n onCreated,\n}: {\n scope: ResourceScope;\n onCreateFile: (name: string) => void;\n onCreateResource: (path: string, content: string, mimeType?: string) => void;\n onCreateMcpServer: (args: {\n scope: McpServerScope;\n name: string;\n url: string;\n headers?: Record<string, string>;\n description?: string;\n }) => Promise<void>;\n canCreateOrgMcp: boolean;\n hasOrg: boolean;\n onCreated?: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const [view, setView] = useState<CreateMenuView>(\"menu\");\n const [value, setValue] = useState(\"\");\n const [agentName, setAgentName] = useState(\"\");\n const [agentDescription, setAgentDescription] = useState(\"\");\n const [agentModel, setAgentModel] = useState<string>(\"inherit\");\n const [agentInstructions, setAgentInstructions] = useState(\n `# Role\\n\\nDefine how this agent should work.\\n\\n## Focus\\n\\n- What kinds of tasks it should handle\\n- What tone or approach it should use\\n- Important constraints or preferences\\n`,\n );\n const defaultMcpScope: McpServerScope =\n scope === \"shared\" && 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 inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (open) {\n setView(\"menu\");\n setValue(\"\");\n setAgentName(\"\");\n setAgentDescription(\"\");\n setAgentModel(\"inherit\");\n setAgentInstructions(\n `# Role\\n\\nDefine how this agent should work.\\n\\n## Focus\\n\\n- What kinds of tasks it should handle\\n- What tone or approach it should use\\n- Important constraints or preferences\\n`,\n );\n setMcpScope(defaultMcpScope);\n setMcpName(\"\");\n setMcpUrl(\"\");\n setMcpDescription(\"\");\n setMcpHeadersText(\"\");\n setMcpError(null);\n setMcpTestResult(null);\n setMcpBusy(false);\n }\n }, [open, defaultMcpScope]);\n\n useEffect(() => {\n if (view !== \"menu\" && view !== \"agent-form\") {\n setValue(\"\");\n if (view === \"mcp-server\") {\n setMcpError(null);\n setMcpTestResult(null);\n }\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 submitFile = () => {\n const trimmed = value.trim();\n if (trimmed) {\n onCreateFile(trimmed);\n setOpen(false);\n }\n };\n\n const submitSkill = (text: string = value) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n\n sendToAgentChat({\n message: `Create a skill: ${trimmed}`,\n newTab: true,\n context: `The user wants to create an agent skill. Their description: \"${trimmed}\"\n\nFollow the create-skill pattern to build this. Before writing:\n\n1. **Determine the skill name** — derive a hyphen-case name from the description (e.g. \"code review\" → \"code-review\")\n2. **Determine the skill type** — Pattern (architectural rule), Workflow (step-by-step), or Generator (scaffolding)\n3. **Write the skill** as a ${scope} resource at path \"skills/<name>/SKILL.md\" using resource-write\n\nThe skill file MUST have YAML frontmatter with name and description (under 40 words), then markdown with:\n- Clear rule/purpose statement\n- Why this skill exists\n- How to follow it (with code examples where helpful)\n- Common violations to avoid\n- Related skills\n\nTemplate for a Pattern skill:\n\\`\\`\\`markdown\n---\nname: <hyphen-case-name>\ndescription: >-\n <Under 40 words. When should this trigger?>\n---\n\n# <Skill Name>\n\n## Rule\n<One sentence: what must be true>\n\n## Why\n<Why this rule exists>\n\n## How\n<How to follow it, with code examples>\n\n## Don't\n<Common violations>\n\\`\\`\\`\n\nTemplate for a Workflow skill:\n\\`\\`\\`markdown\n---\nname: <hyphen-case-name>\ndescription: >-\n <Under 40 words. When should this trigger?>\n---\n\n# <Workflow Name>\n\n## Prerequisites\n<What must be in place>\n\n## Steps\n<Numbered steps with code examples>\n\n## Verification\n<How to confirm it worked>\n\\`\\`\\`\n\nAfter creating, update the shared AGENTS.md resource to reference the new skill in its skills table.\n\nKeep the skill concise (under 500 lines) and actionable.`,\n submit: true,\n });\n\n setOpen(false);\n onCreated?.();\n };\n\n const submitJob = (text: string = value) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n\n sendToAgentChat({\n message: `Create a recurring job: ${trimmed}`,\n newTab: true,\n context: `The user wants to create a recurring job. Their description: \"${trimmed}\"\n\nUse the manage-jobs tool with action \"create\" to create this. You need to:\n1. Derive a hyphen-case name from the description\n2. Convert the schedule to a cron expression (e.g., \"every weekday at 9am\" → \"0 9 * * 1-5\")\n3. Write clear, self-contained instructions for what the agent should do each time the job runs\n4. Create it in ${scope} scope\n\nThe job will run automatically on the schedule. Make the instructions specific — include which actions to call and what to do with results.`,\n submit: true,\n });\n\n setOpen(false);\n };\n\n const submitAgentPrompt = (text: string = value) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n\n sendToAgentChat({\n message: `Create a custom agent: ${trimmed}`,\n newTab: true,\n context: `The user wants a reusable custom sub-agent profile for the workspace. Their description: \"${trimmed}\"\n\nCreate it as a ${scope} resource under \"agents/<name>.md\" using resource-write.\n\nRequirements:\n1. Derive a hyphen-case file name from the intent\n2. Use YAML frontmatter with:\n - name\n - description\n - model (use \"inherit\" unless the request clearly needs a different model)\n - tools (set to \"inherit\")\n - delegate-default (set to false)\n3. Put the main operating instructions in the markdown body\n4. Keep it concise and directive, similar to a Claude Code-style custom agent\n\nTemplate:\n\\`\\`\\`markdown\n---\nname: Design\ndescription: >-\n Helps with product and interface design decisions.\nmodel: inherit\ntools: inherit\ndelegate-default: false\n---\n\n# Role\n\nYou are a focused design agent.\n\n## Responsibilities\n\n- ...\n\n## Approach\n\n- ...\n\\`\\`\\`\n\nThe result should be a reusable agent profile, not a one-off task response.`,\n submit: true,\n });\n\n setOpen(false);\n onCreated?.();\n };\n\n const submitAgentManual = () => {\n const trimmedName = agentName.trim();\n const trimmedDescription = agentDescription.trim();\n const trimmedInstructions = agentInstructions.trim();\n if (!trimmedName || !trimmedDescription || !trimmedInstructions) return;\n\n const slug = slugifyName(trimmedName);\n onCreateResource(\n `agents/${slug}.md`,\n buildAgentResourceContent({\n name: trimmedName,\n description: trimmedDescription,\n model: agentModel,\n tools: \"inherit\",\n body: trimmedInstructions,\n }),\n \"text/markdown\",\n );\n setOpen(false);\n onCreated?.();\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 value = trimmed.slice(idx + 1).trim();\n if (!key || !value) continue;\n out[key] = value;\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 onCreateMcpServer({\n scope: mcpScope,\n name,\n url,\n headers: parseHeaderLines(mcpHeadersText),\n description: mcpDescription.trim() || undefined,\n });\n setOpen(false);\n onCreated?.();\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 menuItems: {\n icon: React.ReactNode;\n label: string;\n desc: string;\n action: () => void;\n }[] = [\n {\n icon: <IconPlus className=\"h-3.5 w-3.5\" />,\n label: \"Create File\",\n desc: \"Add a new file at a path\",\n action: () => setView(\"file\"),\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: () => setView(\"skill\"),\n },\n {\n icon: <IconClock className=\"h-3.5 w-3.5\" />,\n label: \"Scheduled Task\",\n desc: \"Run something on a schedule\",\n action: () => setView(\"job\"),\n },\n {\n icon: <IconMessageChatbot className=\"h-3.5 w-3.5\" />,\n label: \"Create Custom Agent\",\n desc: \"Add a reusable sub-agent profile\",\n action: () => setView(\"agent-mode\"),\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 setOpen(false);\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:set-mode\", {\n detail: { mode: \"chat\" },\n }),\n );\n sendToAgentChat({\n message:\n \"Help me create a new automation. Ask me what I want to automate.\",\n context: `The user wants to create a new automation. Scope: personal. Use manage-automations with action=define to create it. Ask clarifying questions if needed about what event to trigger on, conditions, and what actions to take.`,\n submit: true,\n newTab: true,\n });\n onCreated?.();\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 return (\n <Popover open={open} onOpenChange={setOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n open && \"bg-accent/50 text-foreground\",\n )}\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Create new...</TooltipContent>\n </Tooltip>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n collisionPadding={8}\n className={cn(\n \"z-[260] p-0 text-[13px] leading-normal\",\n view === \"menu\" || view === \"file\"\n ? \"w-[260px]\"\n : \"max-h-[70vh] w-[calc(100vw-24px)] max-w-[380px] overflow-y-auto\",\n )}\n >\n {view === \"menu\" && (\n <div className=\"py-1\">\n {menuItems.map((item) => (\n <button\n key={item.label}\n onClick={item.action}\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\">{item.icon}</span>\n <div className=\"min-w-0\">\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 </button>\n ))}\n </div>\n )}\n\n {view === \"file\" && (\n <div className=\"p-3\">\n <label className=\"mb-1.5 block text-[11px] font-medium text-muted-foreground\">\n File path\n </label>\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitFile();\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setView(\"menu\");\n }\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=\"notes/ideas.md\"\n />\n <div className=\"mt-2.5 flex justify-end\">\n <button\n onClick={submitFile}\n disabled={!value.trim()}\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 Create\n </button>\n </div>\n </div>\n )}\n\n {view === \"skill\" && (\n <div className=\"p-3\">\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Create Skill\n </label>\n <p className=\"mb-2 text-[10px] text-muted-foreground/60 leading-relaxed\">\n Describe what kind of skill you want and the agent will create it.\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"e.g. A skill that reviews PRs for security issues and OWASP top 10 vulnerabilities\"\n draftScope=\"resources:create-skill\"\n onSubmit={(text) => submitSkill(text)}\n />\n </div>\n )}\n\n {view === \"job\" && (\n <div className=\"p-3\">\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Scheduled Task\n </label>\n <p className=\"mb-2 text-[10px] text-muted-foreground/60 leading-relaxed\">\n Describe what should happen and when.\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"e.g. Every weekday at 9am, check for overdue scorecards and send a Slack update\"\n draftScope=\"resources:create-job\"\n onSubmit={(text) => submitJob(text)}\n />\n </div>\n )}\n\n {view === \"agent-mode\" && (\n <div className=\"p-3\">\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Create Agent\n </label>\n <p className=\"mb-2 text-[10px] leading-relaxed text-muted-foreground/60\">\n Build a reusable sub-agent profile for this workspace.\n </p>\n <div className=\"space-y-2\">\n <button\n onClick={() => setView(\"agent-prompt\")}\n className=\"flex w-full items-start gap-2 rounded-md border border-border px-3 py-2 text-left hover:bg-accent/40\"\n >\n <IconPencil className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <div>\n <div className=\"text-[12px] font-medium text-foreground\">\n Describe It\n </div>\n <div className=\"text-[10px] text-muted-foreground/60\">\n Let the agent draft the profile from a prompt.\n </div>\n </div>\n </button>\n <button\n onClick={() => setView(\"agent-form\")}\n className=\"flex w-full items-start gap-2 rounded-md border border-border px-3 py-2 text-left hover:bg-accent/40\"\n >\n <IconMessageChatbot className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <div>\n <div className=\"text-[12px] font-medium text-foreground\">\n Fill Form\n </div>\n <div className=\"text-[10px] text-muted-foreground/60\">\n Set the fields manually and start with a markdown template.\n </div>\n </div>\n </button>\n </div>\n </div>\n )}\n\n {view === \"agent-prompt\" && (\n <div className=\"p-3\">\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Create Agent From Prompt\n </label>\n <p className=\"mb-2 text-[10px] text-muted-foreground/60 leading-relaxed\">\n Describe the agent you want. It will be saved under{\" \"}\n <code>agents/</code>.\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"e.g. A design agent that critiques layouts, suggests UI direction, and prefers concise product reasoning\"\n draftScope=\"resources:create-agent\"\n onSubmit={(text) => submitAgentPrompt(text)}\n />\n </div>\n )}\n\n {view === \"agent-form\" && (\n <div className=\"p-3\">\n <label className=\"mb-2 block text-[11px] font-semibold text-foreground\">\n Create Agent Manually\n </label>\n <div className=\"space-y-2\">\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\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=\"Agent name\"\n />\n <input\n value={agentDescription}\n onChange={(e) => setAgentDescription(e.target.value)}\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=\"Short description\"\n />\n <label className=\"block text-[11px] font-medium text-muted-foreground\">\n Model\n </label>\n <select\n value={agentModel}\n onChange={(e) => setAgentModel(e.target.value)}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none focus:ring-1 focus:ring-accent\"\n >\n {AGENT_MODEL_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <label className=\"block text-[11px] font-medium text-muted-foreground\">\n Instructions\n </label>\n <textarea\n value={agentInstructions}\n onChange={(e) => setAgentInstructions(e.target.value)}\n rows={8}\n className=\"w-full resize-y 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 style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n lineHeight: 1.5,\n }}\n />\n </div>\n <div className=\"mt-2.5 flex justify-end\">\n <button\n onClick={submitAgentManual}\n disabled={\n !agentName.trim() ||\n !agentDescription.trim() ||\n !agentInstructions.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 Create\n </button>\n </div>\n </div>\n )}\n\n {view === \"mcp-server\" && (\n <div className=\"p-3\">\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 (Zapier, Cloudflare,\n internal tools). Its tools become available to the agent. Use\n Personal for private or staging servers; use Organization only for\n vetted servers the whole org should share.{\" \"}\n <a\n href=\"https://agent-native.com/docs/mcp-clients#remote-via-ui\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-0.5 text-muted-foreground/80 underline hover:text-foreground\"\n >\n Learn more\n <IconExternalLink className=\"inline h-2.5 w-2.5\" />\n </a>\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 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// ─── PathBreadcrumb ─────────────────────────────────────────────────────────\n\nfunction PathBreadcrumb({ path }: { path: string }) {\n const parts = path.split(\"/\").filter(Boolean);\n return (\n <div className=\"flex items-center gap-0.5 text-[11px] text-muted-foreground/60 overflow-hidden\">\n {parts.map((part, i) => (\n <React.Fragment key={i}>\n {i > 0 && <span className=\"shrink-0\">/</span>}\n <span\n className={cn(\n \"truncate\",\n i === parts.length - 1 && \"text-muted-foreground\",\n )}\n >\n {part}\n </span>\n </React.Fragment>\n ))}\n </div>\n );\n}\n\n// ─── ResourcesPanel ─────────────────────────────────────────────────────────\n\nconst DEFAULT_AGENTS_MD_CLIENT = `# Agent Instructions\n\nThis file customizes how the AI agent behaves in this app. Edit it to add your own instructions, preferences, and context.\n\n## What to put here\n\n- **Preferences** — Tone, style, verbosity, response format\n- **Context** — Domain knowledge, terminology, team conventions\n- **Rules** — Things the agent should always/never do\n- **Skills** — Reference skill files for specialized tasks (create them in the \\`skills/\\` folder)\n\n## Skills\n\nCreate skill files under \\`skills/<name>/SKILL.md\\` to give the agent specialized knowledge. Reference them here:\n\n| Skill | Path | Description |\n|-------|------|-------------|\n| *(use the skill button to create one)* | \\`skills/example/SKILL.md\\` | |\n`;\n\n// BuilderBrowserCard moved to settings/BrowserSection.tsx\n\nexport function ResourcesPanel() {\n const { data: org } = useOrg();\n // Non-admin org members get read-only access to organization resources.\n // Solo deployments (no orgId) behave as owner — users can edit their own.\n const canEditOrg =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n\n const [activeScope, setActiveScope] = useState<ResourceScope>(\n canEditOrg ? \"shared\" : \"personal\",\n );\n const [selectedResourceId, setSelectedResourceId] = useState<string | null>(\n null,\n );\n const [toolbarDeleteConfirmId, setToolbarDeleteConfirmId] = useState<\n string | null\n >(null);\n const [dragOver, setDragOver] = useState(false);\n const [editorView, setEditorView] = useState<\"visual\" | \"code\">(() => {\n try {\n const v = localStorage.getItem(\"resource-editor-view\");\n if (v === \"code\") return \"code\";\n } catch {}\n return \"visual\";\n });\n\n useEffect(() => {\n setToolbarDeleteConfirmId(null);\n }, [selectedResourceId]);\n const [saveStatus, setSaveStatus] = useState<\"idle\" | \"saving\" | \"saved\">(\n \"idle\",\n );\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const sharedTreeQuery = useResourceTree(\"shared\");\n const personalTreeQuery = useResourceTree(\"personal\");\n const mcpServersQuery = useMcpServers();\n const createMcpServer = useCreateMcpServer();\n const deleteMcpServer = useDeleteMcpServer();\n\n // Merge MCP servers into each scope's tree as a virtual `mcp-servers/`\n // folder. The servers live in the settings store, not the resources\n // table — the virtual ids carry the `mcp:<scope>:<id>` prefix that\n // `handleSelect` and `handleDelete` below recognize to route back to\n // the MCP endpoints.\n const personalTree = withAgentScratchFolder(\n withMcpServersFolder(\n personalTreeQuery.data ?? [],\n mcpServersQuery.data?.user ?? [],\n ),\n );\n const sharedTree = withMcpServersFolder(\n sharedTreeQuery.data ?? [],\n mcpServersQuery.data?.org ?? [],\n );\n\n const orgRole = mcpServersQuery.data?.role ?? org?.role ?? null;\n const hasOrgForMcp = !!(mcpServersQuery.data?.orgId ?? org?.orgId);\n const canCreateOrgMcp =\n hasOrgForMcp && (orgRole === \"owner\" || orgRole === \"admin\");\n\n // Virtual MCP server currently selected in the tree (or null for a real\n // resource / nothing). Resolved by scanning both trees' mcp folders for\n // a matching virtual id.\n const selectedMcpServer = React.useMemo(() => {\n const parsed = selectedResourceId\n ? parseMcpVirtualId(selectedResourceId)\n : null;\n if (!parsed) return null;\n const list =\n parsed.scope === \"user\"\n ? (mcpServersQuery.data?.user ?? [])\n : (mcpServersQuery.data?.org ?? []);\n return list.find((s) => s.id === parsed.serverId) ?? null;\n }, [selectedResourceId, mcpServersQuery.data]);\n\n // Sync activeScope once the org role arrives (canEditOrg is resolved async).\n useEffect(() => {\n if (!canEditOrg && activeScope === \"shared\") {\n setActiveScope(\"personal\");\n }\n }, [canEditOrg, activeScope]);\n // Virtual MCP ids aren't in the resources store — skip the fetch so\n // useResource doesn't 404-flash.\n const resourceQuery = useResource(\n selectedResourceId && !parseMcpVirtualId(selectedResourceId)\n ? selectedResourceId\n : null,\n );\n const createResource = useCreateResource();\n const updateResource = useUpdateResource();\n const deleteResource = useDeleteResource();\n const uploadResource = useUploadResource();\n\n // Ensure AGENTS.md exists in the organization scope when the panel opens.\n // The server also seeds it on table init; this is a safety net. Only attempt\n // for users who can write to organization resources — non-admins would just\n // get a 403.\n const seededRef = useRef(false);\n useEffect(() => {\n if (seededRef.current || !canEditOrg) return;\n seededRef.current = true;\n fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n path: \"AGENTS.md\",\n content: DEFAULT_AGENTS_MD_CLIENT,\n shared: true,\n ifNotExists: true,\n }),\n }).catch(() => {});\n }, [canEditOrg]);\n\n // Are we viewing a file (editor) or the tree?\n const isEditing = selectedResourceId !== null;\n const isMcpSelected = !!selectedMcpServer;\n\n const handleSelect = useCallback((resource: ResourceMeta) => {\n setSelectedResourceId(resource.id);\n }, []);\n\n const handleBack = useCallback(() => {\n setSelectedResourceId(null);\n }, []);\n\n const handleCreateFile = useCallback(\n (parentPath: string, name: string, scope: ResourceScope) => {\n const path = parentPath ? `${parentPath}/${name}` : name;\n createResource.mutate(\n { path, content: \"\", shared: scope === \"shared\" },\n {\n onSuccess: (data) => {\n setSelectedResourceId(data.id);\n },\n },\n );\n },\n [createResource],\n );\n\n const handleCreateFolder = useCallback(\n (parentPath: string, name: string, scope: ResourceScope) => {\n const path = parentPath ? `${parentPath}/${name}/.keep` : `${name}/.keep`;\n createResource.mutate({ path, content: \"\", shared: scope === \"shared\" });\n },\n [createResource],\n );\n\n const handleCreateFromToolbar = useCallback(\n (name: string) => {\n createResource.mutate(\n { path: name, content: \"\", shared: activeScope === \"shared\" },\n {\n onSuccess: (data) => {\n setSelectedResourceId(data.id);\n },\n },\n );\n },\n [createResource, activeScope],\n );\n\n const handleCreateResourceFromToolbar = useCallback(\n (path: string, content: string, mimeType?: string) => {\n createResource.mutate(\n { path, content, mimeType, shared: activeScope === \"shared\" },\n {\n onSuccess: (data) => {\n setSelectedResourceId(data.id);\n },\n },\n );\n },\n [activeScope, createResource],\n );\n\n const handleDelete = useCallback(\n (id: string) => {\n const mcp = parseMcpVirtualId(id);\n if (mcp) {\n deleteMcpServer.mutate(\n { id: mcp.serverId, scope: mcp.scope },\n {\n onSuccess: () => {\n if (selectedResourceId === id) setSelectedResourceId(null);\n },\n },\n );\n return;\n }\n deleteResource.mutate(id);\n if (selectedResourceId === id) {\n setSelectedResourceId(null);\n }\n },\n [deleteResource, deleteMcpServer, selectedResourceId],\n );\n\n const handleCreateMcpServer = useCallback(\n async (args: {\n scope: McpServerScope;\n name: string;\n url: string;\n headers?: Record<string, string>;\n description?: string;\n }) => {\n const server = await createMcpServer.mutateAsync(args);\n // Select the newly-created virtual entry so the detail view opens.\n setSelectedResourceId(`mcp:${args.scope}:${server.id}`);\n },\n [createMcpServer],\n );\n\n const handleRename = useCallback(\n (id: string, newPath: string) => {\n updateResource.mutate({ id, path: newPath });\n },\n [updateResource],\n );\n\n const handleSave = useCallback(\n (content: string) => {\n if (!selectedResourceId) return;\n updateResource.mutate({ id: selectedResourceId, content });\n },\n [updateResource, selectedResourceId],\n );\n\n const handleUploadFiles = useCallback(\n (files: FileList) => {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const formData = new FormData();\n formData.append(\"file\", file);\n formData.append(\"shared\", activeScope === \"shared\" ? \"true\" : \"false\");\n uploadResource.mutate(formData);\n }\n },\n [uploadResource, activeScope],\n );\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n if (e.dataTransfer.files.length > 0) {\n handleUploadFiles(e.dataTransfer.files);\n }\n },\n [handleUploadFiles],\n );\n\n return (\n <div\n className={cn(\n \"relative flex h-full flex-col min-h-0\",\n dragOver && \"ring-2 ring-inset ring-accent\",\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* Toolbar */}\n {isEditing ? (\n <div className=\"flex shrink-0 items-center justify-between border-b border-border px-2 py-1.5\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleBack}\n aria-label=\"Back to workspace\"\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconArrowLeft className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Back to workspace</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n {selectedMcpServer ? (\n <PathBreadcrumb\n path={`mcp-servers/${selectedMcpServer.name}.json`}\n />\n ) : resourceQuery.data ? (\n <PathBreadcrumb path={resourceQuery.data.path} />\n ) : null}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {!selectedMcpServer && resourceQuery.data && (\n <span\n aria-live=\"polite\"\n className=\"mr-1 w-16 text-right text-[11px] text-muted-foreground/60\"\n >\n {saveStatus === \"saving\"\n ? \"Saving...\"\n : saveStatus === \"saved\"\n ? \"Saved\"\n : \"\"}\n </span>\n )}\n {!selectedMcpServer &&\n resourceQuery.data &&\n (resourceQuery.data.mimeType === \"text/markdown\" ||\n resourceQuery.data.path.endsWith(\".md\")) && (\n <div className=\"flex items-center gap-0.5 mr-1\">\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setEditorView(\"visual\")}\n aria-label=\"Visual editor\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md\",\n editorView === \"visual\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n )}\n >\n <IconEye className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Visual editor</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setEditorView(\"code\")}\n aria-label=\"Code editor\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md\",\n editorView === \"code\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n )}\n >\n <IconCode className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Code editor</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n )}\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => {\n if (!selectedResourceId) return;\n if (toolbarDeleteConfirmId === selectedResourceId) {\n handleDelete(selectedResourceId);\n setToolbarDeleteConfirmId(null);\n } else {\n setToolbarDeleteConfirmId(selectedResourceId);\n }\n }}\n aria-label={\n toolbarDeleteConfirmId === selectedResourceId\n ? \"Confirm delete resource\"\n : \"Delete resource\"\n }\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-destructive hover:bg-accent/50\",\n toolbarDeleteConfirmId === selectedResourceId &&\n \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {toolbarDeleteConfirmId === selectedResourceId\n ? \"Click again to delete\"\n : \"Delete resource\"}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n </div>\n ) : (\n /* Floating action buttons — absolute top-right over tree view */\n <div className=\"absolute top-1 right-1 z-10 flex items-center gap-1\">\n <CreateMenu\n scope={activeScope}\n onCreateFile={handleCreateFromToolbar}\n onCreateResource={handleCreateResourceFromToolbar}\n onCreateMcpServer={handleCreateMcpServer}\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrgForMcp}\n />\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Upload file\"\n className=\"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconUpload className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Upload file</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <a\n href={WORKSPACE_DOCS_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Open Workspace docs\"\n className=\"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconHelp className=\"h-3.5 w-3.5\" />\n </a>\n </TooltipTrigger>\n <TooltipContent side=\"left\" sideOffset={8}>\n Open Workspace docs\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n if (e.target.files && e.target.files.length > 0) {\n handleUploadFiles(e.target.files);\n e.target.value = \"\";\n }\n }}\n />\n </div>\n )}\n\n {/* Content: either tree OR editor (single view) */}\n <div className=\"flex flex-1 flex-col min-h-0 overflow-hidden\">\n {isEditing ? (\n selectedMcpServer ? (\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n <McpServerDetail server={selectedMcpServer} />\n </div>\n ) : selectedResourceId && resourceQuery.data ? (\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n <ResourceEditor\n resource={resourceQuery.data}\n onSave={handleSave}\n view={editorView}\n onViewChange={setEditorView}\n onSaveStatusChange={setSaveStatus}\n hideToolbar\n />\n </div>\n ) : resourceQuery.isError ? (\n <div className=\"flex flex-1 items-center justify-center text-[12px] text-destructive/70\">\n Failed to load resource\n </div>\n ) : (\n <div className=\"flex flex-1 items-center justify-center text-[12px] text-muted-foreground/50\">\n Loading...\n </div>\n )\n ) : (\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {!personalTreeQuery.isLoading &&\n !sharedTreeQuery.isLoading &&\n (personalTreeQuery.data ?? []).length === 0 &&\n (sharedTreeQuery.data ?? []).length === 0 && (\n <div className=\"mx-2 mt-2 rounded-md border border-border bg-muted/30 p-2.5 text-[11px] text-muted-foreground\">\n <p className=\"mb-1 font-medium text-foreground\">\n This is your Workspace\n </p>\n <p className=\"mb-1.5 leading-snug\">\n Files the agent reads and writes — notes, instructions,\n skills, custom agents, scheduled jobs. They live in the\n database, so they persist across sessions and deploys.\n </p>\n <p className=\"mb-2 leading-snug\">\n <span className=\"text-foreground\">Personal</span> is just\n for you.{\" \"}\n <span className=\"text-foreground\">Organization</span> is\n visible to everyone in your organization\n {org?.orgId ? \" — only admins can edit.\" : \".\"}\n </p>\n <a\n href={WORKSPACE_DOCS_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-foreground hover:underline\"\n >\n Learn more\n <IconExternalLink className=\"h-3 w-3\" />\n </a>\n </div>\n )}\n <ResourceTree\n tree={personalTree}\n isLoading={personalTreeQuery.isLoading}\n deletingId={\n deleteResource.isPending\n ? (deleteResource.variables as string)\n : deleteMcpServer.isPending\n ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`\n : null\n }\n selectedId={selectedResourceId}\n onSelect={handleSelect}\n onCreateFile={(parentPath, name) =>\n handleCreateFile(parentPath, name, \"personal\")\n }\n onCreateFolder={(parentPath, name) =>\n handleCreateFolder(parentPath, name, \"personal\")\n }\n onDelete={handleDelete}\n onRename={handleRename}\n onDrop={handleUploadFiles}\n title=\"Personal\"\n titleTooltip=\"Files visible only to you\"\n />\n <ResourceTree\n tree={sharedTree}\n isLoading={sharedTreeQuery.isLoading}\n deletingId={\n deleteResource.isPending\n ? (deleteResource.variables as string)\n : deleteMcpServer.isPending\n ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`\n : null\n }\n selectedId={selectedResourceId}\n onSelect={handleSelect}\n onCreateFile={(parentPath, name) =>\n handleCreateFile(parentPath, name, \"shared\")\n }\n onCreateFolder={(parentPath, name) =>\n handleCreateFolder(parentPath, name, \"shared\")\n }\n onDelete={handleDelete}\n onRename={handleRename}\n onDrop={handleUploadFiles}\n title=\"Organization\"\n titleTooltip={\n canEditOrg\n ? \"Files visible to everyone in your organization\"\n : \"Files visible to everyone in your organization. Read-only — only admins can edit.\"\n }\n readOnly={!canEditOrg}\n headingHint={!canEditOrg ? \"Read only\" : undefined}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useBuilderStatus.d.ts","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB;;;;EA4C/B;AAkBD,MAAM,WAAW,yBAAyB;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;;;;;OAOG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oFAAoF;IACpF,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAcD,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,yBAA8B,GACnC,kBAAkB,CAoOpB"}
1
+ {"version":3,"file":"useBuilderStatus.d.ts","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB;;;;EA4C/B;AAkBD,MAAM,WAAW,yBAAyB;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;;;;;OAOG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oFAAoF;IACpF,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAcD,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,yBAA8B,GACnC,kBAAkB,CAwOpB"}
@@ -171,11 +171,13 @@ export function useBuilderConnectFlow(opts = {}) {
171
171
  popupUrl ??
172
172
  new URL(agentNativePath("/_agent-native/builder/connect"), origin).href;
173
173
  try {
174
- window.open(url, "_blank", "noopener,noreferrer");
174
+ const opened = window.open(url, "_blank", "noopener,noreferrer");
175
+ if (!opened) {
176
+ setError("Popup blocked. Allow popups, then click Connect Builder again.");
177
+ }
175
178
  }
176
179
  catch {
177
- // Fall through polling still detects completion if the user
178
- // opens the URL themselves.
180
+ setError("Couldn't open Builder. Allow popups and try again.");
179
181
  }
180
182
  const started = Date.now();
181
183
  pollRef.current = setInterval(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useBuilderStatus.js","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { getCallbackOrigin } from \"../frame.js\";\n\nexport interface BuilderStatus {\n configured: boolean;\n builderEnabled: boolean;\n /**\n * True when `BUILDER_PRIVATE_KEY` is set at the deploy level. This is a\n * fallback credential; per-user/org Builder connections are still allowed\n * and take precedence for that request.\n */\n envManaged?: boolean;\n credentialSource?: \"user\" | \"org\" | \"env\";\n connectUrl: string;\n appHost: string;\n apiHost: string;\n branchProjectIdConfigured?: boolean;\n branchProjectId?: string;\n publicKeyConfigured: boolean;\n privateKeyConfigured: boolean;\n userId?: string;\n orgName?: string;\n orgKind?: string;\n /**\n * Set when the OAuth callback ran but failed to persist credentials.\n * Surfaced as a one-shot row by the server so the connect-flow polling\n * can stop with a clear message instead of timing out at 5min.\n */\n connectError?: { message: string; at: number };\n}\n\n/**\n * Fetches Builder connection status from /_agent-native/builder/status.\n * Re-fetches on window focus to detect post-redirect state changes.\n */\nexport function useBuilderStatus() {\n const [status, setStatus] = useState<BuilderStatus | null>(null);\n const [loading, setLoading] = useState(true);\n\n const fetchStatus = useCallback(async () => {\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/builder/status\"));\n if (!res.ok) {\n setStatus(null);\n return;\n }\n setStatus(await res.json());\n } catch {\n setStatus(null);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchStatus();\n\n function onFocus() {\n fetchStatus();\n }\n function onVisibility() {\n if (document.visibilityState === \"visible\") fetchStatus();\n }\n window.addEventListener(\"focus\", onFocus);\n document.addEventListener(\"visibilitychange\", onVisibility);\n // Engine connect/disconnect actions (e.g. the Builder disconnect button)\n // dispatch this event so dependent cards refresh without a full reload.\n window.addEventListener(\"agent-engine:configured-changed\", fetchStatus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n fetchStatus,\n );\n };\n }, [fetchStatus]);\n\n return { status, loading, refetch: fetchStatus };\n}\n\n// ─── useBuilderConnectFlow ──────────────────────────────────────────────────\n//\n// Shared state machine for the \"open Builder CLI-auth popup + poll\n// /builder/status until credentials land\" interaction. Replaces three\n// near-duplicate inline implementations: `BuilderCliAuthMethod` in\n// OnboardingPanel, `ConnectBuilderCard`, and `BuilderConnectCta` in\n// AssistantChat. Each consumer supplies its own popup URL / completion\n// behavior; the hook owns the polling + timeout + focus refresh.\n//\n// `popupUrl` is what we pass to `window.open`. The default\n// `/_agent-native/builder/connect` is a server-side 302 to the real\n// cli-auth URL — using it keeps the click handler synchronous so popup\n// blockers don't downgrade the open to same-tab navigation. Pass an\n// explicit `popupUrl` (e.g. the already-computed cli-auth URL) if your\n// caller already has it in hand.\n\nexport interface BuilderConnectFlowOptions {\n /** URL to synchronously open on start(). Defaults to the 302 shortcut. */\n popupUrl?: string;\n /** Invoked after the status poll first sees `configured: true`. */\n onConnected?: (state: { orgName: string | null }) => void | Promise<void>;\n}\n\nexport interface BuilderConnectFlow {\n configured: boolean;\n /**\n * True when the deploy has BUILDER_PRIVATE_KEY set as a fallback. Connect\n * is still available so users can override the fallback with their own\n * Builder account.\n */\n envManaged: boolean;\n /**\n * True when the server has a Builder branch project configured for this\n * request. When false, the card surfaces a waitlist CTA instead of a Send\n * button.\n */\n builderEnabled: boolean;\n orgName: string | null;\n connecting: boolean;\n error: string | null;\n /**\n * True once the first `/builder/status` fetch has completed (successfully\n * or not). Consumers that accept an `initialConfigured` prop (e.g. agent\n * tool-call results rendered with server-side state) should treat\n * `configured`/`orgName` as authoritative only once this flips true —\n * otherwise the hook's starting `false` defaults would cause a flash\n * back to \"Connect Builder\" on first paint.\n */\n hasFetchedStatus: boolean;\n /** Open the popup and begin polling. Must be called from a user-gesture handler. */\n start: () => void;\n}\n\nconst POLL_INTERVAL_MS = 2000;\nconst POLL_TIMEOUT_MS = 5 * 60 * 1000;\n\nfunction notifyAgentEngineConfiguredChanged(source: string) {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(\"agent-engine:configured-changed\", {\n detail: { source },\n }),\n );\n}\n\nexport function useBuilderConnectFlow(\n opts: BuilderConnectFlowOptions = {},\n): BuilderConnectFlow {\n const { popupUrl, onConnected } = opts;\n const [configured, setConfigured] = useState(false);\n const [envManaged, setEnvManaged] = useState(false);\n const [builderEnabled, setBuilderEnabled] = useState(false);\n const [orgName, setOrgName] = useState<string | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasFetchedStatus, setHasFetchedStatus] = useState(false);\n const [statusConnectUrl, setStatusConnectUrl] = useState<string | null>(null);\n // When statusConnectUrl was last fetched. The server signs the embedded\n // _an_connect token with a 10-minute TTL; using an older URL silently\n // fails the same-origin check on the popup side. Track freshness so\n // start() can fall back to the bare /builder/connect path when stale.\n const statusConnectUrlAtRef = useRef<number | null>(null);\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const mountedRef = useRef(true);\n const notifiedConnectedRef = useRef(false);\n // Keep onConnected in a ref so start() doesn't need to re-create when the\n // caller passes an inline arrow function.\n const onConnectedRef = useRef(onConnected);\n onConnectedRef.current = onConnected;\n\n const stopPoll = useCallback(() => {\n if (pollRef.current) {\n clearInterval(pollRef.current);\n pollRef.current = null;\n }\n }, []);\n\n const fetchStatus = useCallback(async () => {\n const origin = getCallbackOrigin() || window.location.origin;\n try {\n const r = await fetch(\n new URL(agentNativePath(\"/_agent-native/builder/status\"), origin).href,\n );\n if (!r.ok) return null;\n return (await r.json()) as {\n configured: boolean;\n envManaged?: boolean;\n builderEnabled?: boolean;\n orgName?: string | null;\n connectUrl?: string;\n credentialSource?: \"user\" | \"org\" | \"env\";\n connectError?: { message: string; at: number };\n };\n } catch {\n return null;\n }\n }, []);\n\n // Initial fetch + focus/visibility refresh so if the user completed the\n // flow in another tab (or a downgraded same-tab nav) we notice it. Also\n // listen for `agent-engine:configured-changed` so a Disconnect click in\n // Settings propagates to any connect-CTA cards rendered elsewhere in\n // the app without waiting for the next focus event.\n useEffect(() => {\n mountedRef.current = true;\n let cancelled = false;\n const refresh = async () => {\n const s = await fetchStatus();\n if (cancelled || !mountedRef.current) return;\n // Flip `hasFetchedStatus` even when the fetch failed — the caller's\n // \"use initial props until the hook has an answer\" pattern wants to\n // stop waiting after we've tried, regardless of network outcome.\n setHasFetchedStatus(true);\n if (!s) return;\n setConfigured(!!s.configured);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n setStatusConnectUrl(s.connectUrl ?? null);\n statusConnectUrlAtRef.current = s.connectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n if (s.configured && !notifiedConnectedRef.current) {\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-status\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // The caller's callback is a UI convenience; status is already set.\n }\n } else if (!s.configured) {\n notifiedConnectedRef.current = false;\n }\n };\n refresh();\n const onVisible = () => {\n if (document.visibilityState === \"visible\") refresh();\n };\n window.addEventListener(\"focus\", refresh);\n document.addEventListener(\"visibilitychange\", onVisible);\n window.addEventListener(\"agent-engine:configured-changed\", refresh);\n return () => {\n cancelled = true;\n mountedRef.current = false;\n window.removeEventListener(\"focus\", refresh);\n document.removeEventListener(\"visibilitychange\", onVisible);\n window.removeEventListener(\"agent-engine:configured-changed\", refresh);\n stopPoll();\n };\n }, [fetchStatus, stopPoll]);\n\n const start = useCallback(() => {\n stopPoll();\n setConnecting(true);\n setError(null);\n\n // Open SYNCHRONOUSLY inside the caller's click handler — any await\n // before window.open lets the user-gesture token expire, which causes\n // popup blockers to block entirely or fall back to same-tab navigation.\n const origin = getCallbackOrigin() || window.location.origin;\n // The signed _an_connect token in statusConnectUrl has a 10-minute TTL.\n // If the panel has been open longer than that the token is dead and the\n // popup will silently 403; drop the cached URL and let the bare /connect\n // route do the same-origin Sec-Fetch-Site check instead.\n const STATUS_CONNECT_URL_TTL_MS = 9 * 60 * 1000;\n const cachedAt = statusConnectUrlAtRef.current;\n const cachedFresh =\n typeof cachedAt === \"number\" &&\n Date.now() - cachedAt < STATUS_CONNECT_URL_TTL_MS;\n const url =\n (cachedFresh ? statusConnectUrl : null) ??\n popupUrl ??\n new URL(agentNativePath(\"/_agent-native/builder/connect\"), origin).href;\n try {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n } catch {\n // Fall through — polling still detects completion if the user\n // opens the URL themselves.\n }\n\n const started = Date.now();\n pollRef.current = setInterval(async () => {\n const s = await fetchStatus();\n if (!mountedRef.current) {\n stopPoll();\n return;\n }\n if (s?.configured) {\n stopPoll();\n setConfigured(true);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n setStatusConnectUrl(s.connectUrl ?? null);\n statusConnectUrlAtRef.current = s.connectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n setConnecting(false);\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-connect\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // Consumer's callback failed; we've already flipped the UI state\n // to connected. Swallow so we don't re-arm the flow.\n }\n } else if (s?.connectError?.message) {\n // OAuth callback ran but writeBuilderCredentials threw — surface the\n // real error instead of letting the user wait 5 minutes for timeout.\n stopPoll();\n setConnecting(false);\n setError(\n `Couldn't save Builder credentials: ${s.connectError.message}. Try again or contact support.`,\n );\n } else if (Date.now() - started > POLL_TIMEOUT_MS) {\n stopPoll();\n setConnecting(false);\n setError(\n \"Didn't hear back from Builder in 5 minutes. Allow popups and try again.\",\n );\n }\n }, POLL_INTERVAL_MS);\n }, [fetchStatus, popupUrl, statusConnectUrl, stopPoll]);\n\n // Popup-side fast path: the error page broadcasts a message so we stop\n // polling immediately rather than waiting for the next 2s tick.\n //\n // We listen on BroadcastChannel (same-origin, works with noopener popups)\n // AND on window.message (legacy path for environments without BC or for\n // popups that still have opener access). Both paths are safe to have open\n // simultaneously \\u2014 the first one to fire wins and the error is deduplicated\n // by the stopPoll() call which is idempotent.\n useEffect(() => {\n let channel: BroadcastChannel | null = null;\n const handleError = (message: string) => {\n stopPoll();\n setConnecting(false);\n setError(`Couldn't save Builder credentials: ${message}.`);\n };\n\n try {\n channel = new BroadcastChannel(`builder-connect:${window.location.host}`);\n channel.onmessage = (e: MessageEvent) => {\n const data = e.data as { type?: string; message?: string } | undefined;\n if (data?.type !== \"builder-connect-error\") return;\n if (typeof data.message !== \"string\" || !data.message) return;\n handleError(data.message);\n };\n } catch {\n // BroadcastChannel not available (rare) \\u2014 fall through to postMessage.\n }\n\n const handler = (e: MessageEvent) => {\n if (e.origin !== window.location.origin) return;\n const data = e.data as { type?: string; message?: string } | undefined;\n if (data?.type !== \"builder-connect-error\") return;\n if (typeof data.message !== \"string\" || !data.message) return;\n handleError(data.message);\n };\n window.addEventListener(\"message\", handler);\n\n return () => {\n channel?.close();\n window.removeEventListener(\"message\", handler);\n };\n }, [stopPoll]);\n\n return {\n configured,\n envManaged,\n builderEnabled,\n orgName,\n connecting,\n error,\n hasFetchedStatus,\n start,\n };\n}\n"]}
1
+ {"version":3,"file":"useBuilderStatus.js","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { getCallbackOrigin } from \"../frame.js\";\n\nexport interface BuilderStatus {\n configured: boolean;\n builderEnabled: boolean;\n /**\n * True when `BUILDER_PRIVATE_KEY` is set at the deploy level. This is a\n * fallback credential; per-user/org Builder connections are still allowed\n * and take precedence for that request.\n */\n envManaged?: boolean;\n credentialSource?: \"user\" | \"org\" | \"env\";\n connectUrl: string;\n appHost: string;\n apiHost: string;\n branchProjectIdConfigured?: boolean;\n branchProjectId?: string;\n publicKeyConfigured: boolean;\n privateKeyConfigured: boolean;\n userId?: string;\n orgName?: string;\n orgKind?: string;\n /**\n * Set when the OAuth callback ran but failed to persist credentials.\n * Surfaced as a one-shot row by the server so the connect-flow polling\n * can stop with a clear message instead of timing out at 5min.\n */\n connectError?: { message: string; at: number };\n}\n\n/**\n * Fetches Builder connection status from /_agent-native/builder/status.\n * Re-fetches on window focus to detect post-redirect state changes.\n */\nexport function useBuilderStatus() {\n const [status, setStatus] = useState<BuilderStatus | null>(null);\n const [loading, setLoading] = useState(true);\n\n const fetchStatus = useCallback(async () => {\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/builder/status\"));\n if (!res.ok) {\n setStatus(null);\n return;\n }\n setStatus(await res.json());\n } catch {\n setStatus(null);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchStatus();\n\n function onFocus() {\n fetchStatus();\n }\n function onVisibility() {\n if (document.visibilityState === \"visible\") fetchStatus();\n }\n window.addEventListener(\"focus\", onFocus);\n document.addEventListener(\"visibilitychange\", onVisibility);\n // Engine connect/disconnect actions (e.g. the Builder disconnect button)\n // dispatch this event so dependent cards refresh without a full reload.\n window.addEventListener(\"agent-engine:configured-changed\", fetchStatus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n fetchStatus,\n );\n };\n }, [fetchStatus]);\n\n return { status, loading, refetch: fetchStatus };\n}\n\n// ─── useBuilderConnectFlow ──────────────────────────────────────────────────\n//\n// Shared state machine for the \"open Builder CLI-auth popup + poll\n// /builder/status until credentials land\" interaction. Replaces three\n// near-duplicate inline implementations: `BuilderCliAuthMethod` in\n// OnboardingPanel, `ConnectBuilderCard`, and `BuilderConnectCta` in\n// AssistantChat. Each consumer supplies its own popup URL / completion\n// behavior; the hook owns the polling + timeout + focus refresh.\n//\n// `popupUrl` is what we pass to `window.open`. The default\n// `/_agent-native/builder/connect` is a server-side 302 to the real\n// cli-auth URL — using it keeps the click handler synchronous so popup\n// blockers don't downgrade the open to same-tab navigation. Pass an\n// explicit `popupUrl` (e.g. the already-computed cli-auth URL) if your\n// caller already has it in hand.\n\nexport interface BuilderConnectFlowOptions {\n /** URL to synchronously open on start(). Defaults to the 302 shortcut. */\n popupUrl?: string;\n /** Invoked after the status poll first sees `configured: true`. */\n onConnected?: (state: { orgName: string | null }) => void | Promise<void>;\n}\n\nexport interface BuilderConnectFlow {\n configured: boolean;\n /**\n * True when the deploy has BUILDER_PRIVATE_KEY set as a fallback. Connect\n * is still available so users can override the fallback with their own\n * Builder account.\n */\n envManaged: boolean;\n /**\n * True when the server has a Builder branch project configured for this\n * request. When false, the card surfaces a waitlist CTA instead of a Send\n * button.\n */\n builderEnabled: boolean;\n orgName: string | null;\n connecting: boolean;\n error: string | null;\n /**\n * True once the first `/builder/status` fetch has completed (successfully\n * or not). Consumers that accept an `initialConfigured` prop (e.g. agent\n * tool-call results rendered with server-side state) should treat\n * `configured`/`orgName` as authoritative only once this flips true —\n * otherwise the hook's starting `false` defaults would cause a flash\n * back to \"Connect Builder\" on first paint.\n */\n hasFetchedStatus: boolean;\n /** Open the popup and begin polling. Must be called from a user-gesture handler. */\n start: () => void;\n}\n\nconst POLL_INTERVAL_MS = 2000;\nconst POLL_TIMEOUT_MS = 5 * 60 * 1000;\n\nfunction notifyAgentEngineConfiguredChanged(source: string) {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(\"agent-engine:configured-changed\", {\n detail: { source },\n }),\n );\n}\n\nexport function useBuilderConnectFlow(\n opts: BuilderConnectFlowOptions = {},\n): BuilderConnectFlow {\n const { popupUrl, onConnected } = opts;\n const [configured, setConfigured] = useState(false);\n const [envManaged, setEnvManaged] = useState(false);\n const [builderEnabled, setBuilderEnabled] = useState(false);\n const [orgName, setOrgName] = useState<string | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasFetchedStatus, setHasFetchedStatus] = useState(false);\n const [statusConnectUrl, setStatusConnectUrl] = useState<string | null>(null);\n // When statusConnectUrl was last fetched. The server signs the embedded\n // _an_connect token with a 10-minute TTL; using an older URL silently\n // fails the same-origin check on the popup side. Track freshness so\n // start() can fall back to the bare /builder/connect path when stale.\n const statusConnectUrlAtRef = useRef<number | null>(null);\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const mountedRef = useRef(true);\n const notifiedConnectedRef = useRef(false);\n // Keep onConnected in a ref so start() doesn't need to re-create when the\n // caller passes an inline arrow function.\n const onConnectedRef = useRef(onConnected);\n onConnectedRef.current = onConnected;\n\n const stopPoll = useCallback(() => {\n if (pollRef.current) {\n clearInterval(pollRef.current);\n pollRef.current = null;\n }\n }, []);\n\n const fetchStatus = useCallback(async () => {\n const origin = getCallbackOrigin() || window.location.origin;\n try {\n const r = await fetch(\n new URL(agentNativePath(\"/_agent-native/builder/status\"), origin).href,\n );\n if (!r.ok) return null;\n return (await r.json()) as {\n configured: boolean;\n envManaged?: boolean;\n builderEnabled?: boolean;\n orgName?: string | null;\n connectUrl?: string;\n credentialSource?: \"user\" | \"org\" | \"env\";\n connectError?: { message: string; at: number };\n };\n } catch {\n return null;\n }\n }, []);\n\n // Initial fetch + focus/visibility refresh so if the user completed the\n // flow in another tab (or a downgraded same-tab nav) we notice it. Also\n // listen for `agent-engine:configured-changed` so a Disconnect click in\n // Settings propagates to any connect-CTA cards rendered elsewhere in\n // the app without waiting for the next focus event.\n useEffect(() => {\n mountedRef.current = true;\n let cancelled = false;\n const refresh = async () => {\n const s = await fetchStatus();\n if (cancelled || !mountedRef.current) return;\n // Flip `hasFetchedStatus` even when the fetch failed — the caller's\n // \"use initial props until the hook has an answer\" pattern wants to\n // stop waiting after we've tried, regardless of network outcome.\n setHasFetchedStatus(true);\n if (!s) return;\n setConfigured(!!s.configured);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n setStatusConnectUrl(s.connectUrl ?? null);\n statusConnectUrlAtRef.current = s.connectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n if (s.configured && !notifiedConnectedRef.current) {\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-status\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // The caller's callback is a UI convenience; status is already set.\n }\n } else if (!s.configured) {\n notifiedConnectedRef.current = false;\n }\n };\n refresh();\n const onVisible = () => {\n if (document.visibilityState === \"visible\") refresh();\n };\n window.addEventListener(\"focus\", refresh);\n document.addEventListener(\"visibilitychange\", onVisible);\n window.addEventListener(\"agent-engine:configured-changed\", refresh);\n return () => {\n cancelled = true;\n mountedRef.current = false;\n window.removeEventListener(\"focus\", refresh);\n document.removeEventListener(\"visibilitychange\", onVisible);\n window.removeEventListener(\"agent-engine:configured-changed\", refresh);\n stopPoll();\n };\n }, [fetchStatus, stopPoll]);\n\n const start = useCallback(() => {\n stopPoll();\n setConnecting(true);\n setError(null);\n\n // Open SYNCHRONOUSLY inside the caller's click handler — any await\n // before window.open lets the user-gesture token expire, which causes\n // popup blockers to block entirely or fall back to same-tab navigation.\n const origin = getCallbackOrigin() || window.location.origin;\n // The signed _an_connect token in statusConnectUrl has a 10-minute TTL.\n // If the panel has been open longer than that the token is dead and the\n // popup will silently 403; drop the cached URL and let the bare /connect\n // route do the same-origin Sec-Fetch-Site check instead.\n const STATUS_CONNECT_URL_TTL_MS = 9 * 60 * 1000;\n const cachedAt = statusConnectUrlAtRef.current;\n const cachedFresh =\n typeof cachedAt === \"number\" &&\n Date.now() - cachedAt < STATUS_CONNECT_URL_TTL_MS;\n const url =\n (cachedFresh ? statusConnectUrl : null) ??\n popupUrl ??\n new URL(agentNativePath(\"/_agent-native/builder/connect\"), origin).href;\n try {\n const opened = window.open(url, \"_blank\", \"noopener,noreferrer\");\n if (!opened) {\n setError(\n \"Popup blocked. Allow popups, then click Connect Builder again.\",\n );\n }\n } catch {\n setError(\"Couldn't open Builder. Allow popups and try again.\");\n }\n\n const started = Date.now();\n pollRef.current = setInterval(async () => {\n const s = await fetchStatus();\n if (!mountedRef.current) {\n stopPoll();\n return;\n }\n if (s?.configured) {\n stopPoll();\n setConfigured(true);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n setStatusConnectUrl(s.connectUrl ?? null);\n statusConnectUrlAtRef.current = s.connectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n setConnecting(false);\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-connect\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // Consumer's callback failed; we've already flipped the UI state\n // to connected. Swallow so we don't re-arm the flow.\n }\n } else if (s?.connectError?.message) {\n // OAuth callback ran but writeBuilderCredentials threw — surface the\n // real error instead of letting the user wait 5 minutes for timeout.\n stopPoll();\n setConnecting(false);\n setError(\n `Couldn't save Builder credentials: ${s.connectError.message}. Try again or contact support.`,\n );\n } else if (Date.now() - started > POLL_TIMEOUT_MS) {\n stopPoll();\n setConnecting(false);\n setError(\n \"Didn't hear back from Builder in 5 minutes. Allow popups and try again.\",\n );\n }\n }, POLL_INTERVAL_MS);\n }, [fetchStatus, popupUrl, statusConnectUrl, stopPoll]);\n\n // Popup-side fast path: the error page broadcasts a message so we stop\n // polling immediately rather than waiting for the next 2s tick.\n //\n // We listen on BroadcastChannel (same-origin, works with noopener popups)\n // AND on window.message (legacy path for environments without BC or for\n // popups that still have opener access). Both paths are safe to have open\n // simultaneously \\u2014 the first one to fire wins and the error is deduplicated\n // by the stopPoll() call which is idempotent.\n useEffect(() => {\n let channel: BroadcastChannel | null = null;\n const handleError = (message: string) => {\n stopPoll();\n setConnecting(false);\n setError(`Couldn't save Builder credentials: ${message}.`);\n };\n\n try {\n channel = new BroadcastChannel(`builder-connect:${window.location.host}`);\n channel.onmessage = (e: MessageEvent) => {\n const data = e.data as { type?: string; message?: string } | undefined;\n if (data?.type !== \"builder-connect-error\") return;\n if (typeof data.message !== \"string\" || !data.message) return;\n handleError(data.message);\n };\n } catch {\n // BroadcastChannel not available (rare) \\u2014 fall through to postMessage.\n }\n\n const handler = (e: MessageEvent) => {\n if (e.origin !== window.location.origin) return;\n const data = e.data as { type?: string; message?: string } | undefined;\n if (data?.type !== \"builder-connect-error\") return;\n if (typeof data.message !== \"string\" || !data.message) return;\n handleError(data.message);\n };\n window.addEventListener(\"message\", handler);\n\n return () => {\n channel?.close();\n window.removeEventListener(\"message\", handler);\n };\n }, [stopPoll]);\n\n return {\n configured,\n envManaged,\n builderEnabled,\n orgName,\n connecting,\n error,\n hasFetchedStatus,\n start,\n };\n}\n"]}