bazilion 0.9.0 → 0.11.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 (189) hide show
  1. package/dist/cli.js +1257 -150
  2. package/dist/cli.js.map +1 -1
  3. package/dist/daemon.js +3049 -471
  4. package/dist/daemon.js.map +1 -1
  5. package/dist/migrations/0001_init.sql +20 -0
  6. package/dist/web/client/assets/AgentTabs-B3hq5a3e.js +1 -0
  7. package/dist/web/client/assets/ConfigPage-BCwfgyjD.js +1 -0
  8. package/dist/web/client/assets/FieldRow-avAFLgYW.js +1 -0
  9. package/dist/web/client/assets/Page-CwNuDhWz.js +1 -0
  10. package/dist/web/client/assets/ProductionTeamPolicyEditor-B6dbpuYy.js +7 -0
  11. package/dist/web/client/assets/{ProfileCommunicationEditor-D1OZ8WE5.js → ProfileCommunicationEditor-Bf8UvmZT.js} +1 -1
  12. package/dist/web/client/assets/SectionTabs-DZzy01az.js +1 -0
  13. package/dist/web/client/assets/TeamTabs-sQBHChtd.js +1 -0
  14. package/dist/web/client/assets/TemplatesTabs-DPsuwsWB.js +1 -0
  15. package/dist/web/client/assets/_id-C9rkCclz.js +1 -0
  16. package/dist/web/client/assets/_id-D65IzC8H.js +1 -0
  17. package/dist/web/client/assets/_id-DE4IY5bL.js +1 -0
  18. package/dist/web/client/assets/_id-DYASsGQ8.js +1 -0
  19. package/dist/web/client/assets/activity-C7o6-xHg.js +1 -0
  20. package/dist/web/client/assets/agents-UroO4d25.js +1 -0
  21. package/dist/web/client/assets/agents-h8yWXQ2H.js +1 -0
  22. package/dist/web/client/assets/approvals-DKhF0YLC.js +1 -0
  23. package/dist/web/client/assets/chevron-down-BK6NPMMP.js +1 -0
  24. package/dist/web/client/assets/config-q8JDresK.js +3 -0
  25. package/dist/web/client/assets/context-CBucAoi6.js +1 -0
  26. package/dist/web/client/assets/inbox-BwoRikj1.js +1 -0
  27. package/dist/web/client/assets/index-DUXAevpZ.js +12 -0
  28. package/dist/web/client/assets/login-CNAV9Wer.js +1 -0
  29. package/dist/web/client/assets/mcp-BKdEFwHO.js +1 -0
  30. package/dist/web/client/assets/members-BDqZQh26.js +1 -0
  31. package/dist/web/client/assets/memory-DVdEVr6L.js +1 -0
  32. package/dist/web/client/assets/plus-b4yFXP0O.js +1 -0
  33. package/dist/web/client/assets/policy-DdDctqvg.js +1 -0
  34. package/dist/web/client/assets/preload-helper-mNuBjNXU.js +1 -0
  35. package/dist/web/client/assets/react-3W8R1pOO.js +1 -0
  36. package/dist/web/client/assets/routes-BEfALSZv.js +1 -0
  37. package/dist/web/client/assets/services-DZP2ybzb.js +1 -0
  38. package/dist/web/client/assets/skills-DoeIjITs.js +1 -0
  39. package/dist/web/client/assets/styles-BYM0UGdF.css +2 -0
  40. package/dist/web/client/assets/team-policy-D0jpnn2b.js +1 -0
  41. package/dist/web/client/assets/teams-DlHRnrQw.js +1 -0
  42. package/dist/web/client/assets/teams-W3j-UoJ9.js +1 -0
  43. package/dist/web/client/assets/telegram-2OdeGv4E.js +1 -0
  44. package/dist/web/client/assets/tokens-MuBfmgue.js +1 -0
  45. package/dist/web/client/assets/triggers-CX7RMQFQ.js +1 -0
  46. package/dist/web/client/assets/welcome-CvNr5IMi.js +1 -0
  47. package/dist/web/client/assets/wire-constants-BhVKOCQa.js +74 -0
  48. package/dist/web/server/assets/{AgentTabs-BOjTN7QF.js → AgentTabs-DoMDJBXH.js} +10 -7
  49. package/dist/web/server/assets/{ChatPane-Dh3qxzdb.js → ChatPane-Ba5wTsVk.js} +340 -44
  50. package/dist/web/server/assets/ConfigPage-BKlh5vOU.js +68 -0
  51. package/dist/web/server/assets/{FieldRow-DwyqycWI.js → FieldRow-B4eTegH9.js} +5 -5
  52. package/dist/web/server/assets/Page-LENulSXY.js +111 -0
  53. package/dist/web/server/assets/{ProductionTeamPolicyEditor-Bke5doyl.js → ProductionTeamPolicyEditor-Y4mzFFvR.js} +4 -4
  54. package/dist/web/server/assets/SectionTabs-BJTPr5nU.js +8 -0
  55. package/dist/web/server/assets/{Sidebar-CGmtCnYU.js → Sidebar-DsRVCszF.js} +229 -118
  56. package/dist/web/server/assets/{TeamTabs-BPxDBfqy.js → TeamTabs-zZzbP1t_.js} +9 -8
  57. package/dist/web/server/assets/{TemplatesTabs-zf4YhStd.js → TemplatesTabs-CcRxZhJe.js} +5 -4
  58. package/dist/web/server/assets/{_id-fpFQ9_Ya.js → _id-BhOB8Umi.js} +1 -1
  59. package/dist/web/server/assets/{_id-CCHA0gdR.js → _id-C3HY4lWg.js} +7 -10
  60. package/dist/web/server/assets/{_id-B6g9wmPR.js → _id-Cg7x6q3g.js} +22 -28
  61. package/dist/web/server/assets/{_id-B04VaQlh.js → _id-CwyGjJeP.js} +2 -2
  62. package/dist/web/server/assets/{_id-_nFwi9gD.js → _id-D27T85mU.js} +1 -1
  63. package/dist/web/server/assets/{_id-5lLzLwcv.js → _id-D3Ap7zZA.js} +142 -144
  64. package/dist/web/server/assets/{_id-ButXHnRH.js → _id-DinTp_7X.js} +2 -2
  65. package/dist/web/server/assets/{_id-DdC9wpNN.js → _id-Dj1yZ3zJ.js} +2 -2
  66. package/dist/web/server/assets/{_id-DkFgCIb-.js → _id-DqON-59C.js} +2 -2
  67. package/dist/web/server/assets/{_id-CUWgTqMS.js → _id-IzadFZV9.js} +1 -1
  68. package/dist/web/server/assets/{_id-C4AOhstq.js → _id-LrvXU4Nr.js} +6 -5
  69. package/dist/web/server/assets/{_id-DJkzwHjM.js → _id-tB47Vsfp.js} +1 -1
  70. package/dist/web/server/assets/{_tanstack-start-manifest_v-Div-TukY.js → _tanstack-start-manifest_v-BXauUXg6.js} +96 -51
  71. package/dist/web/server/assets/{activity-C2ZKg1Q9.js → activity-BCI4mfNS.js} +28 -30
  72. package/dist/web/server/assets/{activity-DedraoFj.js → activity-D9SMqBhy.js} +2 -2
  73. package/dist/web/server/assets/{activity-GPx8NCeB.js → activity-DohitgwW.js} +1 -1
  74. package/dist/web/server/assets/{agents-BR2qXlXF.js → agents-BPKOshR5.js} +1 -1
  75. package/dist/web/server/assets/{agents-LHowEI6S.js → agents-BY74v7fM.js} +1 -1
  76. package/dist/web/server/assets/{agents-B8kinIPW.js → agents-BvttypqB.js} +2 -2
  77. package/dist/web/server/assets/{agents-Bp1nsVs2.js → agents-C9xlWK0Z.js} +2 -2
  78. package/dist/web/server/assets/agents-CgZMHj80.js +265 -0
  79. package/dist/web/server/assets/{agents-CUQmWhTp.js → agents-DZuFEj0D.js} +59 -77
  80. package/dist/web/server/assets/{approvals-VPc0YpLN.js → approvals-BGU-XGIO.js} +1 -1
  81. package/dist/web/server/assets/{approvals-Dw2LJoSA.js → approvals-CWcFHlor.js} +2 -2
  82. package/dist/web/server/assets/{approvals-DHgARzd8.js → approvals-DCaVw1Mz.js} +116 -78
  83. package/dist/web/server/assets/{auth-l-Vf8wlu.js → auth-byfSx6Ja.js} +1 -1
  84. package/dist/web/server/assets/{config-CHaCv89D.js → config-BDCJdtj2.js} +1 -1
  85. package/dist/web/server/assets/{config-BvKctDOX.js → config-D2LAsud2.js} +28 -49
  86. package/dist/web/server/assets/{config-QvHaxGlP.js → config-TeIoyYYc.js} +2 -2
  87. package/dist/web/server/assets/{context-5lrf2ame.js → context-B-XDf6Ym.js} +1 -1
  88. package/dist/web/server/assets/{context-D3Egm-vY.js → context-BXGo5Vfi.js} +2 -2
  89. package/dist/web/server/assets/context-DrkrIWun.js +47 -0
  90. package/dist/web/server/assets/{createServerRpc-CeKECg65.js → createServerRpc-pU-IQV2Y.js} +1 -1
  91. package/dist/web/server/assets/{createSsrRpc-ZBGxhl8t.js → createSsrRpc-DFsIAfFd.js} +1 -1
  92. package/dist/web/server/assets/{empty-plugin-adapters-DKUlnwwl.js → empty-plugin-adapters-Cq4--YW-.js} +1 -1
  93. package/dist/web/server/assets/{inbox-CkiSvD14.js → inbox-B3-TRsNI.js} +1 -1
  94. package/dist/web/server/assets/{inbox-Bxb3W04M.js → inbox-BardsGyy.js} +2 -2
  95. package/dist/web/server/assets/inbox-CUIyf9MT.js +131 -0
  96. package/dist/web/server/assets/login-Bx5LEyGP.js +118 -0
  97. package/dist/web/server/assets/login-CmWvxfTK.js +136 -0
  98. package/dist/web/server/assets/{mcp-BsFKEoXt.js → mcp-2pwT9HU8.js} +1 -1
  99. package/dist/web/server/assets/{mcp-BU_kKENi.js → mcp-BJjLIdP0.js} +105 -112
  100. package/dist/web/server/assets/{mcp-CKqwG4mt.js → mcp-DIWTogHM.js} +2 -2
  101. package/dist/web/server/assets/members-CCv17cjQ.js +46 -0
  102. package/dist/web/server/assets/{members-DlGBKZNl.js → members-CW5aBe81.js} +1 -1
  103. package/dist/web/server/assets/{members-ksELRsyk.js → members-VdPwD6CE.js} +2 -2
  104. package/dist/web/server/assets/{memory-CO0jKGzJ.js → memory-Dngc13Nw.js} +1 -1
  105. package/dist/web/server/assets/memory-a8Kz57Kh.js +287 -0
  106. package/dist/web/server/assets/{memory-B5moRnnp.js → memory-pZ4pZT7p.js} +2 -2
  107. package/dist/web/server/assets/{policy-Dxs78_GO.js → policy-Bb-vEgqg.js} +1 -1
  108. package/dist/web/server/assets/{policy-Dr55y-Mh.js → policy-BcGELcc9.js} +16 -22
  109. package/dist/web/server/assets/{policy-DNcGZLOB.js → policy-C30AeFIb.js} +2 -2
  110. package/dist/web/server/assets/{router-_izWQUeG.js → router-C5_NjTsP.js} +100 -111
  111. package/dist/web/server/assets/{routes-BSSKp3Rv.js → routes-B6cMLIPk.js} +16 -13
  112. package/dist/web/server/assets/{routes-BrTOoeth.js → routes-BrA-U_Hm.js} +2 -2
  113. package/dist/web/server/assets/{routes-DOj6ljcm.js → routes-C19CMLZt.js} +2 -2
  114. package/dist/web/server/assets/services-B9yBWDX0.js +79 -0
  115. package/dist/web/server/assets/{services-Pv_V88VA.js → services-C4szdhPx.js} +2 -2
  116. package/dist/web/server/assets/{services-DhRiNeq0.js → services-wG8I06oS.js} +1 -1
  117. package/dist/web/server/assets/skills-BZdqiDig.js +358 -0
  118. package/dist/web/server/assets/{skills-l2cyQ3zS.js → skills-C-UgkuCW.js} +2 -2
  119. package/dist/web/server/assets/{skills-CFIWVg32.js → skills-a9VSWHWq.js} +1 -1
  120. package/dist/web/server/assets/{start-DlHq0RaQ.js → start-WH8WzTL_.js} +1 -1
  121. package/dist/web/server/assets/{team-policy-Csvc5EDd.js → team-policy-vPG01onj.js} +3 -3
  122. package/dist/web/server/assets/{teams-B9O-WDH5.js → teams-CpQ0YgWf.js} +38 -34
  123. package/dist/web/server/assets/{teams-35Oprf6e.js → teams-DEpQR2QA.js} +2 -2
  124. package/dist/web/server/assets/{teams-DFkN7ic7.js → teams-DqfrEoH6.js} +1 -1
  125. package/dist/web/server/assets/{teams-B5IF65p2.js → teams-MjqgsmC3.js} +1 -1
  126. package/dist/web/server/assets/{teams-DH1CvWmT.js → teams-OIkHuxy1.js} +2 -2
  127. package/dist/web/server/assets/teams-jBtvnk59.js +193 -0
  128. package/dist/web/server/assets/{telegram-C9sQFwWj.js → telegram-CBF8SJzB.js} +36 -71
  129. package/dist/web/server/assets/{telegram-BdaUIjvs.js → telegram-DNgCWebD.js} +1 -1
  130. package/dist/web/server/assets/{telegram-mTnJCOmn.js → telegram-XwyKSEtj.js} +2 -2
  131. package/dist/web/server/assets/{tokens-DdpnfV_Y.js → tokens-BnwFbV7T.js} +2 -2
  132. package/dist/web/server/assets/{tokens-BCz3PSoT.js → tokens-DPDMSN5O.js} +1 -1
  133. package/dist/web/server/assets/tokens-yyTSfBSN.js +186 -0
  134. package/dist/web/server/assets/{triggers-BcTTwMfy.js → triggers-CBl4yMyw.js} +2 -2
  135. package/dist/web/server/assets/{triggers-BcH_6PW1.js → triggers-D79NoSXk.js} +4 -3
  136. package/dist/web/server/assets/{triggers-BzJG1nN5.js → triggers-_3rdhwSN.js} +31 -6
  137. package/dist/web/server/assets/{welcome-CDGE2Sdk.js → welcome-IYHGurWx.js} +21 -13
  138. package/dist/web/server/server.js +82 -73
  139. package/dist/worker.js +1614 -153
  140. package/dist/worker.js.map +1 -1
  141. package/package.json +5 -3
  142. package/dist/web/client/assets/AgentTabs-DioGqUVR.js +0 -1
  143. package/dist/web/client/assets/ConfigTabs-pY-V0Rie.js +0 -1
  144. package/dist/web/client/assets/FieldRow-DmwAFfbF.js +0 -1
  145. package/dist/web/client/assets/ProductionTeamPolicyEditor-1a5jQqUB.js +0 -7
  146. package/dist/web/client/assets/TeamTabs-BViZ4sti.js +0 -1
  147. package/dist/web/client/assets/TemplatesTabs-DVcY9pMD.js +0 -1
  148. package/dist/web/client/assets/_id-8P7brhGy.js +0 -1
  149. package/dist/web/client/assets/_id-C3o3MHq8.js +0 -1
  150. package/dist/web/client/assets/_id-DGRrSF1e.js +0 -1
  151. package/dist/web/client/assets/_id-KnJe-aW9.js +0 -1
  152. package/dist/web/client/assets/activity-WWvJSo4t.js +0 -1
  153. package/dist/web/client/assets/agents-C32T1voV.js +0 -1
  154. package/dist/web/client/assets/agents-nH4m4gZ1.js +0 -1
  155. package/dist/web/client/assets/approvals-l8jIZjqz.js +0 -1
  156. package/dist/web/client/assets/config-C7wvi1nR.js +0 -3
  157. package/dist/web/client/assets/context-BEGWE3RC.js +0 -1
  158. package/dist/web/client/assets/inbox--4aBaAgG.js +0 -1
  159. package/dist/web/client/assets/index-BCXoh1c8.js +0 -12
  160. package/dist/web/client/assets/login-Bk2wwIHQ.js +0 -1
  161. package/dist/web/client/assets/mcp-vM7xgh9e.js +0 -1
  162. package/dist/web/client/assets/members-cPKfnrSL.js +0 -1
  163. package/dist/web/client/assets/memory-BOcsaemD.js +0 -1
  164. package/dist/web/client/assets/policy-BGLCJYvS.js +0 -1
  165. package/dist/web/client/assets/preload-helper-eOOCz1Fu.js +0 -1
  166. package/dist/web/client/assets/routes-DnrP3dwv.js +0 -1
  167. package/dist/web/client/assets/services-C2_O3ifw.js +0 -1
  168. package/dist/web/client/assets/skills-B__fLZjx.js +0 -1
  169. package/dist/web/client/assets/styles-Dn24-ZvP.css +0 -2
  170. package/dist/web/client/assets/team-policy-BdX340m4.js +0 -1
  171. package/dist/web/client/assets/teams-DZMB4_iw.js +0 -1
  172. package/dist/web/client/assets/teams-rpaYKNIb.js +0 -1
  173. package/dist/web/client/assets/telegram-B1O4Ko0V.js +0 -1
  174. package/dist/web/client/assets/tokens-D7FH9VgA.js +0 -1
  175. package/dist/web/client/assets/triggers-3PLy2_Fo.js +0 -1
  176. package/dist/web/client/assets/welcome-B-QQobzq.js +0 -1
  177. package/dist/web/client/assets/wire-constants-BY9Q9Z7d.js +0 -74
  178. package/dist/web/server/assets/ConfigTabs-CyuxzesF.js +0 -41
  179. package/dist/web/server/assets/agents-DU9Hqs58.js +0 -249
  180. package/dist/web/server/assets/context-CEr4-xiA.js +0 -49
  181. package/dist/web/server/assets/inbox-DU27iHv_.js +0 -133
  182. package/dist/web/server/assets/login-CNznncgA.js +0 -58
  183. package/dist/web/server/assets/login-CQybKk7Y.js +0 -74
  184. package/dist/web/server/assets/members-40DxRdVj.js +0 -48
  185. package/dist/web/server/assets/memory-CiTl4cN9.js +0 -289
  186. package/dist/web/server/assets/services-CHe4ihJk.js +0 -94
  187. package/dist/web/server/assets/skills-D89ND2kR.js +0 -321
  188. package/dist/web/server/assets/teams-zcm9XaQU.js +0 -174
  189. package/dist/web/server/assets/tokens-CkKqrtk-.js +0 -193
