@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.
- package/README.md +43 -9
- package/dist/host.d.ts +16 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +3 -0
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +35 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -1
- package/dist/index.js.map +1 -1
- package/dist/self-host-api.d.ts +3 -0
- package/dist/self-host-api.d.ts.map +1 -0
- package/dist/self-host-api.js +55 -0
- package/dist/self-host-api.js.map +1 -0
- package/dist/v2/agents/agent-detail.d.ts +58 -0
- package/dist/v2/agents/agent-detail.d.ts.map +1 -0
- package/dist/v2/agents/agent-detail.js +412 -0
- package/dist/v2/agents/agent-detail.js.map +1 -0
- package/dist/v2/agents/agent-run-panel.d.ts +5 -0
- package/dist/v2/agents/agent-run-panel.d.ts.map +1 -0
- package/dist/v2/agents/agent-run-panel.js +149 -0
- package/dist/v2/agents/agent-run-panel.js.map +1 -0
- package/dist/v2/agents/loops-tab.d.ts +6 -0
- package/dist/v2/agents/loops-tab.d.ts.map +1 -0
- package/dist/v2/agents/loops-tab.js +160 -0
- package/dist/v2/agents/loops-tab.js.map +1 -0
- package/dist/v2/agents/model-select.d.ts +24 -0
- package/dist/v2/agents/model-select.d.ts.map +1 -0
- package/dist/v2/agents/model-select.js +157 -0
- package/dist/v2/agents/model-select.js.map +1 -0
- package/dist/v2/agents/prompt-preview-dialog.d.ts +15 -0
- package/dist/v2/agents/prompt-preview-dialog.d.ts.map +1 -0
- package/dist/v2/agents/prompt-preview-dialog.js +141 -0
- package/dist/v2/agents/prompt-preview-dialog.js.map +1 -0
- package/dist/v2/agents/self-host-create-agent-dialog.d.ts +6 -0
- package/dist/v2/agents/self-host-create-agent-dialog.d.ts.map +1 -0
- package/dist/v2/agents/self-host-create-agent-dialog.js +31 -0
- package/dist/v2/agents/self-host-create-agent-dialog.js.map +1 -0
- package/dist/v2/agents/self-host-detail.d.ts +4 -0
- package/dist/v2/agents/self-host-detail.d.ts.map +1 -0
- package/dist/v2/agents/self-host-detail.js +34 -0
- package/dist/v2/agents/self-host-detail.js.map +1 -0
- package/dist/v2/agents/self-host-run-chat.d.ts +10 -0
- package/dist/v2/agents/self-host-run-chat.d.ts.map +1 -0
- package/dist/v2/agents/self-host-run-chat.js +18 -0
- package/dist/v2/agents/self-host-run-chat.js.map +1 -0
- package/dist/v2/agents/skills-tab.d.ts +6 -0
- package/dist/v2/agents/skills-tab.d.ts.map +1 -0
- package/dist/v2/agents/skills-tab.js +112 -0
- package/dist/v2/agents/skills-tab.js.map +1 -0
- package/dist/v2/agents/tools-panel.d.ts +26 -0
- package/dist/v2/agents/tools-panel.d.ts.map +1 -0
- package/dist/v2/agents/tools-panel.js +123 -0
- package/dist/v2/agents/tools-panel.js.map +1 -0
- package/dist/v2/agents/tools-tab.d.ts +6 -0
- package/dist/v2/agents/tools-tab.d.ts.map +1 -0
- package/dist/v2/agents/tools-tab.js +117 -0
- package/dist/v2/agents/tools-tab.js.map +1 -0
- package/dist/v2/agents/vault-tab.d.ts +13 -0
- package/dist/v2/agents/vault-tab.d.ts.map +1 -0
- package/dist/v2/agents/vault-tab.js +93 -0
- package/dist/v2/agents/vault-tab.js.map +1 -0
- package/dist/v2/files/file-browser-primitives.d.ts +39 -0
- package/dist/v2/files/file-browser-primitives.d.ts.map +1 -0
- package/dist/v2/files/file-browser-primitives.js +75 -0
- package/dist/v2/files/file-browser-primitives.js.map +1 -0
- package/dist/v2/files/file-directory-browser.d.ts +10 -0
- package/dist/v2/files/file-directory-browser.d.ts.map +1 -0
- package/dist/v2/files/file-directory-browser.js +57 -0
- package/dist/v2/files/file-directory-browser.js.map +1 -0
- package/dist/v2/files/files-browser.d.ts +7 -0
- package/dist/v2/files/files-browser.d.ts.map +1 -0
- package/dist/v2/files/files-browser.js +390 -0
- package/dist/v2/files/files-browser.js.map +1 -0
- package/dist/v2/files/host.d.ts +45 -0
- package/dist/v2/files/host.d.ts.map +1 -0
- package/dist/v2/files/host.js +72 -0
- package/dist/v2/files/host.js.map +1 -0
- package/dist/v2/host.d.ts +42 -0
- package/dist/v2/host.d.ts.map +1 -0
- package/dist/v2/host.js +137 -0
- package/dist/v2/host.js.map +1 -0
- package/dist/v2/playground/chat-canvas.d.ts +9 -0
- package/dist/v2/playground/chat-canvas.d.ts.map +1 -0
- package/dist/v2/playground/chat-canvas.js +88 -0
- package/dist/v2/playground/chat-canvas.js.map +1 -0
- package/dist/v2/playground/host.d.ts +116 -0
- package/dist/v2/playground/host.d.ts.map +1 -0
- package/dist/v2/playground/host.js +12 -0
- package/dist/v2/playground/host.js.map +1 -0
- package/dist/v2/playground/self-host-chat.d.ts +11 -0
- package/dist/v2/playground/self-host-chat.d.ts.map +1 -0
- package/dist/v2/playground/self-host-chat.js +85 -0
- package/dist/v2/playground/self-host-chat.js.map +1 -0
- package/dist/v2/playground/self-host.d.ts +2 -0
- package/dist/v2/playground/self-host.d.ts.map +1 -0
- package/dist/v2/playground/self-host.js +87 -0
- package/dist/v2/playground/self-host.js.map +1 -0
- package/dist/v2/sessions/host.d.ts +167 -0
- package/dist/v2/sessions/host.d.ts.map +1 -0
- package/dist/v2/sessions/host.js +12 -0
- package/dist/v2/sessions/host.js.map +1 -0
- package/dist/v2/sessions/self-host.d.ts +7 -0
- package/dist/v2/sessions/self-host.d.ts.map +1 -0
- package/dist/v2/sessions/self-host.js +120 -0
- package/dist/v2/sessions/self-host.js.map +1 -0
- package/dist/v2/sessions/trace-columns.d.ts +4 -0
- package/dist/v2/sessions/trace-columns.d.ts.map +1 -0
- package/dist/v2/sessions/trace-columns.js +102 -0
- package/dist/v2/sessions/trace-columns.js.map +1 -0
- package/dist/v2/sessions/trace-detail-view.d.ts +7 -0
- package/dist/v2/sessions/trace-detail-view.d.ts.map +1 -0
- package/dist/v2/sessions/trace-detail-view.js +346 -0
- package/dist/v2/sessions/trace-detail-view.js.map +1 -0
- package/dist/v2/sessions/trace-detail.d.ts +133 -0
- package/dist/v2/sessions/trace-detail.d.ts.map +1 -0
- package/dist/v2/sessions/trace-detail.js +210 -0
- package/dist/v2/sessions/trace-detail.js.map +1 -0
- package/dist/v2/sessions/trace-normalize.d.ts +60 -0
- package/dist/v2/sessions/trace-normalize.d.ts.map +1 -0
- package/dist/v2/sessions/trace-normalize.js +87 -0
- package/dist/v2/sessions/trace-normalize.js.map +1 -0
- package/dist/v2/sessions/trace-table.d.ts +8 -0
- package/dist/v2/sessions/trace-table.d.ts.map +1 -0
- package/dist/v2/sessions/trace-table.js +27 -0
- package/dist/v2/sessions/trace-table.js.map +1 -0
- package/dist/v2/shell/coding-agents.d.ts +21 -0
- package/dist/v2/shell/coding-agents.d.ts.map +1 -0
- package/dist/v2/shell/coding-agents.js +41 -0
- package/dist/v2/shell/coding-agents.js.map +1 -0
- package/dist/v2/shell/dashboard-shell.d.ts +6 -0
- package/dist/v2/shell/dashboard-shell.d.ts.map +1 -0
- package/dist/v2/shell/dashboard-shell.js +132 -0
- package/dist/v2/shell/dashboard-shell.js.map +1 -0
- package/dist/v2/skills/self-host-create-skill-dialog.d.ts +6 -0
- package/dist/v2/skills/self-host-create-skill-dialog.d.ts.map +1 -0
- package/dist/v2/skills/self-host-create-skill-dialog.js +27 -0
- package/dist/v2/skills/self-host-create-skill-dialog.js.map +1 -0
- package/dist/v2/skills/self-host-detail.d.ts +4 -0
- package/dist/v2/skills/self-host-detail.d.ts.map +1 -0
- package/dist/v2/skills/self-host-detail.js +31 -0
- package/dist/v2/skills/self-host-detail.js.map +1 -0
- package/dist/v2/support/agent-call-snippets.d.ts +35 -0
- package/dist/v2/support/agent-call-snippets.d.ts.map +1 -0
- package/dist/v2/support/agent-call-snippets.js +113 -0
- package/dist/v2/support/agent-call-snippets.js.map +1 -0
- package/dist/v2/support/tool-catalog.d.ts +62 -0
- package/dist/v2/support/tool-catalog.d.ts.map +1 -0
- package/dist/v2/support/tool-catalog.js +271 -0
- package/dist/v2/support/tool-catalog.js.map +1 -0
- package/dist/v2/support/vault-fields.d.ts +29 -0
- package/dist/v2/support/vault-fields.d.ts.map +1 -0
- package/dist/v2/support/vault-fields.js +74 -0
- package/dist/v2/support/vault-fields.js.map +1 -0
- package/dist/v2/tools/param-fields.d.ts +19 -0
- package/dist/v2/tools/param-fields.d.ts.map +1 -0
- package/dist/v2/tools/param-fields.js +191 -0
- package/dist/v2/tools/param-fields.js.map +1 -0
- package/dist/v2/tools/self-host.d.ts +7 -0
- package/dist/v2/tools/self-host.d.ts.map +1 -0
- package/dist/v2/tools/self-host.js +26 -0
- package/dist/v2/tools/self-host.js.map +1 -0
- package/dist/v2/tools/source-parsing.d.ts +4 -0
- package/dist/v2/tools/source-parsing.d.ts.map +1 -0
- package/dist/v2/tools/source-parsing.js +15 -0
- package/dist/v2/tools/source-parsing.js.map +1 -0
- package/dist/v2/tools/tool-detail.d.ts +7 -0
- package/dist/v2/tools/tool-detail.d.ts.map +1 -0
- package/dist/v2/tools/tool-detail.js +157 -0
- package/dist/v2/tools/tool-detail.js.map +1 -0
- package/dist/v2/tools/tool-editor-dialog.d.ts +9 -0
- package/dist/v2/tools/tool-editor-dialog.d.ts.map +1 -0
- package/dist/v2/tools/tool-editor-dialog.js +306 -0
- package/dist/v2/tools/tool-editor-dialog.js.map +1 -0
- package/dist/v2/tools/tools-view.d.ts +21 -0
- package/dist/v2/tools/tools-view.d.ts.map +1 -0
- package/dist/v2/tools/tools-view.js +77 -0
- package/dist/v2/tools/tools-view.js.map +1 -0
- package/dist/v2/ui/bits.d.ts +23 -0
- package/dist/v2/ui/bits.d.ts.map +1 -0
- package/dist/v2/ui/bits.js +18 -0
- package/dist/v2/ui/bits.js.map +1 -0
- package/dist/v2/ui/button.d.ts +9 -0
- package/dist/v2/ui/button.d.ts.map +1 -0
- package/dist/v2/ui/button.js +33 -0
- package/dist/v2/ui/button.js.map +1 -0
- package/dist/v2/ui/code-block.d.ts +20 -0
- package/dist/v2/ui/code-block.d.ts.map +1 -0
- package/dist/v2/ui/code-block.js +44 -0
- package/dist/v2/ui/code-block.js.map +1 -0
- package/dist/v2/ui/code-editor.d.ts +9 -0
- package/dist/v2/ui/code-editor.d.ts.map +1 -0
- package/dist/v2/ui/code-editor.js +25 -0
- package/dist/v2/ui/code-editor.js.map +1 -0
- package/dist/v2/ui/copy-button.d.ts +9 -0
- package/dist/v2/ui/copy-button.d.ts.map +1 -0
- package/dist/v2/ui/copy-button.js +24 -0
- package/dist/v2/ui/copy-button.js.map +1 -0
- package/dist/v2/ui/data-table.d.ts +40 -0
- package/dist/v2/ui/data-table.d.ts.map +1 -0
- package/dist/v2/ui/data-table.js +85 -0
- package/dist/v2/ui/data-table.js.map +1 -0
- package/dist/v2/ui/dialog.d.ts +16 -0
- package/dist/v2/ui/dialog.d.ts.map +1 -0
- package/dist/v2/ui/dialog.js +39 -0
- package/dist/v2/ui/dialog.js.map +1 -0
- package/dist/v2/ui/input.d.ts +2 -0
- package/dist/v2/ui/input.d.ts.map +1 -0
- package/dist/v2/ui/input.js +7 -0
- package/dist/v2/ui/input.js.map +1 -0
- package/dist/v2/ui/multi-select-filter.d.ts +18 -0
- package/dist/v2/ui/multi-select-filter.d.ts.map +1 -0
- package/dist/v2/ui/multi-select-filter.js +37 -0
- package/dist/v2/ui/multi-select-filter.js.map +1 -0
- package/dist/v2/ui/page-header.d.ts +10 -0
- package/dist/v2/ui/page-header.d.ts.map +1 -0
- package/dist/v2/ui/page-header.js +8 -0
- package/dist/v2/ui/page-header.js.map +1 -0
- package/dist/v2/ui/refresh-button.d.ts +5 -0
- package/dist/v2/ui/refresh-button.d.ts.map +1 -0
- package/dist/v2/ui/refresh-button.js +7 -0
- package/dist/v2/ui/refresh-button.js.map +1 -0
- package/dist/v2/ui/select.d.ts +16 -0
- package/dist/v2/ui/select.d.ts.map +1 -0
- package/dist/v2/ui/select.js +36 -0
- package/dist/v2/ui/select.js.map +1 -0
- package/dist/v2/ui/skeleton.d.ts +3 -0
- package/dist/v2/ui/skeleton.d.ts.map +1 -0
- package/dist/v2/ui/skeleton.js +7 -0
- package/dist/v2/ui/skeleton.js.map +1 -0
- package/dist/v2/ui/textarea.d.ts +2 -0
- package/dist/v2/ui/textarea.d.ts.map +1 -0
- package/dist/v2/ui/textarea.js +6 -0
- package/dist/v2/ui/textarea.js.map +1 -0
- package/dist/v2/utils.d.ts +3 -0
- package/dist/v2/utils.d.ts.map +1 -0
- package/dist/v2/utils.js +6 -0
- package/dist/v2/utils.js.map +1 -0
- package/dist/v2/views/agents-detail.d.ts +2 -0
- package/dist/v2/views/agents-detail.d.ts.map +1 -0
- package/dist/v2/views/agents-detail.js +2 -0
- package/dist/v2/views/agents-detail.js.map +1 -0
- package/dist/v2/views/agents.d.ts +27 -0
- package/dist/v2/views/agents.d.ts.map +1 -0
- package/dist/v2/views/agents.js +161 -0
- package/dist/v2/views/agents.js.map +1 -0
- package/dist/v2/views/files.d.ts +2 -0
- package/dist/v2/views/files.d.ts.map +1 -0
- package/dist/v2/views/files.js +10 -0
- package/dist/v2/views/files.js.map +1 -0
- package/dist/v2/views/memory-host.d.ts +10 -0
- package/dist/v2/views/memory-host.d.ts.map +1 -0
- package/dist/v2/views/memory-host.js +17 -0
- package/dist/v2/views/memory-host.js.map +1 -0
- package/dist/v2/views/memory-project.d.ts +5 -0
- package/dist/v2/views/memory-project.d.ts.map +1 -0
- package/dist/v2/views/memory-project.js +36 -0
- package/dist/v2/views/memory-project.js.map +1 -0
- package/dist/v2/views/memory.d.ts +2 -0
- package/dist/v2/views/memory.d.ts.map +1 -0
- package/dist/v2/views/memory.js +14 -0
- package/dist/v2/views/memory.js.map +1 -0
- package/dist/v2/views/playground.d.ts +13 -0
- package/dist/v2/views/playground.d.ts.map +1 -0
- package/dist/v2/views/playground.js +88 -0
- package/dist/v2/views/playground.js.map +1 -0
- package/dist/v2/views/sessions-detail.d.ts +8 -0
- package/dist/v2/views/sessions-detail.d.ts.map +1 -0
- package/dist/v2/views/sessions-detail.js +107 -0
- package/dist/v2/views/sessions-detail.js.map +1 -0
- package/dist/v2/views/sessions.d.ts +9 -0
- package/dist/v2/views/sessions.d.ts.map +1 -0
- package/dist/v2/views/sessions.js +9 -0
- package/dist/v2/views/sessions.js.map +1 -0
- package/dist/v2/views/skills-detail.d.ts +26 -0
- package/dist/v2/views/skills-detail.d.ts.map +1 -0
- package/dist/v2/views/skills-detail.js +120 -0
- package/dist/v2/views/skills-detail.js.map +1 -0
- package/dist/v2/views/skills.d.ts +18 -0
- package/dist/v2/views/skills.d.ts.map +1 -0
- package/dist/v2/views/skills.js +46 -0
- package/dist/v2/views/skills.js.map +1 -0
- package/package.json +20 -4
- 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"}
|
package/dist/v2/host.js
ADDED
|
@@ -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(/"/g, '"')
|
|
113
|
+
.replace(/'/g, "'")
|
|
114
|
+
.replace(/</g, "<")
|
|
115
|
+
.replace(/>/g, ">")
|
|
116
|
+
.replace(/ /g, " ")
|
|
117
|
+
.replace(/&/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":"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"}
|
|
@@ -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
|