bazilion 0.5.1 → 0.6.0
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 +14 -9
- package/dist/cli.js +365 -140
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +32 -14058
- package/dist/daemon.js.map +1 -1
- package/dist/web/client/assets/AgentAvatar-Cq7PVBE_.js +1 -0
- package/dist/web/client/assets/AgentTabs-M5K8emJ8.js +1 -0
- package/dist/web/client/assets/Button-BefUtjMZ.js +1 -0
- package/dist/web/client/assets/ChatPane-C8zQfpzH.js +74 -0
- package/dist/web/client/assets/ConfigTabs-DRqAymcN.js +1 -0
- package/dist/web/client/assets/FieldRow-BqWnxZiX.js +1 -0
- package/dist/web/client/assets/MembersEditor-B-47GLUb.js +1 -0
- package/dist/web/client/assets/SpawnTeamModal-DiiC7Nc0.js +1 -0
- package/dist/web/client/assets/TemplatesTabs-DB4KERTQ.js +1 -0
- package/dist/web/client/assets/_id-B7gv1aPQ.js +1 -0
- package/dist/web/client/assets/_id-C7d1AqS0.js +1 -0
- package/dist/web/client/assets/_id-DhiwjC8u.js +1 -0
- package/dist/web/client/assets/_id-p8lUuNFm.js +1 -0
- package/dist/web/client/assets/agents-v8G-wt0M.js +1 -0
- package/dist/web/client/assets/config-BdmYpS_y.js +3 -0
- package/dist/web/client/assets/groups-DiY_ExGM.js +1 -0
- package/dist/web/client/assets/inbox-DtfVx246.js +1 -0
- package/dist/web/client/assets/index-BQUL6oyH.js +12 -0
- package/dist/web/client/assets/login-CVS70W9g.js +1 -0
- package/dist/web/client/assets/mcp-BDLQq8OZ.js +1 -0
- package/dist/web/client/assets/memory-6GGuAXwx.js +1 -0
- package/dist/web/client/assets/profile-groups-BA8rwZMA.js +1 -0
- package/dist/web/client/assets/profiles-C0aAcPZg.js +1 -0
- package/dist/web/client/assets/routes-DgAhnKFw.js +1 -0
- package/dist/web/client/assets/services-BZ86QEah.js +1 -0
- package/dist/web/client/assets/skills-mv_NNNwo.js +1 -0
- package/dist/web/client/assets/styles-CmqUskDu.css +2 -0
- package/dist/web/client/assets/telegram-5f9WXs3x.js +1 -0
- package/dist/web/client/assets/tokens-DHiYsFUh.js +1 -0
- package/dist/web/client/assets/triggers-CjC8Ljrz.js +1 -0
- package/dist/web/client/assets/welcome-C-Cu-ziL.js +1 -0
- package/dist/web/client/assets/wire-constants-BkT5-597.js +1 -0
- package/dist/web/client/baziu.svg +8 -0
- package/dist/web/server/assets/AgentAvatar-8gTAy_tP.js +37 -0
- package/dist/web/server/assets/AgentTabs-BOjTN7QF.js +34 -0
- package/dist/web/server/assets/Button-Dsnw22OF.js +17 -0
- package/dist/web/server/assets/ChatPane-BvpswYvF.js +1084 -0
- package/dist/web/server/assets/ConfigTabs-CyuxzesF.js +41 -0
- package/dist/web/server/assets/FieldRow-DwyqycWI.js +94 -0
- package/dist/web/server/assets/MembersEditor-BWQztvrX.js +131 -0
- package/dist/web/server/assets/Sidebar-DmEiewRN.js +529 -0
- package/dist/web/server/assets/SpawnTeamModal-dSN421k_.js +107 -0
- package/dist/web/server/assets/TemplatesTabs---7h5GYa.js +30 -0
- package/dist/web/server/assets/_id-BZ-YCWSw.js +16 -0
- package/dist/web/server/assets/_id-Bm4-_AP-.js +367 -0
- package/dist/web/server/assets/_id-C78M9_j9.js +12 -0
- package/dist/web/server/assets/_id-CGZbudCl.js +28 -0
- package/dist/web/server/assets/_id-CHNm7EAd.js +161 -0
- package/dist/web/server/assets/_id-CrQbC5L8.js +16 -0
- package/dist/web/server/assets/_id-Crcw2HhT.js +38 -0
- package/dist/web/server/assets/_id-CvIGhq4U.js +16 -0
- package/dist/web/server/assets/_id-DF3pfi9M.js +27 -0
- package/dist/web/server/assets/_id-Dc8P9sy2.js +24 -0
- package/dist/web/server/assets/_id-GJk3EYTT.js +662 -0
- package/dist/web/server/assets/_id-pd4S7LTi.js +467 -0
- package/dist/web/server/assets/_tanstack-start-manifest_v-CPyKYMJg.js +174 -0
- package/dist/web/server/assets/agents-70EwQJR6.js +210 -0
- package/dist/web/server/assets/agents-Ds4lcREv.js +26 -0
- package/dist/web/server/assets/agents-K4Smhnq3.js +14 -0
- package/dist/web/server/assets/auth-DpAGLHpA.js +26 -0
- package/dist/web/server/assets/config-CMXUx_IF.js +19 -0
- package/dist/web/server/assets/config-DQbCsY_l.js +382 -0
- package/dist/web/server/assets/config-DxCGYgR9.js +12 -0
- package/dist/web/server/assets/createServerRpc-CBTntoKx.js +12 -0
- package/dist/web/server/assets/createSsrRpc-DHBVUN8O.js +16 -0
- package/dist/web/server/assets/daemon-client-2NRMzlTr.js +96 -0
- package/dist/web/server/assets/empty-plugin-adapters-Bos_V2s-.js +5 -0
- package/dist/web/server/assets/groups-CXVew7BP.js +150 -0
- package/dist/web/server/assets/groups-Cms8cvH5.js +12 -0
- package/dist/web/server/assets/groups-Dmcvw5ya.js +21 -0
- package/dist/web/server/assets/inbox-0QfwsrGo.js +27 -0
- package/dist/web/server/assets/inbox-8HybA2Ws.js +133 -0
- package/dist/web/server/assets/inbox-B7UWoICA.js +42 -0
- package/dist/web/server/assets/login-CNznncgA.js +58 -0
- package/dist/web/server/assets/login-CQybKk7Y.js +74 -0
- package/dist/web/server/assets/mcp-42BrkI1I.js +12 -0
- package/dist/web/server/assets/mcp-DIa0kIOf.js +268 -0
- package/dist/web/server/assets/mcp-DsTjY3uz.js +12 -0
- package/dist/web/server/assets/memory-BfrMp8iY.js +284 -0
- package/dist/web/server/assets/memory-Dr0lOM2y.js +28 -0
- package/dist/web/server/assets/memory-EEgLDfCj.js +16 -0
- package/dist/web/server/assets/profile-groups-BW5gU-fG.js +12 -0
- package/dist/web/server/assets/profile-groups-B_kIT6BU.js +208 -0
- package/dist/web/server/assets/profile-groups-C5isDI2t.js +28 -0
- package/dist/web/server/assets/profiles-BP1v-jna.js +453 -0
- package/dist/web/server/assets/profiles-BbPTpmyq.js +26 -0
- package/dist/web/server/assets/profiles-Cy5auEj8.js +12 -0
- package/dist/web/server/assets/router-CL100-Ly.js +460 -0
- package/dist/web/server/assets/routes-CzJLQxcS.js +14 -0
- package/dist/web/server/assets/routes-D2H1Hnoh.js +57 -0
- package/dist/web/server/assets/routes-Dzk8jvIo.js +33 -0
- package/dist/web/server/assets/services-Bgj6M2gC.js +12 -0
- package/dist/web/server/assets/services-DEgYsWJ4.js +17 -0
- package/dist/web/server/assets/services-DFenjiw0.js +94 -0
- package/dist/web/server/assets/skills-BASIP_rT.js +12 -0
- package/dist/web/server/assets/skills-C-JPRCHh.js +12 -0
- package/dist/web/server/assets/skills-DZXN680t.js +261 -0
- package/dist/web/server/assets/start-cOXH7eTI.js +4 -0
- package/dist/web/server/assets/telegram-BbvqVWxa.js +583 -0
- package/dist/web/server/assets/telegram-Bq49AtnP.js +12 -0
- package/dist/web/server/assets/telegram-sUckI94O.js +12 -0
- package/dist/web/server/assets/tokens-BERRE0wB.js +14 -0
- package/dist/web/server/assets/tokens-CImgxhDI.js +193 -0
- package/dist/web/server/assets/tokens-Dwn00iV7.js +12 -0
- package/dist/web/server/assets/triggers-DtexqbNH.js +16 -0
- package/dist/web/server/assets/triggers-TyIjwSYn.js +26 -0
- package/dist/web/server/assets/triggers-_iSeahif.js +191 -0
- package/dist/web/server/assets/welcome-BkQ9NC5K.js +81 -0
- package/dist/web/server/assets/wire-constants-Deb4NxBb.js +16 -0
- package/dist/web/server/server.js +5899 -0
- package/dist/web-server.js +42 -0
- package/dist/web-server.js.map +1 -0
- package/package.json +10 -4
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { t as Route } from "./services-DEgYsWJ4.js";
|
|
2
|
+
import { t as ConfigTabs } from "./ConfigTabs-CyuxzesF.js";
|
|
3
|
+
import { t as FieldRow } from "./FieldRow-DwyqycWI.js";
|
|
4
|
+
import { 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 groups while preserving the order each group first
|
|
9
|
+
* appears in the daemon's SERVICES list. Cards without a `group` 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.group ?? UNGROUPED_LABEL;
|
|
16
|
+
const bucket = buckets.get(key) ?? [];
|
|
17
|
+
bucket.push(s);
|
|
18
|
+
buckets.set(key, bucket);
|
|
19
|
+
}
|
|
20
|
+
const entries = Array.from(buckets, ([group, items]) => ({
|
|
21
|
+
group,
|
|
22
|
+
items
|
|
23
|
+
}));
|
|
24
|
+
if (entries.length > 1) entries.sort((a, b) => {
|
|
25
|
+
if (a.group === UNGROUPED_LABEL) return 1;
|
|
26
|
+
if (b.group === 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("main", {
|
|
35
|
+
className: "mx-auto max-w-5xl px-6 py-8",
|
|
36
|
+
children: [
|
|
37
|
+
/* @__PURE__ */ jsx("h1", {
|
|
38
|
+
className: "font-serif text-3xl text-foreground mb-2",
|
|
39
|
+
children: "config"
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ jsx(ConfigTabs, { active: "services" }),
|
|
42
|
+
/* @__PURE__ */ jsxs("p", {
|
|
43
|
+
className: "text-muted-foreground text-sm mb-6",
|
|
44
|
+
children: [
|
|
45
|
+
"Configuration for non-LLM integrations — web search, crawlers, and similar. Fields marked as secrets are encrypted in the ",
|
|
46
|
+
/* @__PURE__ */ jsx("code", {
|
|
47
|
+
className: "font-mono",
|
|
48
|
+
children: "secrets"
|
|
49
|
+
}),
|
|
50
|
+
" ",
|
|
51
|
+
"table; plaintext URLs and IDs live in the ",
|
|
52
|
+
/* @__PURE__ */ jsx("code", {
|
|
53
|
+
className: "font-mono",
|
|
54
|
+
children: "config"
|
|
55
|
+
}),
|
|
56
|
+
" ",
|
|
57
|
+
"table."
|
|
58
|
+
]
|
|
59
|
+
}),
|
|
60
|
+
services.length === 0 && /* @__PURE__ */ jsx("p", {
|
|
61
|
+
className: "text-muted-foreground italic",
|
|
62
|
+
children: "(no services registered)"
|
|
63
|
+
}),
|
|
64
|
+
grouped.map(({ group, items }) => /* @__PURE__ */ jsxs("section", {
|
|
65
|
+
className: "mb-6",
|
|
66
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
67
|
+
className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground",
|
|
68
|
+
children: group
|
|
69
|
+
}), items.map((s) => /* @__PURE__ */ jsxs("section", {
|
|
70
|
+
className: "rounded-lg border bg-card p-5 mb-3",
|
|
71
|
+
children: [
|
|
72
|
+
/* @__PURE__ */ jsxs("header", {
|
|
73
|
+
className: "flex items-center gap-2 mb-3",
|
|
74
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
75
|
+
className: "font-mono font-semibold",
|
|
76
|
+
children: s.id
|
|
77
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
78
|
+
className: "text-muted-foreground text-sm",
|
|
79
|
+
children: ["· ", s.displayName]
|
|
80
|
+
})]
|
|
81
|
+
}),
|
|
82
|
+
s.hint && /* @__PURE__ */ jsx("p", {
|
|
83
|
+
className: "text-xs text-muted-foreground mb-2",
|
|
84
|
+
children: s.hint
|
|
85
|
+
}),
|
|
86
|
+
s.fields.map((f) => /* @__PURE__ */ jsx(FieldRow, { field: f }, f.envVar))
|
|
87
|
+
]
|
|
88
|
+
}, s.id))]
|
|
89
|
+
}, group))
|
|
90
|
+
]
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { ServicesPage as component };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { t as createServerFn } from "../server.js";
|
|
2
|
+
import { t as createServerRpc } from "./createServerRpc-CBTntoKx.js";
|
|
3
|
+
import { n as daemonClient } from "./daemon-client-2NRMzlTr.js";
|
|
4
|
+
//#region src/routes/skills/index.tsx?tss-serverfn-split
|
|
5
|
+
var fetchSkills_createServerFn_handler = createServerRpc({
|
|
6
|
+
id: "ae1d30575b229c1e2622fbaf2252800a9a7acc84afdd68cba025ca890b8d52c5",
|
|
7
|
+
name: "fetchSkills",
|
|
8
|
+
filename: "src/routes/skills/index.tsx"
|
|
9
|
+
}, (opts) => fetchSkills.__executeServer(opts));
|
|
10
|
+
var fetchSkills = createServerFn({ method: "GET" }).handler(fetchSkills_createServerFn_handler, () => daemonClient().get("/api/skills"));
|
|
11
|
+
//#endregion
|
|
12
|
+
export { fetchSkills_createServerFn_handler };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { t as createServerFn } from "../server.js";
|
|
2
|
+
import { t as createSsrRpc } from "./createSsrRpc-DHBVUN8O.js";
|
|
3
|
+
import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
|
|
4
|
+
//#region src/routes/skills/index.tsx
|
|
5
|
+
var $$splitComponentImporter = () => import("./skills-DZXN680t.js");
|
|
6
|
+
var fetchSkills = createServerFn({ method: "GET" }).handler(createSsrRpc("ae1d30575b229c1e2622fbaf2252800a9a7acc84afdd68cba025ca890b8d52c5"));
|
|
7
|
+
var Route = createFileRoute("/skills/")({
|
|
8
|
+
loader: () => fetchSkills(),
|
|
9
|
+
component: lazyRouteComponent($$splitComponentImporter, "component")
|
|
10
|
+
});
|
|
11
|
+
//#endregion
|
|
12
|
+
export { Route as t };
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { t as Route } from "./skills-C-JPRCHh.js";
|
|
2
|
+
import { useRef, useState } from "react";
|
|
3
|
+
import { useRouter } from "@tanstack/react-router";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/routes/skills/index.tsx?tsr-split=component
|
|
6
|
+
function SkillsPage() {
|
|
7
|
+
const skills = Route.useLoaderData();
|
|
8
|
+
const router = useRouter();
|
|
9
|
+
async function remove(name) {
|
|
10
|
+
if (!confirm(`remove skill "${name}"? this deletes the directory on disk.`)) return;
|
|
11
|
+
const res = await fetch(`/api/skills/${encodeURIComponent(name)}`, { method: "DELETE" });
|
|
12
|
+
if (!res.ok && res.status !== 204) {
|
|
13
|
+
alert(res.statusText);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
await router.invalidate();
|
|
17
|
+
}
|
|
18
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
19
|
+
/* @__PURE__ */ jsx("h1", { children: "skills" }),
|
|
20
|
+
/* @__PURE__ */ jsx(ImportCard, { onImported: () => router.invalidate() }),
|
|
21
|
+
/* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
22
|
+
/* @__PURE__ */ jsx("th", { children: "name" }),
|
|
23
|
+
/* @__PURE__ */ jsx("th", { children: "description" }),
|
|
24
|
+
/* @__PURE__ */ jsx("th", { children: "source" }),
|
|
25
|
+
/* @__PURE__ */ jsx("th", {})
|
|
26
|
+
] }) }), /* @__PURE__ */ jsxs("tbody", { children: [skills.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
|
|
27
|
+
colSpan: 4,
|
|
28
|
+
className: "muted",
|
|
29
|
+
children: "no skills installed yet"
|
|
30
|
+
}) }), skills.map((s) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
31
|
+
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: s.name }) }),
|
|
32
|
+
/* @__PURE__ */ jsx("td", { children: s.parseError ? /* @__PURE__ */ jsxs("span", {
|
|
33
|
+
className: "text-[#9B3D3D]",
|
|
34
|
+
children: ["parse error: ", s.parseError]
|
|
35
|
+
}) : s.description }),
|
|
36
|
+
/* @__PURE__ */ jsxs("td", {
|
|
37
|
+
className: "text-[0.78em] text-mocha-light",
|
|
38
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: "font-mono",
|
|
40
|
+
children: s.source ?? "(unknown)"
|
|
41
|
+
}), s.importedAt && /* @__PURE__ */ jsx("div", {
|
|
42
|
+
className: "font-mono",
|
|
43
|
+
children: new Date(s.importedAt).toLocaleDateString()
|
|
44
|
+
})]
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("button", {
|
|
47
|
+
type: "button",
|
|
48
|
+
className: "ghost-btn",
|
|
49
|
+
onClick: () => remove(s.name),
|
|
50
|
+
children: "remove"
|
|
51
|
+
}) })
|
|
52
|
+
] }, s.name))] })] })
|
|
53
|
+
] });
|
|
54
|
+
}
|
|
55
|
+
function ImportCard({ onImported }) {
|
|
56
|
+
const [tab, setTab] = useState("openclaw");
|
|
57
|
+
const [path, setPath] = useState("");
|
|
58
|
+
const [force, setForce] = useState(false);
|
|
59
|
+
const [zipFile, setZipFile] = useState(null);
|
|
60
|
+
const [dragOver, setDragOver] = useState(false);
|
|
61
|
+
const [err, setErr] = useState(null);
|
|
62
|
+
const [submitting, setSubmitting] = useState(false);
|
|
63
|
+
const fileInput = useRef(null);
|
|
64
|
+
async function submit(e) {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
setErr(null);
|
|
67
|
+
setSubmitting(true);
|
|
68
|
+
try {
|
|
69
|
+
let res;
|
|
70
|
+
if (tab === "zip") {
|
|
71
|
+
if (!zipFile) {
|
|
72
|
+
setErr("choose a .zip file first");
|
|
73
|
+
setSubmitting(false);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const fd = new FormData();
|
|
77
|
+
fd.set("file", zipFile);
|
|
78
|
+
if (force) fd.set("force", "true");
|
|
79
|
+
res = await fetch("/api/skills/import", {
|
|
80
|
+
method: "POST",
|
|
81
|
+
body: fd
|
|
82
|
+
});
|
|
83
|
+
} else {
|
|
84
|
+
let source;
|
|
85
|
+
if (tab === "openclaw") source = "openclaw";
|
|
86
|
+
else {
|
|
87
|
+
source = path.trim();
|
|
88
|
+
if (!source) {
|
|
89
|
+
setErr("fill in the server path");
|
|
90
|
+
setSubmitting(false);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
res = await fetch("/api/skills/import", {
|
|
95
|
+
method: "POST",
|
|
96
|
+
headers: { "content-type": "application/json" },
|
|
97
|
+
body: JSON.stringify({
|
|
98
|
+
source,
|
|
99
|
+
force
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (!res.ok) {
|
|
104
|
+
const e2 = await res.json().catch(() => null);
|
|
105
|
+
throw new Error(e2?.error ?? `${res.status} ${res.statusText}`);
|
|
106
|
+
}
|
|
107
|
+
setPath("");
|
|
108
|
+
setZipFile(null);
|
|
109
|
+
onImported();
|
|
110
|
+
} catch (e2) {
|
|
111
|
+
setErr(e2.message);
|
|
112
|
+
} finally {
|
|
113
|
+
setSubmitting(false);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function onFileChange(e) {
|
|
117
|
+
setZipFile(e.target.files?.[0] ?? null);
|
|
118
|
+
}
|
|
119
|
+
function onDrop(e) {
|
|
120
|
+
e.preventDefault();
|
|
121
|
+
setDragOver(false);
|
|
122
|
+
const files = e.dataTransfer?.files;
|
|
123
|
+
if (!files || files.length === 0) return;
|
|
124
|
+
const f = files[0];
|
|
125
|
+
if (!f) return;
|
|
126
|
+
if (!/\.zip$/i.test(f.name)) {
|
|
127
|
+
setErr("only .zip archives are supported");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
setZipFile(f);
|
|
131
|
+
if (fileInput.current) {
|
|
132
|
+
const dt = new DataTransfer();
|
|
133
|
+
dt.items.add(f);
|
|
134
|
+
fileInput.current.files = dt.files;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
138
|
+
className: "card",
|
|
139
|
+
children: [
|
|
140
|
+
/* @__PURE__ */ jsx("h3", {
|
|
141
|
+
className: "mb-1",
|
|
142
|
+
children: "import skills"
|
|
143
|
+
}),
|
|
144
|
+
/* @__PURE__ */ jsxs("p", {
|
|
145
|
+
className: "muted mb-3 text-[0.88em]",
|
|
146
|
+
children: [
|
|
147
|
+
"pick a source. Each skill's ",
|
|
148
|
+
/* @__PURE__ */ jsx("code", { children: "SKILL.md" }),
|
|
149
|
+
" body is injected into the system prompt of any agent it's attached to."
|
|
150
|
+
]
|
|
151
|
+
}),
|
|
152
|
+
/* @__PURE__ */ jsx("div", {
|
|
153
|
+
role: "tablist",
|
|
154
|
+
className: "mb-4 inline-flex gap-0 rounded-md border border-frost bg-ivory p-1",
|
|
155
|
+
children: [
|
|
156
|
+
{
|
|
157
|
+
id: "openclaw",
|
|
158
|
+
label: "OpenClaw"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: "path",
|
|
162
|
+
label: "server directory"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: "zip",
|
|
166
|
+
label: "upload zip"
|
|
167
|
+
}
|
|
168
|
+
].map((it) => /* @__PURE__ */ jsx("button", {
|
|
169
|
+
type: "button",
|
|
170
|
+
role: "tab",
|
|
171
|
+
"aria-selected": tab === it.id,
|
|
172
|
+
onClick: () => {
|
|
173
|
+
setTab(it.id);
|
|
174
|
+
setErr(null);
|
|
175
|
+
},
|
|
176
|
+
className: `unstyled cursor-pointer rounded-sm border-none bg-transparent px-3 py-1.5 text-[0.88em] font-medium transition-colors ${tab === it.id ? "bg-snow text-sapphire-deep shadow-baziu-sm" : "text-mocha hover:text-sapphire"}`,
|
|
177
|
+
children: it.label
|
|
178
|
+
}, it.id))
|
|
179
|
+
}),
|
|
180
|
+
err && /* @__PURE__ */ jsx("div", {
|
|
181
|
+
className: "err",
|
|
182
|
+
children: err
|
|
183
|
+
}),
|
|
184
|
+
/* @__PURE__ */ jsxs("form", {
|
|
185
|
+
onSubmit: submit,
|
|
186
|
+
children: [
|
|
187
|
+
tab === "openclaw" && /* @__PURE__ */ jsxs("p", {
|
|
188
|
+
className: "text-[0.92em] text-mocha",
|
|
189
|
+
children: [
|
|
190
|
+
"One-click import of every skill found in ",
|
|
191
|
+
/* @__PURE__ */ jsx("code", { children: "~/.openclaw/skills" }),
|
|
192
|
+
" on the server."
|
|
193
|
+
]
|
|
194
|
+
}),
|
|
195
|
+
tab === "path" && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("p", {
|
|
196
|
+
className: "text-[0.92em] text-mocha",
|
|
197
|
+
children: [
|
|
198
|
+
"Import from an absolute path on the server — either a single skill folder (contains ",
|
|
199
|
+
/* @__PURE__ */ jsx("code", { children: "SKILL.md" }),
|
|
200
|
+
") or a parent folder holding many skill subfolders."
|
|
201
|
+
]
|
|
202
|
+
}), /* @__PURE__ */ jsxs("label", { children: ["server path", /* @__PURE__ */ jsx("input", {
|
|
203
|
+
value: path,
|
|
204
|
+
onChange: (e) => setPath(e.target.value),
|
|
205
|
+
placeholder: "/home/you/my-skills",
|
|
206
|
+
required: true
|
|
207
|
+
})] })] }),
|
|
208
|
+
tab === "zip" && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("p", {
|
|
209
|
+
className: "text-[0.92em] text-mocha",
|
|
210
|
+
children: [
|
|
211
|
+
"Upload a ",
|
|
212
|
+
/* @__PURE__ */ jsx("code", { children: ".zip" }),
|
|
213
|
+
" archive whose top level contains one folder per skill — the folder name becomes the skill name."
|
|
214
|
+
]
|
|
215
|
+
}), /* @__PURE__ */ jsxs("label", {
|
|
216
|
+
onDragOver: (e) => {
|
|
217
|
+
e.preventDefault();
|
|
218
|
+
setDragOver(true);
|
|
219
|
+
},
|
|
220
|
+
onDragLeave: () => setDragOver(false),
|
|
221
|
+
onDrop,
|
|
222
|
+
className: `block cursor-pointer rounded-md border-2 border-dashed p-6 text-center transition-colors ${dragOver ? "border-sapphire bg-sapphire-glow text-sapphire-deep" : zipFile ? "border-solid border-sapphire-light bg-snow text-chocolate" : "border-frost bg-ivory text-mocha-light hover:border-sapphire hover:bg-sapphire-glow hover:text-sapphire-deep"}`,
|
|
223
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
224
|
+
ref: fileInput,
|
|
225
|
+
type: "file",
|
|
226
|
+
accept: ".zip,application/zip",
|
|
227
|
+
onChange: onFileChange,
|
|
228
|
+
className: "absolute h-px w-px overflow-hidden opacity-0"
|
|
229
|
+
}), zipFile ? /* @__PURE__ */ jsx("span", {
|
|
230
|
+
className: "block break-all font-mono text-[0.85em] text-sapphire-deep",
|
|
231
|
+
children: zipFile.name
|
|
232
|
+
}) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
|
|
233
|
+
className: "block text-[0.95em] font-medium text-mocha",
|
|
234
|
+
children: "click to choose a .zip file"
|
|
235
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
236
|
+
className: "text-[0.82em]",
|
|
237
|
+
children: "or drag & drop here"
|
|
238
|
+
})] })]
|
|
239
|
+
})] }),
|
|
240
|
+
/* @__PURE__ */ jsxs("div", {
|
|
241
|
+
className: "mt-3 flex flex-wrap items-center gap-3",
|
|
242
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
243
|
+
type: "submit",
|
|
244
|
+
disabled: submitting,
|
|
245
|
+
children: submitting ? "importing…" : tab === "zip" ? "upload & import" : tab === "openclaw" ? "import from OpenClaw" : "import"
|
|
246
|
+
}), /* @__PURE__ */ jsxs("label", {
|
|
247
|
+
className: "m-0 inline-flex cursor-pointer items-center text-[0.88em] text-mocha",
|
|
248
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
249
|
+
type: "checkbox",
|
|
250
|
+
checked: force,
|
|
251
|
+
onChange: (e) => setForce(e.target.checked)
|
|
252
|
+
}), "overwrite existing"]
|
|
253
|
+
})]
|
|
254
|
+
})
|
|
255
|
+
]
|
|
256
|
+
})
|
|
257
|
+
]
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
//#endregion
|
|
261
|
+
export { SkillsPage as component };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/@tanstack+react-start@1.168.16_react-dom@19.2.6_react@19.2.6__react@19.2.6_vite@8.0.14__9a33437cfd4027f5b7456e70e790b869/node_modules/@tanstack/react-start/dist/plugin/default-entry/start.ts
|
|
2
|
+
var startInstance = void 0;
|
|
3
|
+
//#endregion
|
|
4
|
+
export { startInstance };
|