@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,72 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { usePolpo } from "@polpo-ai/react";
4
+ export { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
5
+ export { Button } from "../ui/button.js";
6
+ export { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "../ui/dialog.js";
7
+ export { DataTable } from "../ui/data-table.js";
8
+ export { PageBody, PageHeader } from "../ui/page-header.js";
9
+ export { RefreshButton } from "../ui/refresh-button.js";
10
+ export { Skeleton } from "../ui/skeleton.js";
11
+ export const toast = {
12
+ success(message) {
13
+ window.dispatchEvent(new CustomEvent("polpo:notification", {
14
+ detail: { type: "success", message },
15
+ }));
16
+ },
17
+ error(message) {
18
+ window.dispatchEvent(new CustomEvent("polpo:notification", {
19
+ detail: { type: "error", message },
20
+ }));
21
+ },
22
+ };
23
+ function normalizeEntry(entry) {
24
+ return {
25
+ name: entry.name,
26
+ type: entry.type ?? (entry.isDirectory ? "directory" : "file"),
27
+ size: entry.size,
28
+ mimeType: entry.mimeType,
29
+ modifiedAt: entry.modifiedAt instanceof Date
30
+ ? entry.modifiedAt.toISOString()
31
+ : entry.modifiedAt,
32
+ };
33
+ }
34
+ export function usePolpoClient(_projectId) {
35
+ const { client } = usePolpo();
36
+ return useMemo(() => ({
37
+ async getVolumes() {
38
+ const { roots } = await client.getFileRoots();
39
+ const volumes = roots.map((root) => ({
40
+ id: root.id,
41
+ name: root.id,
42
+ label: root.name,
43
+ mode: root.id === "workspace"
44
+ ? "code-drive"
45
+ : "file-drive",
46
+ mountPath: root.path,
47
+ path: root.path,
48
+ absolutePath: root.absolutePath,
49
+ totalFiles: root.totalFiles,
50
+ totalSize: root.totalSize,
51
+ }));
52
+ return { volumes, defaults: { volume: volumes[0]?.name } };
53
+ },
54
+ async saveVolume(_volume) {
55
+ throw new Error("Drive management is not available in the self-hosted dashboard");
56
+ },
57
+ async removeVolume(_name) {
58
+ throw new Error("Drive management is not available in the self-hosted dashboard");
59
+ },
60
+ async listFiles(path) {
61
+ const result = await client.listFiles(path);
62
+ return {
63
+ path: result.path,
64
+ entries: result.entries.map(normalizeEntry),
65
+ };
66
+ },
67
+ createDirectory: (path) => client.createDirectory(path),
68
+ uploadFile: (path, file, name) => client.uploadFile(path, file, name),
69
+ deleteFile: (path) => client.deleteFile(path),
70
+ }), [client]);
71
+ }
72
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/v2/files/host.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type AnchorHTMLAttributes, type ReactNode } from "react";
2
+ import { ProviderIcon } from "@lobehub/icons";
3
+ export { PolpoChat } from "./agents/self-host-run-chat.js";
4
+ export { useMutation, useQuery, useQueryClient, } from "@tanstack/react-query";
5
+ export { ProviderIcon };
6
+ export { BASELINE_TOOLS, CATALOG_TOOL_NAMES, TOOL_CATALOG, countEnabledTools, isToolEnabled, type CatalogGroup, type CatalogTool, } from "./support/tool-catalog.js";
7
+ export { TYPE_FIELDS, TYPE_OPTIONS, buildCredentials, typeLabel, type VaultType, } from "./support/vault-fields.js";
8
+ export { CALL_LANGS, buildCallSnippets, tenantBase, type CallLang, } from "./support/agent-call-snippets.js";
9
+ export declare const DASHBOARD_API_URL = "";
10
+ export declare const AGENT_TAB_TO_SUB: Record<string, string>;
11
+ export declare const V2_FLAGS: {
12
+ readonly showTeams: false;
13
+ readonly showAvatars: false;
14
+ readonly showConnections: false;
15
+ };
16
+ export declare function usePolpoClient(_projectId?: string): import("@polpo-ai/sdk").PolpoClient;
17
+ export declare function Link({ href, onClick, children, ...props }: Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "href"> & {
18
+ href: string;
19
+ children?: ReactNode;
20
+ }): import("react/jsx-runtime").JSX.Element;
21
+ export declare function useRouter(): {
22
+ push: (href: string) => void;
23
+ replace: (href: string) => void;
24
+ refresh: () => void;
25
+ back: () => void;
26
+ forward: () => void;
27
+ };
28
+ export declare function useSearchParams(): URLSearchParams;
29
+ export declare function useParams<T extends Record<string, string>>(): T;
30
+ export declare function announceNavigationStart(_label: string, _href: string): void;
31
+ export declare function Markdown({ content }: {
32
+ content: string;
33
+ }): import("react/jsx-runtime").JSX.Element;
34
+ export declare function useCopilot(): {
35
+ openChat: ({ name, prompt, }: {
36
+ kind?: string;
37
+ name?: string;
38
+ prompt?: string;
39
+ }) => void;
40
+ };
41
+ export declare function decodeTextEntities(value: string): string;
42
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/v2/host.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EACL,WAAW,EACX,QAAQ,EACR,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,KAAK,SAAS,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,KAAK,QAAQ,GACd,MAAM,kCAAkC,CAAC;AAE1C,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWnD,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;CAIX,CAAC;AAEX,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,uCAEjD;AAED,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,GAAG;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,2CAwBA;AAED,wBAAgB,SAAS;iBAKN,MAAM;oBACH,MAAM;;;;EAa3B;AAED,wBAAgB,eAAe,IAAI,eAAe,CAIjD;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAW/D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAG;AAE/E,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,2CAExD;AAED,wBAAgB,UAAU;kCAMnB;QACD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;EAUJ;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBxD"}
@@ -0,0 +1,137 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useMemo, } from "react";
4
+ import ReactMarkdown from "react-markdown";
5
+ import { usePolpo } from "@polpo-ai/react";
6
+ import { ProviderIcon } from "@lobehub/icons";
7
+ import { useQueryClient as useTanStackQueryClient } from "@tanstack/react-query";
8
+ import { useDashboardHost } from "../host.js";
9
+ export { PolpoChat } from "./agents/self-host-run-chat.js";
10
+ export { useMutation, useQuery, useQueryClient, } from "@tanstack/react-query";
11
+ export { ProviderIcon };
12
+ export { BASELINE_TOOLS, CATALOG_TOOL_NAMES, TOOL_CATALOG, countEnabledTools, isToolEnabled, } from "./support/tool-catalog.js";
13
+ export { TYPE_FIELDS, TYPE_OPTIONS, buildCredentials, typeLabel, } from "./support/vault-fields.js";
14
+ export { CALL_LANGS, buildCallSnippets, tenantBase, } from "./support/agent-call-snippets.js";
15
+ export const DASHBOARD_API_URL = "";
16
+ export const AGENT_TAB_TO_SUB = {
17
+ models: "models",
18
+ prompt: "instructions",
19
+ instructions: "instructions",
20
+ tools: "tools",
21
+ skills: "skills",
22
+ memory: "memory",
23
+ vault: "permissions",
24
+ permissions: "permissions",
25
+ loops: "loops",
26
+ settings: "settings",
27
+ };
28
+ export const V2_FLAGS = {
29
+ showTeams: false,
30
+ showAvatars: false,
31
+ showConnections: false,
32
+ };
33
+ export function usePolpoClient(_projectId) {
34
+ return usePolpo().client;
35
+ }
36
+ export function Link({ href, onClick, children, ...props }) {
37
+ const host = useDashboardHost();
38
+ const resolved = host.href?.(href) ?? href;
39
+ const handleClick = (event) => {
40
+ onClick?.(event);
41
+ if (event.defaultPrevented ||
42
+ event.button !== 0 ||
43
+ event.metaKey ||
44
+ event.ctrlKey ||
45
+ event.shiftKey ||
46
+ event.altKey ||
47
+ props.target === "_blank") {
48
+ return;
49
+ }
50
+ event.preventDefault();
51
+ host.navigate(href);
52
+ };
53
+ return (_jsx("a", { ...props, href: resolved, onClick: handleClick, children: children }));
54
+ }
55
+ export function useRouter() {
56
+ const host = useDashboardHost();
57
+ const queryClient = useTanStackQueryClient();
58
+ return useMemo(() => ({
59
+ push: (href) => host.navigate(href),
60
+ replace: (href) => {
61
+ const resolved = host.href?.(href) ?? href;
62
+ window.history.replaceState(null, "", resolved);
63
+ window.dispatchEvent(new PopStateEvent("popstate"));
64
+ },
65
+ refresh: () => {
66
+ void queryClient.invalidateQueries();
67
+ },
68
+ back: () => window.history.back(),
69
+ forward: () => window.history.forward(),
70
+ }), [host, queryClient]);
71
+ }
72
+ export function useSearchParams() {
73
+ return new URLSearchParams(typeof window === "undefined" ? "" : window.location.search);
74
+ }
75
+ export function useParams() {
76
+ const host = useDashboardHost();
77
+ const path = typeof window === "undefined" ? "" : window.location.pathname;
78
+ const parts = path.split("/").filter(Boolean).map(decodeURIComponent);
79
+ const detailIndex = parts.findIndex((part) => part === "agents" || part === "skills");
80
+ return {
81
+ id: host.project.id,
82
+ name: detailIndex >= 0 ? parts[detailIndex + 1] ?? "" : "",
83
+ };
84
+ }
85
+ export function announceNavigationStart(_label, _href) { }
86
+ export function Markdown({ content }) {
87
+ return _jsx(ReactMarkdown, { children: content });
88
+ }
89
+ export function useCopilot() {
90
+ const host = useDashboardHost();
91
+ return {
92
+ openChat: ({ name, prompt, }) => {
93
+ if (prompt) {
94
+ try {
95
+ window.sessionStorage.setItem("polpo:playground-seed", prompt);
96
+ }
97
+ catch { }
98
+ }
99
+ const query = name ? `?agent=${encodeURIComponent(name)}` : "";
100
+ host.navigate(`/projects/${host.project.id}/playground${query}`);
101
+ },
102
+ };
103
+ }
104
+ export function decodeTextEntities(value) {
105
+ if (!value.includes("&"))
106
+ return value;
107
+ let decoded = value;
108
+ for (let index = 0; index < 2; index += 1) {
109
+ const next = decoded
110
+ .replace(/&#(\d+);/g, (match, code) => charFromCodePoint(Number(code), match))
111
+ .replace(/&#x([0-9a-f]+);/gi, (match, code) => charFromCodePoint(Number.parseInt(code, 16), match))
112
+ .replace(/&quot;/g, '"')
113
+ .replace(/&apos;/g, "'")
114
+ .replace(/&lt;/g, "<")
115
+ .replace(/&gt;/g, ">")
116
+ .replace(/&nbsp;/g, " ")
117
+ .replace(/&amp;/g, "&");
118
+ if (next === decoded)
119
+ break;
120
+ decoded = next;
121
+ }
122
+ return decoded;
123
+ }
124
+ function charFromCodePoint(codePoint, fallback) {
125
+ if (!Number.isInteger(codePoint) ||
126
+ codePoint < 0 ||
127
+ codePoint > 0x10ffff) {
128
+ return fallback;
129
+ }
130
+ try {
131
+ return String.fromCodePoint(codePoint);
132
+ }
133
+ catch {
134
+ return fallback;
135
+ }
136
+ }
137
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/v2/host.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,OAAO,GAIR,MAAM,OAAO,CAAC;AACf,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EACL,WAAW,EACX,QAAQ,EACR,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,aAAa,GAGd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,SAAS,GAEV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,UAAU,GAEX,MAAM,kCAAkC,CAAC;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,cAAc;IACtB,YAAY,EAAE,cAAc;IAC5B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,aAAa;IAC1B,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,KAAK;IAClB,eAAe,EAAE,KAAK;CACd,CAAC;AAEX,MAAM,UAAU,cAAc,CAAC,UAAmB;IAChD,OAAO,QAAQ,EAAE,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EACnB,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,GAAG,KAAK,EAIT;IACC,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC3C,MAAM,WAAW,GAAG,CAAC,KAAoC,EAAE,EAAE;QAC3D,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACjB,IACE,KAAK,CAAC,gBAAgB;YACtB,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,KAAK,CAAC,OAAO;YACb,KAAK,CAAC,OAAO;YACb,KAAK,CAAC,QAAQ;YACd,KAAK,CAAC,MAAM;YACZ,KAAK,CAAC,MAAM,KAAK,QAAQ,EACzB,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,OAAO,CACL,eAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,YAC/C,QAAQ,GACP,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,sBAAsB,EAAE,CAAC;IAC7C,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC3C,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,KAAK,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACvC,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QACjC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE;KACxC,CAAC,EACF,CAAC,IAAI,EAAE,WAAW,CAAC,CACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,eAAe,CACxB,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,CACjD,CAAC;IACF,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;QACnB,IAAI,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;KAC3C,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,KAAa,IAAS,CAAC;AAE/E,MAAM,UAAU,QAAQ,CAAC,EAAE,OAAO,EAAuB;IACvD,OAAO,KAAC,aAAa,cAAE,OAAO,GAAiB,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,OAAO;QACL,QAAQ,EAAE,CAAC,EACT,IAAI,EACJ,MAAM,GAKP,EAAE,EAAE;YACH,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;gBACjE,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO;aACjB,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CAC5C,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CACvC;aACA,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACpD,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CACpD;aACA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM;QAC5B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB,EAAE,QAAgB;IAC5D,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;QAC5B,SAAS,GAAG,CAAC;QACb,SAAS,GAAG,QAAQ,EACpB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type CanvasTabId = "trace" | "drive";
2
+ export declare function ChatCanvas({ projectId, sessionId, tab, onTabChange, onClose, }: {
3
+ projectId: string;
4
+ sessionId: string | undefined;
5
+ tab: CanvasTabId;
6
+ onTabChange: (tab: CanvasTabId) => void;
7
+ onClose: () => void;
8
+ }): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=chat-canvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-canvas.d.ts","sourceRoot":"","sources":["../../../src/v2/playground/chat-canvas.tsx"],"names":[],"mappings":"AAyBA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;AAK5C,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,SAAS,EACT,GAAG,EACH,WAAW,EACX,OAAO,GACR,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,GAAG,EAAE,WAAW,CAAC;IACjB,WAAW,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,2CA4EA"}
@@ -0,0 +1,88 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * Chat canvas — the collapsible, resizable right panel of the v2 playground,
5
+ * rendered as a floating card (matches the v2 copilot dock / builder). Two
6
+ * tabs:
7
+ * • Trace — the live transcript/step inspector for the current run, reusing
8
+ * the v2 sessions renderer (`<Trace>`) fed by `chatToItems`, polled so it
9
+ * tracks the run near-live.
10
+ * • Drive — the project file browser, reusing the existing v2 files section
11
+ * component (`<FilesBrowser>`).
12
+ */
13
+ import { useEffect, useRef, useState, } from "react";
14
+ import { Bug, FolderOpen, X } from "@phosphor-icons/react";
15
+ import { SessionsHostProvider } from "../sessions/host.js";
16
+ import { chatToItems } from "../sessions/trace-detail.js";
17
+ import { Trace } from "../sessions/trace-detail-view.js";
18
+ import { usePlaygroundHost } from "./host.js";
19
+ const CANVAS_DEFAULT_WIDTH = 640;
20
+ const CANVAS_MIN_WIDTH = 480;
21
+ const CANVAS_MAX_WIDTH = 960;
22
+ export function ChatCanvas({ projectId, sessionId, tab, onTabChange, onClose, }) {
23
+ const host = usePlaygroundHost();
24
+ const { FilesBrowser } = host.components;
25
+ const [width, setWidth] = useState(CANVAS_DEFAULT_WIDTH);
26
+ const [resizing, setResizing] = useState(false);
27
+ // Drag the left edge to resize the card.
28
+ const startResize = (e) => {
29
+ e.preventDefault();
30
+ setResizing(true);
31
+ const startX = e.clientX;
32
+ const startW = width;
33
+ const onMove = (ev) => setWidth(Math.min(CANVAS_MAX_WIDTH, Math.max(CANVAS_MIN_WIDTH, startW - (ev.clientX - startX))));
34
+ const onUp = () => {
35
+ setResizing(false);
36
+ window.removeEventListener("pointermove", onMove);
37
+ window.removeEventListener("pointerup", onUp);
38
+ };
39
+ window.addEventListener("pointermove", onMove);
40
+ window.addEventListener("pointerup", onUp);
41
+ };
42
+ return (_jsxs("div", { className: "relative h-full shrink-0 py-3 pl-1.5 pr-3", children: [_jsxs("div", { onPointerDown: startResize, role: "separator", "aria-orientation": "vertical", "data-resizing": resizing || undefined, className: "group absolute inset-y-3 left-0 z-30 flex w-3 cursor-col-resize items-center justify-center", children: [_jsx("div", { className: "absolute inset-y-[6%] left-1/2 w-px -translate-x-1/2 bg-border transition-colors group-hover:bg-brand/40 group-data-[resizing]:bg-brand/60" }), _jsx("div", { className: "relative h-7 w-1 rounded-full bg-border shadow-sm transition-all duration-150 group-hover:h-9 group-hover:bg-brand group-data-[resizing]:h-9 group-data-[resizing]:bg-brand" })] }), _jsxs("aside", { style: { width }, className: "flex h-full max-w-[calc(100vw-4rem)] flex-col overflow-hidden rounded-xl border border-border bg-card shadow-xl", children: [_jsxs("header", { className: "flex h-11 shrink-0 items-center gap-0.5 border-b border-border px-2", children: [_jsx(CanvasTab, { active: tab === "trace", onClick: () => onTabChange("trace"), icon: _jsx(Bug, { size: 14, weight: tab === "trace" ? "fill" : "regular" }), label: "Trace" }), _jsx(CanvasTab, { active: tab === "drive", onClick: () => onTabChange("drive"), icon: _jsx(FolderOpen, { size: 14, weight: tab === "drive" ? "fill" : "regular" }), label: "Drive" }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close canvas", className: "ml-auto grid h-7 w-7 place-items-center rounded-md text-muted-foreground transition-colors hover:bg-secondary/60 hover:text-foreground", children: _jsx(X, { size: 15 }) })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto bg-background", children: tab === "trace" ? (_jsx(TraceTab, { projectId: projectId, sessionId: sessionId })) : (_jsx("div", { className: "p-3", children: _jsx(FilesBrowser, { projectId: projectId, embedded: true }) })) })] })] }));
43
+ }
44
+ function CanvasTab({ active, onClick, icon, label, }) {
45
+ return (_jsxs("button", { type: "button", onClick: onClick, className: `inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-[13px] font-medium transition-colors ${active
46
+ ? "bg-secondary text-foreground"
47
+ : "text-muted-foreground hover:bg-secondary/60 hover:text-foreground"}`, children: [icon, label] }));
48
+ }
49
+ function TraceTab({ projectId, sessionId, }) {
50
+ const host = usePlaygroundHost();
51
+ const { RefreshButton } = host.components;
52
+ // Poll ONLY while a run is streaming: `<PolpoChat>` dispatches
53
+ // `polpo:trace-activity` on every chat update; we hold a short "active"
54
+ // window that keeps polling for 3s after the last event, then stops. Idle =
55
+ // no polling (no more refetching-forever when nothing is happening).
56
+ const [active, setActive] = useState(false);
57
+ const idleTimer = useRef(undefined);
58
+ useEffect(() => {
59
+ const onActivity = () => {
60
+ setActive(true);
61
+ if (idleTimer.current)
62
+ clearTimeout(idleTimer.current);
63
+ idleTimer.current = setTimeout(() => setActive(false), 3000);
64
+ };
65
+ window.addEventListener("polpo:trace-activity", onActivity);
66
+ return () => {
67
+ window.removeEventListener("polpo:trace-activity", onActivity);
68
+ if (idleTimer.current)
69
+ clearTimeout(idleTimer.current);
70
+ };
71
+ }, []);
72
+ const { messages, isLoading, isFetching, refetch } = host.data.useTrace({
73
+ projectId,
74
+ sessionId,
75
+ active,
76
+ });
77
+ const items = chatToItems(messages);
78
+ // A run exists but its trace is still loading — show a skeleton, not the
79
+ // "send a message" empty state (which wrongly reads as "nothing happened").
80
+ if (sessionId && isLoading && items.length === 0) {
81
+ return (_jsx("div", { className: "flex flex-col gap-2 p-4", children: Array.from({ length: 7 }).map((_, i) => (_jsx("div", { className: "h-8 animate-pulse rounded-md bg-muted/60" }, i))) }));
82
+ }
83
+ if (!sessionId || items.length === 0) {
84
+ return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-2.5 px-6 text-center", children: [_jsx(Bug, { size: 24, className: "text-muted-foreground/40" }), _jsx("p", { className: "text-[13px] text-muted-foreground", children: "Send a message to inspect the run \u2014 every step, tool call and result shows up here." })] }));
85
+ }
86
+ return (_jsx("div", { className: "p-4", children: _jsx(SessionsHostProvider, { host: host.sessions, children: _jsx(Trace, { items: items, rightSlot: _jsx(RefreshButton, { onClick: () => refetch(), busy: isFetching }) }) }) }));
87
+ }
88
+ //# sourceMappingURL=chat-canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-canvas.js","sourceRoot":"","sources":["../../../src/v2/playground/chat-canvas.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import type { AnchorHTMLAttributes, ComponentType, ReactNode } from "react";
2
+ import type { SessionsHostAdapter } from "../sessions/host.js";
3
+ export type PlaygroundAgent = {
4
+ name: string;
5
+ model?: string;
6
+ assignedLoops?: string[];
7
+ role?: string;
8
+ };
9
+ export type LinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {
10
+ href: string;
11
+ children: ReactNode;
12
+ };
13
+ export type PlaygroundTraceResource = {
14
+ messages: unknown[];
15
+ isLoading: boolean;
16
+ isFetching: boolean;
17
+ refetch: () => unknown;
18
+ };
19
+ export interface PlaygroundHostAdapter {
20
+ sessions: SessionsHostAdapter;
21
+ showAvatars: boolean;
22
+ logoSrc: string;
23
+ data: {
24
+ dataPlaneBaseUrl(projectId: string): string;
25
+ useTrace(args: {
26
+ projectId: string;
27
+ sessionId: string | undefined;
28
+ active: boolean;
29
+ }): PlaygroundTraceResource;
30
+ };
31
+ navigation: {
32
+ searchEntries(): Iterable<[string, string]>;
33
+ replace(path: string, options?: {
34
+ scroll?: boolean;
35
+ }): void;
36
+ };
37
+ routes: {
38
+ projects(): string;
39
+ agents(projectId: string): string;
40
+ agent(projectId: string, agentName: string): string;
41
+ };
42
+ components: {
43
+ Link: ComponentType<LinkProps>;
44
+ Image: ComponentType<{
45
+ src: string;
46
+ alt: string;
47
+ width: number;
48
+ height: number;
49
+ priority?: boolean;
50
+ className?: string;
51
+ }>;
52
+ ProviderIcon: ComponentType<{
53
+ provider: string;
54
+ size: number;
55
+ type: "mono";
56
+ className?: string;
57
+ }>;
58
+ ChatAgentSelector: ComponentType<{
59
+ agents: Array<{
60
+ name: string;
61
+ role?: string;
62
+ }>;
63
+ selected: string | undefined;
64
+ onSelect: (name: string) => void;
65
+ variant: "command";
66
+ fallbackLabel: string;
67
+ renderAvatar?: () => ReactNode;
68
+ className?: string;
69
+ }>;
70
+ ChatLanding: ComponentType<{
71
+ greeting: string;
72
+ subtitle: string;
73
+ inputPlaceholder: string;
74
+ header: ReactNode;
75
+ }>;
76
+ PolpoChat: ComponentType<{
77
+ baseUrl: string;
78
+ agent: string | undefined;
79
+ loop: string | undefined;
80
+ onSession: (sessionId: string | undefined) => void;
81
+ landing: ReactNode;
82
+ composerControls: ReactNode;
83
+ gutter: "none";
84
+ }>;
85
+ Select: ComponentType<{
86
+ value: string;
87
+ onValueChange: (value: string) => void;
88
+ children: ReactNode;
89
+ }>;
90
+ SelectTrigger: ComponentType<{
91
+ className?: string;
92
+ children: ReactNode;
93
+ }>;
94
+ SelectContent: ComponentType<{
95
+ children: ReactNode;
96
+ }>;
97
+ SelectItem: ComponentType<{
98
+ value: string;
99
+ children: ReactNode;
100
+ }>;
101
+ FilesBrowser: ComponentType<{
102
+ projectId: string;
103
+ embedded?: boolean;
104
+ }>;
105
+ RefreshButton: ComponentType<{
106
+ onClick: () => unknown;
107
+ busy?: boolean;
108
+ }>;
109
+ };
110
+ }
111
+ export declare function PlaygroundHostProvider({ host, children, }: {
112
+ host: PlaygroundHostAdapter;
113
+ children: ReactNode;
114
+ }): import("react").FunctionComponentElement<import("react").ProviderProps<PlaygroundHostAdapter | null>>;
115
+ export declare function usePlaygroundHost(): PlaygroundHostAdapter;
116
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../src/v2/playground/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { createContext, createElement, useContext } from "react";
2
+ const PlaygroundHostContext = createContext(null);
3
+ export function PlaygroundHostProvider({ host, children, }) {
4
+ return createElement(PlaygroundHostContext.Provider, { value: host }, children);
5
+ }
6
+ export function usePlaygroundHost() {
7
+ const host = useContext(PlaygroundHostContext);
8
+ if (!host)
9
+ throw new Error("Playground v2 requires a PlaygroundHostAdapter");
10
+ return host;
11
+ }
12
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/v2/playground/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAqGjE,MAAM,qBAAqB,GAAG,aAAa,CAA+B,IAAI,CAAC,CAAC;AAEhF,MAAM,UAAU,sBAAsB,CAAC,EACrC,IAAI,EACJ,QAAQ,GAIT;IACC,OAAO,aAAa,CAAC,qBAAqB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type ReactNode } from "react";
2
+ export declare function SelfHostPolpoChat({ agent, loop, onSession, landing, composerControls, gutter, }: {
3
+ baseUrl: string;
4
+ agent: string | undefined;
5
+ loop: string | undefined;
6
+ onSession: (sessionId: string | undefined) => void;
7
+ landing: ReactNode;
8
+ composerControls: ReactNode;
9
+ gutter: "none";
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=self-host-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-host-chat.d.ts","sourceRoot":"","sources":["../../../src/v2/playground/self-host-chat.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAkBrH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,IAAI,EACJ,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,MAAM,GACP,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACnD,OAAO,EAAE,SAAS,CAAC;IACnB,gBAAgB,EAAE,SAAS,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,2CAoCA"}
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { PolpoProvider } from "@polpo-ai/react";
5
+ import { usePolpoChatAdapter, PolpoChatCapabilitiesMenu, usePolpoChatSlashItems } from "@lumea-labs/chat-polpo";
6
+ import { Chat, ChatAskUser, ChatProvider, ChatTriggerMenu, ToolCallVariantProvider, useChatContext, useChatTriggerMenu, useSubmitHandler, } from "@lumea-labs/chat";
7
+ import { ToolFileOpenProvider } from "@lumea-labs/tool-calls";
8
+ import { ArrowUp, Paperclip, Square, X } from "lucide-react";
9
+ export function SelfHostPolpoChat({ agent, loop, onSession, landing, composerControls, gutter, }) {
10
+ const initialSession = useRef(typeof window === "undefined" ? undefined : new URLSearchParams(window.location.search).get("session") ?? undefined);
11
+ const pendingSession = useRef(initialSession.current);
12
+ const previous = useRef({ agent, loop });
13
+ useEffect(() => { onSession(initialSession.current); }, [onSession]);
14
+ useEffect(() => {
15
+ if (previous.current.agent === agent && previous.current.loop === loop)
16
+ return;
17
+ previous.current = { agent, loop };
18
+ initialSession.current = undefined;
19
+ pendingSession.current = undefined;
20
+ onSession(undefined);
21
+ }, [agent, loop, onSession]);
22
+ return (_jsx(PolpoProvider, { baseUrl: "", apiPrefix: "/api/polpo", autoConnect: false, children: _jsx(SelfHostChatSurface, { agent: agent, loop: loop, sessionId: initialSession.current, landing: landing, composerControls: composerControls, gutter: gutter, onSessionCreated: (id) => { pendingSession.current = id; onSession(id); }, onFinish: () => {
23
+ const id = pendingSession.current;
24
+ if (!id)
25
+ return;
26
+ const params = new URLSearchParams(window.location.search);
27
+ params.set("session", id);
28
+ window.history.replaceState(null, "", `?${params.toString()}`);
29
+ } }) }));
30
+ }
31
+ function SelfHostChatSurface({ agent, loop, sessionId, landing, composerControls, gutter, onSessionCreated, onFinish }) {
32
+ const adapter = usePolpoChatAdapter({
33
+ sessionId,
34
+ agent,
35
+ loop,
36
+ onSessionCreated,
37
+ onUpdate: () => window.dispatchEvent(new CustomEvent("polpo:trace-activity")),
38
+ onFinish: () => { onFinish(); window.dispatchEvent(new CustomEvent("polpo:trace-activity")); },
39
+ });
40
+ return (_jsx(ChatProvider, { adapter: adapter, children: _jsx(ToolFileOpenProvider, { onOpenFile: (path) => window.open(`/api/polpo/v1/files/read?path=${encodeURIComponent(path)}`, "_blank", "noopener,noreferrer"), children: _jsx(ToolCallVariantProvider, { variant: "task", children: _jsx(Chat, { className: "flex-1", gutter: gutter, children: ({ hasMessages }) => hasMessages ? _jsx(InputBar, { agent: agent, controls: composerControls }) : landing }) }) }) }));
41
+ }
42
+ function InputBar({ agent, controls }) {
43
+ const { sendMessage, isStreaming, abort, uploadFile, isUploading, pendingToolCall } = useChatContext();
44
+ const [text, setText] = useState("");
45
+ const [pendingFiles, setPendingFiles] = useState([]);
46
+ const fileInputRef = useRef(null);
47
+ const submit = useSubmitHandler(sendMessage, uploadFile);
48
+ const askUserQuestions = pendingToolCall?.toolName === "ask_user_question" ? (pendingToolCall.arguments?.questions ?? []) : null;
49
+ const slash = usePolpoChatSlashItems({ agent, skillsScope: "assigned" });
50
+ const slashMenu = useChatTriggerMenu({ triggers: slash.triggers, onSelect: (item) => { void slash.onSelect(item); } });
51
+ const handleSend = useCallback(async () => {
52
+ const trimmed = text.trim();
53
+ if (!trimmed && pendingFiles.length === 0)
54
+ return;
55
+ const message = { text: trimmed, files: pendingFiles.map((file) => ({ url: URL.createObjectURL(file), filename: file.name })) };
56
+ setText("");
57
+ setPendingFiles([]);
58
+ try {
59
+ await submit(message);
60
+ }
61
+ finally {
62
+ message.files.forEach((file) => URL.revokeObjectURL(file.url));
63
+ }
64
+ }, [pendingFiles, submit, text]);
65
+ if (askUserQuestions?.length) {
66
+ return _jsx("div", { className: "shrink-0", children: _jsx("div", { className: "mx-auto max-w-3xl px-4 py-3", children: _jsx(ChatAskUser, { variant: "command", questions: askUserQuestions, onSubmit: (answers) => void sendMessage(JSON.stringify({ answers })) }) }) });
67
+ }
68
+ function handleSubmit(event) {
69
+ event.preventDefault();
70
+ if (isStreaming)
71
+ abort();
72
+ else
73
+ void handleSend();
74
+ }
75
+ function handleKeyDown(event) {
76
+ slashMenu.onKeyDown(event);
77
+ if (!event.defaultPrevented && event.key === "Enter" && !event.shiftKey) {
78
+ event.preventDefault();
79
+ void handleSend();
80
+ }
81
+ }
82
+ return (_jsx("form", { onSubmit: handleSubmit, className: "shrink-0", children: _jsxs("div", { className: "mx-auto max-w-3xl px-4 py-3", children: [pendingFiles.length > 0 && _jsx("div", { className: "mb-2 flex flex-wrap gap-2", children: pendingFiles.map((file, index) => _jsxs("span", { className: "inline-flex items-center gap-1.5 rounded border border-border bg-card px-2 py-1 text-xs font-mono", children: [file.name, _jsx("button", { type: "button", onClick: () => setPendingFiles((items) => items.filter((_, itemIndex) => itemIndex !== index)), "aria-label": `Remove ${file.name}`, className: "text-muted-foreground hover:text-foreground", children: _jsx(X, { className: "h-3 w-3" }) })] }, `${file.name}-${index}`)) }), _jsxs("div", { className: "relative rounded-2xl border border-border bg-card shadow-sm transition-colors focus-within:border-foreground/20", children: [_jsx("textarea", { ref: slashMenu.inputRef, value: text, onChange: (event) => { setText(event.target.value); slashMenu.onChange(event); }, onKeyDown: handleKeyDown, placeholder: "Send a message\u2026", rows: 2, className: "block max-h-[200px] min-h-[58px] w-full resize-none overflow-y-auto bg-transparent px-4 py-3.5 text-sm placeholder:text-muted-foreground/50 [field-sizing:content] focus:outline-none" }), _jsx(ChatTriggerMenu, { ...slashMenu.menuProps }), _jsxs("div", { className: "flex items-center gap-1 border-t border-border px-2 py-1.5", children: [controls && _jsxs(_Fragment, { children: [controls, _jsx("div", { className: "mx-1 h-4 w-px bg-border" })] }), _jsx("input", { ref: fileInputRef, type: "file", multiple: true, hidden: true, onChange: (event) => { if (event.target.files)
83
+ setPendingFiles((items) => [...items, ...Array.from(event.target.files)]); event.target.value = ""; } }), _jsx("button", { type: "button", onClick: () => fileInputRef.current?.click(), disabled: isUploading, className: "inline-flex size-8 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:opacity-50", "aria-label": "Attach file", children: _jsx(Paperclip, { className: "h-4 w-4" }) }), _jsx(PolpoChatCapabilitiesMenu, { agent: agent, label: "Skills", variant: "icon", searchable: true }), _jsxs("span", { "aria-hidden": true, className: "ml-1 hidden items-center gap-1 font-mono text-[10.5px] uppercase tracking-[0.14em] text-muted-foreground sm:inline-flex", children: [_jsx("kbd", { className: "rounded border border-border bg-card px-1.5 py-px font-mono text-[10px] text-muted-foreground", children: "/" }), "skills"] }), _jsx("button", { type: "submit", disabled: !isStreaming && !text.trim() && pendingFiles.length === 0, className: "ml-auto inline-flex size-8 items-center justify-center rounded-lg bg-foreground text-background transition-colors hover:bg-foreground/90 disabled:opacity-40", "aria-label": isStreaming ? "Stop" : "Send", children: isStreaming ? _jsx(Square, { className: "h-3.5 w-3.5" }) : _jsx(ArrowUp, { className: "h-3.5 w-3.5" }) })] })] })] }) }));
84
+ }
85
+ //# sourceMappingURL=self-host-chat.js.map