@@ -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__e21a0adc8a336ddd90ad25f10366380c/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 };
@@ -2,9 +2,9 @@
2
2
  var DEFAULT_PROFILE_COMMUNICATION = {
3
3
  userInput: true,
4
4
  userOutput: true,
5
- outsideTeamInput: true,
6
- outsideTeamOutput: true,
7
- peerDefault: "inherit_team_policy"
5
+ outsideTeamInput: false,
6
+ outsideTeamOutput: false,
7
+ peerDefault: "allow_all"
8
8
  };
9
9
  var USER_ENDPOINT = { kind: "user" };
10
10
  var OUTSIDE_GROUP_ENDPOINT = { kind: "outside_team" };
@@ -1,6 +1,7 @@
1
- import { t as Route } from "./teams-DH1CvWmT.js";
1
+ import { t as Route } from "./teams-OIkHuxy1.js";
2
+ import { n as PageHeader, r as PageShell } from "./Page-LENulSXY.js";
2
3
  import { t as Button } from "./Button-Dsnw22OF.js";
3
- import { t as TemplatesTabs } from "./TemplatesTabs-zf4YhStd.js";
4
+ import { t as TemplatesTabs } from "./TemplatesTabs-CcRxZhJe.js";
4
5
  import { useState } from "react";
5
6
  import { useRouter } from "@tanstack/react-router";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -8,38 +9,41 @@ import { jsx, jsxs } from "react/jsx-runtime";
