bazilion 0.13.0 → 0.14.1
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 +16 -5
- package/dist/cli.js +285 -86
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +539 -81
- package/dist/daemon.js.map +1 -1
- package/dist/web/client/assets/AgentTabs-BcmmwYJc.js +1 -0
- package/dist/web/client/assets/ConfigPage-BCLp-FUC.js +1 -0
- package/dist/web/client/assets/ConfirmDialog-BAiyYC8w.js +1 -0
- package/dist/web/client/assets/FieldRow-DsWhqiIQ.js +1 -0
- package/dist/web/client/assets/Page-NV96O47A.js +1 -0
- package/dist/web/client/assets/ProductionTeamPolicyEditor-CHBKZMpY.js +7 -0
- package/dist/web/client/assets/{ProfileCommunicationEditor-BcSf2Hao.js → ProfileCommunicationEditor-DZ8yTQvV.js} +1 -1
- package/dist/web/client/assets/SectionTabs-4kCQXuFY.js +1 -0
- package/dist/web/client/assets/TeamTabs-BfC1pfQe.js +1 -0
- package/dist/web/client/assets/{TemplatesTabs-CyDVzrOl.js → TemplatesTabs-BwsLjN0Q.js} +1 -1
- package/dist/web/client/assets/UnsavedChangesGuard-C7U9rsPw.js +1 -0
- package/dist/web/client/assets/{_id-DWTMH7Eb.js → _id-CG9YM1tY.js} +1 -1
- package/dist/web/client/assets/_id-DfzTSFBA.js +1 -0
- package/dist/web/client/assets/_id-DtHL-U-0.js +1 -0
- package/dist/web/client/assets/_id-J0kM-98d.js +1 -0
- package/dist/web/client/assets/activity-CBQGMwWo.js +1 -0
- package/dist/web/client/assets/agents-BWGBjF2Y.js +1 -0
- package/dist/web/client/assets/agents-DTY5RXgO.js +1 -0
- package/dist/web/client/assets/approvals-DwMk9S4Z.js +1 -0
- package/dist/web/client/assets/attention-7qYFtwOW.js +1 -0
- package/dist/web/client/assets/chevron-right-DK703skW.js +1 -0
- package/dist/web/client/assets/config-D59MT3Y5.js +3 -0
- package/dist/web/client/assets/{inbox-D2NypLee.js → inbox-CpKuNfOj.js} +1 -1
- package/dist/web/client/assets/index-BVfpuiby.js +52 -0
- package/dist/web/client/assets/learning-631_q6a9.js +1 -0
- package/dist/web/client/assets/login-JjfTCGIb.js +1 -0
- package/dist/web/client/assets/mcp-DHgUOUPG.js +1 -0
- package/dist/web/client/assets/members-CLCUdo-h.js +1 -0
- package/dist/web/client/assets/memory-paAiM6ix.js +1 -0
- package/dist/web/client/assets/{policy-CHM95pMU.js → policy-Fy_Wnq6p.js} +1 -1
- package/dist/web/client/assets/{preload-helper-mNuBjNXU.js → preload-helper-bztXdkDj.js} +1 -1
- package/dist/web/client/assets/routes-DciiC6QA.js +1 -0
- package/dist/web/client/assets/services-i_RmJYAO.js +1 -0
- package/dist/web/client/assets/skills-BX42OGpp.js +1 -0
- package/dist/web/client/assets/styles-B5vcgXln.css +2 -0
- package/dist/web/client/assets/{teams-Dm_huGxn.js → teams-4ySkP31k.js} +1 -1
- package/dist/web/client/assets/teams-D6nIPyC0.js +1 -0
- package/dist/web/client/assets/telegram-CphoIRWP.js +1 -0
- package/dist/web/client/assets/tokens-2j3NQudt.js +1 -0
- package/dist/web/client/assets/triggers-sDA075Nu.js +1 -0
- package/dist/web/client/assets/utils-B6KiDbIe.js +1 -0
- package/dist/web/client/assets/welcome-Do427w4M.js +1 -0
- package/dist/web/client/assets/wire-constants-B7b2CQp1.js +74 -0
- package/dist/web/client/assets/x-CbAF-3_T.js +1 -0
- package/dist/web/server/assets/{AgentTabs-aXdsiiMp.js → AgentTabs-Dq8hDM2Q.js} +9 -2
- package/dist/web/server/assets/{ChatPane-Ba5wTsVk.js → ChatPane-CgSe7tsy.js} +81 -43
- package/dist/web/server/assets/{ConfigPage-BKlh5vOU.js → ConfigPage-CiQ-gxmJ.js} +3 -2
- package/dist/web/server/assets/ConfirmDialog-C-MPYYSU.js +99 -0
- package/dist/web/server/assets/FieldRow-DCOF07kl.js +160 -0
- package/dist/web/server/assets/{Page-LENulSXY.js → Page-Bz-ydB8j.js} +4 -10
- package/dist/web/server/assets/{ProductionTeamPolicyEditor-Y4mzFFvR.js → ProductionTeamPolicyEditor-DQSdP7Yx.js} +140 -123
- package/dist/web/server/assets/{SectionTabs-BJTPr5nU.js → SectionTabs-B2Yw81XN.js} +2 -2
- package/dist/web/server/assets/{Sidebar-DsRVCszF.js → Sidebar-DKyk7oIo.js} +563 -283
- package/dist/web/server/assets/{TeamTabs-zZzbP1t_.js → TeamTabs-Co3n2exj.js} +2 -6
- package/dist/web/server/assets/{TemplatesTabs-CcRxZhJe.js → TemplatesTabs-B0fA361R.js} +1 -1
- package/dist/web/server/assets/UnsavedChangesGuard-CiStXyBI.js +40 -0
- package/dist/web/server/assets/{_id-xTD_6ApX.js → _id-BAA9KJBU.js} +1 -1
- package/dist/web/server/assets/{_id-BQ2zoMiR.js → _id-BM5m2FLT.js} +4 -4
- package/dist/web/server/assets/{_id-BENqNBfK.js → _id-BYKpT2Tu.js} +1 -2
- package/dist/web/server/assets/{_id-BreRHYV2.js → _id-BeKhPKw3.js} +350 -185
- package/dist/web/server/assets/{_id-CPIXIqyO.js → _id-BqWTB8Wl.js} +188 -86
- package/dist/web/server/assets/{_id-DkrNqqTw.js → _id-BwvCtzlD.js} +1 -1
- package/dist/web/server/assets/{_id-BZWunvy7.js → _id-DYU6uIBx.js} +0 -1
- package/dist/web/server/assets/{_id-BFELaMIN.js → _id-ndxFHx0t.js} +75 -71
- package/dist/web/server/assets/{_id-CvYqVJPU.js → _id-sNu5aXZt.js} +2 -1
- package/dist/web/server/assets/{_tanstack-start-manifest_v-COkJjXt_.js → _tanstack-start-manifest_v-DR7wyKcH.js} +113 -90
- package/dist/web/server/assets/{activity-B6N1T_5N.js → activity-BWv1goK6.js} +3 -3
- package/dist/web/server/assets/{activity-BazZNfvf.js → activity-LjpblbDL.js} +1 -1
- package/dist/web/server/assets/{agents-BpSeOA30.js → agents-BDFGrU3o.js} +1 -1
- package/dist/web/server/assets/{agents-DY630p6x.js → agents-CJk4pxKu.js} +1 -1
- package/dist/web/server/assets/{agents-wSYNPuyK.js → agents-CYw1xHoY.js} +138 -16
- package/dist/web/server/assets/{agents-DfoLnTyD.js → agents-DfNKc_Q7.js} +52 -8
- package/dist/web/server/assets/{approvals-BkUGmYU9.js → approvals-7JOoBchn.js} +1 -1
- package/dist/web/server/assets/{approvals-BYajNOdE.js → approvals-Bz123liE.js} +59 -21
- package/dist/web/server/assets/{attention-Bw_wiiqI.js → attention-B35JvhOL.js} +1 -1
- package/dist/web/server/assets/{attention-Z3bGuxOD.js → attention-C1pPWSXw.js} +3 -3
- package/dist/web/server/assets/{config-wYtIhkRm.js → config-DQ8n0AwF.js} +1 -1
- package/dist/web/server/assets/config-XSTLuRaT.js +980 -0
- package/dist/web/server/assets/{inbox-DTTfSuGU.js → inbox-RweGCV3D.js} +3 -3
- package/dist/web/server/assets/{inbox-0iiSg-Y1.js → inbox-cu3jLzNP.js} +1 -1
- package/dist/web/server/assets/{learning-DpyLNVe8.js → learning-BaKM6qaw.js} +1 -1
- package/dist/web/server/assets/{learning-fG8316uc.js → learning-CbtNlqYo.js} +76 -23
- package/dist/web/server/assets/{login-D_GDeTrB.js → login-BNj3U6ok.js} +21 -11
- package/dist/web/server/assets/{login-CrFVVUaE.js → login-Be8eP4Jp.js} +2 -2
- package/dist/web/server/assets/{mcp-BQtp2T87.js → mcp-B0goWO8Q.js} +1 -1
- package/dist/web/server/assets/mcp-CiBs8unU.js +332 -0
- package/dist/web/server/assets/members-DHYTVgwb.js +100 -0
- package/dist/web/server/assets/{members-DXu2oAS_.js → members-DiYtr-zm.js} +1 -1
- package/dist/web/server/assets/{memory-C6fX_FKI.js → memory-CkXUgf5s.js} +150 -48
- package/dist/web/server/assets/{memory-Iq2M0-Yc.js → memory-DTFEmfF3.js} +1 -1
- package/dist/web/server/assets/{policy-D7kj3Cy7.js → policy-BddK4xom.js} +1 -1
- package/dist/web/server/assets/{policy-Bg6u-rTq.js → policy-Bvvav8fh.js} +4 -4
- package/dist/web/server/assets/{router-D-6TzLRZ.js → router-M0lutIDA.js} +347 -173
- package/dist/web/server/assets/{routes-CiPfEldd.js → routes-BgHisAxH.js} +22 -5
- package/dist/web/server/assets/{routes-CNRzy79H.js → routes-COtkyZG1.js} +1 -1
- package/dist/web/server/assets/{routes-D933ngZS.js → routes-DAU2g7Uz.js} +1 -1
- package/dist/web/server/assets/services-ClyGBU7W.js +83 -0
- package/dist/web/server/assets/{services-OB4LAr2A.js → services-DgoU1udp.js} +1 -1
- package/dist/web/server/assets/{skills-Babb9jsQ.js → skills-CYih9TJw.js} +47 -6
- package/dist/web/server/assets/{skills-D5DQL8bM.js → skills-Dw3cI3si.js} +1 -1
- package/dist/web/server/assets/{start-uKQNK6if.js → start-D4Wq9iTa.js} +1 -1
- package/dist/web/server/assets/{teams-Dz6ZEMRo.js → teams-BJuoNOTB.js} +1 -1
- package/dist/web/server/assets/{teams-Bk6ZT0MD.js → teams-DF3RViAg.js} +3 -3
- package/dist/web/server/assets/{teams-DqC4wZxu.js → teams-DFnuc660.js} +1 -1
- package/dist/web/server/assets/{teams-Cc2Czynq.js → teams-TV6nbEN_.js} +101 -10
- package/dist/web/server/assets/{telegram-J4T0XhwQ.js → telegram-DbOFpTFm.js} +1 -1
- package/dist/web/server/assets/{telegram-DUbDIVGX.js → telegram-Dj4Wwhd6.js} +147 -47
- package/dist/web/server/assets/{tokens-CJM_0NDa.js → tokens-DDwtO15P.js} +88 -19
- package/dist/web/server/assets/{tokens-DO5BzNOn.js → tokens-_2hptHP6.js} +1 -1
- package/dist/web/server/assets/{triggers-BdBx-HwR.js → triggers-BvjYNmmY.js} +1 -1
- package/dist/web/server/assets/triggers-CHk9O3rU.js +367 -0
- package/dist/web/server/assets/utils-C_uf36nf.js +8 -0
- package/dist/web/server/assets/{welcome-DDB11L5j.js → welcome-B8nchXdF.js} +9 -8
- package/dist/web/server/server.js +5 -9
- package/dist/worker.js +64 -19
- package/dist/worker.js.map +1 -1
- package/package.json +3 -3
- package/dist/web/client/assets/AgentTabs-R6gSjIj3.js +0 -1
- package/dist/web/client/assets/ConfigPage-BCwfgyjD.js +0 -1
- package/dist/web/client/assets/FieldRow-avAFLgYW.js +0 -1
- package/dist/web/client/assets/Page-CwNuDhWz.js +0 -1
- package/dist/web/client/assets/ProductionTeamPolicyEditor-DdpYInwV.js +0 -7
- package/dist/web/client/assets/SectionTabs-DZzy01az.js +0 -1
- package/dist/web/client/assets/TeamTabs-Bk89JfN7.js +0 -1
- package/dist/web/client/assets/_id-CAJTTnee.js +0 -1
- package/dist/web/client/assets/_id-CN6jPaBu.js +0 -1
- package/dist/web/client/assets/_id-DGwJqqDc.js +0 -1
- package/dist/web/client/assets/activity-DK_M0-bn.js +0 -1
- package/dist/web/client/assets/agents-B-i5pASm.js +0 -1
- package/dist/web/client/assets/agents-n8U7qNxw.js +0 -1
- package/dist/web/client/assets/approvals-CmVxCy0Z.js +0 -1
- package/dist/web/client/assets/attention-F0lUQCWE.js +0 -1
- package/dist/web/client/assets/chevron-down-OndG7r1U.js +0 -1
- package/dist/web/client/assets/config-DuApZ9xS.js +0 -3
- package/dist/web/client/assets/context-C1sMnW6K.js +0 -1
- package/dist/web/client/assets/index-B3vdrEEg.js +0 -12
- package/dist/web/client/assets/learning-zYDCfVxT.js +0 -1
- package/dist/web/client/assets/login-B1Un51Zx.js +0 -1
- package/dist/web/client/assets/mcp-DSVmJBdv.js +0 -1
- package/dist/web/client/assets/members-Pl7hXJcN.js +0 -1
- package/dist/web/client/assets/memory-Co3BEaAq.js +0 -1
- package/dist/web/client/assets/plus-Dor-_wmL.js +0 -1
- package/dist/web/client/assets/routes-D29qjwG0.js +0 -1
- package/dist/web/client/assets/services-CCQ_6YWQ.js +0 -1
- package/dist/web/client/assets/skills-3xAIvzvP.js +0 -1
- package/dist/web/client/assets/styles-D6RPN7RK.css +0 -2
- package/dist/web/client/assets/teams-UGLyjHYj.js +0 -1
- package/dist/web/client/assets/telegram-3KvrJVO6.js +0 -1
- package/dist/web/client/assets/tokens-DUSFmV5_.js +0 -1
- package/dist/web/client/assets/triggers-DlQ2KF1h.js +0 -1
- package/dist/web/client/assets/welcome-DkP8qzK1.js +0 -1
- package/dist/web/client/assets/wire-constants-BhVKOCQa.js +0 -74
- package/dist/web/server/assets/FieldRow-B4eTegH9.js +0 -94
- package/dist/web/server/assets/config-DGzM28F_.js +0 -554
- package/dist/web/server/assets/context-BkDDwbby.js +0 -12
- package/dist/web/server/assets/context-DMc0KyHh.js +0 -12
- package/dist/web/server/assets/context-poimKI7w.js +0 -47
- package/dist/web/server/assets/mcp-DlgXUcAS.js +0 -261
- package/dist/web/server/assets/members-CteHKPSF.js +0 -46
- package/dist/web/server/assets/services-DJRA1A0-.js +0 -79
- package/dist/web/server/assets/triggers-B87fycBl.js +0 -216
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { t as Route } from "./mcp-BQtp2T87.js";
|
|
2
|
-
import { t as ConfigPage } from "./ConfigPage-BKlh5vOU.js";
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { useRouter } from "@tanstack/react-router";
|
|
5
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
-
//#region src/routes/config/mcp.tsx?tsr-split=component
|
|
7
|
-
var TRANSPORTS = [
|
|
8
|
-
"stdio",
|
|
9
|
-
"http",
|
|
10
|
-
"sse"
|
|
11
|
-
];
|
|
12
|
-
function McpPage() {
|
|
13
|
-
const { servers } = Route.useLoaderData();
|
|
14
|
-
const router = useRouter();
|
|
15
|
-
const [name, setName] = useState("");
|
|
16
|
-
const [transport, setTransport] = useState("stdio");
|
|
17
|
-
const [command, setCommand] = useState("");
|
|
18
|
-
const [argsStr, setArgsStr] = useState("");
|
|
19
|
-
const [url, setUrl] = useState("");
|
|
20
|
-
const [token, setToken] = useState("");
|
|
21
|
-
const [err, setErr] = useState(null);
|
|
22
|
-
const [busy, setBusy] = useState(false);
|
|
23
|
-
const [testResult, setTestResult] = useState({});
|
|
24
|
-
async function add(e) {
|
|
25
|
-
e.preventDefault();
|
|
26
|
-
setErr(null);
|
|
27
|
-
setBusy(true);
|
|
28
|
-
try {
|
|
29
|
-
const body = {
|
|
30
|
-
name,
|
|
31
|
-
transport,
|
|
32
|
-
command: transport === "stdio" ? command : null,
|
|
33
|
-
args: transport === "stdio" ? argsStr.split(" ").filter(Boolean) : [],
|
|
34
|
-
url: transport === "stdio" ? null : url,
|
|
35
|
-
authToken: token || void 0
|
|
36
|
-
};
|
|
37
|
-
const res = await fetch("/api/mcp-servers", {
|
|
38
|
-
method: "POST",
|
|
39
|
-
headers: { "content-type": "application/json" },
|
|
40
|
-
body: JSON.stringify(body)
|
|
41
|
-
});
|
|
42
|
-
if (!res.ok) {
|
|
43
|
-
const j = await res.json().catch(() => ({}));
|
|
44
|
-
throw new Error(j.error ?? `${res.status} ${res.statusText}`);
|
|
45
|
-
}
|
|
46
|
-
setName("");
|
|
47
|
-
setCommand("");
|
|
48
|
-
setArgsStr("");
|
|
49
|
-
setUrl("");
|
|
50
|
-
setToken("");
|
|
51
|
-
await router.invalidate();
|
|
52
|
-
} catch (e) {
|
|
53
|
-
setErr(e.message);
|
|
54
|
-
} finally {
|
|
55
|
-
setBusy(false);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
async function toggle(s) {
|
|
59
|
-
await fetch(`/api/mcp-servers/${s.id}`, {
|
|
60
|
-
method: "PATCH",
|
|
61
|
-
headers: { "content-type": "application/json" },
|
|
62
|
-
body: JSON.stringify({ enabled: !s.enabled })
|
|
63
|
-
});
|
|
64
|
-
await router.invalidate();
|
|
65
|
-
}
|
|
66
|
-
async function remove(id) {
|
|
67
|
-
await fetch(`/api/mcp-servers/${id}`, { method: "DELETE" });
|
|
68
|
-
await router.invalidate();
|
|
69
|
-
}
|
|
70
|
-
async function test(id) {
|
|
71
|
-
setTestResult((r) => ({
|
|
72
|
-
...r,
|
|
73
|
-
[id]: "connecting…"
|
|
74
|
-
}));
|
|
75
|
-
const j = await (await fetch(`/api/mcp-servers/${id}/test`, { method: "POST" })).json().catch(() => ({}));
|
|
76
|
-
setTestResult((r) => ({
|
|
77
|
-
...r,
|
|
78
|
-
[id]: j.ok ? `✓ ${j.tools?.length ?? 0} tools: ${(j.tools ?? []).map((t) => t.name).join(", ")}` : `✗ ${j.error ?? "failed"}`
|
|
79
|
-
}));
|
|
80
|
-
}
|
|
81
|
-
return /* @__PURE__ */ jsxs(ConfigPage, {
|
|
82
|
-
active: "mcp",
|
|
83
|
-
title: "MCP servers",
|
|
84
|
-
description: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
85
|
-
"Expose tools from local or remote Model Context Protocol servers to every agent under the ",
|
|
86
|
-
/* @__PURE__ */ jsx("code", {
|
|
87
|
-
className: "font-mono",
|
|
88
|
-
children: "mcp__<server>__<tool>"
|
|
89
|
-
}),
|
|
90
|
-
" namespace. Local stdio servers inherit configured secrets; HTTP and SSE servers can use a bearer token."
|
|
91
|
-
] }),
|
|
92
|
-
children: [/* @__PURE__ */ jsxs("section", {
|
|
93
|
-
className: "rounded-lg border bg-card p-5",
|
|
94
|
-
children: [/* @__PURE__ */ jsx("h3", {
|
|
95
|
-
className: "font-serif text-xl mb-3",
|
|
96
|
-
children: "Add a server"
|
|
97
|
-
}), /* @__PURE__ */ jsxs("form", {
|
|
98
|
-
onSubmit: add,
|
|
99
|
-
className: "space-y-3",
|
|
100
|
-
children: [
|
|
101
|
-
/* @__PURE__ */ jsxs("div", {
|
|
102
|
-
className: "flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-end",
|
|
103
|
-
children: [/* @__PURE__ */ jsxs("label", {
|
|
104
|
-
className: "w-full text-sm sm:w-auto",
|
|
105
|
-
children: ["Name", /* @__PURE__ */ jsx("input", {
|
|
106
|
-
type: "text",
|
|
107
|
-
value: name,
|
|
108
|
-
onChange: (e) => setName(e.target.value),
|
|
109
|
-
required: true,
|
|
110
|
-
placeholder: "playwright",
|
|
111
|
-
pattern: "[a-zA-Z0-9_]+",
|
|
112
|
-
className: "mt-1 block w-full rounded-md border bg-background px-3 py-2 text-sm sm:w-48"
|
|
113
|
-
})]
|
|
114
|
-
}), /* @__PURE__ */ jsxs("label", {
|
|
115
|
-
className: "w-full text-sm sm:w-auto",
|
|
116
|
-
children: ["Transport", /* @__PURE__ */ jsx("select", {
|
|
117
|
-
value: transport,
|
|
118
|
-
onChange: (e) => setTransport(e.target.value),
|
|
119
|
-
className: "mt-1 block w-full rounded-md border bg-background px-3 py-2 text-sm",
|
|
120
|
-
children: TRANSPORTS.map((t) => /* @__PURE__ */ jsx("option", {
|
|
121
|
-
value: t,
|
|
122
|
-
children: t
|
|
123
|
-
}, t))
|
|
124
|
-
})]
|
|
125
|
-
})]
|
|
126
|
-
}),
|
|
127
|
-
transport === "stdio" ? /* @__PURE__ */ jsxs("div", {
|
|
128
|
-
className: "flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-end",
|
|
129
|
-
children: [/* @__PURE__ */ jsxs("label", {
|
|
130
|
-
className: "w-full text-sm sm:w-auto",
|
|
131
|
-
children: ["Command", /* @__PURE__ */ jsx("input", {
|
|
132
|
-
type: "text",
|
|
133
|
-
value: command,
|
|
134
|
-
onChange: (e) => setCommand(e.target.value),
|
|
135
|
-
placeholder: "npx",
|
|
136
|
-
className: "mt-1 block w-full rounded-md border bg-background px-3 py-2 text-sm sm:w-48"
|
|
137
|
-
})]
|
|
138
|
-
}), /* @__PURE__ */ jsxs("label", {
|
|
139
|
-
className: "w-full min-w-0 text-sm sm:flex-1",
|
|
140
|
-
children: ["Args (space-separated)", /* @__PURE__ */ jsx("input", {
|
|
141
|
-
type: "text",
|
|
142
|
-
value: argsStr,
|
|
143
|
-
onChange: (e) => setArgsStr(e.target.value),
|
|
144
|
-
placeholder: "-y @modelcontextprotocol/server-filesystem /tmp",
|
|
145
|
-
className: "block mt-1 rounded-md border bg-background px-3 py-2 text-sm w-full"
|
|
146
|
-
})]
|
|
147
|
-
})]
|
|
148
|
-
}) : /* @__PURE__ */ jsxs("div", {
|
|
149
|
-
className: "flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-end",
|
|
150
|
-
children: [/* @__PURE__ */ jsxs("label", {
|
|
151
|
-
className: "w-full min-w-0 text-sm sm:flex-1",
|
|
152
|
-
children: ["URL", /* @__PURE__ */ jsx("input", {
|
|
153
|
-
type: "url",
|
|
154
|
-
value: url,
|
|
155
|
-
onChange: (e) => setUrl(e.target.value),
|
|
156
|
-
placeholder: "https://mcp.example.com/sse",
|
|
157
|
-
className: "block mt-1 rounded-md border bg-background px-3 py-2 text-sm w-full"
|
|
158
|
-
})]
|
|
159
|
-
}), /* @__PURE__ */ jsxs("label", {
|
|
160
|
-
className: "w-full text-sm sm:w-auto",
|
|
161
|
-
children: ["Bearer token (optional)", /* @__PURE__ */ jsx("input", {
|
|
162
|
-
type: "password",
|
|
163
|
-
value: token,
|
|
164
|
-
onChange: (e) => setToken(e.target.value),
|
|
165
|
-
autoComplete: "off",
|
|
166
|
-
className: "mt-1 block w-full rounded-md border bg-background px-3 py-2 text-sm sm:w-56"
|
|
167
|
-
})]
|
|
168
|
-
})]
|
|
169
|
-
}),
|
|
170
|
-
/* @__PURE__ */ jsx("button", {
|
|
171
|
-
type: "submit",
|
|
172
|
-
disabled: busy,
|
|
173
|
-
className: "w-full rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground disabled:opacity-50 sm:w-auto",
|
|
174
|
-
children: busy ? "adding…" : "add server"
|
|
175
|
-
}),
|
|
176
|
-
err && /* @__PURE__ */ jsx("p", {
|
|
177
|
-
className: "text-sm text-danger",
|
|
178
|
-
children: err
|
|
179
|
-
})
|
|
180
|
-
]
|
|
181
|
-
})]
|
|
182
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
183
|
-
className: "overflow-x-auto",
|
|
184
|
-
children: /* @__PURE__ */ jsxs("table", {
|
|
185
|
-
className: "w-full min-w-[720px] text-sm",
|
|
186
|
-
children: [/* @__PURE__ */ jsx("thead", {
|
|
187
|
-
className: "text-left text-muted-foreground border-b",
|
|
188
|
-
children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
189
|
-
/* @__PURE__ */ jsx("th", {
|
|
190
|
-
className: "py-2",
|
|
191
|
-
children: "name"
|
|
192
|
-
}),
|
|
193
|
-
/* @__PURE__ */ jsx("th", { children: "transport" }),
|
|
194
|
-
/* @__PURE__ */ jsx("th", { children: "target" }),
|
|
195
|
-
/* @__PURE__ */ jsx("th", { children: "state" }),
|
|
196
|
-
/* @__PURE__ */ jsx("th", {})
|
|
197
|
-
] })
|
|
198
|
-
}), /* @__PURE__ */ jsxs("tbody", { children: [servers.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
|
|
199
|
-
colSpan: 5,
|
|
200
|
-
className: "py-6 text-center text-muted-foreground italic",
|
|
201
|
-
children: "no MCP servers yet — add one above"
|
|
202
|
-
}) }), servers.map((s) => /* @__PURE__ */ jsxs("tr", {
|
|
203
|
-
className: "border-b last:border-0 align-top",
|
|
204
|
-
children: [
|
|
205
|
-
/* @__PURE__ */ jsxs("td", {
|
|
206
|
-
className: "py-2",
|
|
207
|
-
children: [
|
|
208
|
-
s.name,
|
|
209
|
-
s.hasAuthToken && /* @__PURE__ */ jsx("span", {
|
|
210
|
-
className: "ml-2 text-[0.7em] uppercase tracking-wide text-muted-foreground",
|
|
211
|
-
children: "auth"
|
|
212
|
-
}),
|
|
213
|
-
testResult[s.id] && /* @__PURE__ */ jsx("div", {
|
|
214
|
-
className: "text-xs text-muted-foreground mt-1 break-all",
|
|
215
|
-
children: testResult[s.id]
|
|
216
|
-
})
|
|
217
|
-
]
|
|
218
|
-
}),
|
|
219
|
-
/* @__PURE__ */ jsx("td", { children: s.transport }),
|
|
220
|
-
/* @__PURE__ */ jsx("td", {
|
|
221
|
-
className: "font-mono text-xs break-all",
|
|
222
|
-
children: s.transport === "stdio" ? `${s.command ?? ""} ${s.args.join(" ")}`.trim() : s.url
|
|
223
|
-
}),
|
|
224
|
-
/* @__PURE__ */ jsx("td", { children: s.enabled ? /* @__PURE__ */ jsx("span", {
|
|
225
|
-
className: "text-success",
|
|
226
|
-
children: "enabled"
|
|
227
|
-
}) : /* @__PURE__ */ jsx("span", {
|
|
228
|
-
className: "text-muted-foreground",
|
|
229
|
-
children: "disabled"
|
|
230
|
-
}) }),
|
|
231
|
-
/* @__PURE__ */ jsxs("td", {
|
|
232
|
-
className: "space-x-2 whitespace-nowrap",
|
|
233
|
-
children: [
|
|
234
|
-
/* @__PURE__ */ jsx("button", {
|
|
235
|
-
type: "button",
|
|
236
|
-
onClick: () => test(s.id),
|
|
237
|
-
className: "rounded-md border px-2 py-1 text-xs hover:bg-accent",
|
|
238
|
-
children: "test"
|
|
239
|
-
}),
|
|
240
|
-
/* @__PURE__ */ jsx("button", {
|
|
241
|
-
type: "button",
|
|
242
|
-
onClick: () => toggle(s),
|
|
243
|
-
className: "rounded-md border px-2 py-1 text-xs hover:bg-accent",
|
|
244
|
-
children: s.enabled ? "disable" : "enable"
|
|
245
|
-
}),
|
|
246
|
-
/* @__PURE__ */ jsx("button", {
|
|
247
|
-
type: "button",
|
|
248
|
-
onClick: () => remove(s.id),
|
|
249
|
-
className: "rounded-md border px-2 py-1 text-xs text-danger hover:bg-danger/10",
|
|
250
|
-
children: "delete"
|
|
251
|
-
})
|
|
252
|
-
]
|
|
253
|
-
})
|
|
254
|
-
]
|
|
255
|
-
}, s.id))] })]
|
|
256
|
-
})
|
|
257
|
-
})]
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
//#endregion
|
|
261
|
-
export { McpPage as component };
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { t as Route } from "./members-DXu2oAS_.js";
|
|
2
|
-
import { r as PageShell } from "./Page-LENulSXY.js";
|
|
3
|
-
import { t as TeamTabs } from "./TeamTabs-zZzbP1t_.js";
|
|
4
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
//#region src/routes/teams/$id/members.tsx?tsr-split=component
|
|
6
|
-
function TeamMembersPage() {
|
|
7
|
-
const detail = Route.useLoaderData();
|
|
8
|
-
const { id } = Route.useParams();
|
|
9
|
-
return /* @__PURE__ */ jsxs(PageShell, { children: [
|
|
10
|
-
/* @__PURE__ */ jsx("h1", { children: "Team members" }),
|
|
11
|
-
/* @__PURE__ */ jsxs("p", {
|
|
12
|
-
className: "muted",
|
|
13
|
-
children: [/* @__PURE__ */ jsx("code", { children: "agents.team_id" }), " is the only live-membership authority."]
|
|
14
|
-
}),
|
|
15
|
-
/* @__PURE__ */ jsx(TeamTabs, { teamId: id }),
|
|
16
|
-
/* @__PURE__ */ jsx("div", {
|
|
17
|
-
className: "overflow-x-auto rounded-md border border-frost",
|
|
18
|
-
children: /* @__PURE__ */ jsxs("table", {
|
|
19
|
-
className: "w-full",
|
|
20
|
-
children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
21
|
-
/* @__PURE__ */ jsx("th", { children: "agent" }),
|
|
22
|
-
/* @__PURE__ */ jsx("th", { children: "status" }),
|
|
23
|
-
/* @__PURE__ */ jsx("th", { children: "agent template" }),
|
|
24
|
-
/* @__PURE__ */ jsx("th", { children: "source slot" })
|
|
25
|
-
] }) }), /* @__PURE__ */ jsxs("tbody", { children: [detail.members.map((agent) => {
|
|
26
|
-
const binding = detail.bindings.find((item) => item.agentId === agent.id);
|
|
27
|
-
return /* @__PURE__ */ jsxs("tr", { children: [
|
|
28
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("a", {
|
|
29
|
-
href: `/agents/${agent.id}`,
|
|
30
|
-
children: agent.name
|
|
31
|
-
}) }),
|
|
32
|
-
/* @__PURE__ */ jsx("td", { children: agent.status }),
|
|
33
|
-
/* @__PURE__ */ jsx("td", { children: agent.profileId }),
|
|
34
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: binding?.sourceSlotId ?? "live-only" }) })
|
|
35
|
-
] }, agent.id);
|
|
36
|
-
}), detail.members.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
|
|
37
|
-
colSpan: 4,
|
|
38
|
-
className: "muted",
|
|
39
|
-
children: "No agents belong to this team."
|
|
40
|
-
}) })] })]
|
|
41
|
-
})
|
|
42
|
-
})
|
|
43
|
-
] });
|
|
44
|
-
}
|
|
45
|
-
//#endregion
|
|
46
|
-
export { TeamMembersPage as component };
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { t as Route } from "./services-OB4LAr2A.js";
|
|
2
|
-
import { t as ConfigPage } from "./ConfigPage-BKlh5vOU.js";
|
|
3
|
-
import { t as FieldRow } from "./FieldRow-B4eTegH9.js";
|
|
4
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
//#region src/routes/config/services.tsx?tsr-split=component
|
|
6
|
-
var UNGROUPED_LABEL = "Other";
|
|
7
|
-
/**
|
|
8
|
-
* Bucket services into teams while preserving the order each team first
|
|
9
|
-
* appears in the daemon's SERVICES list. Cards without a `team` field land
|
|
10
|
-
* in an "Other" bucket at the end.
|
|
11
|
-
*/
|
|
12
|
-
function groupServices(services) {
|
|
13
|
-
const buckets = /* @__PURE__ */ new Map();
|
|
14
|
-
for (const s of services) {
|
|
15
|
-
const key = s.team ?? UNGROUPED_LABEL;
|
|
16
|
-
const bucket = buckets.get(key) ?? [];
|
|
17
|
-
bucket.push(s);
|
|
18
|
-
buckets.set(key, bucket);
|
|
19
|
-
}
|
|
20
|
-
const entries = Array.from(buckets, ([team, items]) => ({
|
|
21
|
-
team,
|
|
22
|
-
items
|
|
23
|
-
}));
|
|
24
|
-
if (entries.length > 1) entries.sort((a, b) => {
|
|
25
|
-
if (a.team === UNGROUPED_LABEL) return 1;
|
|
26
|
-
if (b.team === UNGROUPED_LABEL) return -1;
|
|
27
|
-
return 0;
|
|
28
|
-
});
|
|
29
|
-
return entries;
|
|
30
|
-
}
|
|
31
|
-
function ServicesPage() {
|
|
32
|
-
const { services } = Route.useLoaderData();
|
|
33
|
-
const grouped = groupServices(services);
|
|
34
|
-
return /* @__PURE__ */ jsxs(ConfigPage, {
|
|
35
|
-
active: "services",
|
|
36
|
-
title: "Services",
|
|
37
|
-
description: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
38
|
-
"Configure non-LLM integrations such as web search and crawlers. Secret fields are encrypted in the ",
|
|
39
|
-
/* @__PURE__ */ jsx("code", {
|
|
40
|
-
className: "font-mono",
|
|
41
|
-
children: "secrets"
|
|
42
|
-
}),
|
|
43
|
-
" table; URLs and IDs live in the ",
|
|
44
|
-
/* @__PURE__ */ jsx("code", {
|
|
45
|
-
className: "font-mono",
|
|
46
|
-
children: "config"
|
|
47
|
-
}),
|
|
48
|
-
" table."
|
|
49
|
-
] }),
|
|
50
|
-
children: [services.length === 0 && /* @__PURE__ */ jsx("p", {
|
|
51
|
-
className: "text-muted-foreground italic",
|
|
52
|
-
children: "(no services registered)"
|
|
53
|
-
}), grouped.map(({ team, items }) => /* @__PURE__ */ jsxs("section", { children: [/* @__PURE__ */ jsx("h2", {
|
|
54
|
-
className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground",
|
|
55
|
-
children: team
|
|
56
|
-
}), items.map((s) => /* @__PURE__ */ jsxs("section", {
|
|
57
|
-
className: "rounded-lg border bg-card p-5 mb-3",
|
|
58
|
-
children: [
|
|
59
|
-
/* @__PURE__ */ jsxs("header", {
|
|
60
|
-
className: "mb-3 flex flex-wrap items-center gap-2",
|
|
61
|
-
children: [/* @__PURE__ */ jsx("span", {
|
|
62
|
-
className: "font-mono font-semibold",
|
|
63
|
-
children: s.id
|
|
64
|
-
}), /* @__PURE__ */ jsxs("span", {
|
|
65
|
-
className: "text-muted-foreground text-sm",
|
|
66
|
-
children: ["· ", s.displayName]
|
|
67
|
-
})]
|
|
68
|
-
}),
|
|
69
|
-
s.hint && /* @__PURE__ */ jsx("p", {
|
|
70
|
-
className: "text-xs text-muted-foreground mb-2",
|
|
71
|
-
children: s.hint
|
|
72
|
-
}),
|
|
73
|
-
s.fields.map((f) => /* @__PURE__ */ jsx(FieldRow, { field: f }, f.envVar))
|
|
74
|
-
]
|
|
75
|
-
}, s.id))] }, team))]
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
//#endregion
|
|
79
|
-
export { ServicesPage as component };
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { t as Route } from "./triggers-BdBx-HwR.js";
|
|
2
|
-
import { r as PageShell } from "./Page-LENulSXY.js";
|
|
3
|
-
import { t as AgentTabs } from "./AgentTabs-aXdsiiMp.js";
|
|
4
|
-
import { useState } from "react";
|
|
5
|
-
import { useRouter } from "@tanstack/react-router";
|
|
6
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
-
//#region src/routes/agents/$id/triggers.tsx?tsr-split=component
|
|
8
|
-
function TriggersPage() {
|
|
9
|
-
const { resolved, triggers, dispatches } = Route.useLoaderData();
|
|
10
|
-
const router = useRouter();
|
|
11
|
-
async function toggle(t) {
|
|
12
|
-
await fetch(`/api/triggers/${t.id}`, {
|
|
13
|
-
method: "PATCH",
|
|
14
|
-
headers: { "content-type": "application/json" },
|
|
15
|
-
body: JSON.stringify({ enabled: !t.enabled })
|
|
16
|
-
});
|
|
17
|
-
await router.invalidate();
|
|
18
|
-
}
|
|
19
|
-
async function del(id) {
|
|
20
|
-
if (!confirm("delete this trigger?")) return;
|
|
21
|
-
await fetch(`/api/triggers/${id}`, { method: "DELETE" });
|
|
22
|
-
await router.invalidate();
|
|
23
|
-
}
|
|
24
|
-
return /* @__PURE__ */ jsxs(PageShell, { children: [
|
|
25
|
-
/* @__PURE__ */ jsx("header", {
|
|
26
|
-
className: "mb-6",
|
|
27
|
-
children: /* @__PURE__ */ jsx("h1", { children: resolved.agent.name })
|
|
28
|
-
}),
|
|
29
|
-
/* @__PURE__ */ jsx(AgentTabs, {
|
|
30
|
-
agentId: resolved.agent.id,
|
|
31
|
-
active: "triggers",
|
|
32
|
-
archived: resolved.agent.status === "archived"
|
|
33
|
-
}),
|
|
34
|
-
/* @__PURE__ */ jsx(AddTriggerForm, {
|
|
35
|
-
agentId: resolved.agent.id,
|
|
36
|
-
onAdded: () => router.invalidate()
|
|
37
|
-
}),
|
|
38
|
-
/* @__PURE__ */ jsx("h3", {
|
|
39
|
-
className: "mb-3 mt-6 font-body text-[0.85em] font-semibold uppercase tracking-wider text-mocha-light",
|
|
40
|
-
children: "Active triggers"
|
|
41
|
-
}),
|
|
42
|
-
triggers.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
43
|
-
className: "muted",
|
|
44
|
-
children: "no triggers yet — add one above."
|
|
45
|
-
}) : /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
46
|
-
/* @__PURE__ */ jsx("th", { children: "id" }),
|
|
47
|
-
/* @__PURE__ */ jsx("th", { children: "kind" }),
|
|
48
|
-
/* @__PURE__ */ jsx("th", { children: "spec" }),
|
|
49
|
-
/* @__PURE__ */ jsx("th", { children: "message" }),
|
|
50
|
-
/* @__PURE__ */ jsx("th", { children: "last fired" }),
|
|
51
|
-
/* @__PURE__ */ jsx("th", {})
|
|
52
|
-
] }) }), /* @__PURE__ */ jsx("tbody", { children: triggers.map((t) => {
|
|
53
|
-
const spec = t.kind === "interval" ? `every ${t.intervalSec}s` : t.cronExpr;
|
|
54
|
-
const last = t.lastFiredAt ? new Date(t.lastFiredAt).toLocaleString() : "(never)";
|
|
55
|
-
return /* @__PURE__ */ jsxs("tr", {
|
|
56
|
-
className: t.enabled ? "" : "opacity-60",
|
|
57
|
-
children: [
|
|
58
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("code", { children: [t.id.slice(0, 8), "…"] }) }),
|
|
59
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("span", {
|
|
60
|
-
className: "inline-block rounded-sm border border-frost bg-ivory px-2 py-0.5 font-mono text-[0.8em] text-mocha",
|
|
61
|
-
children: t.kind
|
|
62
|
-
}) }),
|
|
63
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: spec }) }),
|
|
64
|
-
/* @__PURE__ */ jsx("td", { children: t.message.length > 60 ? `${t.message.slice(0, 60)}…` : t.message }),
|
|
65
|
-
/* @__PURE__ */ jsx("td", {
|
|
66
|
-
className: "text-[0.82em] text-mocha-light",
|
|
67
|
-
children: last
|
|
68
|
-
}),
|
|
69
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("div", {
|
|
70
|
-
className: "flex gap-1.5",
|
|
71
|
-
children: [/* @__PURE__ */ jsx("button", {
|
|
72
|
-
type: "button",
|
|
73
|
-
className: "ghost-btn",
|
|
74
|
-
onClick: () => toggle(t),
|
|
75
|
-
children: t.enabled ? "disable" : "enable"
|
|
76
|
-
}), /* @__PURE__ */ jsx("button", {
|
|
77
|
-
type: "button",
|
|
78
|
-
className: "ghost-btn",
|
|
79
|
-
onClick: () => del(t.id),
|
|
80
|
-
children: "delete"
|
|
81
|
-
})]
|
|
82
|
-
}) })
|
|
83
|
-
]
|
|
84
|
-
}, t.id);
|
|
85
|
-
}) })] }),
|
|
86
|
-
/* @__PURE__ */ jsx("h3", {
|
|
87
|
-
className: "mb-3 mt-8 font-body text-[0.85em] font-semibold uppercase tracking-wider text-mocha-light",
|
|
88
|
-
children: "Recent dispatches"
|
|
89
|
-
}),
|
|
90
|
-
dispatches.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
91
|
-
className: "muted",
|
|
92
|
-
children: "no scheduled occurrences yet."
|
|
93
|
-
}) : /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
94
|
-
/* @__PURE__ */ jsx("th", { children: "scheduled" }),
|
|
95
|
-
/* @__PURE__ */ jsx("th", { children: "status" }),
|
|
96
|
-
/* @__PURE__ */ jsx("th", { children: "attempts" }),
|
|
97
|
-
/* @__PURE__ */ jsx("th", { children: "error" })
|
|
98
|
-
] }) }), /* @__PURE__ */ jsx("tbody", { children: dispatches.map((dispatch) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
99
|
-
/* @__PURE__ */ jsx("td", {
|
|
100
|
-
className: "text-[0.82em]",
|
|
101
|
-
children: new Date(dispatch.scheduledAt).toLocaleString()
|
|
102
|
-
}),
|
|
103
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: dispatch.status }) }),
|
|
104
|
-
/* @__PURE__ */ jsx("td", { children: dispatch.attemptCount }),
|
|
105
|
-
/* @__PURE__ */ jsx("td", {
|
|
106
|
-
className: "text-[0.82em] text-mocha-light",
|
|
107
|
-
children: dispatch.lastError ?? "—"
|
|
108
|
-
})
|
|
109
|
-
] }, dispatch.id)) })] })
|
|
110
|
-
] });
|
|
111
|
-
}
|
|
112
|
-
function AddTriggerForm({ agentId, onAdded }) {
|
|
113
|
-
const [kind, setKind] = useState("interval");
|
|
114
|
-
const [intervalSec, setIntervalSec] = useState(300);
|
|
115
|
-
const [cronExpr, setCronExpr] = useState("");
|
|
116
|
-
const [message, setMessage] = useState("");
|
|
117
|
-
const [err, setErr] = useState(null);
|
|
118
|
-
const [submitting, setSubmitting] = useState(false);
|
|
119
|
-
async function submit(e) {
|
|
120
|
-
e.preventDefault();
|
|
121
|
-
setErr(null);
|
|
122
|
-
if (!message.trim()) {
|
|
123
|
-
setErr("message is required");
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
if (kind === "interval" && (!Number.isFinite(intervalSec) || intervalSec <= 0)) {
|
|
127
|
-
setErr("interval must be a positive number");
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
if (kind === "cron" && !cronExpr.trim()) {
|
|
131
|
-
setErr("cron expression is required");
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
setSubmitting(true);
|
|
135
|
-
try {
|
|
136
|
-
const body = {
|
|
137
|
-
kind,
|
|
138
|
-
message: message.trim()
|
|
139
|
-
};
|
|
140
|
-
if (kind === "interval") body.intervalSec = intervalSec;
|
|
141
|
-
else body.cronExpr = cronExpr.trim();
|
|
142
|
-
const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}/triggers`, {
|
|
143
|
-
method: "POST",
|
|
144
|
-
headers: { "content-type": "application/json" },
|
|
145
|
-
body: JSON.stringify(body)
|
|
146
|
-
});
|
|
147
|
-
if (!res.ok) {
|
|
148
|
-
const e2 = await res.json().catch(() => null);
|
|
149
|
-
throw new Error(e2?.error ?? res.statusText);
|
|
150
|
-
}
|
|
151
|
-
setMessage("");
|
|
152
|
-
setCronExpr("");
|
|
153
|
-
setIntervalSec(300);
|
|
154
|
-
onAdded();
|
|
155
|
-
} catch (e2) {
|
|
156
|
-
setErr(e2.message);
|
|
157
|
-
} finally {
|
|
158
|
-
setSubmitting(false);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return /* @__PURE__ */ jsxs("form", {
|
|
162
|
-
className: "card",
|
|
163
|
-
onSubmit: submit,
|
|
164
|
-
children: [
|
|
165
|
-
/* @__PURE__ */ jsx("h3", { children: "Add trigger" }),
|
|
166
|
-
/* @__PURE__ */ jsxs("div", {
|
|
167
|
-
className: "mb-3 flex gap-3",
|
|
168
|
-
children: [/* @__PURE__ */ jsxs("label", {
|
|
169
|
-
className: "m-0 inline-flex cursor-pointer items-center gap-1",
|
|
170
|
-
children: [/* @__PURE__ */ jsx("input", {
|
|
171
|
-
type: "radio",
|
|
172
|
-
checked: kind === "interval",
|
|
173
|
-
onChange: () => setKind("interval")
|
|
174
|
-
}), "interval (every N seconds)"]
|
|
175
|
-
}), /* @__PURE__ */ jsxs("label", {
|
|
176
|
-
className: "m-0 inline-flex cursor-pointer items-center gap-1",
|
|
177
|
-
children: [/* @__PURE__ */ jsx("input", {
|
|
178
|
-
type: "radio",
|
|
179
|
-
checked: kind === "cron",
|
|
180
|
-
onChange: () => setKind("cron")
|
|
181
|
-
}), "cron (5-field)"]
|
|
182
|
-
})]
|
|
183
|
-
}),
|
|
184
|
-
kind === "interval" ? /* @__PURE__ */ jsxs("label", { children: ["interval (seconds)", /* @__PURE__ */ jsx("input", {
|
|
185
|
-
type: "number",
|
|
186
|
-
min: 1,
|
|
187
|
-
value: intervalSec,
|
|
188
|
-
onChange: (e) => setIntervalSec(Number(e.target.value))
|
|
189
|
-
})] }) : /* @__PURE__ */ jsxs("label", { children: ["cron expression (minute hour dom month dow)", /* @__PURE__ */ jsx("input", {
|
|
190
|
-
type: "text",
|
|
191
|
-
placeholder: "*/15 * * * *",
|
|
192
|
-
value: cronExpr,
|
|
193
|
-
onChange: (e) => setCronExpr(e.target.value)
|
|
194
|
-
})] }),
|
|
195
|
-
/* @__PURE__ */ jsxs("label", { children: ["message", /* @__PURE__ */ jsx("textarea", {
|
|
196
|
-
placeholder: "e.g. check your inbox and act on anything new",
|
|
197
|
-
value: message,
|
|
198
|
-
onChange: (e) => setMessage(e.target.value),
|
|
199
|
-
className: "font-mono text-[0.9em] min-h-[80px]"
|
|
200
|
-
})] }),
|
|
201
|
-
/* @__PURE__ */ jsxs("div", {
|
|
202
|
-
className: "mt-3 flex items-center gap-3",
|
|
203
|
-
children: [/* @__PURE__ */ jsx("button", {
|
|
204
|
-
type: "submit",
|
|
205
|
-
disabled: submitting,
|
|
206
|
-
children: submitting ? "adding…" : "add"
|
|
207
|
-
}), err && /* @__PURE__ */ jsx("span", {
|
|
208
|
-
className: "text-[0.85em] text-danger",
|
|
209
|
-
children: err
|
|
210
|
-
})]
|
|
211
|
-
})
|
|
212
|
-
]
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
//#endregion
|
|
216
|
-
export { TriggersPage as component };
|