bazilion 0.8.0 → 0.10.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.
Files changed (217) hide show
  1. package/README.md +47 -5
  2. package/dist/cli.js +1190 -640
  3. package/dist/cli.js.map +1 -1
  4. package/dist/daemon.js +5165 -1598
  5. package/dist/daemon.js.map +1 -1
  6. package/dist/migrations/0001_init.sql +318 -88
  7. package/dist/web/client/assets/AgentTabs-B3hq5a3e.js +1 -0
  8. package/dist/web/client/assets/ConfigPage-BCwfgyjD.js +1 -0
  9. package/dist/web/client/assets/FieldRow-avAFLgYW.js +1 -0
  10. package/dist/web/client/assets/Page-CwNuDhWz.js +1 -0
  11. package/dist/web/client/assets/ProductionTeamPolicyEditor-CiQ-VVDo.js +7 -0
  12. package/dist/web/client/assets/ProductionTeamPolicyEditor-DLioOiRN.css +1 -0
  13. package/dist/web/client/assets/ProfileCommunicationEditor-D84F5yfr.js +1 -0
  14. package/dist/web/client/assets/RecoveryState-QfMSuwy3.js +1 -0
  15. package/dist/web/client/assets/SectionTabs-DZzy01az.js +1 -0
  16. package/dist/web/client/assets/TeamTabs-Btoe_FAE.js +1 -0
  17. package/dist/web/client/assets/TemplatesTabs-CAYY03F5.js +1 -0
  18. package/dist/web/client/assets/_id-BeauECmk.js +1 -0
  19. package/dist/web/client/assets/_id-BqU2BodK.js +1 -0
  20. package/dist/web/client/assets/_id-CKtoio3t.js +1 -0
  21. package/dist/web/client/assets/_id-DGyKURCp.js +1 -0
  22. package/dist/web/client/assets/_id-Q98Of6k9.js +1 -0
  23. package/dist/web/client/assets/activity-DJuhhQCb.js +1 -0
  24. package/dist/web/client/assets/activity-DXN_N85w.js +1 -0
  25. package/dist/web/client/assets/agents-C5Xsdge1.js +1 -0
  26. package/dist/web/client/assets/agents-Cgxo4H5G.js +1 -0
  27. package/dist/web/client/assets/approvals-BnG7fbw-.js +1 -0
  28. package/dist/web/client/assets/approvals-DGi0PSx8.js +1 -0
  29. package/dist/web/client/assets/chevron-down-BhcBspw3.js +1 -0
  30. package/dist/web/client/assets/config-xw4NyrXF.js +3 -0
  31. package/dist/web/client/assets/context-D2V1Oi4z.js +1 -0
  32. package/dist/web/client/assets/inbox-DK6hWCMp.js +1 -0
  33. package/dist/web/client/assets/index-VdURSoM4.js +12 -0
  34. package/dist/web/client/assets/login-CvptUoMR.js +1 -0
  35. package/dist/web/client/assets/mcp-BDFM_sW-.js +1 -0
  36. package/dist/web/client/assets/members-BJvph_TR.js +1 -0
  37. package/dist/web/client/assets/memory-DRytqZCD.js +1 -0
  38. package/dist/web/client/assets/plus-C9ee3SIO.js +1 -0
  39. package/dist/web/client/assets/policy-CGP50OtQ.js +1 -0
  40. package/dist/web/client/assets/policy-K4hIbbIN.js +1 -0
  41. package/dist/web/client/assets/preload-helper-mNuBjNXU.js +1 -0
  42. package/dist/web/client/assets/react-3W8R1pOO.js +1 -0
  43. package/dist/web/client/assets/routes-DJnWYvC9.js +1 -0
  44. package/dist/web/client/assets/services-DHheiv7L.js +1 -0
  45. package/dist/web/client/assets/skills-DmsitluU.js +1 -0
  46. package/dist/web/client/assets/styles-B5eQAwLP.css +2 -0
  47. package/dist/web/client/assets/team-policy-D0jpnn2b.js +1 -0
  48. package/dist/web/client/assets/teams-BdC4gthq.js +1 -0
  49. package/dist/web/client/assets/teams-CSNyLz3l.js +1 -0
  50. package/dist/web/client/assets/teams-CbxSaorm.js +1 -0
  51. package/dist/web/client/assets/telegram-D61G_alO.js +1 -0
  52. package/dist/web/client/assets/tokens-CjRplDrJ.js +1 -0
  53. package/dist/web/client/assets/triggers-MLzTm_DM.js +1 -0
  54. package/dist/web/client/assets/welcome-wBfX9dAd.js +1 -0
  55. package/dist/web/client/assets/{ChatPane-DzEgOEqS.js → wire-constants-BxfyUMXB.js} +4 -4
  56. package/dist/web/server/assets/{AgentTabs-BOjTN7QF.js → AgentTabs-DoMDJBXH.js} +10 -7
  57. package/dist/web/server/assets/{ChatPane-BvpswYvF.js → ChatPane-eUY_dga3.js} +38 -20
  58. package/dist/web/server/assets/ConfigPage-BKlh5vOU.js +68 -0
  59. package/dist/web/server/assets/{FieldRow-DwyqycWI.js → FieldRow-B4eTegH9.js} +5 -5
  60. package/dist/web/server/assets/Page-LENulSXY.js +111 -0
  61. package/dist/web/server/assets/ProductionTeamPolicyEditor-Y4mzFFvR.js +1009 -0
  62. package/dist/web/server/assets/ProfileCommunicationEditor-C2RU-2QB.js +107 -0
  63. package/dist/web/server/assets/RecoveryState-B2SG-mrY.js +37 -0
  64. package/dist/web/server/assets/SectionTabs-BJTPr5nU.js +8 -0
  65. package/dist/web/server/assets/Sidebar-O_CH1-JD.js +964 -0
  66. package/dist/web/server/assets/TeamTabs-zZzbP1t_.js +51 -0
  67. package/dist/web/server/assets/{TemplatesTabs---7h5GYa.js → TemplatesTabs-CcRxZhJe.js} +9 -8
  68. package/dist/web/server/assets/_id-A8Xiv6Lc.js +11 -0
  69. package/dist/web/server/assets/{_id-Sjw0zhA6.js → _id-BhOB8Umi.js} +5 -5
  70. package/dist/web/server/assets/{_id-DDixKEud.js → _id-C3HY4lWg.js} +77 -20
  71. package/dist/web/server/assets/{_id-BdRiQb2H.js → _id-ClN9hY2x.js} +132 -39
  72. package/dist/web/server/assets/{_id-BqnDy_Ca.js → _id-CwyGjJeP.js} +7 -6
  73. package/dist/web/server/assets/{_id-D8duqgd5.js → _id-D27T85mU.js} +6 -5
  74. package/dist/web/server/assets/_id-D3Ap7zZA.js +377 -0
  75. package/dist/web/server/assets/_id-DinTp_7X.js +14 -0
  76. package/dist/web/server/assets/{_id-CnQflrRv.js → _id-Dj1yZ3zJ.js} +6 -6
  77. package/dist/web/server/assets/{_id-DUIrFV3G.js → _id-DkYodSkG.js} +10 -2
  78. package/dist/web/server/assets/{_id-D_Ew11ED.js → _id-IzadFZV9.js} +9 -9
  79. package/dist/web/server/assets/_id-LrvXU4Nr.js +45 -0
  80. package/dist/web/server/assets/_id-tB47Vsfp.js +42 -0
  81. package/dist/web/server/assets/_tanstack-start-manifest_v-D09Xu_6u.js +286 -0
  82. package/dist/web/server/assets/activity-BCI4mfNS.js +168 -0
  83. package/dist/web/server/assets/activity-CGCf8BQf.js +11 -0
  84. package/dist/web/server/assets/activity-D9SMqBhy.js +14 -0
  85. package/dist/web/server/assets/activity-DohitgwW.js +12 -0
  86. package/dist/web/server/assets/{agents-k5QURC4I.js → agents-BPKOshR5.js} +5 -5
  87. package/dist/web/server/assets/{profiles-C6a3RKgu.js → agents-BY74v7fM.js} +5 -5
  88. package/dist/web/server/assets/{profiles-CZ5NkmVw.js → agents-BvttypqB.js} +5 -5
  89. package/dist/web/server/assets/{agents-ChcAJUI5.js → agents-C9xlWK0Z.js} +2 -2
  90. package/dist/web/server/assets/agents-CgZMHj80.js +265 -0
  91. package/dist/web/server/assets/{profiles-LxcC_L6n.js → agents-DZuFEj0D.js} +87 -79
  92. package/dist/web/server/assets/approvals-BGU-XGIO.js +12 -0
  93. package/dist/web/server/assets/approvals-CWcFHlor.js +14 -0
  94. package/dist/web/server/assets/approvals-CbFXFvG8.js +11 -0
  95. package/dist/web/server/assets/approvals-DCaVw1Mz.js +280 -0
  96. package/dist/web/server/assets/{auth-DzRAMwVt.js → auth-byfSx6Ja.js} +6 -2
  97. package/dist/web/server/assets/{config-CHaCv89D.js → config-BDCJdtj2.js} +1 -1
  98. package/dist/web/server/assets/{config-CdVjqjin.js → config-D2LAsud2.js} +31 -52
  99. package/dist/web/server/assets/{config-Bq3o924J.js → config-TeIoyYYc.js} +2 -2
  100. package/dist/web/server/assets/context-B-XDf6Ym.js +12 -0
  101. package/dist/web/server/assets/context-BXGo5Vfi.js +12 -0
  102. package/dist/web/server/assets/context-DrkrIWun.js +47 -0
  103. package/dist/web/server/assets/{createServerRpc-CeKECg65.js → createServerRpc-pU-IQV2Y.js} +1 -1
  104. package/dist/web/server/assets/{createSsrRpc-ZBGxhl8t.js → createSsrRpc-DFsIAfFd.js} +1 -1
  105. package/dist/web/server/assets/{empty-plugin-adapters-DKUlnwwl.js → empty-plugin-adapters-Cq4--YW-.js} +1 -1
  106. package/dist/web/server/assets/{inbox-CkiSvD14.js → inbox-B3-TRsNI.js} +1 -1
  107. package/dist/web/server/assets/{inbox-Bxb3W04M.js → inbox-BardsGyy.js} +2 -2
  108. package/dist/web/server/assets/inbox-CUIyf9MT.js +131 -0
  109. package/dist/web/server/assets/login-Bx5LEyGP.js +118 -0
  110. package/dist/web/server/assets/login-CmWvxfTK.js +136 -0
  111. package/dist/web/server/assets/{mcp-BsFKEoXt.js → mcp-2pwT9HU8.js} +1 -1
  112. package/dist/web/server/assets/{mcp-BU_kKENi.js → mcp-BJjLIdP0.js} +105 -112
  113. package/dist/web/server/assets/{mcp-CKqwG4mt.js → mcp-DIWTogHM.js} +2 -2
  114. package/dist/web/server/assets/members-CCv17cjQ.js +46 -0
  115. package/dist/web/server/assets/members-CW5aBe81.js +12 -0
  116. package/dist/web/server/assets/members-VdPwD6CE.js +12 -0
  117. package/dist/web/server/assets/{memory-BaYnfm7K.js → memory-Dngc13Nw.js} +9 -9
  118. package/dist/web/server/assets/{memory-CQaqWnyM.js → memory-a8Kz57Kh.js} +22 -19
  119. package/dist/web/server/assets/{memory-Ns2-Z31p.js → memory-pZ4pZT7p.js} +6 -6
  120. package/dist/web/server/assets/policy-BYVXqsan.js +11 -0
  121. package/dist/web/server/assets/policy-Bb-vEgqg.js +40 -0
  122. package/dist/web/server/assets/policy-BcGELcc9.js +490 -0
  123. package/dist/web/server/assets/policy-C30AeFIb.js +21 -0
  124. package/dist/web/server/assets/router-DIdp8ZNt.js +504 -0
  125. package/dist/web/server/assets/{routes-C61gBiXa.js → routes-CXz4hTAr.js} +6 -6
  126. package/dist/web/server/assets/{routes-Ce2VWrU9.js → routes-Jb0zjKav.js} +16 -13
  127. package/dist/web/server/assets/{routes-V9URcp1v.js → routes-lIclH9Br.js} +2 -2
  128. package/dist/web/server/assets/services-B9yBWDX0.js +79 -0
  129. package/dist/web/server/assets/{services-Ccc5s2bS.js → services-C4szdhPx.js} +4 -4
  130. package/dist/web/server/assets/{services-DhRiNeq0.js → services-wG8I06oS.js} +1 -1
  131. package/dist/web/server/assets/skills-BZdqiDig.js +358 -0
  132. package/dist/web/server/assets/{skills-l2cyQ3zS.js → skills-C-UgkuCW.js} +2 -2
  133. package/dist/web/server/assets/{skills-CFIWVg32.js → skills-a9VSWHWq.js} +1 -1
  134. package/dist/web/server/assets/{start-CYDpZ6cb.js → start-WH8WzTL_.js} +1 -1
  135. package/dist/web/server/assets/team-policy-vPG01onj.js +180 -0
  136. package/dist/web/server/assets/teams-3im0oQnS.js +11 -0
  137. package/dist/web/server/assets/teams-CpQ0YgWf.js +112 -0
  138. package/dist/web/server/assets/teams-DEpQR2QA.js +14 -0
  139. package/dist/web/server/assets/teams-DqfrEoH6.js +36 -0
  140. package/dist/web/server/assets/teams-MjqgsmC3.js +12 -0
  141. package/dist/web/server/assets/teams-OIkHuxy1.js +12 -0
  142. package/dist/web/server/assets/teams-jBtvnk59.js +193 -0
  143. package/dist/web/server/assets/{telegram-DfAddLdv.js → telegram-7ub--6xz.js} +44 -56
  144. package/dist/web/server/assets/{telegram-T3l9KtiE.js → telegram-Bazhmpr4.js} +2 -2
  145. package/dist/web/server/assets/{telegram-BdaUIjvs.js → telegram-DNgCWebD.js} +1 -1
  146. package/dist/web/server/assets/{tokens-DdpnfV_Y.js → tokens-BnwFbV7T.js} +2 -2
  147. package/dist/web/server/assets/{tokens-BCz3PSoT.js → tokens-DPDMSN5O.js} +1 -1
  148. package/dist/web/server/assets/tokens-yyTSfBSN.js +186 -0
  149. package/dist/web/server/assets/{triggers-BzJG1nN5.js → triggers-BMpHsGIr.js} +5 -4
  150. package/dist/web/server/assets/{triggers-BcH_6PW1.js → triggers-C_0y6QV9.js} +1 -1
  151. package/dist/web/server/assets/{triggers-BcTTwMfy.js → triggers-Ca57_qym.js} +2 -2
  152. package/dist/web/server/assets/{welcome-CP4CZ9B6.js → welcome-IYHGurWx.js} +23 -15
  153. package/dist/web/server/assets/{wire-constants-Deb4NxBb.js → wire-constants-C8nBJcU3.js} +3 -3
  154. package/dist/web/server/server.js +126 -95
  155. package/dist/worker.js +185 -146
  156. package/dist/worker.js.map +1 -1
  157. package/package.json +8 -7
  158. package/dist/migrations/0002_profile_groups.sql +0 -38
  159. package/dist/migrations/0003_agent_telegram.sql +0 -40
  160. package/dist/migrations/0004_agent_mirror_mode.sql +0 -17
  161. package/dist/migrations/0005_group_topic_name_format.sql +0 -15
  162. package/dist/migrations/0006_telegram_acl.sql +0 -18
  163. package/dist/migrations/0007_mcp_servers.sql +0 -30
  164. package/dist/migrations/0008_seed_user_md.sql +0 -39
  165. package/dist/web/client/assets/AgentTabs-DioGqUVR.js +0 -1
  166. package/dist/web/client/assets/ConfigTabs-pY-V0Rie.js +0 -1
  167. package/dist/web/client/assets/FieldRow-CNKma5LE.js +0 -1
  168. package/dist/web/client/assets/MembersEditor-C6UpqDdV.js +0 -1
  169. package/dist/web/client/assets/SpawnTeamModal-BEkNCKXm.js +0 -1
  170. package/dist/web/client/assets/TemplatesTabs-UM04RMO9.js +0 -1
  171. package/dist/web/client/assets/_id-BNJapCT4.js +0 -1
  172. package/dist/web/client/assets/_id-CjGoV8Mr.js +0 -1
  173. package/dist/web/client/assets/_id-DehuCHUw.js +0 -1
  174. package/dist/web/client/assets/_id-Dz9fjcCM.js +0 -1
  175. package/dist/web/client/assets/agents-M6omAXcZ.js +0 -1
  176. package/dist/web/client/assets/config-DIuEc5bm.js +0 -3
  177. package/dist/web/client/assets/groups-DpE2d2zZ.js +0 -1
  178. package/dist/web/client/assets/inbox-BPnLsRNf.js +0 -1
  179. package/dist/web/client/assets/index-MAJuXnie.js +0 -12
  180. package/dist/web/client/assets/login-CawJX16E.js +0 -1
  181. package/dist/web/client/assets/mcp-DIrh9-v_.js +0 -1
  182. package/dist/web/client/assets/memory-BpHbdKsd.js +0 -1
  183. package/dist/web/client/assets/preload-helper-CvnapA2_.js +0 -1
  184. package/dist/web/client/assets/profile-groups-ByoKak0c.js +0 -1
  185. package/dist/web/client/assets/profiles-BEjv8LGo.js +0 -1
  186. package/dist/web/client/assets/routes-D2COHy7v.js +0 -1
  187. package/dist/web/client/assets/services-D212jSK_.js +0 -1
  188. package/dist/web/client/assets/skills-Da0MURjY.js +0 -1
  189. package/dist/web/client/assets/styles-BgE5bCHA.css +0 -2
  190. package/dist/web/client/assets/telegram-Czh2MdVm.js +0 -1
  191. package/dist/web/client/assets/tokens-E_JvO5JN.js +0 -1
  192. package/dist/web/client/assets/triggers-BBRZQOm7.js +0 -1
  193. package/dist/web/client/assets/welcome-Dn-zvmBE.js +0 -1
  194. package/dist/web/client/assets/wire-constants-BkT5-597.js +0 -1
  195. package/dist/web/server/assets/ConfigTabs-CyuxzesF.js +0 -41
  196. package/dist/web/server/assets/MembersEditor-BWQztvrX.js +0 -131
  197. package/dist/web/server/assets/Sidebar-DmEiewRN.js +0 -529
  198. package/dist/web/server/assets/SpawnTeamModal-dSN421k_.js +0 -107
  199. package/dist/web/server/assets/_id-BKev9H1p.js +0 -12
  200. package/dist/web/server/assets/_id-BNwlbWHP.js +0 -24
  201. package/dist/web/server/assets/_id-CRqqi8IE.js +0 -161
  202. package/dist/web/server/assets/_id-CXg-Blec.js +0 -367
  203. package/dist/web/server/assets/_tanstack-start-manifest_v-D9FLKShQ.js +0 -178
  204. package/dist/web/server/assets/agents-C7SBPN0M.js +0 -210
  205. package/dist/web/server/assets/groups-CbSwND2r.js +0 -12
  206. package/dist/web/server/assets/groups-CeRRlZaZ.js +0 -150
  207. package/dist/web/server/assets/groups-pk4CYSuf.js +0 -21
  208. package/dist/web/server/assets/inbox-DU27iHv_.js +0 -133
  209. package/dist/web/server/assets/login-CNznncgA.js +0 -58
  210. package/dist/web/server/assets/login-CQybKk7Y.js +0 -74
  211. package/dist/web/server/assets/profile-groups-CiU06yN1.js +0 -28
  212. package/dist/web/server/assets/profile-groups-D21MYoLM.js +0 -208
  213. package/dist/web/server/assets/profile-groups-aoJleXHP.js +0 -12
  214. package/dist/web/server/assets/router-BrDascdO.js +0 -460
  215. package/dist/web/server/assets/services-B91w2f-X.js +0 -94
  216. package/dist/web/server/assets/skills-D89ND2kR.js +0 -321
  217. package/dist/web/server/assets/tokens-CkKqrtk-.js +0 -193
