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