@polpo-ai/dashboard 0.15.11 → 0.15.13

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 (283) hide show
  1. package/README.md +43 -9
  2. package/dist/host.d.ts +16 -0
  3. package/dist/host.d.ts.map +1 -1
  4. package/dist/host.js +3 -0
  5. package/dist/host.js.map +1 -1
  6. package/dist/index.d.ts +35 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +27 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/self-host-api.d.ts +3 -0
  11. package/dist/self-host-api.d.ts.map +1 -0
  12. package/dist/self-host-api.js +55 -0
  13. package/dist/self-host-api.js.map +1 -0
  14. package/dist/v2/agents/agent-detail.d.ts +58 -0
  15. package/dist/v2/agents/agent-detail.d.ts.map +1 -0
  16. package/dist/v2/agents/agent-detail.js +412 -0
  17. package/dist/v2/agents/agent-detail.js.map +1 -0
  18. package/dist/v2/agents/agent-run-panel.d.ts +5 -0
  19. package/dist/v2/agents/agent-run-panel.d.ts.map +1 -0
  20. package/dist/v2/agents/agent-run-panel.js +149 -0
  21. package/dist/v2/agents/agent-run-panel.js.map +1 -0
  22. package/dist/v2/agents/loops-tab.d.ts +6 -0
  23. package/dist/v2/agents/loops-tab.d.ts.map +1 -0
  24. package/dist/v2/agents/loops-tab.js +160 -0
  25. package/dist/v2/agents/loops-tab.js.map +1 -0
  26. package/dist/v2/agents/model-select.d.ts +24 -0
  27. package/dist/v2/agents/model-select.d.ts.map +1 -0
  28. package/dist/v2/agents/model-select.js +157 -0
  29. package/dist/v2/agents/model-select.js.map +1 -0
  30. package/dist/v2/agents/prompt-preview-dialog.d.ts +15 -0
  31. package/dist/v2/agents/prompt-preview-dialog.d.ts.map +1 -0
  32. package/dist/v2/agents/prompt-preview-dialog.js +141 -0
  33. package/dist/v2/agents/prompt-preview-dialog.js.map +1 -0
  34. package/dist/v2/agents/self-host-create-agent-dialog.d.ts +6 -0
  35. package/dist/v2/agents/self-host-create-agent-dialog.d.ts.map +1 -0
  36. package/dist/v2/agents/self-host-create-agent-dialog.js +31 -0
  37. package/dist/v2/agents/self-host-create-agent-dialog.js.map +1 -0
  38. package/dist/v2/agents/self-host-detail.d.ts +4 -0
  39. package/dist/v2/agents/self-host-detail.d.ts.map +1 -0
  40. package/dist/v2/agents/self-host-detail.js +34 -0
  41. package/dist/v2/agents/self-host-detail.js.map +1 -0
  42. package/dist/v2/agents/self-host-run-chat.d.ts +10 -0
  43. package/dist/v2/agents/self-host-run-chat.d.ts.map +1 -0
  44. package/dist/v2/agents/self-host-run-chat.js +18 -0
  45. package/dist/v2/agents/self-host-run-chat.js.map +1 -0
  46. package/dist/v2/agents/skills-tab.d.ts +6 -0
  47. package/dist/v2/agents/skills-tab.d.ts.map +1 -0
  48. package/dist/v2/agents/skills-tab.js +112 -0
  49. package/dist/v2/agents/skills-tab.js.map +1 -0
  50. package/dist/v2/agents/tools-panel.d.ts +26 -0
  51. package/dist/v2/agents/tools-panel.d.ts.map +1 -0
  52. package/dist/v2/agents/tools-panel.js +123 -0
  53. package/dist/v2/agents/tools-panel.js.map +1 -0
  54. package/dist/v2/agents/tools-tab.d.ts +6 -0
  55. package/dist/v2/agents/tools-tab.d.ts.map +1 -0
  56. package/dist/v2/agents/tools-tab.js +117 -0
  57. package/dist/v2/agents/tools-tab.js.map +1 -0
  58. package/dist/v2/agents/vault-tab.d.ts +13 -0
  59. package/dist/v2/agents/vault-tab.d.ts.map +1 -0
  60. package/dist/v2/agents/vault-tab.js +93 -0
  61. package/dist/v2/agents/vault-tab.js.map +1 -0
  62. package/dist/v2/files/file-browser-primitives.d.ts +39 -0
  63. package/dist/v2/files/file-browser-primitives.d.ts.map +1 -0
  64. package/dist/v2/files/file-browser-primitives.js +75 -0
  65. package/dist/v2/files/file-browser-primitives.js.map +1 -0
  66. package/dist/v2/files/file-directory-browser.d.ts +10 -0
  67. package/dist/v2/files/file-directory-browser.d.ts.map +1 -0
  68. package/dist/v2/files/file-directory-browser.js +57 -0
  69. package/dist/v2/files/file-directory-browser.js.map +1 -0
  70. package/dist/v2/files/files-browser.d.ts +7 -0
  71. package/dist/v2/files/files-browser.d.ts.map +1 -0
  72. package/dist/v2/files/files-browser.js +390 -0
  73. package/dist/v2/files/files-browser.js.map +1 -0
  74. package/dist/v2/files/host.d.ts +45 -0
  75. package/dist/v2/files/host.d.ts.map +1 -0
  76. package/dist/v2/files/host.js +72 -0
  77. package/dist/v2/files/host.js.map +1 -0
  78. package/dist/v2/host.d.ts +42 -0
  79. package/dist/v2/host.d.ts.map +1 -0
  80. package/dist/v2/host.js +137 -0
  81. package/dist/v2/host.js.map +1 -0
  82. package/dist/v2/playground/chat-canvas.d.ts +9 -0
  83. package/dist/v2/playground/chat-canvas.d.ts.map +1 -0
  84. package/dist/v2/playground/chat-canvas.js +88 -0
  85. package/dist/v2/playground/chat-canvas.js.map +1 -0
  86. package/dist/v2/playground/host.d.ts +116 -0
  87. package/dist/v2/playground/host.d.ts.map +1 -0
  88. package/dist/v2/playground/host.js +12 -0
  89. package/dist/v2/playground/host.js.map +1 -0
  90. package/dist/v2/playground/self-host-chat.d.ts +11 -0
  91. package/dist/v2/playground/self-host-chat.d.ts.map +1 -0
  92. package/dist/v2/playground/self-host-chat.js +85 -0
  93. package/dist/v2/playground/self-host-chat.js.map +1 -0
  94. package/dist/v2/playground/self-host.d.ts +2 -0
  95. package/dist/v2/playground/self-host.d.ts.map +1 -0
  96. package/dist/v2/playground/self-host.js +87 -0
  97. package/dist/v2/playground/self-host.js.map +1 -0
  98. package/dist/v2/sessions/host.d.ts +167 -0
  99. package/dist/v2/sessions/host.d.ts.map +1 -0
  100. package/dist/v2/sessions/host.js +12 -0
  101. package/dist/v2/sessions/host.js.map +1 -0
  102. package/dist/v2/sessions/self-host.d.ts +7 -0
  103. package/dist/v2/sessions/self-host.d.ts.map +1 -0
  104. package/dist/v2/sessions/self-host.js +120 -0
  105. package/dist/v2/sessions/self-host.js.map +1 -0
  106. package/dist/v2/sessions/trace-columns.d.ts +4 -0
  107. package/dist/v2/sessions/trace-columns.d.ts.map +1 -0
  108. package/dist/v2/sessions/trace-columns.js +102 -0
  109. package/dist/v2/sessions/trace-columns.js.map +1 -0
  110. package/dist/v2/sessions/trace-detail-view.d.ts +7 -0
  111. package/dist/v2/sessions/trace-detail-view.d.ts.map +1 -0
  112. package/dist/v2/sessions/trace-detail-view.js +346 -0
  113. package/dist/v2/sessions/trace-detail-view.js.map +1 -0
  114. package/dist/v2/sessions/trace-detail.d.ts +133 -0
  115. package/dist/v2/sessions/trace-detail.d.ts.map +1 -0
  116. package/dist/v2/sessions/trace-detail.js +210 -0
  117. package/dist/v2/sessions/trace-detail.js.map +1 -0
  118. package/dist/v2/sessions/trace-normalize.d.ts +60 -0
  119. package/dist/v2/sessions/trace-normalize.d.ts.map +1 -0
  120. package/dist/v2/sessions/trace-normalize.js +87 -0
  121. package/dist/v2/sessions/trace-normalize.js.map +1 -0
  122. package/dist/v2/sessions/trace-table.d.ts +8 -0
  123. package/dist/v2/sessions/trace-table.d.ts.map +1 -0
  124. package/dist/v2/sessions/trace-table.js +27 -0
  125. package/dist/v2/sessions/trace-table.js.map +1 -0
  126. package/dist/v2/shell/coding-agents.d.ts +21 -0
  127. package/dist/v2/shell/coding-agents.d.ts.map +1 -0
  128. package/dist/v2/shell/coding-agents.js +41 -0
  129. package/dist/v2/shell/coding-agents.js.map +1 -0
  130. package/dist/v2/shell/dashboard-shell.d.ts +6 -0
  131. package/dist/v2/shell/dashboard-shell.d.ts.map +1 -0
  132. package/dist/v2/shell/dashboard-shell.js +132 -0
  133. package/dist/v2/shell/dashboard-shell.js.map +1 -0
  134. package/dist/v2/skills/self-host-create-skill-dialog.d.ts +6 -0
  135. package/dist/v2/skills/self-host-create-skill-dialog.d.ts.map +1 -0
  136. package/dist/v2/skills/self-host-create-skill-dialog.js +27 -0
  137. package/dist/v2/skills/self-host-create-skill-dialog.js.map +1 -0
  138. package/dist/v2/skills/self-host-detail.d.ts +4 -0
  139. package/dist/v2/skills/self-host-detail.d.ts.map +1 -0
  140. package/dist/v2/skills/self-host-detail.js +31 -0
  141. package/dist/v2/skills/self-host-detail.js.map +1 -0
  142. package/dist/v2/support/agent-call-snippets.d.ts +35 -0
  143. package/dist/v2/support/agent-call-snippets.d.ts.map +1 -0
  144. package/dist/v2/support/agent-call-snippets.js +113 -0
  145. package/dist/v2/support/agent-call-snippets.js.map +1 -0
  146. package/dist/v2/support/tool-catalog.d.ts +62 -0
  147. package/dist/v2/support/tool-catalog.d.ts.map +1 -0
  148. package/dist/v2/support/tool-catalog.js +271 -0
  149. package/dist/v2/support/tool-catalog.js.map +1 -0
  150. package/dist/v2/support/vault-fields.d.ts +29 -0
  151. package/dist/v2/support/vault-fields.d.ts.map +1 -0
  152. package/dist/v2/support/vault-fields.js +74 -0
  153. package/dist/v2/support/vault-fields.js.map +1 -0
  154. package/dist/v2/tools/param-fields.d.ts +19 -0
  155. package/dist/v2/tools/param-fields.d.ts.map +1 -0
  156. package/dist/v2/tools/param-fields.js +191 -0
  157. package/dist/v2/tools/param-fields.js.map +1 -0
  158. package/dist/v2/tools/self-host.d.ts +7 -0
  159. package/dist/v2/tools/self-host.d.ts.map +1 -0
  160. package/dist/v2/tools/self-host.js +26 -0
  161. package/dist/v2/tools/self-host.js.map +1 -0
  162. package/dist/v2/tools/source-parsing.d.ts +4 -0
  163. package/dist/v2/tools/source-parsing.d.ts.map +1 -0
  164. package/dist/v2/tools/source-parsing.js +15 -0
  165. package/dist/v2/tools/source-parsing.js.map +1 -0
  166. package/dist/v2/tools/tool-detail.d.ts +7 -0
  167. package/dist/v2/tools/tool-detail.d.ts.map +1 -0
  168. package/dist/v2/tools/tool-detail.js +157 -0
  169. package/dist/v2/tools/tool-detail.js.map +1 -0
  170. package/dist/v2/tools/tool-editor-dialog.d.ts +9 -0
  171. package/dist/v2/tools/tool-editor-dialog.d.ts.map +1 -0
  172. package/dist/v2/tools/tool-editor-dialog.js +306 -0
  173. package/dist/v2/tools/tool-editor-dialog.js.map +1 -0
  174. package/dist/v2/tools/tools-view.d.ts +21 -0
  175. package/dist/v2/tools/tools-view.d.ts.map +1 -0
  176. package/dist/v2/tools/tools-view.js +77 -0
  177. package/dist/v2/tools/tools-view.js.map +1 -0
  178. package/dist/v2/ui/bits.d.ts +23 -0
  179. package/dist/v2/ui/bits.d.ts.map +1 -0
  180. package/dist/v2/ui/bits.js +18 -0
  181. package/dist/v2/ui/bits.js.map +1 -0
  182. package/dist/v2/ui/button.d.ts +9 -0
  183. package/dist/v2/ui/button.d.ts.map +1 -0
  184. package/dist/v2/ui/button.js +33 -0
  185. package/dist/v2/ui/button.js.map +1 -0
  186. package/dist/v2/ui/code-block.d.ts +20 -0
  187. package/dist/v2/ui/code-block.d.ts.map +1 -0
  188. package/dist/v2/ui/code-block.js +44 -0
  189. package/dist/v2/ui/code-block.js.map +1 -0
  190. package/dist/v2/ui/code-editor.d.ts +9 -0
  191. package/dist/v2/ui/code-editor.d.ts.map +1 -0
  192. package/dist/v2/ui/code-editor.js +25 -0
  193. package/dist/v2/ui/code-editor.js.map +1 -0
  194. package/dist/v2/ui/copy-button.d.ts +9 -0
  195. package/dist/v2/ui/copy-button.d.ts.map +1 -0
  196. package/dist/v2/ui/copy-button.js +24 -0
  197. package/dist/v2/ui/copy-button.js.map +1 -0
  198. package/dist/v2/ui/data-table.d.ts +40 -0
  199. package/dist/v2/ui/data-table.d.ts.map +1 -0
  200. package/dist/v2/ui/data-table.js +85 -0
  201. package/dist/v2/ui/data-table.js.map +1 -0
  202. package/dist/v2/ui/dialog.d.ts +16 -0
  203. package/dist/v2/ui/dialog.d.ts.map +1 -0
  204. package/dist/v2/ui/dialog.js +39 -0
  205. package/dist/v2/ui/dialog.js.map +1 -0
  206. package/dist/v2/ui/input.d.ts +2 -0
  207. package/dist/v2/ui/input.d.ts.map +1 -0
  208. package/dist/v2/ui/input.js +7 -0
  209. package/dist/v2/ui/input.js.map +1 -0
  210. package/dist/v2/ui/multi-select-filter.d.ts +18 -0
  211. package/dist/v2/ui/multi-select-filter.d.ts.map +1 -0
  212. package/dist/v2/ui/multi-select-filter.js +37 -0
  213. package/dist/v2/ui/multi-select-filter.js.map +1 -0
  214. package/dist/v2/ui/page-header.d.ts +10 -0
  215. package/dist/v2/ui/page-header.d.ts.map +1 -0
  216. package/dist/v2/ui/page-header.js +8 -0
  217. package/dist/v2/ui/page-header.js.map +1 -0
  218. package/dist/v2/ui/refresh-button.d.ts +5 -0
  219. package/dist/v2/ui/refresh-button.d.ts.map +1 -0
  220. package/dist/v2/ui/refresh-button.js +7 -0
  221. package/dist/v2/ui/refresh-button.js.map +1 -0
  222. package/dist/v2/ui/select.d.ts +16 -0
  223. package/dist/v2/ui/select.d.ts.map +1 -0
  224. package/dist/v2/ui/select.js +36 -0
  225. package/dist/v2/ui/select.js.map +1 -0
  226. package/dist/v2/ui/skeleton.d.ts +3 -0
  227. package/dist/v2/ui/skeleton.d.ts.map +1 -0
  228. package/dist/v2/ui/skeleton.js +7 -0
  229. package/dist/v2/ui/skeleton.js.map +1 -0
  230. package/dist/v2/ui/textarea.d.ts +2 -0
  231. package/dist/v2/ui/textarea.d.ts.map +1 -0
  232. package/dist/v2/ui/textarea.js +6 -0
  233. package/dist/v2/ui/textarea.js.map +1 -0
  234. package/dist/v2/utils.d.ts +3 -0
  235. package/dist/v2/utils.d.ts.map +1 -0
  236. package/dist/v2/utils.js +6 -0
  237. package/dist/v2/utils.js.map +1 -0
  238. package/dist/v2/views/agents-detail.d.ts +2 -0
  239. package/dist/v2/views/agents-detail.d.ts.map +1 -0
  240. package/dist/v2/views/agents-detail.js +2 -0
  241. package/dist/v2/views/agents-detail.js.map +1 -0
  242. package/dist/v2/views/agents.d.ts +27 -0
  243. package/dist/v2/views/agents.d.ts.map +1 -0
  244. package/dist/v2/views/agents.js +161 -0
  245. package/dist/v2/views/agents.js.map +1 -0
  246. package/dist/v2/views/files.d.ts +2 -0
  247. package/dist/v2/views/files.d.ts.map +1 -0
  248. package/dist/v2/views/files.js +10 -0
  249. package/dist/v2/views/files.js.map +1 -0
  250. package/dist/v2/views/memory-host.d.ts +10 -0
  251. package/dist/v2/views/memory-host.d.ts.map +1 -0
  252. package/dist/v2/views/memory-host.js +17 -0
  253. package/dist/v2/views/memory-host.js.map +1 -0
  254. package/dist/v2/views/memory-project.d.ts +5 -0
  255. package/dist/v2/views/memory-project.d.ts.map +1 -0
  256. package/dist/v2/views/memory-project.js +36 -0
  257. package/dist/v2/views/memory-project.js.map +1 -0
  258. package/dist/v2/views/memory.d.ts +2 -0
  259. package/dist/v2/views/memory.d.ts.map +1 -0
  260. package/dist/v2/views/memory.js +14 -0
  261. package/dist/v2/views/memory.js.map +1 -0
  262. package/dist/v2/views/playground.d.ts +13 -0
  263. package/dist/v2/views/playground.d.ts.map +1 -0
  264. package/dist/v2/views/playground.js +88 -0
  265. package/dist/v2/views/playground.js.map +1 -0
  266. package/dist/v2/views/sessions-detail.d.ts +8 -0
  267. package/dist/v2/views/sessions-detail.d.ts.map +1 -0
  268. package/dist/v2/views/sessions-detail.js +107 -0
  269. package/dist/v2/views/sessions-detail.js.map +1 -0
  270. package/dist/v2/views/sessions.d.ts +9 -0
  271. package/dist/v2/views/sessions.d.ts.map +1 -0
  272. package/dist/v2/views/sessions.js +9 -0
  273. package/dist/v2/views/sessions.js.map +1 -0
  274. package/dist/v2/views/skills-detail.d.ts +26 -0
  275. package/dist/v2/views/skills-detail.d.ts.map +1 -0
  276. package/dist/v2/views/skills-detail.js +120 -0
  277. package/dist/v2/views/skills-detail.js.map +1 -0
  278. package/dist/v2/views/skills.d.ts +18 -0
  279. package/dist/v2/views/skills.d.ts.map +1 -0
  280. package/dist/v2/views/skills.js +46 -0
  281. package/dist/v2/views/skills.js.map +1 -0
  282. package/package.json +20 -4
  283. package/src/v2.css +212 -0