@@ -1,5 +1,5 @@
1
1
  import { t as createServerFn } from "../server.js";
2
- import { t as createServerRpc } from "./createServerRpc-CeKECg65.js";
2
+ import { t as createServerRpc } from "./createServerRpc-pU-IQV2Y.js";
3
3
  import { n as daemonClient } from "./daemon-client-2NRMzlTr.js";
4
4
  //#region src/routes/config/services.tsx?tss-serverfn-split
5
5
  var fetchServices_createServerFn_handler = createServerRpc({
@@ -0,0 +1,358 @@
1
+ import { t as Route } from "./skills-C-UgkuCW.js";
2
+ import { a as StatusBadge, i as SectionCard, n as PageHeader, r as PageShell, t as EmptyState } from "./Page-LENulSXY.js";
3
+ import { t as Button } from "./Button-Dsnw22OF.js";
4
+ import { useRef, useState } from "react";
5
+ import { useRouter } from "@tanstack/react-router";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/routes/skills/index.tsx?tsr-split=component
8
+ function SkillsPage() {
9
+ const skills = Route.useLoaderData();
10
+ const router = useRouter();
11
+ async function remove(name) {
12
+ if (!confirm(`Remove skill "${name}"? This deletes the directory on disk.`)) return;
13
+ const res = await fetch(`/api/skills/${encodeURIComponent(name)}`, { method: "DELETE" });
14
+ if (!res.ok && res.status !== 204) {
15
+ alert(res.statusText);
16
+ return;
17
+ }
18
+ await router.invalidate();
19
+ }
20
+ return /* @__PURE__ */ jsxs(PageShell, {
21
+ size: "wide",
22
+ children: [
23
+ /* @__PURE__ */ jsx(PageHeader, {
24
+ title: "Skills",
25
+ description: "Install and review the prompt-only skills available to your agents."
26
+ }),
27
+ /* @__PURE__ */ jsx(ImportCard, { onImported: () => router.invalidate() }),
28
+ /* @__PURE__ */ jsx(SectionCard, {
29
+ title: "Installed skills",
30
+ description: `${skills.length} skill${skills.length === 1 ? "" : "s"} available`,
31
+ children: skills.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
32
+ title: "No skills installed",
33
+ description: "Import from OpenClaw, a server directory, or a ZIP archive to get started."
34
+ }) : /* @__PURE__ */ jsx("div", {
35
+ className: "overflow-x-auto",
36
+ children: /* @__PURE__ */ jsxs("table", {
37
+ className: "m-0 min-w-[760px]",
38
+ children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
39
+ /* @__PURE__ */ jsx("th", { children: "Name" }),
40
+ /* @__PURE__ */ jsx("th", { children: "Description" }),
41
+ /* @__PURE__ */ jsx("th", { children: "Scan" }),
42
+ /* @__PURE__ */ jsx("th", { children: "Source" }),
43
+ /* @__PURE__ */ jsx("th", {})
44
+ ] }) }), /* @__PURE__ */ jsx("tbody", { children: skills.map((s) => /* @__PURE__ */ jsxs("tr", { children: [
45
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: s.name }) }),
46
+ /* @__PURE__ */ jsx("td", {
47
+ className: "max-w-xl",
48
+ children: s.parseError ? /* @__PURE__ */ jsxs("div", {
49
+ className: "flex items-start gap-2 text-sm",
50
+ children: [/* @__PURE__ */ jsx(StatusBadge, {
51
+ variant: "danger",
52
+ children: "Parse error"
53
+ }), /* @__PURE__ */ jsx("span", {
54
+ className: "text-destructive",
55
+ children: s.parseError
56
+ })]
57
+ }) : s.description
58
+ }),
59
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(FindingSummary, { findings: s.scanFindings ?? [] }) }),
60
+ /* @__PURE__ */ jsxs("td", {
61
+ className: "text-xs text-muted-foreground",
62
+ children: [/* @__PURE__ */ jsx("span", {
63
+ className: "font-mono",
64
+ children: s.source ?? "Unknown"
65
+ }), s.importedAt && /* @__PURE__ */ jsx("div", {
66
+ className: "mt-1 font-mono",
67
+ children: new Date(s.importedAt).toLocaleDateString()
68
+ })]
69
+ }),
70
+ /* @__PURE__ */ jsx("td", {
71
+ className: "text-right",
72
+ children: /* @__PURE__ */ jsx(Button, {
73
+ variant: "danger",
74
+ className: "whitespace-nowrap",
75
+ onClick: () => remove(s.name),
76
+ children: "Remove"
77
+ })
78
+ })
79
+ ] }, s.name)) })]
80
+ })
81
+ })
82
+ })
83
+ ]
84
+ });
85
+ }
86
+ function ImportCard({ onImported }) {
87
+ const [tab, setTab] = useState("openclaw");
88
+ const [path, setPath] = useState("");
89
+ const [force, setForce] = useState(false);
90
+ const [zipFile, setZipFile] = useState(null);
91
+ const [dragOver, setDragOver] = useState(false);
92
+ const [err, setErr] = useState(null);
93
+ const [findings, setFindings] = useState([]);
94
+ const [submitting, setSubmitting] = useState(false);
95
+ const fileInput = useRef(null);
96
+ async function submit(e) {
97
+ e.preventDefault();
98
+ setErr(null);
99
+ setFindings([]);
100
+ setSubmitting(true);
101
+ try {
102
+ let res;
103
+ if (tab === "zip") {
104
+ if (!zipFile) {
105
+ setErr("Choose a ZIP file first.");
106
+ setSubmitting(false);
107
+ return;
108
+ }
109
+ const fd = new FormData();
110
+ fd.set("file", zipFile);
111
+ if (force) fd.set("force", "true");
112
+ res = await fetch("/api/skills/import", {
113
+ method: "POST",
114
+ body: fd
115
+ });
116
+ } else {
117
+ let source;
118
+ if (tab === "openclaw") source = "openclaw";
119
+ else {
120
+ source = path.trim();
121
+ if (!source) {
122
+ setErr("Enter the server path.");
123
+ setSubmitting(false);
124
+ return;
125
+ }
126
+ }
127
+ res = await fetch("/api/skills/import", {
128
+ method: "POST",
129
+ headers: { "content-type": "application/json" },
130
+ body: JSON.stringify({
131
+ source,
132
+ force
133
+ })
134
+ });
135
+ }
136
+ if (!res.ok) {
137
+ const e2 = await res.json().catch(() => null);
138
+ setFindings(e2?.findings ?? []);
139
+ throw new Error(e2?.error ?? `${res.status} ${res.statusText}`);
140
+ }
141
+ setFindings(flattenImportFindings((await res.json().catch(() => null))?.findings));
142
+ setPath("");
143
+ setZipFile(null);
144
+ onImported();
145
+ } catch (e2) {
146
+ setErr(e2.message);
147
+ } finally {
148
+ setSubmitting(false);
149
+ }
150
+ }
151
+ function onFileChange(e) {
152
+ setZipFile(e.target.files?.[0] ?? null);
153
+ }
154
+ function onDrop(e) {
155
+ e.preventDefault();
156
+ setDragOver(false);
157
+ const files = e.dataTransfer?.files;
158
+ if (!files || files.length === 0) return;
159
+ const f = files[0];
160
+ if (!f) return;
161
+ if (!/\.zip$/i.test(f.name)) {
162
+ setErr("Only ZIP archives are supported.");
163
+ return;
164
+ }
165
+ setZipFile(f);
166
+ if (fileInput.current) {
167
+ const dt = new DataTransfer();
168
+ dt.items.add(f);
169
+ fileInput.current.files = dt.files;
170
+ }
171
+ }
172
+ const findingsVariant = findings.some((finding) => finding.severity === "danger") ? "danger" : "warning";
173
+ return /* @__PURE__ */ jsxs(SectionCard, {
174
+ title: "Import skills",
175
+ description: /* @__PURE__ */ jsxs(Fragment, { children: [
176
+ "Choose a source. Each skill's ",
177
+ /* @__PURE__ */ jsx("code", { children: "SKILL.md" }),
178
+ " body is injected into the system prompt of any agent it is attached to."
179
+ ] }),
180
+ children: [
181
+ /* @__PURE__ */ jsx("div", {
182
+ role: "tablist",
183
+ className: "mb-5 inline-flex max-w-full gap-0 overflow-x-auto rounded-lg border border-border bg-muted p-1",
184
+ children: [
185
+ {
186
+ id: "openclaw",
187
+ label: "OpenClaw"
188
+ },
189
+ {
190
+ id: "path",
191
+ label: "Server directory"
192
+ },
193
+ {
194
+ id: "zip",
195
+ label: "Upload ZIP"
196
+ }
197
+ ].map((it) => /* @__PURE__ */ jsx("button", {
198
+ type: "button",
199
+ role: "tab",
200
+ "aria-selected": tab === it.id,
201
+ onClick: () => {
202
+ setTab(it.id);
203
+ setErr(null);
204
+ },
205
+ className: `unstyled cursor-pointer whitespace-nowrap rounded-md border-none bg-transparent px-3 py-1.5 text-sm font-medium transition-colors ${tab === it.id ? "bg-card text-accent-foreground shadow-baziu-sm" : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"}`,
206
+ children: it.label
207
+ }, it.id))
208
+ }),
209
+ err && /* @__PURE__ */ jsx("div", {
210
+ role: "alert",
211
+ className: "mb-4 rounded-lg border border-destructive/20 bg-destructive/10 px-4 py-3 text-sm text-destructive",
212
+ children: err
213
+ }),
214
+ findings.length > 0 && /* @__PURE__ */ jsxs("div", {
215
+ className: "mb-4 rounded-lg border border-border bg-muted/30 p-4 text-sm",
216
+ children: [/* @__PURE__ */ jsx(StatusBadge, {
217
+ variant: findingsVariant,
218
+ className: "mb-2",
219
+ children: "Scan findings"
220
+ }), /* @__PURE__ */ jsx(FindingList, { findings })]
221
+ }),
222
+ /* @__PURE__ */ jsxs("form", {
223
+ className: "space-y-4",
224
+ onSubmit: submit,
225
+ children: [
226
+ tab === "openclaw" && /* @__PURE__ */ jsxs("p", {
227
+ className: "text-sm leading-6 text-muted-foreground",
228
+ children: [
229
+ "One-click import of every skill found in ",
230
+ /* @__PURE__ */ jsx("code", { children: "~/.openclaw/skills" }),
231
+ " on the server."
232
+ ]
233
+ }),
234
+ tab === "path" && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("p", {
235
+ className: "text-sm leading-6 text-muted-foreground",
236
+ children: [
237
+ "Import from an absolute path on the server — either a single skill folder (contains ",
238
+ /* @__PURE__ */ jsx("code", { children: "SKILL.md" }),
239
+ ") or a parent folder holding many skill subfolders."
240
+ ]
241
+ }), /* @__PURE__ */ jsxs("label", {
242
+ className: "max-w-2xl",
243
+ children: ["Server path", /* @__PURE__ */ jsx("input", {
244
+ value: path,
245
+ onChange: (e) => setPath(e.target.value),
246
+ placeholder: "/home/you/my-skills",
247
+ required: true
248
+ })]
249
+ })] }),
250
+ tab === "zip" && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("p", {
251
+ className: "text-sm leading-6 text-muted-foreground",
252
+ children: [
253
+ "Upload a ",
254
+ /* @__PURE__ */ jsx("code", { children: ".zip" }),
255
+ " archive whose top level contains one folder per skill — the folder name becomes the skill name."
256
+ ]
257
+ }), /* @__PURE__ */ jsxs("label", {
258
+ onDragOver: (e) => {
259
+ e.preventDefault();
260
+ setDragOver(true);
261
+ },
262
+ onDragLeave: () => setDragOver(false),
263
+ onDrop,
264
+ className: `block cursor-pointer rounded-xl border-2 border-dashed p-8 text-center transition-colors ${dragOver ? "border-primary bg-accent text-accent-foreground" : zipFile ? "border-solid border-primary/40 bg-card text-foreground" : "border-border bg-muted/30 text-muted-foreground hover:border-primary hover:bg-accent hover:text-accent-foreground"}`,
265
+ children: [/* @__PURE__ */ jsx("input", {
266
+ ref: fileInput,
267
+ type: "file",
268
+ accept: ".zip,application/zip",
269
+ onChange: onFileChange,
270
+ className: "absolute h-px w-px overflow-hidden opacity-0"
271
+ }), zipFile ? /* @__PURE__ */ jsx("span", {
272
+ className: "block break-all font-mono text-sm text-accent-foreground",
273
+ children: zipFile.name
274
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
275
+ className: "block text-sm font-medium text-foreground",
276
+ children: "Click to choose a ZIP file"
277
+ }), /* @__PURE__ */ jsx("span", {
278
+ className: "text-xs",
279
+ children: "or drag and drop it here"
280
+ })] })]
281
+ })] }),
282
+ /* @__PURE__ */ jsxs("div", {
283
+ className: "flex flex-wrap items-center gap-3",
284
+ children: [/* @__PURE__ */ jsx(Button, {
285
+ variant: "primary",
286
+ type: "submit",
287
+ disabled: submitting,
288
+ children: submitting ? "Importing…" : tab === "zip" ? "Upload and import" : tab === "openclaw" ? "Import from OpenClaw" : "Import"
289
+ }), /* @__PURE__ */ jsxs("label", {
290
+ className: "m-0 inline-flex cursor-pointer items-center gap-1 text-sm text-foreground",
291
+ children: [
292
+ /* @__PURE__ */ jsx("input", {
293
+ type: "checkbox",
294
+ checked: force,
295
+ onChange: (e) => setForce(e.target.checked)
296
+ }),
297
+ /* @__PURE__ */ jsx("span", { children: "Overwrite existing" }),
298
+ /* @__PURE__ */ jsx("span", {
299
+ className: "text-muted-foreground",
300
+ children: "and confirm scan findings"
301
+ })
302
+ ]
303
+ })]
304
+ })
305
+ ]
306
+ })
307
+ ]
308
+ });
309
+ }
310
+ function FindingSummary({ findings }) {
311
+ if (findings.length === 0) return /* @__PURE__ */ jsx(StatusBadge, {
312
+ variant: "success",
313
+ children: "Clean"
314
+ });
315
+ return /* @__PURE__ */ jsxs("details", {
316
+ className: "text-xs",
317
+ children: [/* @__PURE__ */ jsx("summary", {
318
+ className: "cursor-pointer list-none",
319
+ children: /* @__PURE__ */ jsxs(StatusBadge, {
320
+ variant: findings.some((f) => f.severity === "danger") ? "danger" : "warning",
321
+ children: [
322
+ findings.length,
323
+ " finding",
324
+ findings.length === 1 ? "" : "s"
325
+ ]
326
+ })
327
+ }), /* @__PURE__ */ jsx("div", {
328
+ className: "mt-2 min-w-64",
329
+ children: /* @__PURE__ */ jsx(FindingList, { findings })
330
+ })]
331
+ });
332
+ }
333
+ function FindingList({ findings }) {
334
+ return /* @__PURE__ */ jsx("ul", {
335
+ className: "m-0 space-y-1.5 pl-0",
336
+ children: findings.map((f, i) => /* @__PURE__ */ jsxs("li", {
337
+ className: "flex items-start gap-2",
338
+ children: [/* @__PURE__ */ jsx(StatusBadge, {
339
+ variant: f.severity === "danger" ? "danger" : "warning",
340
+ children: f.severity === "danger" ? "Danger" : "Warning"
341
+ }), /* @__PURE__ */ jsxs("span", { children: [
342
+ /* @__PURE__ */ jsx("code", { children: f.code }),
343
+ f.line ? `, line ${f.line}` : "",
344
+ " — ",
345
+ f.message
346
+ ] })]
347
+ }, `${f.code}-${f.line ?? 0}-${i}`))
348
+ });
349
+ }
350
+ function flattenImportFindings(findings) {
351
+ if (!findings) return [];
352
+ return Object.entries(findings).flatMap(([name, items]) => items.map((item) => ({
353
+ ...item,
354
+ message: `${name}: ${item.message}`
355
+ })));
356
+ }
357
+ //#endregion
358
+ export { SkillsPage as component };
@@ -1,8 +1,8 @@
1
1
  import { t as createServerFn } from "../server.js";
