@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,149 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * The live "Run" experience — the same shape as onboarding's Call step, reused
5
+ * DRY: call snippets + inputs on the LEFT, a live result on the RIGHT.
6
+ *
7
+ * • Chat → the real Playground (`PolpoChat`, seeded with your message) plus a
8
+ * Raw stream teed off that same call — one request, two views.
9
+ * • Task → creates the task on the data plane and shows its execution Trace
10
+ * (the v2 sessions renderer) once the run resolves a session, with the raw
11
+ * creation Response alongside.
12
+ *
13
+ * Both hit the data plane through the session proxy (dogfooding, no CORS). The
14
+ * copyable snippet still targets the tenant URL + Bearer key for the user's app.
15
+ */
16
+ import { useEffect, useRef, useState } from "react";
17
+ import { useMutation, useQuery } from "../host";
18
+ import { CircleNotch, Play, Key, Check } from "@phosphor-icons/react/dist/ssr";
19
+ import { Button } from "../ui/button";
20
+ import { CodeEditor } from "../ui/code-editor";
21
+ import { CopyButton } from "../ui/copy-button";
22
+ import { PolpoChat } from "../host";
23
+ import { chatToItems } from "../sessions/trace-detail";
24
+ import { Trace } from "../sessions/trace-detail-view";
25
+ import { useDashboardApi } from "../../host";
26
+ import { CALL_LANGS, buildCallSnippets, tenantBase, } from "../host";
27
+ export function AgentRunPanel({ projectId, agentName, }) {
28
+ const api = useDashboardApi();
29
+ const [mode, setMode] = useState("chat");
30
+ const [message, setMessage] = useState("Hello! What can you do?");
31
+ const [taskTitle, setTaskTitle] = useState("Summarize this week's issues");
32
+ const [taskDesc, setTaskDesc] = useState("Detailed instructions for the background task…");
33
+ const [lang, setLang] = useState("curl");
34
+ const [apiKey, setApiKey] = useState(null);
35
+ // Chat run — mirror the onboarding playground: one call, seeded + teed.
36
+ const [chatRunKey, setChatRunKey] = useState(0);
37
+ const [chatStatus, setChatStatus] = useState("idle");
38
+ const [chatRaw, setChatRaw] = useState("");
39
+ const [chatView, setChatView] = useState("playground");
40
+ const rawRef = useRef(null);
41
+ // Keep the raw stream pinned to the bottom as frames arrive.
42
+ useEffect(() => {
43
+ if (chatView === "raw" && rawRef.current) {
44
+ rawRef.current.scrollTop = rawRef.current.scrollHeight;
45
+ }
46
+ }, [chatRaw, chatView]);
47
+ // Task run — create it, then poll + resolve a session for the Trace.
48
+ const [taskId, setTaskId] = useState(null);
49
+ const [taskView, setTaskView] = useState("trace");
50
+ const [taskError, setTaskError] = useState(null);
51
+ const { data: project } = useQuery({
52
+ queryKey: ["project", projectId],
53
+ queryFn: () => api.fetchControlPlane(`/v1/projects/${projectId}`),
54
+ staleTime: 60_000,
55
+ });
56
+ const base = tenantBase(project?.slug);
57
+ const { code, codeLang } = buildCallSnippets({
58
+ base,
59
+ agentName,
60
+ streaming: mode === "chat",
61
+ message,
62
+ taskTitle,
63
+ taskDesc,
64
+ }).pick(lang);
65
+ const createKey = useMutation({
66
+ mutationFn: () => api.mutateControlPlane("/v1/api-keys", {
67
+ method: "POST",
68
+ body: {
69
+ orgId: project?.orgId,
70
+ name: `${agentName} · run`,
71
+ scopes: [{ type: "project", projectId }],
72
+ environment: "live",
73
+ },
74
+ }),
75
+ onSuccess: (d) => setApiKey(d.rawKey),
76
+ });
77
+ // Poll the created task, then its session's transcript for the live Trace.
78
+ const { data: taskData } = useQuery({
79
+ queryKey: ["run-task", projectId, taskId],
80
+ queryFn: () => api.fetchDataPlane(projectId, `/v1/tasks/${encodeURIComponent(taskId)}/activity`),
81
+ enabled: !!taskId,
82
+ refetchInterval: taskId ? 2000 : false,
83
+ });
84
+ const taskObj = taskData?.data?.task;
85
+ const taskRun = taskData?.data?.run;
86
+ const taskSessionId = taskRun?.sessionId
87
+ ?? taskRun?.activity?.sessionId
88
+ ?? taskObj?.sessionId;
89
+ const executionError = taskError ?? taskRun?.result?.stderr;
90
+ const { data: traceData, isFetching: traceFetching } = useQuery({
91
+ queryKey: ["run-task-trace", projectId, taskSessionId],
92
+ queryFn: () => api.fetchDataPlane(projectId, `/v1/chat/sessions/${encodeURIComponent(taskSessionId)}/messages`),
93
+ enabled: !!taskSessionId,
94
+ refetchInterval: taskSessionId ? 2000 : false,
95
+ });
96
+ const traceItems = chatToItems((traceData?.data?.messages ?? []));
97
+ const createTask = useMutation({
98
+ // Raw fetch preserves the streamed response shape used by this panel.
99
+ mutationFn: async () => {
100
+ const r = await fetch(api.runtimeUrl(projectId, "/v1/tasks"), {
101
+ method: "POST",
102
+ credentials: "include",
103
+ headers: { "Content-Type": "application/json" },
104
+ body: JSON.stringify({
105
+ assignTo: agentName,
106
+ title: taskTitle,
107
+ description: taskDesc,
108
+ }),
109
+ });
110
+ if (!r.ok)
111
+ throw new Error(`HTTP ${r.status}`);
112
+ return (await r.json());
113
+ },
114
+ onSuccess: (r) => {
115
+ setTaskId(r.data?.id ?? null);
116
+ setTaskView("trace");
117
+ },
118
+ onError: (e) => setTaskError(e instanceof Error ? e.message : "Failed to create task"),
119
+ });
120
+ const run = () => {
121
+ if (mode === "chat") {
122
+ setChatRaw("");
123
+ setChatStatus("running");
124
+ setChatView("playground");
125
+ setChatRunKey((k) => k + 1);
126
+ }
127
+ else {
128
+ setTaskError(null);
129
+ createTask.mutate();
130
+ }
131
+ };
132
+ const inputCls = "w-full rounded-md border border-border bg-background px-3 py-2 text-[13px] text-foreground placeholder:text-muted-foreground/40 focus:border-ring/50 focus:outline-none";
133
+ return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-4 md:flex-row", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-3 md:min-h-0 md:w-[44%] md:shrink-0", children: [_jsxs("div", { className: "shrink-0 space-y-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-[14px] font-semibold text-foreground", children: "Call it from your app" }), _jsxs("p", { className: "mt-0.5 text-[12px] leading-5 text-muted-foreground", children: ["This is how you integrate", " ", _jsx("span", { className: "font-mono text-foreground", children: agentName }), " \u2014 drop the snippet into your code. You can also run it here first just to test."] })] }), _jsx("div", { className: "inline-flex rounded-md border border-border p-0.5 text-[13px]", children: ["chat", "task"].map((m) => (_jsx("button", { type: "button", onClick: () => setMode(m), className: `rounded px-3 py-1 font-medium transition-colors ${mode === m
134
+ ? "bg-secondary text-foreground"
135
+ : "text-muted-foreground hover:text-foreground"}`, children: m === "chat" ? "Chat" : "Task" }, m))) }), mode === "chat" ? (_jsx("textarea", { value: message, onChange: (e) => setMessage(e.target.value), placeholder: "Ask it something\u2026", className: `${inputCls} h-16 resize-none` })) : (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("input", { value: taskTitle, onChange: (e) => setTaskTitle(e.target.value), placeholder: "Task title", className: inputCls }), _jsx("textarea", { value: taskDesc, onChange: (e) => setTaskDesc(e.target.value), placeholder: "Description \u2014 what to do, and what a good result looks like.", className: `${inputCls} h-16 resize-none` })] })), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Button, { variant: "secondary", onClick: run, disabled: mode === "task" && createTask.isPending, className: "gap-1.5", children: [mode === "task" && createTask.isPending ? (_jsx(CircleNotch, { size: 15, className: "animate-spin" })) : (_jsx(Play, { size: 15, weight: "fill" })), mode === "chat" ? "Test it here" : "Run a test task"] }), _jsx("span", { className: "text-[11px] text-muted-foreground", children: "Just a quick test \u2014 your app calls it with the snippet." })] })] }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between gap-2 border-b border-border", children: [_jsx("div", { className: "flex", children: CALL_LANGS.filter((l) => l.id !== "agent").map((l) => (_jsx("button", { type: "button", onClick: () => setLang(l.id), className: `-mb-px border-b-2 px-2.5 py-1.5 text-[12px] transition-colors ${lang === l.id
136
+ ? "border-brand font-medium text-foreground"
137
+ : "border-transparent text-muted-foreground hover:text-foreground"}`, children: l.label }, l.id))) }), _jsxs("div", { className: "flex items-center gap-2 pb-1", children: [!apiKey && (_jsxs(Button, { variant: "outline", size: "sm", disabled: !project?.orgId || createKey.isPending, onClick: () => createKey.mutate(), children: [createKey.isPending ? (_jsx(CircleNotch, { size: 13, className: "animate-spin" })) : (_jsx(Key, { size: 13 })), "Generate key"] })), _jsx(CopyButton, { text: code, label: "Copy" })] })] }), apiKey && (_jsxs("div", { className: "mt-2 flex shrink-0 items-center gap-2 rounded-md border border-brand/30 bg-brand/5 px-2.5 py-1.5", children: [_jsx(Check, { size: 13, weight: "bold", className: "shrink-0 text-brand" }), _jsx("code", { className: "min-w-0 flex-1 truncate font-mono text-[12px] text-foreground", children: apiKey }), _jsx(CopyButton, { text: `export POLPO_API_KEY=${apiKey}`, label: "Copy" })] })), _jsx("div", { className: "mt-2 min-h-0 flex-1 overflow-hidden rounded-lg border border-border", children: _jsx(CodeEditor, { language: codeLang === "typescript"
138
+ ? "typescript"
139
+ : codeLang === "python"
140
+ ? "python"
141
+ : "shell", value: code, onChange: () => { }, readOnly: true, height: "100%" }) })] })] }), _jsx("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col rounded-xl border border-border bg-card", children: mode === "chat" ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between gap-2 border-b border-border px-3 py-2", children: [_jsx("div", { className: "flex items-center gap-1", children: ["playground", "raw"].map((v) => (_jsx("button", { type: "button", onClick: () => setChatView(v), className: `rounded-md px-2 py-1 text-[12px] font-medium transition-colors ${chatView === v
142
+ ? "bg-secondary text-foreground"
143
+ : "text-muted-foreground hover:text-foreground"}`, children: v === "playground" ? "Playground" : "Raw stream" }, v))) }), chatStatus === "running" && (_jsx("span", { className: "text-[11px] text-muted-foreground", children: "streaming\u2026" })), chatStatus === "done" && (_jsx("span", { className: "text-[11px] font-medium text-emerald-600", children: "200 OK" }))] }), _jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: chatStatus === "idle" ? (_jsxs("div", { className: "flex h-full items-center justify-center px-6 text-center text-[13px] text-muted-foreground", children: ["Enter a message and hit \u201CRun chat\u201D to talk to ", agentName, "."] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: chatView === "playground"
144
+ ? "flex h-full min-h-0 min-w-0 flex-col overflow-hidden"
145
+ : "hidden", children: _jsx(PolpoChat, { baseUrl: api.dataPlaneBaseUrl(projectId), agent: agentName, initialMessage: message, seedKey: `run:${projectId}:${agentName}:${chatRunKey}`, onRawChunk: (c) => setChatRaw((r) => r + c), onRawDone: () => setChatStatus("done"), onRawError: () => setChatStatus("error") }, chatRunKey) }), _jsx("pre", { ref: rawRef, className: `h-full overflow-y-auto whitespace-pre-wrap break-words p-3 font-mono text-[11.5px] leading-relaxed text-muted-foreground ${chatView === "raw" ? "" : "hidden"}`, children: chatRaw || "…" })] })) })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between gap-2 border-b border-border px-3 py-2", children: [_jsx("div", { className: "flex items-center gap-1", children: ["trace", "response"].map((v) => (_jsx("button", { type: "button", onClick: () => setTaskView(v), className: `rounded-md px-2 py-1 text-[12px] font-medium transition-colors ${taskView === v
146
+ ? "bg-secondary text-foreground"
147
+ : "text-muted-foreground hover:text-foreground"}`, children: v === "trace" ? "Trace" : "Response" }, v))) }), taskObj?.status && (_jsx("span", { className: "text-[11px] font-medium text-muted-foreground", children: taskObj.status }))] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: executionError ? (_jsx("pre", { className: "whitespace-pre-wrap break-words p-3 font-mono text-[12px] leading-5 text-destructive", children: executionError })) : !taskId ? (_jsx("div", { className: "flex h-full items-center justify-center px-6 text-center text-[13px] text-muted-foreground", children: "Describe a task and hit \u201CRun task\u201D \u2014 its execution trace shows up here." })) : taskView === "trace" ? (traceItems.length > 0 ? (_jsx("div", { className: "p-4", children: _jsx(Trace, { items: traceItems }) })) : (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-2 px-6 text-center", children: [_jsx(CircleNotch, { size: 20, className: "animate-spin text-brand" }), _jsx("p", { className: "text-[13px] text-muted-foreground", children: "Task created \u2014 waiting for the run to start\u2026" })] }))) : (_jsx("pre", { className: "whitespace-pre-wrap break-words p-3 font-mono text-[11.5px] leading-relaxed text-muted-foreground", children: JSON.stringify(taskData?.data ?? { id: taskId }, null, 2) })) })] })) })] }));
148
+ }
149
+ //# sourceMappingURL=agent-run-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-run-panel.js","sourceRoot":"","sources":["../../../src/v2/agents/agent-run-panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function LoopsTab({ projectId, agentName, assignedLoops, }: {
2
+ projectId: string;
3
+ agentName: string;
4
+ assignedLoops: string[];
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=loops-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loops-tab.d.ts","sourceRoot":"","sources":["../../../src/v2/agents/loops-tab.tsx"],"names":[],"mappings":"AAqDA,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,SAAS,EACT,aAAa,GACd,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,2CA4NA"}
@@ -0,0 +1,160 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Fragment, useMemo, useState } from "react";
4
+ import { Link } from "../host";
5
+ import { useRouter } from "../host";
6
+ import { useQuery, useQueryClient } from "../host";
7
+ import { Plus, Minus, Envelope, PencilSimple, MagnifyingGlass, PaperPlaneTilt, Robot, Wrench, User, ArrowsClockwise, CaretRight, } from "@phosphor-icons/react/dist/ssr";
8
+ import { usePolpoClient } from "../host";
9
+ import { useDashboardApi } from "../../host";
10
+ import { Button } from "../ui/button";
11
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "../ui/dialog";
12
+ import { EmptyBox } from "../ui/bits";
13
+ import { DataTable } from "../ui/data-table";
14
+ function breakdown(loop) {
15
+ const steps = Object.values(loop.steps ?? {});
16
+ const by = (t) => steps.filter((s) => (s.type ?? "agent") === t).length;
17
+ return {
18
+ total: steps.length,
19
+ agent: by("agent"),
20
+ tool: by("tool"),
21
+ human: by("human"),
22
+ parallel: by("parallel"),
23
+ while: by("while"),
24
+ };
25
+ }
26
+ export function LoopsTab({ projectId, agentName, assignedLoops, }) {
27
+ const api = useDashboardApi();
28
+ const polpo = usePolpoClient(projectId);
29
+ const router = useRouter();
30
+ const queryClient = useQueryClient();
31
+ const [assigned, setAssigned] = useState(assignedLoops);
32
+ const [busy, setBusy] = useState(false);
33
+ const [error, setError] = useState(null);
34
+ const [addOpen, setAddOpen] = useState(false);
35
+ const [learnOpen, setLearnOpen] = useState(false);
36
+ const { data: loops = [] } = useQuery({
37
+ queryKey: ["loops", projectId],
38
+ queryFn: () => polpo.getLoops(),
39
+ });
40
+ async function patch(body) {
41
+ setBusy(true);
42
+ setError(null);
43
+ try {
44
+ await api.mutateDataPlane(projectId, `/v1/agents/${encodeURIComponent(agentName)}`, { method: "PATCH", body });
45
+ await queryClient.invalidateQueries({ queryKey: ["agents", projectId] });
46
+ router.refresh();
47
+ }
48
+ catch (e) {
49
+ setError(e instanceof Error ? e.message : "Update failed");
50
+ }
51
+ finally {
52
+ setBusy(false);
53
+ }
54
+ }
55
+ function assign(name) {
56
+ const next = [...new Set([...assigned, name])];
57
+ setAssigned(next);
58
+ patch({ assignedLoops: next });
59
+ setAddOpen(false);
60
+ }
61
+ function unassign(name) {
62
+ const next = assigned.filter((n) => n !== name);
63
+ setAssigned(next);
64
+ patch({ assignedLoops: next });
65
+ }
66
+ const { assignedCards, available } = useMemo(() => {
67
+ const set = new Set(assigned);
68
+ const byName = new Map(loops.map((l) => [l.name, l]));
69
+ const assignedCards = assigned.map((name) => byName.get(name) ?? { name });
70
+ const available = loops.filter((l) => !set.has(l.name));
71
+ return { assignedCards, available };
72
+ }, [assigned, loops]);
73
+ const columns = useMemo(() => [
74
+ {
75
+ id: "name",
76
+ header: "Loop",
77
+ accessorFn: (l) => l.name,
78
+ cell: ({ row }) => {
79
+ const loop = row.original;
80
+ const missing = !loop.steps;
81
+ return (_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "font-mono text-[13px] font-medium text-foreground", "data-mono": true, children: loop.name }), missing && (_jsx("span", { className: "shrink-0 rounded bg-destructive/10 px-1 py-0.5 font-mono text-[9px] uppercase text-destructive", children: "missing" }))] }));
82
+ },
83
+ meta: { width: 260 },
84
+ },
85
+ {
86
+ id: "steps",
87
+ header: "Steps",
88
+ enableSorting: false,
89
+ accessorFn: (l) => Object.keys(l.steps ?? {}).length,
90
+ cell: ({ row }) => {
91
+ const loop = row.original;
92
+ if (!loop.steps)
93
+ return _jsx("span", { className: "text-muted-foreground/40", children: "\u2014" });
94
+ const b = breakdown(loop);
95
+ const parts = [
96
+ b.agent && `${b.agent} agent`,
97
+ b.tool && `${b.tool} tool`,
98
+ b.human && `${b.human} human`,
99
+ b.parallel && `${b.parallel} parallel`,
100
+ b.while && `${b.while} while`,
101
+ ].filter(Boolean);
102
+ return (_jsxs("span", { className: "text-[12px] text-muted-foreground", children: [b.total, " step", b.total === 1 ? "" : "s", parts.length > 0 && ` · ${parts.join(" · ")}`] }));
103
+ },
104
+ },
105
+ {
106
+ id: "remove",
107
+ header: "",
108
+ enableSorting: false,
109
+ cell: ({ row }) => {
110
+ const loop = row.original;
111
+ return (_jsx("span", { "data-reveal": "", className: "flex justify-end", children: _jsx("button", { type: "button", onClick: (e) => {
112
+ e.stopPropagation();
113
+ unassign(loop.name);
114
+ }, onKeyDown: (e) => e.stopPropagation(), disabled: busy, "aria-label": "Unassign loop", className: "grid h-7 w-7 place-items-center rounded-md border border-border text-muted-foreground transition-colors hover:border-destructive/40 hover:text-destructive disabled:opacity-50", children: _jsx(Minus, { size: 14, weight: "bold" }) }) }));
115
+ },
116
+ meta: { width: 56, align: "right" },
117
+ },
118
+ ], [busy, unassign]);
119
+ return (_jsxs("div", { children: [_jsxs("p", { className: "mb-4 text-[13px] text-muted-foreground", children: ["A loop is a repeatable recipe your agent can run \u2014 a fixed set of steps it follows on its own, the same way every time. The default one runs when you don\u2019t pick a specific loop.", " ", _jsx("button", { type: "button", onClick: () => setLearnOpen(true), className: "font-medium text-brand transition-colors hover:underline", children: "Learn more" })] }), _jsx(LoopsHelpDialog, { open: learnOpen, onOpenChange: setLearnOpen }), _jsx(DataTable, { columns: columns, data: assignedCards, getRowId: (loop) => loop.name, rowHref: (loop) => loop.steps
120
+ ? `/projects/${projectId}/loops/${encodeURIComponent(loop.name)}`
121
+ : "", searchPlaceholder: "Search loops\u2026", searchFn: (loop, q) => loop.name.toLowerCase().includes(q), rightSlot: _jsxs(Button, { size: "sm", onClick: () => setAddOpen(true), children: [_jsx(Plus, { size: 14, weight: "bold" }), "Add loop"] }), empty: _jsx("span", { className: "text-sm text-muted-foreground", children: "No loops assigned. This agent runs the built-in loop." }), emptyFiltered: _jsx("span", { className: "text-sm text-muted-foreground", children: "No loops match your search." }) }), error && _jsx("p", { className: "mt-3 text-[12px] text-destructive", children: error }), _jsx(Dialog, { open: addOpen, onOpenChange: setAddOpen, children: _jsxs(DialogContent, { className: "v2 sm:max-w-lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { className: "text-[14px] font-semibold", children: "Add a loop" }) }), available.length === 0 ? (_jsxs(EmptyBox, { children: ["No other loops defined in this project.", " ", _jsx(Link, { href: `/projects/${projectId}/loops`, className: "text-brand transition-colors hover:underline", children: "Create one" }), "."] })) : (_jsx("div", { className: "flex max-h-[60vh] flex-col gap-2 overflow-auto", children: available.map((loop) => (_jsx(LoopCard, { projectId: projectId, loop: loop, busy: busy, onAssign: () => assign(loop.name) }, loop.name))) }))] }) })] }));
122
+ }
123
+ function LoopsHelpDialog({ open, onOpenChange, }) {
124
+ const flow = [
125
+ { icon: Envelope, label: "Read the request" },
126
+ { icon: PencilSimple, label: "Draft a reply" },
127
+ { icon: MagnifyingGlass, label: "Double-check it" },
128
+ { icon: PaperPlaneTilt, label: "Send it" },
129
+ ];
130
+ const stepTypes = [
131
+ { icon: Robot, label: "Agent", desc: "thinks or writes" },
132
+ { icon: Wrench, label: "Tool", desc: "runs an action" },
133
+ { icon: User, label: "Human", desc: "reviews or approves" },
134
+ { icon: ArrowsClockwise, label: "Repeat", desc: "until it's done" },
135
+ ];
136
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "v2 w-[calc(100vw-2rem)] sm:max-w-2xl", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { className: "text-[14px] font-semibold", children: "How loops work" }) }), _jsxs("div", { className: "flex flex-col gap-5", children: [_jsxs("p", { className: "text-[13.5px] leading-relaxed text-muted-foreground", children: ["A loop is a", " ", _jsx("span", { className: "font-medium text-foreground", children: "repeatable recipe" }), " ", "your agent follows \u2014 the same steps, in the same order, every time. Instead of improvising, it just runs the plan."] }), _jsxs("div", { children: [_jsx("div", { className: "mb-2 text-[11px] uppercase tracking-[0.06em] text-muted-foreground/60", children: "Example \u2014 answering a support request" }), _jsx("div", { className: "flex items-start gap-1 rounded-xl border border-border bg-card p-4", children: flow.map((s, i) => {
137
+ const Icon = s.icon;
138
+ return (_jsxs(Fragment, { children: [_jsxs("div", { className: "flex flex-1 flex-col items-center gap-2 text-center", children: [_jsx("span", { className: "grid h-12 w-12 place-items-center rounded-xl border border-brand/25 bg-brand/[0.08] text-brand", children: _jsx(Icon, { size: 22 }) }), _jsx("span", { className: "text-[11.5px] leading-tight text-foreground", children: s.label })] }), i < flow.length - 1 && (_jsx(CaretRight, { size: 16, weight: "bold", className: "mt-3.5 shrink-0 text-muted-foreground/35" }))] }, s.label));
139
+ }) })] }), _jsxs("div", { children: [_jsx("div", { className: "mb-2 text-[11px] uppercase tracking-[0.06em] text-muted-foreground/60", children: "A step can be" }), _jsx("div", { className: "grid grid-cols-2 gap-2 sm:grid-cols-4", children: stepTypes.map((s) => {
140
+ const Icon = s.icon;
141
+ return (_jsxs("div", { className: "flex flex-col gap-0.5 rounded-lg border border-border bg-card p-3", children: [_jsx(Icon, { size: 18, className: "mb-1 text-brand" }), _jsx("div", { className: "text-[13px] font-medium text-foreground", children: s.label }), _jsx("div", { className: "text-[11.5px] leading-tight text-muted-foreground", children: s.desc })] }, s.label));
142
+ }) })] }), _jsxs("div", { className: "grid gap-2 sm:grid-cols-2", children: [_jsxs("div", { className: "rounded-lg border border-border bg-secondary/30 p-3.5", children: [_jsx("div", { className: "text-[13px] font-medium text-foreground", children: "Why use one?" }), _jsx("p", { className: "mt-1 text-[12.5px] leading-relaxed text-muted-foreground", children: "Predictable, consistent results for things you do often \u2014 perfect for automations. For open-ended chatting, you don\u2019t need one." })] }), _jsxs("div", { className: "rounded-lg border border-border bg-secondary/30 p-3.5", children: [_jsx("div", { className: "text-[13px] font-medium text-foreground", children: "The default loop" }), _jsx("p", { className: "mt-1 text-[12.5px] leading-relaxed text-muted-foreground", children: "The one the agent runs automatically when you don\u2019t pick a specific loop." })] })] })] })] }) }));
143
+ }
144
+ function LoopCard({ loop, missing, busy, onUnassign, onAssign, projectId, }) {
145
+ const b = breakdown(loop);
146
+ const parts = [
147
+ b.agent && `${b.agent} agent`,
148
+ b.tool && `${b.tool} tool`,
149
+ b.human && `${b.human} human`,
150
+ b.parallel && `${b.parallel} parallel`,
151
+ b.while && `${b.while} while`,
152
+ ].filter(Boolean);
153
+ return (_jsxs("div", { className: "flex flex-col gap-2 rounded-lg border border-border bg-card p-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [missing ? (_jsx("span", { className: "truncate font-mono text-[12px] font-medium text-foreground", children: loop.name })) : (_jsx(Link, { href: `/projects/${projectId}/loops/${encodeURIComponent(loop.name)}`, className: "truncate font-mono text-[12px] font-medium text-foreground transition-colors hover:text-brand", children: loop.name })), missing && (_jsx("span", { className: "shrink-0 rounded bg-destructive/10 px-1 py-0.5 font-mono text-[9px] uppercase text-destructive", children: "missing" }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [onAssign && (_jsx(IconBtn, { label: "Assign", onClick: onAssign, disabled: busy, variant: "assign", children: _jsx(Plus, { size: 14, weight: "bold" }) })), onUnassign && (_jsx(IconBtn, { label: "Unassign", onClick: onUnassign, disabled: busy, variant: "remove", children: _jsx(Minus, { size: 14, weight: "bold" }) }))] })] }), loop.description && (_jsx("p", { className: "line-clamp-2 text-[12px] leading-snug text-muted-foreground", children: loop.description })), !missing && (_jsxs("div", { className: "font-mono text-[11px] text-muted-foreground/60", children: [b.total, " step", b.total === 1 ? "" : "s", parts.length > 0 && ` · ${parts.join(" · ")}`] }))] }));
154
+ }
155
+ function IconBtn({ children, label, onClick, disabled, variant, }) {
156
+ return (_jsx("button", { type: "button", onClick: onClick, disabled: disabled, "aria-label": label, className: `grid h-6 w-6 place-items-center rounded-md border transition-colors disabled:opacity-50 ${variant === "assign"
157
+ ? "border-border text-muted-foreground hover:border-brand/40 hover:text-brand"
158
+ : "border-border text-muted-foreground hover:border-destructive/40 hover:text-destructive"}`, children: children }));
159
+ }
160
+ //# sourceMappingURL=loops-tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loops-tab.js","sourceRoot":"","sources":["../../../src/v2/agents/loops-tab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type GatewayModel = {
2
+ id: string;
3
+ provider: string;
4
+ name: string;
5
+ context?: number;
6
+ routing?: "managed" | "direct" | "local";
7
+ credentialService?: string;
8
+ language?: string;
9
+ /** Best-effort input modalities (e.g. ["text","image"]). Undefined when unknown. */
10
+ input?: string[];
11
+ /** Best-effort output modalities (e.g. ["text"]). Undefined when unknown. */
12
+ output?: string[];
13
+ };
14
+ export declare function fetchModels(): Promise<GatewayModel[]>;
15
+ export declare function ModelSelect({ projectId, agentName, currentModel, field, options, }: {
16
+ projectId: string;
17
+ agentName: string;
18
+ currentModel?: string;
19
+ /** Agent config field to patch (e.g. "model", "vision_model", "tts_model"). */
20
+ field?: string;
21
+ /** Static catalog. When provided, the gateway is not queried. */
22
+ options?: GatewayModel[];
23
+ }): import("react/jsx-runtime").JSX.Element;
24
+ //# sourceMappingURL=model-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-select.d.ts","sourceRoot":"","sources":["../../../src/v2/agents/model-select.tsx"],"names":[],"mappings":"AAaA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AA4EF,wBAAsB,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAY3D;AAED,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,SAAS,EACT,YAAY,EACZ,KAAe,EACf,OAAO,GACR,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B,2CAqNA"}
@@ -0,0 +1,157 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useMemo, useRef, useState } from "react";
4
+ import { useMutation, useQuery, useQueryClient, useRouter } from "../host";
5
+ import { MagnifyingGlass, Check, CaretDown, CircleNotch, } from "@phosphor-icons/react/dist/ssr";
6
+ import { ProviderIcon } from "../host";
7
+ import { useDashboardApi } from "../../host";
8
+ const INPUT_BY_TYPE = {
9
+ language: ["text"],
10
+ realtime: ["text", "audio"],
11
+ transcription: ["audio"],
12
+ image: ["text"],
13
+ video: ["text"],
14
+ speech: ["text"],
15
+ embedding: ["text"],
16
+ reranking: ["text"],
17
+ };
18
+ const OUTPUT_BY_TYPE = {
19
+ language: ["text"],
20
+ realtime: ["text", "audio"],
21
+ transcription: ["text"],
22
+ image: ["image"],
23
+ video: ["video"],
24
+ speech: ["audio"],
25
+ embedding: ["embedding"],
26
+ reranking: ["ranking"],
27
+ };
28
+ /**
29
+ * Best-effort input/output modalities for a gateway model. Returns `undefined`
30
+ * for a side only when there is no signal to derive it from, so downstream
31
+ * capability filters can stay lenient (unknown => include, never exclude).
32
+ */
33
+ function deriveModalities(m) {
34
+ // 1) Prefer explicit modality arrays if upstream ever provides them.
35
+ const explicitInput = m.input_modalities ?? m.modalities?.input ?? m.architecture?.input_modalities;
36
+ const explicitOutput = m.output_modalities ?? m.modalities?.output ?? m.architecture?.output_modalities;
37
+ if (explicitInput || explicitOutput) {
38
+ return {
39
+ input: explicitInput ? [...explicitInput] : undefined,
40
+ output: explicitOutput ? [...explicitOutput] : undefined,
41
+ };
42
+ }
43
+ // 2) Derive from the gateway's `type` + `tags`.
44
+ const tags = m.tags ?? [];
45
+ const type = m.type;
46
+ if (type == null && tags.length === 0)
47
+ return {}; // no signal — stay lenient
48
+ const inputBase = type != null ? INPUT_BY_TYPE[type] : undefined;
49
+ const input = inputBase ? [...inputBase] : ["text"];
50
+ if (tags.includes("vision") && !input.includes("image"))
51
+ input.push("image");
52
+ const outputBase = type != null ? OUTPUT_BY_TYPE[type] : undefined;
53
+ // Unknown `type` => leave output undefined so the text filter includes it.
54
+ const output = outputBase ? [...outputBase] : undefined;
55
+ return { input, output };
56
+ }
57
+ export async function fetchModels() {
58
+ const r = await fetch("/api/polpo/models");
59
+ if (!r.ok)
60
+ return [];
61
+ const d = await r.json();
62
+ const raw = (d.data ?? d ?? []);
63
+ return raw
64
+ .filter((m) => m.id.includes("/"))
65
+ .map((m) => {
66
+ const [provider, ...rest] = m.id.split("/");
67
+ const { input, output } = deriveModalities(m);
68
+ return { id: m.id, provider, name: rest.join("/"), context: m.context_window, input, output };
69
+ });
70
+ }
71
+ export function ModelSelect({ projectId, agentName, currentModel, field = "model", options, }) {
72
+ const api = useDashboardApi();
73
+ const router = useRouter();
74
+ const queryClient = useQueryClient();
75
+ const [open, setOpen] = useState(false);
76
+ const [query, setQuery] = useState("");
77
+ const rootRef = useRef(null);
78
+ const { data: fetched = [], isLoading: fetching } = useQuery({
79
+ queryKey: ["gateway-models"],
80
+ queryFn: fetchModels,
81
+ staleTime: 5 * 60_000,
82
+ enabled: !options,
83
+ });
84
+ // Which capability the fetched catalog should be narrowed to. Slots that pass
85
+ // a static `options` catalog are already curated, so they get no filter.
86
+ const capability = field === "vision_model" ? "vision" : field === "model" ? "text" : null;
87
+ // Lenient capability filter: only drop a model when its modality data proves
88
+ // it does NOT match. Unknown/missing modality => keep, so the list is never
89
+ // wrongly emptied.
90
+ const capabilityFiltered = useMemo(() => {
91
+ if (!capability)
92
+ return fetched;
93
+ return fetched.filter((m) => {
94
+ if (capability === "vision") {
95
+ return !m.input || m.input.includes("image");
96
+ }
97
+ return !m.output || m.output.includes("text");
98
+ });
99
+ }, [capability, fetched]);
100
+ const models = options ?? capabilityFiltered;
101
+ const isLoading = !options && fetching;
102
+ const save = useMutation({
103
+ mutationFn: (model) => api.mutateDataPlane(projectId, `/v1/agents/${encodeURIComponent(agentName)}`, {
104
+ method: "PATCH",
105
+ body: { [field]: model },
106
+ }),
107
+ onSuccess: async () => {
108
+ await Promise.all([
109
+ queryClient.invalidateQueries({ queryKey: ["agent", projectId, agentName] }),
110
+ queryClient.invalidateQueries({ queryKey: ["agents", projectId] }),
111
+ ]);
112
+ setOpen(false);
113
+ setQuery("");
114
+ router.refresh();
115
+ },
116
+ });
117
+ const grouped = useMemo(() => {
118
+ const q = query.trim().toLowerCase();
119
+ const filtered = q
120
+ ? models.filter((m) => m.id.toLowerCase().includes(q) ||
121
+ m.name.toLowerCase().includes(q) ||
122
+ m.provider.toLowerCase().includes(q) ||
123
+ m.language?.toLowerCase().includes(q) ||
124
+ m.routing?.toLowerCase().includes(q))
125
+ : models;
126
+ const map = new Map();
127
+ for (const m of filtered) {
128
+ const list = map.get(m.provider) ?? [];
129
+ list.push(m);
130
+ map.set(m.provider, list);
131
+ }
132
+ return [...map.entries()].sort((a, b) => a[0].localeCompare(b[0]));
133
+ }, [models, query]);
134
+ const [curProvider, curName] = currentModel
135
+ ? [currentModel.split("/")[0], currentModel.split("/").slice(1).join("/")]
136
+ : [null, null];
137
+ const currentOption = currentModel
138
+ ? models.find((model) => model.id === currentModel)
139
+ : undefined;
140
+ return (_jsxs("div", { ref: rootRef, className: "relative inline-block", children: [_jsxs("button", { type: "button", onClick: () => setOpen((v) => !v), className: "flex h-9 min-w-[240px] items-center gap-2 rounded-md border border-border bg-card px-3 text-left transition-colors hover:border-muted-foreground/30 focus:outline-none focus-visible:outline-none focus-visible:!shadow-none", children: [currentModel ? (_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [curProvider && (_jsx(ProviderIcon, { provider: curProvider, size: 16, type: "mono", className: "shrink-0" })), _jsx("span", { className: "truncate font-mono text-[13px] text-foreground", children: currentOption?.name ?? curName })] })) : (_jsx("span", { className: "text-[13px] text-muted-foreground/60", children: "No model set" })), save.isPending ? (_jsx(CircleNotch, { size: 14, className: "ml-auto shrink-0 animate-spin text-muted-foreground" })) : (_jsx(CaretDown, { size: 13, className: "ml-auto shrink-0 text-muted-foreground" }))] }), open && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: () => {
141
+ setOpen(false);
142
+ setQuery("");
143
+ } }), _jsxs("div", { className: "absolute right-0 top-[calc(100%+4px)] z-50 w-[360px] max-w-[calc(100vw-2rem)] overflow-hidden rounded-md border border-border bg-popover shadow-xl", children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-border px-2.5", children: [_jsx(MagnifyingGlass, { size: 14, className: "shrink-0 text-muted-foreground" }), _jsx("input", { autoFocus: true, value: query, onChange: (e) => setQuery(e.target.value), onKeyDown: (e) => {
144
+ if (e.key === "Escape") {
145
+ setOpen(false);
146
+ setQuery("");
147
+ }
148
+ }, placeholder: "Search models\u2026", className: "h-9 w-full bg-transparent text-[13px] text-foreground placeholder:text-muted-foreground/50 focus:outline-none" })] }), _jsx("div", { className: "max-h-[340px] overflow-y-auto py-1", children: isLoading ? (_jsx("div", { className: "px-3 py-6 text-center text-[13px] text-muted-foreground", children: "Loading catalog\u2026" })) : grouped.length === 0 ? (_jsx("div", { className: "px-3 py-6 text-center text-[13px] text-muted-foreground", children: "No models match." })) : (grouped.map(([provider, list]) => (_jsxs("div", { className: "mb-1", children: [_jsxs("div", { className: "flex items-center gap-1.5 px-2.5 py-1 text-[10px] font-medium uppercase tracking-[0.08em] text-muted-foreground/50", children: [_jsx(ProviderIcon, { provider: provider, size: 13, type: "mono" }), provider] }), list.map((m) => {
149
+ const selected = m.id === currentModel;
150
+ return (_jsxs("button", { type: "button", onClick: () => save.mutate(m.id), className: `flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-[13px] transition-colors hover:bg-secondary/60 ${selected ? "text-foreground" : "text-muted-foreground"}`, children: [_jsx("span", { className: "w-3.5 shrink-0", children: selected && (_jsx(Check, { size: 13, weight: "bold", className: "text-brand" })) }), _jsx("span", { className: "min-w-0 truncate font-mono", children: m.name }), m.language ? (_jsx("span", { className: "ml-auto shrink-0 font-mono text-[10px] uppercase text-muted-foreground/50", children: m.language })) : null, m.routing ? (_jsx("span", { className: `${m.language ? "" : "ml-auto"} shrink-0 text-[10px] text-muted-foreground/50`, children: m.routing === "local"
151
+ ? "Local"
152
+ : m.routing === "direct"
153
+ ? "Vault key"
154
+ : "Managed" })) : null, m.context ? (_jsxs("span", { className: `${m.routing || m.language ? "" : "ml-auto"} shrink-0 font-mono text-[10px] text-muted-foreground/40`, "data-tabular": true, children: [Math.round(m.context / 1000), "k"] })) : null] }, m.id));
155
+ })] }, provider)))) })] })] })), save.isError && (_jsx("p", { className: "mt-1.5 text-[12px] text-destructive", children: save.error instanceof Error ? save.error.message : "Update failed" }))] }));
156
+ }
157
+ //# sourceMappingURL=model-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-select.js","sourceRoot":"","sources":["../../../src/v2/agents/model-select.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The composed system prompt the platform sends to the model, audited against
3
+ * the selected model's context window: a ring-gauge verdict on whether the
4
+ * system prompt is bloating the context, a per-block token breakdown, and the
5
+ * full prompt.
6
+ */
7
+ export declare function PromptPreviewDialog({ projectId, agentName, model, open, onOpenChange, }: {
8
+ projectId: string;
9
+ agentName: string;
10
+ /** The agent's current text model id, e.g. "anthropic/claude-sonnet-4.5". */
11
+ model?: string;
12
+ open: boolean;
13
+ onOpenChange: (open: boolean) => void;
14
+ }): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=prompt-preview-dialog.d.ts.map