@@ -0,0 +1,123 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useRouter } from "../host";
5
+ import { useQuery } from "../host";
6
+ import { Link } from "../host";
7
+ import { CircleNotch, MagnifyingGlass, CaretRight, ArrowSquareOut, PlugsConnected, } from "@phosphor-icons/react/dist/ssr";
8
+ import { useDashboardApi } from "../../host";
9
+ import { BASELINE_TOOLS, CATALOG_TOOL_NAMES, countEnabledTools, } from "../host";
10
+ import { Toggle } from "../ui/bits";
11
+ import { ToolsTab } from "./tools-tab";
12
+ /**
13
+ * The agent's "Tools & MCP" tab, split into a vertical sub-nav:
14
+ * • Built-in tools — the managed runtime catalog (categories, toggles).
15
+ * • Custom tools — tools authored at project level, toggled per agent.
16
+ * • MCP Servers — external tools via Model Context Protocol (coming soon).
17
+ */
18
+ export function ToolsPanel({ projectId, agentName, allowedTools, }) {
19
+ const [sub, setSub] = useState("builtin");
20
+ const items = [
21
+ { id: "builtin", label: "Built-in tools" },
22
+ { id: "custom", label: "Custom tools" },
23
+ ];
24
+ return (_jsxs("div", { className: "flex flex-col gap-5 md:flex-row md:gap-6", children: [_jsx("nav", { className: "flex shrink-0 gap-1 overflow-x-auto md:w-44 md:flex-col md:gap-0.5 md:overflow-visible", children: items.map((it) => (_jsx("button", { type: "button", onClick: () => setSub(it.id), className: `shrink-0 rounded-md px-2.5 py-1.5 text-left text-[13px] transition-colors ${sub === it.id
25
+ ? "bg-secondary font-medium text-foreground"
26
+ : "text-muted-foreground hover:bg-secondary/60 hover:text-foreground"}`, children: it.label }, it.id))) }), _jsxs("div", { className: "min-w-0 flex-1", children: [sub === "builtin" && (_jsx(ToolsTab, { projectId: projectId, agentName: agentName, allowedTools: allowedTools })), sub === "custom" && (_jsx(CustomToolsPanel, { projectId: projectId, agentName: agentName, allowedTools: allowedTools }))] })] }));
27
+ }
28
+ /**
29
+ * Agent tools with a horizontal type filter — Built-in · Custom · MCP (soon).
30
+ * One section at a time (single search each), instead of a nested sub-nav.
31
+ */
32
+ export function AgentToolsPanel({ projectId, agentName, allowedTools, }) {
33
+ const [filter, setFilter] = useState("builtin");
34
+ const builtinCount = countEnabledTools(allowedTools);
35
+ const customCount = allowedTools.filter((t) => !CATALOG_TOOL_NAMES.has(t) && !t.endsWith("*")).length;
36
+ const FILTERS = [
37
+ { id: "builtin", label: "Built-in" },
38
+ { id: "custom", label: "Custom" },
39
+ { id: "mcp", label: "MCP", soon: true },
40
+ ];
41
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx("p", { className: "text-[13px] text-muted-foreground", children: "Tools this agent can call. Built-in tools run on the managed runtime, custom tools are authored in your project, and MCP connects external servers." }), _jsx("div", { className: "scrollbar-none flex items-center gap-1 overflow-x-auto border-b border-border", children: FILTERS.map((f) => {
42
+ const count = f.id === "builtin"
43
+ ? builtinCount
44
+ : f.id === "custom"
45
+ ? customCount
46
+ : null;
47
+ return (_jsxs("button", { type: "button", onClick: () => setFilter(f.id), className: `-mb-px inline-flex shrink-0 items-center gap-1.5 border-b-2 px-3 py-2 text-[13px] transition-colors ${filter === f.id
48
+ ? "border-brand font-medium text-foreground"
49
+ : "border-transparent text-muted-foreground hover:text-foreground"}`, children: [f.label, count !== null && (_jsx("span", { className: "rounded bg-secondary px-1.5 py-0.5 text-[10px] tabular-nums text-muted-foreground", children: count })), f.soon && (_jsx("span", { className: "rounded-sm bg-secondary px-1 py-px text-[9px] font-semibold uppercase leading-none tracking-wide text-muted-foreground/60", children: "Soon" }))] }, f.id));
50
+ }) }), filter === "builtin" && (_jsx(ToolsTab, { projectId: projectId, agentName: agentName, allowedTools: allowedTools })), filter === "custom" && (_jsx(CustomToolsPanel, { projectId: projectId, agentName: agentName, allowedTools: allowedTools })), filter === "mcp" && (_jsxs("div", { className: "flex flex-col items-center gap-3 rounded-lg border border-dashed border-border py-16 text-center", children: [_jsx("span", { className: "grid h-11 w-11 place-items-center rounded-lg border border-border bg-secondary", children: _jsx(PlugsConnected, { size: 20, className: "text-muted-foreground" }) }), _jsxs("div", { className: "max-w-sm", children: [_jsx("div", { className: "text-sm font-medium text-foreground", children: "MCP Servers" }), _jsx("div", { className: "mt-1 text-[13px] text-muted-foreground", children: "Connect this agent to external tools and data through Model Context Protocol servers." })] }), _jsx("span", { className: "rounded-full border border-border px-2.5 py-1 text-[11px] font-medium text-muted-foreground", children: "Coming soon" })] }))] }));
51
+ }
52
+ export function CustomToolsPanel({ projectId, agentName, allowedTools, }) {
53
+ const api = useDashboardApi();
54
+ const router = useRouter();
55
+ const [allowed, setAllowed] = useState(allowedTools);
56
+ const [query, setQuery] = useState("");
57
+ const [expanded, setExpanded] = useState(true);
58
+ const [saving, setSaving] = useState(false);
59
+ const [error, setError] = useState(null);
60
+ const { data: tools = [], isLoading } = useQuery({
61
+ queryKey: ["custom-tools", projectId],
62
+ queryFn: () => api.fetchControlPlane(`/v1/projects/${projectId}/tools`).then((r) => r.data ?? []),
63
+ staleTime: 30_000,
64
+ });
65
+ const authorHref = `/projects/${projectId}/tools`;
66
+ async function persist(next) {
67
+ const prev = allowed;
68
+ setAllowed(next);
69
+ setSaving(true);
70
+ setError(null);
71
+ try {
72
+ await api.mutateDataPlane(projectId, `/v1/agents/${encodeURIComponent(agentName)}`, { method: "PATCH", body: { allowedTools: next } });
73
+ router.refresh();
74
+ }
75
+ catch (e) {
76
+ setAllowed(prev);
77
+ setError(e instanceof Error ? e.message : "Update failed");
78
+ }
79
+ finally {
80
+ setSaving(false);
81
+ }
82
+ }
83
+ // Materialize the baseline first so enabling a custom tool doesn't silently
84
+ // switch off the built-in baseline (empty allowedTools == baseline).
85
+ function base() {
86
+ return new Set(allowed.length ? allowed : [...BASELINE_TOOLS]);
87
+ }
88
+ function toggle(name) {
89
+ const set = base();
90
+ if (set.has(name))
91
+ set.delete(name);
92
+ else
93
+ set.add(name);
94
+ persist([...set]);
95
+ }
96
+ function toggleAll(enable) {
97
+ const set = base();
98
+ for (const t of tools) {
99
+ if (enable)
100
+ set.add(t.name);
101
+ else
102
+ set.delete(t.name);
103
+ }
104
+ persist([...set]);
105
+ }
106
+ const filtered = query
107
+ ? tools.filter((t) => t.name.toLowerCase().includes(query.toLowerCase()) ||
108
+ (t.description ?? "").toLowerCase().includes(query.toLowerCase()))
109
+ : tools;
110
+ const enabledCount = tools.filter((t) => allowed.includes(t.name)).length;
111
+ const allOn = tools.length > 0 && enabledCount === tools.length;
112
+ const isOpen = expanded || query.length > 0;
113
+ return (_jsxs("div", { className: "flex flex-col gap-5", children: [tools.length > 0 && (_jsxs("div", { className: "relative w-full sm:w-72", children: [_jsx(MagnifyingGlass, { size: 14, className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search custom tools\u2026", className: "h-8 w-full rounded-md border border-border bg-transparent pl-8 pr-3 text-[13px] text-foreground placeholder:text-muted-foreground/50 focus:border-ring/50 focus:outline-none" })] })), error && _jsx("p", { className: "text-[12px] text-destructive", children: error }), isLoading ? (_jsx("div", { className: "py-10 text-center", children: _jsx(CircleNotch, { size: 18, className: "mx-auto animate-spin text-muted-foreground" }) })) : tools.length === 0 ? (_jsxs("div", { className: "rounded-lg border border-dashed border-border py-12 text-center", children: [_jsx("div", { className: "text-sm font-medium text-foreground", children: "No custom tools yet" }), _jsxs("div", { className: "mt-1 text-[13px] text-muted-foreground", children: ["Author them in", " ", _jsx(Link, { href: authorHref, className: "text-brand transition-colors hover:underline", children: "Project \u2192 Tools" }), "."] })] })) : (_jsxs("section", { children: [_jsxs("div", { role: "button", tabIndex: 0, onClick: () => setExpanded((v) => !v), onKeyDown: (e) => {
114
+ if (e.key === "Enter" || e.key === " ") {
115
+ e.preventDefault();
116
+ setExpanded((v) => !v);
117
+ }
118
+ }, className: "group -mx-2 flex cursor-pointer items-center justify-between gap-3 rounded-md px-2 py-2 transition-colors hover:bg-secondary/50", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx(CaretRight, { size: 14, className: `shrink-0 text-muted-foreground/60 transition-transform ${isOpen ? "rotate-90" : ""}` }), _jsx("h3", { className: "text-[14px] font-semibold text-foreground", children: "Custom tools" }), _jsxs("span", { className: `ml-0.5 rounded-full px-1.5 py-0.5 font-mono text-[10px] tabular-nums ${enabledCount > 0
119
+ ? "bg-brand/10 text-brand"
120
+ : "bg-secondary text-muted-foreground/50"}`, children: [enabledCount, "/", tools.length] })] }), _jsxs("div", { onClick: (e) => e.stopPropagation(), className: "flex shrink-0 items-center gap-2 text-[12px] text-muted-foreground", children: ["Enable all", _jsx(Toggle, { checked: allOn, onChange: () => toggleAll(!allOn), disabled: saving, label: "Toggle all custom tools" })] })] }), isOpen &&
121
+ (filtered.length === 0 ? (_jsxs("p", { className: "py-6 text-center text-[13px] text-muted-foreground", children: ["No custom tools match \u201C", query, "\u201D."] })) : (_jsx("div", { className: "mt-2 overflow-hidden rounded-lg border border-border bg-card", children: filtered.map((t, i) => (_jsxs("div", { className: `flex items-center gap-3 px-3.5 py-2.5 ${i > 0 ? "border-t border-border" : ""}`, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-mono text-[12px] text-foreground", children: t.name }), t.description && (_jsx("div", { className: "mt-0.5 min-w-0 truncate text-[12px] text-muted-foreground", children: t.description }))] }), _jsxs("a", { href: `${authorHref}/${encodeURIComponent(t.name)}`, target: "_blank", rel: "noopener noreferrer", title: `Open ${t.name}`, className: "inline-flex h-7 shrink-0 items-center gap-1.5 rounded-md border border-border px-2 text-[12px] text-muted-foreground transition-colors hover:border-ring/40 hover:text-foreground", children: ["Open", _jsx(ArrowSquareOut, { size: 13 })] }), _jsx(Toggle, { checked: allowed.includes(t.name), onChange: () => toggle(t.name), disabled: saving, label: t.name })] }, t.name))) })))] }))] }));
122
+ }
123
+ //# sourceMappingURL=tools-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-panel.js","sourceRoot":"","sources":["../../../src/v2/agents/tools-panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function ToolsTab({ projectId, agentName, allowedTools, }: {
2
+ projectId: string;
3
+ agentName: string;
4
+ allowedTools: string[];
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=tools-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-tab.d.ts","sourceRoot":"","sources":["../../../src/v2/agents/tools-tab.tsx"],"names":[],"mappings":"AA0CA,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,SAAS,EACT,YAAY,GACb,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,2CAqMA"}
@@ -0,0 +1,117 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useRouter } from "../host";
5
+ import { Key, MagnifyingGlass, CaretRight } from "@phosphor-icons/react/dist/ssr";
6
+ import { TOOL_CATALOG, isToolEnabled, } from "../host";
7
+ import { useDashboardApi } from "../../host";
8
+ import { Toggle } from "../ui/bits";
9
+ /** When allowedTools is empty the runtime grants this baseline set. */
10
+ const BASELINE = new Set([
11
+ "read",
12
+ "write",
13
+ "edit",
14
+ "bash",
15
+ "glob",
16
+ "grep",
17
+ "ls",
18
+ "http_fetch",
19
+ "http_download",
20
+ ]);
21
+ function toolOn(name, allowed, core) {
22
+ if (core)
23
+ return true;
24
+ if (allowed.length === 0)
25
+ return BASELINE.has(name);
26
+ return isToolEnabled(name, allowed);
27
+ }
28
+ function matches(tool, q) {
29
+ if (!q)
30
+ return true;
31
+ const s = q.toLowerCase();
32
+ return (tool.name.toLowerCase().includes(s) ||
33
+ tool.description.toLowerCase().includes(s));
34
+ }
35
+ export function ToolsTab({ projectId, agentName, allowedTools, }) {
36
+ const api = useDashboardApi();
37
+ const router = useRouter();
38
+ const [allowed, setAllowed] = useState(allowedTools);
39
+ const [query, setQuery] = useState("");
40
+ const [saving, setSaving] = useState(false);
41
+ const [error, setError] = useState(null);
42
+ const [expanded, setExpanded] = useState(() => new Set(TOOL_CATALOG.filter((g) => !g.core).map((g) => g.key)));
43
+ const toggleExpand = (key) => setExpanded((s) => {
44
+ const next = new Set(s);
45
+ next.has(key) ? next.delete(key) : next.add(key);
46
+ return next;
47
+ });
48
+ async function persist(next) {
49
+ const prev = allowed;
50
+ setAllowed(next);
51
+ setSaving(true);
52
+ setError(null);
53
+ try {
54
+ await api.mutateDataPlane(projectId, `/v1/agents/${encodeURIComponent(agentName)}`, { method: "PATCH", body: { allowedTools: next } });
55
+ router.refresh();
56
+ }
57
+ catch (e) {
58
+ setAllowed(prev);
59
+ setError(e instanceof Error ? e.message : "Update failed");
60
+ }
61
+ finally {
62
+ setSaving(false);
63
+ }
64
+ }
65
+ function materialize() {
66
+ return new Set(allowed.length ? allowed : [...BASELINE]);
67
+ }
68
+ function toggleTool(group, name) {
69
+ const set = materialize();
70
+ const wildcard = `${group.key}*`;
71
+ if (group.explicitToolsOnly && set.has(wildcard)) {
72
+ set.delete(wildcard);
73
+ for (const tool of group.tools)
74
+ set.add(tool.name);
75
+ }
76
+ if (set.has(name))
77
+ set.delete(name);
78
+ else
79
+ set.add(name);
80
+ persist([...set]);
81
+ }
82
+ function toggleGroup(g, enable) {
83
+ const set = materialize();
84
+ set.delete(`${g.key}*`);
85
+ for (const t of g.tools) {
86
+ if (enable)
87
+ set.add(t.name);
88
+ else
89
+ set.delete(t.name);
90
+ }
91
+ persist([...set]);
92
+ }
93
+ function groupCount(g) {
94
+ return g.tools.filter((t) => toolOn(t.name, allowed, g.core)).length;
95
+ }
96
+ // Core tools are always on and can't be toggled — no point listing them.
97
+ const visible = TOOL_CATALOG.filter((g) => !g.core)
98
+ .map((g) => ({
99
+ group: g,
100
+ tools: g.tools.filter((t) => matches(t, query)),
101
+ }))
102
+ .filter((x) => x.tools.length > 0);
103
+ return (_jsxs("div", { className: "flex flex-col gap-5", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { className: "relative w-full sm:w-72", children: [_jsx(MagnifyingGlass, { size: 14, className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search tools\u2026", className: "h-8 w-full rounded-md border border-border bg-transparent pl-8 pr-3 text-[13px] text-foreground placeholder:text-muted-foreground/50 focus:border-ring/50 focus:outline-none" })] }), error && _jsx("p", { className: "text-[12px] text-destructive", children: error })] }), visible.length === 0 ? (_jsxs("p", { className: "py-8 text-center text-[13px] text-muted-foreground", children: ["No tools match \u201C", query, "\u201D."] })) : (_jsx("div", { className: "flex flex-col gap-3", children: visible.map(({ group: g, tools }) => {
104
+ const on = groupCount(g);
105
+ const allOn = on === g.tools.length;
106
+ const isOpen = expanded.has(g.key) || query.length > 0;
107
+ return (_jsxs("section", { children: [_jsxs("div", { role: "button", tabIndex: 0, onClick: () => toggleExpand(g.key), onKeyDown: (e) => {
108
+ if (e.key === "Enter" || e.key === " ") {
109
+ e.preventDefault();
110
+ toggleExpand(g.key);
111
+ }
112
+ }, className: "group -mx-2 flex cursor-pointer items-center justify-between gap-3 rounded-md px-2 py-2 transition-colors hover:bg-secondary/50", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx(CaretRight, { size: 14, className: `shrink-0 text-muted-foreground/60 transition-transform ${isOpen ? "rotate-90" : ""}` }), _jsx("h3", { className: "text-[14px] font-semibold text-foreground", children: g.label }), g.requiresKey && (_jsxs("span", { className: "inline-flex items-center gap-1 rounded border border-border px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground", children: [_jsx(Key, { size: 10 }), " ", g.credentialLabel ?? "needs vault"] })), _jsxs("span", { className: `ml-0.5 rounded-full px-1.5 py-0.5 font-mono text-[10px] tabular-nums ${on > 0
113
+ ? "bg-brand/10 text-brand"
114
+ : "bg-secondary text-muted-foreground/50"}`, children: [on, "/", g.tools.length] })] }), g.core ? (_jsx("span", { className: "shrink-0 text-[12px] text-muted-foreground", children: "Always on" })) : (_jsxs("div", { onClick: (e) => e.stopPropagation(), className: "flex shrink-0 items-center gap-2 text-[12px] text-muted-foreground", children: ["Enable all", _jsx(Toggle, { checked: allOn, onChange: () => toggleGroup(g, !allOn), disabled: saving, label: `Toggle all ${g.label}` })] }))] }), isOpen && (_jsx("div", { className: "mt-2 overflow-hidden rounded-lg border border-border bg-card", children: tools.map((tool, i) => (_jsxs("div", { className: `flex items-center gap-3 px-3.5 py-2.5 ${i > 0 ? "border-t border-border" : ""}`, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-mono text-[12px] text-foreground", children: tool.name }), _jsx("div", { className: "mt-0.5 text-[12px] leading-snug text-muted-foreground", children: tool.description })] }), _jsx(Toggle, { checked: toolOn(tool.name, allowed, g.core), onChange: () => toggleTool(g, tool.name), disabled: saving || g.core, label: tool.name })] }, tool.name))) }))] }, g.key));
115
+ }) }))] }));
116
+ }
117
+ //# sourceMappingURL=tools-tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-tab.js","sourceRoot":"","sources":["../../../src/v2/agents/tools-tab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ type VaultEntry = {
2
+ service: string;
3
+ type: string;
4
+ label?: string | null;
5
+ keys?: string[];
6
+ };
7
+ export declare function VaultTab({ projectId, agentName, initialEntries, }: {
8
+ projectId: string;
9
+ agentName: string;
10
+ initialEntries: VaultEntry[];
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=vault-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-tab.d.ts","sourceRoot":"","sources":["../../../src/v2/agents/vault-tab.tsx"],"names":[],"mappings":"AAuBA,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAKF,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,SAAS,EACT,cAAc,GACf,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,UAAU,EAAE,CAAC;CAC9B,2CAsHA"}
@@ -0,0 +1,93 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useMutation, useQuery, useQueryClient } from "../host";
5
+ import { Plus, Trash, CircleNotch, Lock } from "@phosphor-icons/react/dist/ssr";
6
+ import { usePolpoClient } from "../host";
7
+ import { Button } from "../ui/button";
8
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../ui/select";
9
+ import { EmptyBox } from "../ui/bits";
10
+ import { TYPE_OPTIONS, TYPE_FIELDS, typeLabel, buildCredentials, } from "../host";
11
+ const INPUT = "h-8 w-full rounded-md border border-border bg-background px-2.5 text-[13px] text-foreground placeholder:text-muted-foreground/40 focus:border-ring/50 focus:outline-none";
12
+ export function VaultTab({ projectId, agentName, initialEntries, }) {
13
+ const polpo = usePolpoClient(projectId);
14
+ const queryClient = useQueryClient();
15
+ const [adding, setAdding] = useState(false);
16
+ const [confirm, setConfirm] = useState(null);
17
+ const { data: entries = [] } = useQuery({
18
+ queryKey: ["vault", projectId, agentName],
19
+ queryFn: () => polpo.listVaultEntries(agentName),
20
+ initialData: initialEntries,
21
+ });
22
+ const invalidate = () => queryClient.invalidateQueries({ queryKey: ["vault", projectId, agentName] });
23
+ const remove = useMutation({
24
+ mutationFn: (service) => polpo.removeVaultEntry(agentName, service),
25
+ onSuccess: async () => {
26
+ setConfirm(null);
27
+ await invalidate();
28
+ },
29
+ });
30
+ return (_jsxs("div", { children: [_jsxs("div", { className: "mb-3 flex items-center justify-between", children: [_jsx("p", { className: "text-[13px] text-muted-foreground", children: "Encrypted secrets this agent can read at runtime. Values are write-only." }), !adding && (_jsxs(Button, { size: "sm", onClick: () => setAdding(true), children: [_jsx(Plus, { size: 15, weight: "bold" }), "Add credential"] }))] }), adding && (_jsx("div", { className: "mb-4", children: _jsx(AddCredentialForm, { onCancel: () => setAdding(false), onSave: async (payload) => {
31
+ await polpo.saveVaultEntry({ agent: agentName, ...payload });
32
+ await invalidate();
33
+ setAdding(false);
34
+ } }) })), entries.length === 0 ? (_jsx(EmptyBox, { children: "No credentials stored for this agent." })) : (_jsxs("div", { className: "overflow-hidden rounded-lg border border-border bg-card", children: [_jsxs("div", { className: "flex border-b border-border bg-muted/40 px-3.5 py-2 text-[11px] font-medium uppercase tracking-[0.06em] text-muted-foreground", children: [_jsx("span", { className: "flex-1", children: "Service" }), _jsx("span", { className: "w-24", children: "Type" }), _jsx("span", { className: "w-40", children: "Keys" }), _jsx("span", { className: "w-24 text-right" })] }), entries.map((e) => (_jsxs("div", { className: "flex items-center border-b border-border px-3.5 py-2.5 last:border-0", children: [_jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [_jsx(Lock, { size: 13, className: "shrink-0 text-muted-foreground/50" }), _jsx("span", { className: "truncate font-mono text-[12px] text-foreground", children: e.service }), e.label && (_jsx("span", { className: "truncate text-[11px] text-muted-foreground/60", children: e.label }))] }), _jsx("span", { className: "w-24", children: _jsx("span", { className: "rounded bg-secondary px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground", children: typeLabel[e.type] ?? e.type }) }), _jsx("span", { className: "w-40 truncate font-mono text-[11px] text-muted-foreground/60", children: e.keys?.join(", ") || "—" }), _jsx("span", { className: "flex w-24 items-center justify-end", children: confirm === e.service ? (_jsxs("span", { className: "flex items-center gap-2 text-[12px]", children: [_jsx("button", { onClick: () => remove.mutate(e.service), disabled: remove.isPending, className: "text-destructive hover:underline", children: remove.isPending ? "…" : "Delete" }), _jsx("button", { onClick: () => setConfirm(null), className: "text-muted-foreground hover:text-foreground", children: "Cancel" })] })) : (_jsx("button", { onClick: () => setConfirm(e.service), "aria-label": `Delete ${e.service}`, className: "grid h-7 w-7 place-items-center rounded-md text-muted-foreground/60 transition-colors hover:bg-secondary hover:text-destructive", children: _jsx(Trash, { size: 14 }) })) })] }, e.service)))] }))] }));
35
+ }
36
+ function AddCredentialForm({ onCancel, onSave, }) {
37
+ const [type, setType] = useState("api_key");
38
+ const [service, setService] = useState("");
39
+ const [label, setLabel] = useState("");
40
+ const [values, setValues] = useState({});
41
+ const [customRows, setCustomRows] = useState([
42
+ { k: "", v: "" },
43
+ ]);
44
+ const [saving, setSaving] = useState(false);
45
+ const [error, setError] = useState(null);
46
+ async function submit() {
47
+ setError(null);
48
+ if (!service.trim()) {
49
+ setError("Service name is required.");
50
+ return;
51
+ }
52
+ let credentials;
53
+ try {
54
+ credentials = buildCredentials(type, values, customRows);
55
+ }
56
+ catch (e) {
57
+ setError(e instanceof Error ? e.message : "Invalid fields");
58
+ return;
59
+ }
60
+ setSaving(true);
61
+ try {
62
+ await onSave({
63
+ service: service.trim(),
64
+ type,
65
+ label: label.trim() || undefined,
66
+ credentials,
67
+ });
68
+ }
69
+ catch (e) {
70
+ setError(e instanceof Error ? e.message : "Save failed");
71
+ setSaving(false);
72
+ }
73
+ }
74
+ return (_jsxs("div", { className: "rounded-lg border border-border bg-card p-4", children: [_jsx("div", { className: "mb-3 flex items-center justify-between", children: _jsx("span", { className: "text-[13px] font-medium text-foreground", children: "New credential" }) }), _jsxs("div", { className: "grid gap-3 sm:grid-cols-3", children: [_jsxs("label", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-[11px] text-muted-foreground", children: "Type" }), _jsxs(Select, { value: type, onValueChange: (v) => {
75
+ if (!v)
76
+ return;
77
+ setType(v);
78
+ setValues({});
79
+ }, children: [_jsx(SelectTrigger, { size: "sm", className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: TYPE_OPTIONS.map((t) => (_jsx(SelectItem, { value: t, children: typeLabel[t] }, t))) })] })] }), _jsxs("label", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-[11px] text-muted-foreground", children: "Service" }), _jsx("input", { value: service, onChange: (e) => setService(e.target.value), placeholder: "e.g. openai, gmail", className: `${INPUT} font-mono` })] }), _jsxs("label", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-[11px] text-muted-foreground", children: "Label (optional)" }), _jsx("input", { value: label, onChange: (e) => setLabel(e.target.value), placeholder: "Personal key", className: INPUT })] })] }), _jsx("div", { className: "mt-3 grid gap-3 sm:grid-cols-2", children: type === "custom"
80
+ ? customRows.map((row, i) => (_jsxs("div", { className: "flex gap-2", children: [_jsx("input", { value: row.k, onChange: (e) => {
81
+ const next = [...customRows];
82
+ next[i] = { ...next[i], k: e.target.value };
83
+ if (i === customRows.length - 1 && e.target.value)
84
+ next.push({ k: "", v: "" });
85
+ setCustomRows(next);
86
+ }, placeholder: "key", className: `${INPUT} font-mono` }), _jsx("input", { value: row.v, onChange: (e) => {
87
+ const next = [...customRows];
88
+ next[i] = { ...next[i], v: e.target.value };
89
+ setCustomRows(next);
90
+ }, placeholder: "value", className: INPUT })] }, i)))
91
+ : TYPE_FIELDS[type].map((f) => (_jsxs("label", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-[11px] text-muted-foreground", children: [f.label, f.optional && (_jsx("span", { className: "text-muted-foreground/40", children: " \u00B7 optional" }))] }), _jsx("input", { type: f.secret ? "password" : "text", value: values[f.k] ?? "", onChange: (e) => setValues((v) => ({ ...v, [f.k]: e.target.value })), placeholder: f.placeholder, className: INPUT })] }, f.k))) }), error && _jsx("p", { className: "mt-3 text-[12px] text-destructive", children: error }), _jsxs("div", { className: "mt-4 flex items-center gap-2", children: [_jsx(Button, { size: "sm", onClick: submit, disabled: saving, children: saving ? (_jsxs(_Fragment, { children: [_jsx(CircleNotch, { size: 14, className: "animate-spin" }), "Saving\u2026"] })) : ("Save credential") }), _jsx(Button, { size: "sm", variant: "ghost", onClick: onCancel, disabled: saving, children: "Cancel" })] })] }));
92
+ }
93
+ //# sourceMappingURL=vault-tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-tab.js","sourceRoot":"","sources":["../../../src/v2/agents/vault-tab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface FileEntry {
2
+ name: string;
3
+ type: "file" | "directory";
4
+ size?: number;
5
+ mimeType?: string;
6
+ modifiedAt?: string;
7
+ }
8
+ export interface DriveVolume {
9
+ id: string;
10
+ name: string;
11
+ label: string | null;
12
+ mode: "file-drive" | "code-drive";
13
+ mountPath: string | null;
14
+ path: string;
15
+ absolutePath: string;
16
+ totalFiles: number;
17
+ totalSize: number;
18
+ sync?: {
19
+ ignore?: string[];
20
+ } | null;
21
+ }
22
+ /**
23
+ * File URL on the data plane. A top-level navigation to this carries the
24
+ * cross-subdomain session cookie, so the browser can render files natively.
25
+ */
26
+ export declare function fileUrl(projectId: string, path: string, download?: boolean): string;
27
+ export declare function modeLabel(mode?: DriveVolume["mode"]): "Code Drive" | "File Drive";
28
+ export declare function driveLabel(drive: DriveVolume): string;
29
+ export declare function VolumeModeIcon({ mode, size, className, }: {
30
+ mode?: DriveVolume["mode"];
31
+ size?: number;
32
+ className?: string;
33
+ }): import("react/jsx-runtime").JSX.Element;
34
+ export declare function modeDescription(mode?: DriveVolume["mode"]): "For codebases and shell work. Polpo hydrates it into a real sandbox folder, then syncs useful changes back." | "For documents, uploaded assets, memory, skills, and files agents read or write on demand." | "Project volume.";
35
+ export declare function formatSize(bytes?: number): string;
36
+ export declare function EntryIcon({ entry }: {
37
+ entry: FileEntry;
38
+ }): import("react/jsx-runtime").JSX.Element;
39
+ //# sourceMappingURL=file-browser-primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-browser-primitives.d.ts","sourceRoot":"","sources":["../../../src/v2/files/file-browser-primitives.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC;IAClC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,GAAG,IAAI,CAAC;CACV;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,UAAQ,UAKxE;AAED,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,+BASnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,UAE5C;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,IAAS,EACT,SAAS,GACV,EAAE;IACD,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CASA;AAED,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,mOASzD;AAED,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,UAOxC;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,2CAcxD"}
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Code, File as FileIcon, FilePdf, FileText, FileZip, FolderOpen, ImageSquare, MusicNotes, VideoCamera, } from "@phosphor-icons/react";
4
+ /**
5
+ * File URL on the data plane. A top-level navigation to this carries the
6
+ * cross-subdomain session cookie, so the browser can render files natively.
7
+ */
8
+ export function fileUrl(projectId, path, download = false) {
9
+ void projectId;
10
+ return `/api/polpo/files/read?path=${encodeURIComponent(path)}${download ? "&download=1" : ""}`;
11
+ }
12
+ export function modeLabel(mode) {
13
+ switch (mode) {
14
+ case "code-drive":
15
+ return "Code Drive";
16
+ case "file-drive":
17
+ return "File Drive";
18
+ default:
19
+ return "File Drive";
20
+ }
21
+ }
22
+ export function driveLabel(drive) {
23
+ return drive.label?.trim() || drive.name;
24
+ }
25
+ export function VolumeModeIcon({ mode, size = 16, className, }) {
26
+ switch (mode) {
27
+ case "code-drive":
28
+ return _jsx(Code, { size: size, className: className });
29
+ case "file-drive":
30
+ return _jsx(FolderOpen, { size: size, className: className, weight: "fill" });
31
+ default:
32
+ return _jsx(FolderOpen, { size: size, className: className, weight: "fill" });
33
+ }
34
+ }
35
+ export function modeDescription(mode) {
36
+ switch (mode) {
37
+ case "code-drive":
38
+ return "For codebases and shell work. Polpo hydrates it into a real sandbox folder, then syncs useful changes back.";
39
+ case "file-drive":
40
+ return "For documents, uploaded assets, memory, skills, and files agents read or write on demand.";
41
+ default:
42
+ return "Project volume.";
43
+ }
44
+ }
45
+ export function formatSize(bytes) {
46
+ if (!bytes)
47
+ return "-";
48
+ if (bytes < 1024)
49
+ return `${bytes} B`;
50
+ if (bytes < 1024 * 1024)
51
+ return `${(bytes / 1024).toFixed(1)} KB`;
52
+ if (bytes < 1024 * 1024 * 1024)
53
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
54
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
55
+ }
56
+ export function EntryIcon({ entry }) {
57
+ if (entry.type === "directory")
58
+ return _jsx(FolderOpen, { size: 16, weight: "fill", className: "text-brand/70" });
59
+ const m = entry.mimeType ?? "";
60
+ const cls = "text-muted-foreground";
61
+ if (m.startsWith("image/"))
62
+ return _jsx(ImageSquare, { size: 16, className: cls });
63
+ if (m.startsWith("audio/"))
64
+ return _jsx(MusicNotes, { size: 16, className: cls });
65
+ if (m.startsWith("video/"))
66
+ return _jsx(VideoCamera, { size: 16, className: cls });
67
+ if (m === "application/pdf")
68
+ return _jsx(FilePdf, { size: 16, className: cls });
69
+ if (m.includes("zip") || m.includes("tar"))
70
+ return _jsx(FileZip, { size: 16, className: cls });
71
+ if (m.startsWith("text/") || m === "application/json")
72
+ return _jsx(FileText, { size: 16, className: cls });
73
+ return _jsx(FileIcon, { size: 16, className: cls });
74
+ }
75
+ //# sourceMappingURL=file-browser-primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-browser-primitives.js","sourceRoot":"","sources":["../../../src/v2/files/file-browser-primitives.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type FileEntry } from "./file-browser-primitives.js";
2
+ export declare function FileDirectoryBrowser({ projectId, rootPath, compact, initialEntries, onFileSelect, emptyLabel, }: {
3
+ projectId: string;
4
+ rootPath: string;
5
+ compact?: boolean;
6
+ initialEntries?: FileEntry[];
7
+ onFileSelect?: (filePath: string, fileName: string) => void;
8
+ emptyLabel?: string;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=file-directory-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-directory-browser.d.ts","sourceRoot":"","sources":["../../../src/v2/files/file-directory-browser.tsx"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,8BAA8B,CAAC;AAMtC,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,QAAQ,EACR,OAAe,EACf,cAAc,EACd,YAAY,EACZ,UAA8B,GAC/B,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,2CA8HA"}