8
9
  function TeamTemplatesPage() {
9
10
  const teams = Route.useLoaderData();
10
11
  const router = useRouter();
11
- return /* @__PURE__ */ jsxs("div", { children: [
12
- /* @__PURE__ */ jsx(TemplatesTabs, {}),
13
- /* @__PURE__ */ jsx("h1", { children: "team templates" }),
14
- /* @__PURE__ */ jsx("p", {
15
- className: "muted",
16
- children: "The sole reusable Team roster. Every slot has stable identity and every saved definition has an immutable revision."
17
- }),
18
- /* @__PURE__ */ jsx(CreateTeamForm, { onCreated: () => router.invalidate() }),
19
- /* @__PURE__ */ jsx("div", {
20
- className: "overflow-x-auto",
21
- children: /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
22
- /* @__PURE__ */ jsx("th", { children: "id" }),
23
- /* @__PURE__ */ jsx("th", { children: "name" }),
24
- /* @__PURE__ */ jsx("th", { children: "slots" }),
25
- /* @__PURE__ */ jsx("th", { children: "revision" }),
26
- /* @__PURE__ */ jsx("th", { children: "source state" })
27
- ] }) }), /* @__PURE__ */ jsxs("tbody", { children: [teams.map((team) => /* @__PURE__ */ jsxs("tr", { children: [
28
- /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("a", {
29
- href: `/templates/teams/${encodeURIComponent(team.id)}`,
30
- children: /* @__PURE__ */ jsx("code", { children: team.id })
31
- }) }),
32
- /* @__PURE__ */ jsx("td", { children: team.name }),
33
- /* @__PURE__ */ jsx("td", { children: team.slotCount }),
34
- /* @__PURE__ */ jsx("td", { children: team.currentRevision }),
35
- /* @__PURE__ */ jsx("td", { children: team.deletedAt ? "deleted source" : "canonical" })
36
- ] }, team.id)), teams.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
37
- colSpan: 5,
38
- className: "muted",
39
- children: "No team templates yet."
40
- }) })] })] })
41
- })
42
- ] });
12
+ return /* @__PURE__ */ jsxs(PageShell, {
13
+ size: "wide",
14
+ children: [
15
+ /* @__PURE__ */ jsx(PageHeader, {
16
+ eyebrow: "Templates",
17
+ title: "Team templates",
18
+ description: "Create revisioned rosters with stable slots and a reusable communication policy."
19
+ }),
20
+ /* @__PURE__ */ jsx(TemplatesTabs, {}),
21
+ /* @__PURE__ */ jsx(CreateTeamForm, { onCreated: () => router.invalidate() }),
22
+ /* @__PURE__ */ jsx("div", {
23
+ className: "overflow-x-auto",
24
+ children: /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
25
+ /* @__PURE__ */ jsx("th", { children: "id" }),
26
+ /* @__PURE__ */ jsx("th", { children: "name" }),
27
+ /* @__PURE__ */ jsx("th", { children: "slots" }),
28
+ /* @__PURE__ */ jsx("th", { children: "revision" }),
29
+ /* @__PURE__ */ jsx("th", { children: "source state" })
30
+ ] }) }), /* @__PURE__ */ jsxs("tbody", { children: [teams.map((team) => /* @__PURE__ */ jsxs("tr", { children: [
31
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("a", {
32
+ href: `/templates/teams/${encodeURIComponent(team.id)}`,
33
+ children: /* @__PURE__ */ jsx("code", { children: team.id })
34
+ }) }),
35
+ /* @__PURE__ */ jsx("td", { children: team.name }),
36
+ /* @__PURE__ */ jsx("td", { children: team.slotCount }),
37
+ /* @__PURE__ */ jsx("td", { children: team.currentRevision }),
38
+ /* @__PURE__ */ jsx("td", { children: team.deletedAt ? "deleted source" : "canonical" })
39
+ ] }, team.id)), teams.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
40
+ colSpan: 5,
41
+ className: "muted",
42
+ children: "No team templates yet."
43
+ }) })] })] })
44
+ })
45
+ ]
46
+ });
43
47
  }
