bazilion 0.5.1 → 0.7.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 (122) hide show
  1. package/README.md +17 -12
  2. package/dist/cli.js +383 -152
  3. package/dist/cli.js.map +1 -1
  4. package/dist/daemon.js +238 -14064
  5. package/dist/daemon.js.map +1 -1
  6. package/dist/web/client/assets/AgentAvatar-JYijLvZ2.js +1 -0
  7. package/dist/web/client/assets/AgentTabs-DioGqUVR.js +1 -0
  8. package/dist/web/client/assets/Button-ByiV6fpd.js +1 -0
  9. package/dist/web/client/assets/ChatPane-DzEgOEqS.js +74 -0
  10. package/dist/web/client/assets/ConfigTabs-pY-V0Rie.js +1 -0
  11. package/dist/web/client/assets/FieldRow-CNKma5LE.js +1 -0
  12. package/dist/web/client/assets/MembersEditor-C6UpqDdV.js +1 -0
  13. package/dist/web/client/assets/SpawnTeamModal-BEkNCKXm.js +1 -0
  14. package/dist/web/client/assets/TemplatesTabs-Da7mg9FI.js +1 -0
  15. package/dist/web/client/assets/_id-BdKmo0gb.js +1 -0
  16. package/dist/web/client/assets/_id-LT6Ejjr0.js +1 -0
  17. package/dist/web/client/assets/_id-MR2XjWh0.js +1 -0
  18. package/dist/web/client/assets/_id-_6jIt0_-.js +1 -0
  19. package/dist/web/client/assets/agents-0arKbVYG.js +1 -0
  20. package/dist/web/client/assets/config-BSAVT-17.js +3 -0
  21. package/dist/web/client/assets/groups-BqTkhHes.js +1 -0
  22. package/dist/web/client/assets/inbox-ozoCXzr5.js +1 -0
  23. package/dist/web/client/assets/index-iayCEuU2.js +12 -0
  24. package/dist/web/client/assets/jsx-runtime-DGeXAQPT.js +1 -0
  25. package/dist/web/client/assets/login-D8lNr2SX.js +1 -0
  26. package/dist/web/client/assets/mcp-BLnngDsj.js +1 -0
  27. package/dist/web/client/assets/memory-D1GQjEvN.js +1 -0
  28. package/dist/web/client/assets/preload-helper-CvnapA2_.js +1 -0
  29. package/dist/web/client/assets/profile-groups-C2yJPTaE.js +1 -0
  30. package/dist/web/client/assets/profiles-BV7AAZjj.js +1 -0
  31. package/dist/web/client/assets/routes-DSHQLA7K.js +1 -0
  32. package/dist/web/client/assets/services-BbCJe1Du.js +1 -0
  33. package/dist/web/client/assets/skills-C6czKR5I.js +1 -0
  34. package/dist/web/client/assets/styles-C06axZZk.css +2 -0
  35. package/dist/web/client/assets/telegram-gE4j8gte.js +1 -0
  36. package/dist/web/client/assets/tokens-D2_O9ARe.js +1 -0
  37. package/dist/web/client/assets/triggers-WljnfEfJ.js +1 -0
  38. package/dist/web/client/assets/welcome-Dn-zvmBE.js +1 -0
  39. package/dist/web/client/assets/wire-constants-BkT5-597.js +1 -0
  40. package/dist/web/client/baziu.svg +8 -0
  41. package/dist/web/server/assets/AgentAvatar-8gTAy_tP.js +37 -0
  42. package/dist/web/server/assets/AgentTabs-BOjTN7QF.js +34 -0
  43. package/dist/web/server/assets/Button-Dsnw22OF.js +17 -0
  44. package/dist/web/server/assets/ChatPane-BvpswYvF.js +1084 -0
  45. package/dist/web/server/assets/ConfigTabs-CyuxzesF.js +41 -0
  46. package/dist/web/server/assets/FieldRow-DwyqycWI.js +94 -0
  47. package/dist/web/server/assets/MembersEditor-BWQztvrX.js +131 -0
  48. package/dist/web/server/assets/Sidebar-DmEiewRN.js +529 -0
  49. package/dist/web/server/assets/SpawnTeamModal-dSN421k_.js +107 -0
  50. package/dist/web/server/assets/TemplatesTabs---7h5GYa.js +30 -0
  51. package/dist/web/server/assets/_id-81NrHA5d.js +16 -0
  52. package/dist/web/server/assets/_id-BKev9H1p.js +12 -0
  53. package/dist/web/server/assets/_id-BNwlbWHP.js +24 -0
  54. package/dist/web/server/assets/_id-BqnDy_Ca.js +16 -0
  55. package/dist/web/server/assets/_id-CRqqi8IE.js +161 -0
  56. package/dist/web/server/assets/_id-CXg-Blec.js +367 -0
  57. package/dist/web/server/assets/_id-CnQflrRv.js +16 -0
  58. package/dist/web/server/assets/_id-D0ytyXGY.js +662 -0
  59. package/dist/web/server/assets/_id-D8duqgd5.js +27 -0
  60. package/dist/web/server/assets/_id-DDixKEud.js +467 -0
  61. package/dist/web/server/assets/_id-D_Ew11ED.js +28 -0
  62. package/dist/web/server/assets/_id-Sjw0zhA6.js +38 -0
  63. package/dist/web/server/assets/_tanstack-start-manifest_v-DBlFH2gg.js +178 -0
  64. package/dist/web/server/assets/agents-C7SBPN0M.js +210 -0
  65. package/dist/web/server/assets/agents-ChcAJUI5.js +14 -0
  66. package/dist/web/server/assets/agents-k5QURC4I.js +26 -0
  67. package/dist/web/server/assets/auth-DzRAMwVt.js +26 -0
  68. package/dist/web/server/assets/config-Bq3o924J.js +12 -0
  69. package/dist/web/server/assets/config-CHaCv89D.js +19 -0
  70. package/dist/web/server/assets/config-CdVjqjin.js +391 -0
  71. package/dist/web/server/assets/createServerRpc-CeKECg65.js +12 -0
  72. package/dist/web/server/assets/createSsrRpc-ZBGxhl8t.js +16 -0
  73. package/dist/web/server/assets/daemon-client-2NRMzlTr.js +96 -0
  74. package/dist/web/server/assets/empty-plugin-adapters-DKUlnwwl.js +5 -0
  75. package/dist/web/server/assets/groups-CbSwND2r.js +12 -0
  76. package/dist/web/server/assets/groups-CeRRlZaZ.js +150 -0
  77. package/dist/web/server/assets/groups-pk4CYSuf.js +21 -0
  78. package/dist/web/server/assets/inbox-Bxb3W04M.js +27 -0
  79. package/dist/web/server/assets/inbox-CkiSvD14.js +42 -0
  80. package/dist/web/server/assets/inbox-DU27iHv_.js +133 -0
  81. package/dist/web/server/assets/login-CNznncgA.js +58 -0
  82. package/dist/web/server/assets/login-CQybKk7Y.js +74 -0
  83. package/dist/web/server/assets/mcp-BU_kKENi.js +268 -0
  84. package/dist/web/server/assets/mcp-BsFKEoXt.js +12 -0
  85. package/dist/web/server/assets/mcp-CKqwG4mt.js +12 -0
  86. package/dist/web/server/assets/memory-BaYnfm7K.js +28 -0
  87. package/dist/web/server/assets/memory-CQaqWnyM.js +284 -0
  88. package/dist/web/server/assets/memory-Ns2-Z31p.js +16 -0
  89. package/dist/web/server/assets/profile-groups-CiU06yN1.js +28 -0
  90. package/dist/web/server/assets/profile-groups-D21MYoLM.js +208 -0
  91. package/dist/web/server/assets/profile-groups-aoJleXHP.js +12 -0
  92. package/dist/web/server/assets/profiles-C6a3RKgu.js +26 -0
  93. package/dist/web/server/assets/profiles-CZ5NkmVw.js +12 -0
  94. package/dist/web/server/assets/profiles-LxcC_L6n.js +453 -0
  95. package/dist/web/server/assets/router-BpBZgRwn.js +460 -0
  96. package/dist/web/server/assets/routes-C61gBiXa.js +57 -0
  97. package/dist/web/server/assets/routes-Ce2VWrU9.js +33 -0
  98. package/dist/web/server/assets/routes-V9URcp1v.js +14 -0
  99. package/dist/web/server/assets/services-B91w2f-X.js +94 -0
  100. package/dist/web/server/assets/services-Ccc5s2bS.js +17 -0
  101. package/dist/web/server/assets/services-DhRiNeq0.js +12 -0
  102. package/dist/web/server/assets/skills-CFIWVg32.js +12 -0
  103. package/dist/web/server/assets/skills-CpsyR_WA.js +12 -0
  104. package/dist/web/server/assets/skills-dLyBZb3B.js +261 -0
  105. package/dist/web/server/assets/start-CYDpZ6cb.js +4 -0
  106. package/dist/web/server/assets/telegram-BdaUIjvs.js +12 -0
  107. package/dist/web/server/assets/telegram-DfAddLdv.js +583 -0
  108. package/dist/web/server/assets/telegram-T3l9KtiE.js +12 -0
  109. package/dist/web/server/assets/tokens-BCz3PSoT.js +12 -0
  110. package/dist/web/server/assets/tokens-CkKqrtk-.js +193 -0
  111. package/dist/web/server/assets/tokens-DdpnfV_Y.js +14 -0
  112. package/dist/web/server/assets/triggers-BcH_6PW1.js +26 -0
  113. package/dist/web/server/assets/triggers-BcTTwMfy.js +16 -0
  114. package/dist/web/server/assets/triggers-BzJG1nN5.js +191 -0
  115. package/dist/web/server/assets/welcome-CP4CZ9B6.js +85 -0
  116. package/dist/web/server/assets/wire-constants-Deb4NxBb.js +16 -0
  117. package/dist/web/server/server.js +5911 -0
  118. package/dist/web-server.js +42 -0
  119. package/dist/web-server.js.map +1 -0
  120. package/dist/worker.js +65 -2
  121. package/dist/worker.js.map +1 -1
  122. package/package.json +18 -12