2
- import { t as createSsrRpc } from "./createSsrRpc-ZBGxhl8t.js";
2
+ import { t as createSsrRpc } from "./createSsrRpc-DFsIAfFd.js";
3
3
  import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
4
  //#region src/routes/skills/index.tsx
5
- var $$splitComponentImporter = () => import("./skills-D89ND2kR.js");
5
+ var $$splitComponentImporter = () => import("./skills-BZdqiDig.js");
6
6
  var fetchSkills = createServerFn({ method: "GET" }).handler(createSsrRpc("ae1d30575b229c1e2622fbaf2252800a9a7acc84afdd68cba025ca890b8d52c5"));
7
7
  var Route = createFileRoute("/skills/")({
8
8
  loader: () => fetchSkills(),
@@ -1,5 +1,5 @@
1
1
  import { t as createServerFn } from "../server.js";
2
- import { t as createServerRpc } from "./createServerRpc-CeKECg65.js";
2
+ import { t as createServerRpc } from "./createServerRpc-pU-IQV2Y.js";
3
3
  import { n as daemonClient } from "./daemon-client-2NRMzlTr.js";
4
4
  //#region src/routes/skills/index.tsx?tss-serverfn-split
5
5
  var fetchSkills_createServerFn_handler = createServerRpc({
@@ -1,4 +1,4 @@
1
- //#region ../../node_modules/.pnpm/@tanstack+react-start@1.168.26_react-dom@19.2.7_react@19.2.7__react@19.2.7_vite@8.0.16__c975ef2d5c659f8176439f8142d7c91d/node_modules/@tanstack/react-start/dist/plugin/default-entry/start.ts
1
+ //#region ../../node_modules/.pnpm/@tanstack+react-start@1.168.28_react-dom@19.2.7_react@19.2.7__react@19.2.7_vite@8.0.16__f2b8db44096d7cf307a2b079d8af2e00/node_modules/@tanstack/react-start/dist/plugin/default-entry/start.ts
2
2
  var startInstance = void 0;
3
3
  //#endregion
4
4
  export { startInstance };
@@ -0,0 +1,180 @@
1
+ //#region src/lib/team-policy.ts
2
+ var DEFAULT_PROFILE_COMMUNICATION = {
3
+ userInput: true,
4
+ userOutput: true,
5
+ outsideTeamInput: false,
6
+ outsideTeamOutput: false,
7
+ peerDefault: "allow_all"
8
+ };
9
+ var USER_ENDPOINT = { kind: "user" };
10
+ var OUTSIDE_GROUP_ENDPOINT = { kind: "outside_team" };
11
+ function endpointKey(endpoint) {
12
+ switch (endpoint.kind) {
13
+ case "user": return "user";
14
+ case "outside_team": return "outside_team";
15
+ case "member_slot": return `slot:${endpoint.slotId}`;
16
+ case "agent": return `agent:${endpoint.agentId}`;
17
+ }
18
+ }
19
+ function endpointFromKey(key) {
20
+ if (key === "user") return USER_ENDPOINT;
21
+ if (key === "outside_team") return OUTSIDE_GROUP_ENDPOINT;
22
+ if (key.startsWith("slot:") && key.length > 5) return {
23
+ kind: "member_slot",
24
+ slotId: key.slice(5)
25
+ };
26
+ if (key.startsWith("agent:") && key.length > 6) return {
27
+ kind: "agent",
28
+ agentId: key.slice(6)
29
+ };
30
+ return null;
31
+ }
32
+ function endpointsEqual(left, right) {
33
+ return endpointKey(left) === endpointKey(right);
34
+ }
35
+ function edgeKey(source, target) {
36
+ return `${endpointKey(source)}>${endpointKey(target)}`;
37
+ }
38
+ function edgeId(source, target) {
39
+ return `edge:${edgeKey(source, target)}`;
40
+ }
41
+ function isMemberEndpoint(endpoint) {
42
+ return endpoint.kind === "member_slot" || endpoint.kind === "agent";
43
+ }
44
+ function isValidTeamPolicyConnection(source, target) {
45
+ if (endpointsEqual(source, target)) return false;
46
+ if (!isMemberEndpoint(source) && !isMemberEndpoint(target)) return false;
47
+ if (source.kind === "member_slot" && target.kind === "agent") return false;
48
+ if (source.kind === "agent" && target.kind === "member_slot") return false;
49
+ return true;
50
+ }
51
+ function hasTeamPolicyEdge(policy, source, target) {
52
+ const wanted = edgeKey(source, target);
53
+ return policy.edges.some((edge) => edgeKey(edge.source, edge.target) === wanted);
54
+ }
55
+ function addTeamPolicyEdge(policy, source, target) {
56
+ if (!isValidTeamPolicyConnection(source, target) || hasTeamPolicyEdge(policy, source, target)) return policy;
57
+ return {
58
+ ...policy,
59
+ edges: [...policy.edges, {
60
+ id: edgeId(source, target),
61
+ source,
62
+ target
63
+ }]
64
+ };
65
+ }
66
+ function removeTeamPolicyEdge(policy, source, target) {
67
+ const unwanted = edgeKey(source, target);
68
+ const edges = policy.edges.filter((edge) => edgeKey(edge.source, edge.target) !== unwanted);
69
+ return edges.length === policy.edges.length ? policy : {
70
+ ...policy,
71
+ edges
72
+ };
73
+ }
74
+ function endpointForMember(teamPolicy, member) {
75
+ if (teamPolicy.kind === "live") return {
76
+ kind: "agent",
77
+ agentId: member.agentId ?? `prototype:${member.slotId}`
78
+ };
79
+ return {
80
+ kind: "member_slot",
81
+ slotId: member.slotId
82
+ };
83
+ }
84
+ function findTeamPolicyMember(teamPolicy, endpoint) {
85
+ if (endpoint.kind === "member_slot") return teamPolicy.members.find((member) => member.slotId === endpoint.slotId);
86
+ if (endpoint.kind === "agent") return teamPolicy.members.find((member) => (member.agentId ?? `prototype:${member.slotId}`) === endpoint.agentId);
87
+ }
88
+ function emptyPolicy() {
89
+ return {
90
+ version: 1,
91
+ edges: []
92
+ };
93
+ }
94
+ function addBothDirections(policy, left, right) {
95
+ return addTeamPolicyEdge(addTeamPolicyEdge(policy, left, right), right, left);
96
+ }
97
+ function createPresetPolicy(kind, members, preset) {
98
+ const endpoints = members.map((member) => endpointForMember({ kind }, member));
99
+ let policy = emptyPolicy();
100
+ if (preset === "blank") return policy;
101
+ if (preset === "open_team") {
102
+ for (let index = 0; index < endpoints.length; index++) {
103
+ const endpoint = endpoints[index];
104
+ if (!endpoint) continue;
105
+ policy = addBothDirections(policy, USER_ENDPOINT, endpoint);
106
+ policy = addBothDirections(policy, OUTSIDE_GROUP_ENDPOINT, endpoint);
107
+ for (let peerIndex = index + 1; peerIndex < endpoints.length; peerIndex++) {
108
+ const peer = endpoints[peerIndex];
109
+ if (peer) policy = addBothDirections(policy, endpoint, peer);
110
+ }
111
+ }
112
+ return policy;
113
+ }
114
+ if (preset === "coordinator") {
115
+ const coordinator = endpoints[Math.max(0, members.findIndex((member) => member.role === "coordinator"))];
116
+ if (!coordinator) return policy;
117
+ policy = addBothDirections(policy, USER_ENDPOINT, coordinator);
118
+ for (const endpoint of endpoints) if (endpoint && !endpointsEqual(endpoint, coordinator)) policy = addBothDirections(policy, coordinator, endpoint);
119
+ return policy;
120
+ }
121
+ const sequence = [
122
+ USER_ENDPOINT,
123
+ ...[
124
+ "planner",
125
+ "worker",
126
+ "reviewer",
127
+ "reporter"
128
+ ].map((role) => {
129
+ const member = members.find((candidate) => candidate.role === role);
130
+ return member ? endpointForMember({ kind }, member) : void 0;
131
+ }).filter((endpoint) => Boolean(endpoint)),
132
+ USER_ENDPOINT
133
+ ];
134
+ for (let index = 0; index < sequence.length - 1; index++) {
135
+ const source = sequence[index];
136
+ const target = sequence[index + 1];
137
+ if (source && target && !endpointsEqual(source, target)) policy = addTeamPolicyEdge(policy, source, target);
138
+ }
139
+ return policy;
140
+ }
141
+ function applyProfileDefaults(policy, teamPolicy, member, defaults) {
142
+ const endpoint = endpointForMember(teamPolicy, member);
143
+ let next = policy;
144
+ const boundaryRules = [
145
+ [
146
+ defaults.userInput,
147
+ USER_ENDPOINT,
148
+ endpoint
149
+ ],
150
+ [
151
+ defaults.userOutput,
152
+ endpoint,
153
+ USER_ENDPOINT
154
+ ],
155
+ [
156
+ defaults.outsideTeamInput,
157
+ OUTSIDE_GROUP_ENDPOINT,
158
+ endpoint
159
+ ],
160
+ [
161
+ defaults.outsideTeamOutput,
162
+ endpoint,
163
+ OUTSIDE_GROUP_ENDPOINT
164
+ ]
165
+ ];
166
+ for (const [allowed, source, target] of boundaryRules) next = allowed ? addTeamPolicyEdge(next, source, target) : removeTeamPolicyEdge(next, source, target);
167
+ if (defaults.peerDefault === "inherit_team_policy") return next;
168
+ for (const peer of teamPolicy.members) {
169
+ if (peer.slotId === member.slotId) continue;
170
+ const peerEndpoint = endpointForMember(teamPolicy, peer);
171
+ if (defaults.peerDefault === "allow_all") next = addBothDirections(next, endpoint, peerEndpoint);
172
+ else {
173
+ next = removeTeamPolicyEdge(next, endpoint, peerEndpoint);
174
+ next = removeTeamPolicyEdge(next, peerEndpoint, endpoint);
175
+ }
176
+ }
177
+ return next;
178
+ }
179
+ //#endregion
180
+ export { applyProfileDefaults as a, endpointFromKey as c, hasTeamPolicyEdge as d, isValidTeamPolicyConnection as f, addTeamPolicyEdge as i, endpointKey as l, OUTSIDE_GROUP_ENDPOINT as n, createPresetPolicy as o, removeTeamPolicyEdge as p, USER_ENDPOINT as r, endpointForMember as s, DEFAULT_PROFILE_COMMUNICATION as t, findTeamPolicyMember as u };
@@ -0,0 +1,11 @@
1
+ import { t as RecoveryState } from "./RecoveryState-B2SG-mrY.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/routes/teams/index.tsx?tsr-split=errorComponent
4
+ var SplitErrorComponent = ({ error, reset }) => /* @__PURE__ */ jsx(RecoveryState, {
5
+ title: "Teams unavailable",
6
+ error,
7
+ reset,
8
+ fallbackHref: "/"
9
+ });
10
+ //#endregion
11
+ export { SplitErrorComponent as errorComponent };