44
48
  function CreateTeamForm({ onCreated }) {
45
49
  const [id, setId] = useState("");
@@ -1,9 +1,9 @@
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/teams/index.tsx
5
5
  var $$splitErrorComponentImporter = () => import("./teams-3im0oQnS.js");
6
- var $$splitComponentImporter = () => import("./teams-zcm9XaQU.js");
6
+ var $$splitComponentImporter = () => import("./teams-jBtvnk59.js");
7
7
  var fetchTeamsData = createServerFn({ method: "GET" }).handler(createSsrRpc("1ab05a58944792f34ad279deeaa56f70e9360687856b18327f335b022e8d21a5"));
8
8
  var Route = createFileRoute("/teams/")({
9
9
  loader: () => fetchTeamsData(),
@@ -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/teams/index.tsx?tss-serverfn-split
5
5
  var fetchTeamsData_createServerFn_handler = createServerRpc({
@@ -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/templates/teams/index.tsx?tss-serverfn-split
5
5
  var fetchTeams_createServerFn_handler = createServerRpc({
@@ -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/templates/teams/index.tsx
5
- var $$splitComponentImporter = () => import("./teams-B9O-WDH5.js");
5
+ var $$splitComponentImporter = () => import("./teams-CpQ0YgWf.js");
6
6
  var fetchTeams = createServerFn({ method: "GET" }).handler(createSsrRpc("1bb12262aaa902fa208aafaa70b69c63da34c1fe523ab0322fe766903fc6b4c1"));
7
7
  var Route = createFileRoute("/templates/teams/")({
8
8
  loader: () => fetchTeams(),