@@ -0,0 +1,453 @@
1
+ import { t as Route } from "./profiles-CZ5NkmVw.js";
2
+ import { t as Button } from "./Button-Dsnw22OF.js";
3
+ import { t as TemplatesTabs } from "./TemplatesTabs---7h5GYa.js";
4
+ import { useState } from "react";
5
+ import { useRouter } from "@tanstack/react-router";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/routes/profiles/index.tsx?tsr-split=component
8
+ function ProfilesPage() {
9
+ const { profiles, modelGroups, skills, templates } = Route.useLoaderData();
10
+ const router = useRouter();
11
+ async function del(id) {
12
+ if (!confirm("delete profile and all its files?")) return;
13
+ const res = await fetch(`/api/profiles/${id}`, { method: "DELETE" });
14
+ if (!res.ok && res.status !== 204) {
15
+ const body = await res.json().catch(() => null);
16
+ alert(body?.error ?? res.statusText);
17
+ return;
18
+ }
19
+ await router.invalidate();
20
+ }
21
+ return /* @__PURE__ */ jsxs("div", { children: [
22
+ /* @__PURE__ */ jsx(TemplatesTabs, {}),
23
+ /* @__PURE__ */ jsx("h1", { children: "profiles" }),
24
+ /* @__PURE__ */ jsx("p", {
25
+ className: "muted",
26
+ children: "A profile is a spawn template — SOUL/IDENTITY templates, a default model, a skills policy. Agents choose a group at spawn time, independent of their profile."
27
+ }),
28
+ /* @__PURE__ */ jsx(CreateProfileForm, {
29
+ modelGroups,
30
+ skills,
31
+ templates,
32
+ onCreated: () => router.invalidate()
33
+ }),
34
+ /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
35
+ /* @__PURE__ */ jsx("th", { children: "id" }),
36
+ /* @__PURE__ */ jsx("th", { children: "name" }),
37
+ /* @__PURE__ */ jsx("th", { children: "model" }),
38
+ /* @__PURE__ */ jsx("th", { children: "agents" }),
39
+ /* @__PURE__ */ jsx("th", { children: "skills" }),
40
+ /* @__PURE__ */ jsx("th", {})
41
+ ] }) }), /* @__PURE__ */ jsxs("tbody", { children: [profiles.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
42
+ colSpan: 6,
43
+ className: "muted",
44
+ children: "no profiles yet"
45
+ }) }), profiles.map((p) => {
46
+ const skillsLabel = p.skillsMode === "all" ? "all" : p.defaultSkills.length === 0 ? "—" : p.defaultSkills.join(", ");
47
+ return /* @__PURE__ */ jsxs("tr", { children: [
48
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("a", {
49
+ href: `/profiles/${p.id}`,
50
+ children: /* @__PURE__ */ jsx("code", { children: p.id })
51
+ }) }),
52
+ /* @__PURE__ */ jsx("td", { children: p.name }),
53
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: p.defaultModel }) }),
54
+ /* @__PURE__ */ jsx("td", { children: p.agentCount }),
55
+ /* @__PURE__ */ jsx("td", {
56
+ className: "text-xs text-mocha-light",
57
+ children: skillsLabel
58
+ }),
59
+ /* @__PURE__ */ jsx("td", { children: p.agentCount === 0 ? /* @__PURE__ */ jsx(Button, {
60
+ variant: "danger",
61
+ onClick: () => del(p.id),
62
+ children: "delete"
63
+ }) : /* @__PURE__ */ jsx("span", {
64
+ className: "muted",
65
+ title: `${p.agentCount} agent(s) use this profile`,
66
+ children: "in use"
67
+ }) })
68
+ ] }, p.id);
69
+ })] })] })
70
+ ] });
71
+ }
72
+ function CreateProfileForm({ modelGroups, skills, templates, onCreated }) {
73
+ const [tab, setTab] = useState("basics");
74
+ const [id, setId] = useState("");
75
+ const [name, setName] = useState("");
76
+ const [model, setModel] = useState("");
77
+ const [soul, setSoul] = useState(templates.soul);
78
+ const [identity, setIdentity] = useState(templates.identity);
79
+ const [bootstrap, setBootstrap] = useState(templates.bootstrap);
80
+ const [enableBootstrap, setEnableBootstrap] = useState(true);
81
+ const [agentsTpl, setAgentsTpl] = useState(templates.agents);
82
+ const [enableAgents, setEnableAgents] = useState(true);
83
+ const [toolsTpl, setToolsTpl] = useState(templates.tools);
84
+ const [enableTools, setEnableTools] = useState(true);
85
+ const [heartbeatTpl, setHeartbeatTpl] = useState(templates.heartbeat);
86
+ const [enableHeartbeat, setEnableHeartbeat] = useState(false);
87
+ function setTemplateEnabled(key, setter, on) {
88
+ setter(on);
89
+ if (!on && tab === key) setTab("basics");
90
+ }
91
+ const [skillsMode, setSkillsMode] = useState("all");
92
+ const [picked, setPicked] = useState(/* @__PURE__ */ new Set());
93
+ const [error, setError] = useState(null);
94
+ const [submitting, setSubmitting] = useState(false);
95
+ function togglePicked(name) {
96
+ setPicked((prev) => {
97
+ const next = new Set(prev);
98
+ if (next.has(name)) next.delete(name);
99
+ else next.add(name);
100
+ return next;
101
+ });
102
+ }
103
+ async function submit(e) {
104
+ e.preventDefault();
105
+ setError(null);
106
+ if (!id.trim()) {
107
+ setError("id is required");
108
+ return;
109
+ }
110
+ if (!model.trim()) {
111
+ setError("default model is required");
112
+ return;
113
+ }
114
+ setSubmitting(true);
115
+ try {
116
+ const body = {
117
+ id: id.trim(),
118
+ name: name.trim() || void 0,
119
+ model: model.trim(),
120
+ skillsMode,
121
+ defaultSkills: skillsMode === "selected" ? Array.from(picked) : [],
122
+ soul,
123
+ identity,
124
+ bootstrap: enableBootstrap ? bootstrap : null,
125
+ agents: enableAgents ? agentsTpl : null,
126
+ tools: enableTools ? toolsTpl : null,
127
+ heartbeat: enableHeartbeat ? heartbeatTpl : null
128
+ };
129
+ const res = await fetch("/api/profiles", {
130
+ method: "POST",
131
+ headers: { "content-type": "application/json" },
132
+ body: JSON.stringify(body)
133
+ });
134
+ if (!res.ok) {
135
+ const e2 = await res.json().catch(() => null);
136
+ throw new Error(e2?.error ?? res.statusText);
137
+ }
138
+ setId("");
139
+ setName("");
140
+ setModel("");
141
+ setEnableBootstrap(true);
142
+ setAgentsTpl(templates.agents);
143
+ setEnableAgents(true);
144
+ setToolsTpl(templates.tools);
145
+ setEnableTools(true);
146
+ setHeartbeatTpl(templates.heartbeat);
147
+ setEnableHeartbeat(false);
148
+ setPicked(/* @__PURE__ */ new Set());
149
+ setSkillsMode("all");
150
+ setTab("basics");
151
+ onCreated();
152
+ } catch (err) {
153
+ setError(err.message);
154
+ } finally {
155
+ setSubmitting(false);
156
+ }
157
+ }
158
+ return /* @__PURE__ */ jsxs("form", {
159
+ className: "card",
160
+ onSubmit: submit,
161
+ children: [
162
+ /* @__PURE__ */ jsx("h3", { children: "create profile" }),
163
+ error && /* @__PURE__ */ jsx("div", {
164
+ className: "err",
165
+ children: error
166
+ }),
167
+ /* @__PURE__ */ jsx(Tabs, {
168
+ items: [
169
+ {
170
+ id: "basics",
171
+ label: "basics"
172
+ },
173
+ {
174
+ id: "soul",
175
+ label: "SOUL"
176
+ },
177
+ {
178
+ id: "identity",
179
+ label: "IDENTITY"
180
+ },
181
+ {
182
+ id: "bootstrap",
183
+ label: "BOOTSTRAP",
184
+ disabled: !enableBootstrap
185
+ },
186
+ {
187
+ id: "agents",
188
+ label: "AGENTS",
189
+ disabled: !enableAgents
190
+ },
191
+ {
192
+ id: "tools",
193
+ label: "TOOLS",
194
+ disabled: !enableTools
195
+ },
196
+ {
197
+ id: "heartbeat",
198
+ label: "HEARTBEAT",
199
+ disabled: !enableHeartbeat
200
+ },
201
+ {
202
+ id: "skills",
203
+ label: "skills"
204
+ }
205
+ ],
206
+ active: tab,
207
+ onChange: (t) => setTab(t)
208
+ }),
209
+ /* @__PURE__ */ jsxs("fieldset", {
210
+ className: "mb-5 rounded-md border border-frost p-3",
211
+ children: [
212
+ /* @__PURE__ */ jsx("legend", {
213
+ className: "px-1 text-[0.85em] font-medium text-mocha",
214
+ children: "templates to include"
215
+ }),
216
+ /* @__PURE__ */ jsxs("div", {
217
+ className: "flex flex-wrap gap-x-5 gap-y-2 text-[0.9em]",
218
+ children: [
219
+ /* @__PURE__ */ jsxs("label", {
220
+ className: "inline-flex items-center gap-1.5 opacity-60",
221
+ title: "always included",
222
+ children: [/* @__PURE__ */ jsx("input", {
223
+ type: "checkbox",
224
+ defaultChecked: true,
225
+ disabled: true
226
+ }), " SOUL.md"]
227
+ }),
228
+ /* @__PURE__ */ jsxs("label", {
229
+ className: "inline-flex items-center gap-1.5 opacity-60",
230
+ title: "always included",
231
+ children: [/* @__PURE__ */ jsx("input", {
232
+ type: "checkbox",
233
+ defaultChecked: true,
234
+ disabled: true
235
+ }), " IDENTITY.md"]
236
+ }),
237
+ /* @__PURE__ */ jsxs("label", {
238
+ className: "inline-flex cursor-pointer items-center gap-1.5",
239
+ children: [/* @__PURE__ */ jsx("input", {
240
+ type: "checkbox",
241
+ checked: enableBootstrap,
242
+ onChange: (e) => setTemplateEnabled("bootstrap", setEnableBootstrap, e.target.checked)
243
+ }), "BOOTSTRAP.md"]
244
+ }),
245
+ /* @__PURE__ */ jsxs("label", {
246
+ className: "inline-flex cursor-pointer items-center gap-1.5",
247
+ children: [/* @__PURE__ */ jsx("input", {
248
+ type: "checkbox",
249
+ checked: enableAgents,
250
+ onChange: (e) => setTemplateEnabled("agents", setEnableAgents, e.target.checked)
251
+ }), "AGENTS.md"]
252
+ }),
253
+ /* @__PURE__ */ jsxs("label", {
254
+ className: "inline-flex cursor-pointer items-center gap-1.5",
255
+ children: [/* @__PURE__ */ jsx("input", {
256
+ type: "checkbox",
257
+ checked: enableTools,
258
+ onChange: (e) => setTemplateEnabled("tools", setEnableTools, e.target.checked)
259
+ }), "TOOLS.md"]
260
+ }),
261
+ /* @__PURE__ */ jsxs("label", {
262
+ className: "inline-flex cursor-pointer items-center gap-1.5",
263
+ children: [/* @__PURE__ */ jsx("input", {
264
+ type: "checkbox",
265
+ checked: enableHeartbeat,
266
+ onChange: (e) => setTemplateEnabled("heartbeat", setEnableHeartbeat, e.target.checked)
267
+ }), "HEARTBEAT.md"]
268
+ })
269
+ ]
270
+ }),
271
+ /* @__PURE__ */ jsx("p", {
272
+ className: "muted mt-2 text-[0.8em]",
273
+ children: "Disabled files aren't created for this profile. Each spawned agent gets its own copy of the enabled files at spawn time."
274
+ })
275
+ ]
276
+ }),
277
+ tab === "basics" && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
278
+ className: "flex gap-4",
279
+ children: [/* @__PURE__ */ jsxs("label", {
280
+ className: "flex-1",
281
+ children: ["id (slug)", /* @__PURE__ */ jsx("input", {
282
+ value: id,
283
+ onChange: (e) => setId(e.target.value),
284
+ required: true
285
+ })]
286
+ }), /* @__PURE__ */ jsxs("label", {
287
+ className: "flex-1",
288
+ children: ["name", /* @__PURE__ */ jsx("input", {
289
+ value: name,
290
+ onChange: (e) => setName(e.target.value)
291
+ })]
292
+ })]
293
+ }), /* @__PURE__ */ jsxs("label", { children: ["default model", modelGroups.length === 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("select", {
294
+ disabled: true,
295
+ children: /* @__PURE__ */ jsx("option", { children: "(no models available)" })
296
+ }), /* @__PURE__ */ jsxs("span", {
297
+ className: "muted text-[0.85em]",
298
+ children: [
299
+ "Enable a provider and curate models on ",
300
+ /* @__PURE__ */ jsx("a", {
301
+ href: "/config",
302
+ children: "/config"
303
+ }),
304
+ " first."
305
+ ]
306
+ })] }) : /* @__PURE__ */ jsxs("select", {
307
+ value: model,
308
+ onChange: (e) => setModel(e.target.value),
309
+ required: true,
310
+ children: [/* @__PURE__ */ jsx("option", {
311
+ value: "",
312
+ children: "-- pick a model --"
313
+ }), modelGroups.map((g) => /* @__PURE__ */ jsx("optgroup", {
314
+ label: g.provider,
315
+ children: g.models.map((m) => /* @__PURE__ */ jsx("option", {
316
+ value: `${g.provider}:${m}`,
317
+ children: `${g.provider}:${m}`
318
+ }, m))
319
+ }, g.provider))]
320
+ })] })] }),
321
+ tab === "soul" && /* @__PURE__ */ jsx(TemplateTab, {
322
+ label: "SOUL.md",
323
+ hint: "Persona, values, and operating principles. Injected into every session.",
324
+ value: soul,
325
+ onChange: setSoul,
326
+ rows: 16
327
+ }),
328
+ tab === "identity" && /* @__PURE__ */ jsx(TemplateTab, {
329
+ label: "IDENTITY.md",
330
+ hint: "Name, creature, vibe, emoji, avatar — filled in during the bootstrap ritual.",
331
+ value: identity,
332
+ onChange: setIdentity,
333
+ rows: 12
334
+ }),
335
+ tab === "bootstrap" && /* @__PURE__ */ jsx(TemplateTab, {
336
+ label: "BOOTSTRAP.md",
337
+ hint: "One-time first-run ritual. The agent retires it once introductions are done.",
338
+ value: bootstrap,
339
+ onChange: setBootstrap,
340
+ rows: 16
341
+ }),
342
+ tab === "agents" && /* @__PURE__ */ jsx(TemplateTab, {
343
+ label: "AGENTS.md",
344
+ hint: "The workspace operating manual — memory discipline, red lines, channel etiquette.",
345
+ value: agentsTpl,
346
+ onChange: setAgentsTpl,
347
+ rows: 16
348
+ }),
349
+ tab === "tools" && /* @__PURE__ */ jsx(TemplateTab, {
350
+ label: "TOOLS.md",
351
+ hint: "Agent-specific tool notes and environment facts beyond the generic tool descriptions.",
352
+ value: toolsTpl,
353
+ onChange: setToolsTpl,
354
+ rows: 14
355
+ }),
356
+ tab === "heartbeat" && /* @__PURE__ */ jsx(TemplateTab, {
357
+ label: "HEARTBEAT.md",
358
+ hint: "Optional checklist run on scheduled wake-ups. Pair with an interval/cron trigger.",
359
+ value: heartbeatTpl,
360
+ onChange: setHeartbeatTpl,
361
+ rows: 12
362
+ }),
363
+ tab === "skills" && /* @__PURE__ */ jsxs("div", { children: [
364
+ /* @__PURE__ */ jsx("p", {
365
+ className: "muted my-2",
366
+ children: "Choose which skills agents inherit at spawn time. In both modes each agent can still attach or detach skills individually after it's spawned."
367
+ }),
368
+ /* @__PURE__ */ jsxs("label", {
369
+ className: "flex items-start gap-2 my-2 cursor-pointer",
370
+ children: [/* @__PURE__ */ jsx("input", {
371
+ type: "radio",
372
+ name: "skillsMode",
373
+ value: "all",
374
+ checked: skillsMode === "all",
375
+ onChange: () => setSkillsMode("all")
376
+ }), /* @__PURE__ */ jsxs("span", { children: [/* @__PURE__ */ jsx("strong", { children: "allow all skills" }), " — every skill on disk is attached when an agent is spawned."] })]
377
+ }),
378
+ /* @__PURE__ */ jsxs("label", {
379
+ className: "flex items-start gap-2 my-2 cursor-pointer",
380
+ children: [/* @__PURE__ */ jsx("input", {
381
+ type: "radio",
382
+ name: "skillsMode",
383
+ value: "selected",
384
+ checked: skillsMode === "selected",
385
+ onChange: () => setSkillsMode("selected")
386
+ }), /* @__PURE__ */ jsxs("span", { children: [/* @__PURE__ */ jsx("strong", { children: "select skills" }), " — attach only the ones you pick below."] })]
387
+ }),
388
+ /* @__PURE__ */ jsx("div", {
389
+ className: `mt-3 max-h-[22rem] overflow-y-auto rounded-md border border-frost p-3 ${skillsMode === "all" ? "opacity-50 pointer-events-none" : ""}`,
390
+ children: skills.length === 0 ? /* @__PURE__ */ jsxs("p", {
391
+ className: "muted",
392
+ children: [
393
+ "No skills installed yet. Import some on ",
394
+ /* @__PURE__ */ jsx("a", {
395
+ href: "/skills",
396
+ children: "/skills"
397
+ }),
398
+ "."
399
+ ]
400
+ }) : skills.map((s) => /* @__PURE__ */ jsxs("label", {
401
+ className: "my-1.5 flex cursor-pointer items-start gap-2",
402
+ children: [/* @__PURE__ */ jsx("input", {
403
+ type: "checkbox",
404
+ checked: picked.has(s.name),
405
+ onChange: () => togglePicked(s.name)
406
+ }), /* @__PURE__ */ jsxs("span", { children: [/* @__PURE__ */ jsx("code", { children: s.name }), s.description && /* @__PURE__ */ jsxs("span", {
407
+ className: "text-[0.9em] text-mocha-light",
408
+ children: [" — ", s.description]
409
+ })] })]
410
+ }, s.name))
411
+ })
412
+ ] }),
413
+ /* @__PURE__ */ jsx("div", {
414
+ className: "mt-5 flex gap-2",
415
+ children: /* @__PURE__ */ jsx(Button, {
416
+ variant: "primary",
417
+ type: "submit",
418
+ disabled: submitting,
419
+ children: submitting ? "creating…" : "create"
420
+ })
421
+ })
422
+ ]
423
+ });
424
+ }
425
+ function Tabs({ items, active, onChange }) {
426
+ return /* @__PURE__ */ jsx("nav", {
427
+ role: "tablist",
428
+ className: "-mb-px mb-5 flex flex-wrap gap-1 border-b border-frost",
429
+ children: items.map((it) => /* @__PURE__ */ jsx("button", {
430
+ type: "button",
431
+ role: "tab",
432
+ "aria-selected": active === it.id,
433
+ disabled: it.disabled,
434
+ title: it.disabled ? "disabled — enable it in “templates to include”" : void 0,
435
+ onClick: () => onChange(it.id),
436
+ className: `unstyled border-b-2 bg-transparent px-4 py-2 text-[0.9em] font-medium transition-colors ${it.disabled ? "cursor-not-allowed border-transparent text-mocha-light/40" : active === it.id ? "cursor-pointer border-sapphire text-sapphire" : "cursor-pointer border-transparent text-mocha hover:text-sapphire"}`,
437
+ children: it.label
438
+ }, it.id))
439
+ });
440
+ }
441
+ function TemplateTab({ label, hint, value, onChange, rows }) {
442
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
443
+ className: "muted my-2 text-[0.85em]",
444
+ children: hint
445
+ }), /* @__PURE__ */ jsxs("label", { children: [label, /* @__PURE__ */ jsx("textarea", {
446
+ rows,
447
+ value,
448
+ onChange: (e) => onChange(e.target.value),
449
+ className: "font-mono text-[0.88em] leading-[1.55]"
450
+ })] })] });
451
+ }
452
+ //#endregion
453
+ export { ProfilesPage as component };