bazilion 0.7.0 → 0.9.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 (166) hide show
  1. package/README.md +47 -5
  2. package/dist/cli.js +1257 -638
  3. package/dist/cli.js.map +1 -1
  4. package/dist/daemon.js +5334 -1594
  5. package/dist/daemon.js.map +1 -1
  6. package/dist/migrations/0001_init.sql +318 -88
  7. package/dist/web/client/assets/{FieldRow-CNKma5LE.js → FieldRow-DmwAFfbF.js} +1 -1
  8. package/dist/web/client/assets/ProductionTeamPolicyEditor-1a5jQqUB.js +7 -0
  9. package/dist/web/client/assets/ProductionTeamPolicyEditor-DLioOiRN.css +1 -0
  10. package/dist/web/client/assets/ProfileCommunicationEditor-D1OZ8WE5.js +1 -0
  11. package/dist/web/client/assets/RecoveryState-QfMSuwy3.js +1 -0
  12. package/dist/web/client/assets/TeamTabs-BViZ4sti.js +1 -0
  13. package/dist/web/client/assets/TemplatesTabs-DVcY9pMD.js +1 -0
  14. package/dist/web/client/assets/_id-8P7brhGy.js +1 -0
  15. package/dist/web/client/assets/_id-C3o3MHq8.js +1 -0
  16. package/dist/web/client/assets/_id-DGRrSF1e.js +1 -0
  17. package/dist/web/client/assets/_id-DGyKURCp.js +1 -0
  18. package/dist/web/client/assets/_id-KnJe-aW9.js +1 -0
  19. package/dist/web/client/assets/activity-DJuhhQCb.js +1 -0
  20. package/dist/web/client/assets/activity-WWvJSo4t.js +1 -0
  21. package/dist/web/client/assets/agents-C32T1voV.js +1 -0
  22. package/dist/web/client/assets/agents-nH4m4gZ1.js +1 -0
  23. package/dist/web/client/assets/approvals-DGi0PSx8.js +1 -0
  24. package/dist/web/client/assets/approvals-l8jIZjqz.js +1 -0
  25. package/dist/web/client/assets/{config-BSAVT-17.js → config-C7wvi1nR.js} +2 -2
  26. package/dist/web/client/assets/context-BEGWE3RC.js +1 -0
  27. package/dist/web/client/assets/inbox--4aBaAgG.js +1 -0
  28. package/dist/web/client/assets/index-BCXoh1c8.js +12 -0
  29. package/dist/web/client/assets/{login-D8lNr2SX.js → login-Bk2wwIHQ.js} +1 -1
  30. package/dist/web/client/assets/{mcp-BLnngDsj.js → mcp-vM7xgh9e.js} +1 -1
  31. package/dist/web/client/assets/members-cPKfnrSL.js +1 -0
  32. package/dist/web/client/assets/memory-BOcsaemD.js +1 -0
  33. package/dist/web/client/assets/policy-BGLCJYvS.js +1 -0
  34. package/dist/web/client/assets/policy-K4hIbbIN.js +1 -0
  35. package/dist/web/client/assets/{preload-helper-CvnapA2_.js → preload-helper-eOOCz1Fu.js} +1 -1
  36. package/dist/web/client/assets/routes-DnrP3dwv.js +1 -0
  37. package/dist/web/client/assets/services-C2_O3ifw.js +1 -0
  38. package/dist/web/client/assets/skills-B__fLZjx.js +1 -0
  39. package/dist/web/client/assets/styles-Dn24-ZvP.css +2 -0
  40. package/dist/web/client/assets/team-policy-BdX340m4.js +1 -0
  41. package/dist/web/client/assets/teams-CSNyLz3l.js +1 -0
  42. package/dist/web/client/assets/teams-DZMB4_iw.js +1 -0
  43. package/dist/web/client/assets/teams-rpaYKNIb.js +1 -0
  44. package/dist/web/client/assets/telegram-B1O4Ko0V.js +1 -0
  45. package/dist/web/client/assets/{tokens-D2_O9ARe.js → tokens-D7FH9VgA.js} +1 -1
  46. package/dist/web/client/assets/triggers-3PLy2_Fo.js +1 -0
  47. package/dist/web/client/assets/welcome-B-QQobzq.js +1 -0
  48. package/dist/web/client/assets/{ChatPane-DzEgOEqS.js → wire-constants-BY9Q9Z7d.js} +4 -4
  49. package/dist/web/server/assets/{ChatPane-BvpswYvF.js → ChatPane-Dh3qxzdb.js} +23 -12
  50. package/dist/web/server/assets/ProductionTeamPolicyEditor-Bke5doyl.js +1009 -0
  51. package/dist/web/server/assets/ProfileCommunicationEditor-C2RU-2QB.js +107 -0
  52. package/dist/web/server/assets/RecoveryState-B2SG-mrY.js +37 -0
  53. package/dist/web/server/assets/{Sidebar-DmEiewRN.js → Sidebar-CGmtCnYU.js} +372 -48
  54. package/dist/web/server/assets/TeamTabs-BPxDBfqy.js +50 -0
  55. package/dist/web/server/assets/{TemplatesTabs---7h5GYa.js → TemplatesTabs-zf4YhStd.js} +6 -6
  56. package/dist/web/server/assets/{_id-CXg-Blec.js → _id-5lLzLwcv.js} +52 -40
  57. package/dist/web/server/assets/_id-A8Xiv6Lc.js +11 -0
  58. package/dist/web/server/assets/{_id-BqnDy_Ca.js → _id-B04VaQlh.js} +6 -5
  59. package/dist/web/server/assets/{_id-D0ytyXGY.js → _id-B6g9wmPR.js} +167 -31
  60. package/dist/web/server/assets/_id-ButXHnRH.js +14 -0
  61. package/dist/web/server/assets/_id-C4AOhstq.js +44 -0
  62. package/dist/web/server/assets/{_id-DDixKEud.js → _id-CCHA0gdR.js} +72 -12
  63. package/dist/web/server/assets/{_id-D_Ew11ED.js → _id-CUWgTqMS.js} +8 -8
  64. package/dist/web/server/assets/_id-DJkzwHjM.js +42 -0
  65. package/dist/web/server/assets/{_id-CnQflrRv.js → _id-DdC9wpNN.js} +5 -5
  66. package/dist/web/server/assets/{_id-81NrHA5d.js → _id-DkFgCIb-.js} +9 -1
  67. package/dist/web/server/assets/{_id-D8duqgd5.js → _id-_nFwi9gD.js} +5 -4
  68. package/dist/web/server/assets/{_id-Sjw0zhA6.js → _id-fpFQ9_Ya.js} +4 -4
  69. package/dist/web/server/assets/_tanstack-start-manifest_v-Div-TukY.js +241 -0
  70. package/dist/web/server/assets/activity-C2ZKg1Q9.js +170 -0
  71. package/dist/web/server/assets/activity-CGCf8BQf.js +11 -0
  72. package/dist/web/server/assets/activity-DedraoFj.js +14 -0
  73. package/dist/web/server/assets/activity-GPx8NCeB.js +12 -0
  74. package/dist/web/server/assets/{profiles-CZ5NkmVw.js → agents-B8kinIPW.js} +4 -4
  75. package/dist/web/server/assets/{agents-k5QURC4I.js → agents-BR2qXlXF.js} +4 -4
  76. package/dist/web/server/assets/{agents-ChcAJUI5.js → agents-Bp1nsVs2.js} +1 -1
  77. package/dist/web/server/assets/{profiles-LxcC_L6n.js → agents-CUQmWhTp.js} +36 -10
  78. package/dist/web/server/assets/{agents-C7SBPN0M.js → agents-DU9Hqs58.js} +51 -12
  79. package/dist/web/server/assets/{profiles-C6a3RKgu.js → agents-LHowEI6S.js} +4 -4
  80. package/dist/web/server/assets/approvals-CbFXFvG8.js +11 -0
  81. package/dist/web/server/assets/approvals-DHgARzd8.js +242 -0
  82. package/dist/web/server/assets/approvals-Dw2LJoSA.js +14 -0
  83. package/dist/web/server/assets/approvals-VPc0YpLN.js +12 -0
  84. package/dist/web/server/assets/{auth-DzRAMwVt.js → auth-l-Vf8wlu.js} +5 -1
  85. package/dist/web/server/assets/{config-CdVjqjin.js → config-BvKctDOX.js} +4 -4
  86. package/dist/web/server/assets/{config-Bq3o924J.js → config-QvHaxGlP.js} +1 -1
  87. package/dist/web/server/assets/context-5lrf2ame.js +12 -0
  88. package/dist/web/server/assets/context-CEr4-xiA.js +49 -0
  89. package/dist/web/server/assets/context-D3Egm-vY.js +12 -0
  90. package/dist/web/server/assets/members-40DxRdVj.js +48 -0
  91. package/dist/web/server/assets/members-DlGBKZNl.js +12 -0
  92. package/dist/web/server/assets/members-ksELRsyk.js +12 -0
  93. package/dist/web/server/assets/{memory-Ns2-Z31p.js → memory-B5moRnnp.js} +5 -5
  94. package/dist/web/server/assets/{memory-BaYnfm7K.js → memory-CO0jKGzJ.js} +8 -8
  95. package/dist/web/server/assets/memory-CiTl4cN9.js +289 -0
  96. package/dist/web/server/assets/policy-BYVXqsan.js +11 -0
  97. package/dist/web/server/assets/policy-DNcGZLOB.js +21 -0
  98. package/dist/web/server/assets/policy-Dr55y-Mh.js +496 -0
  99. package/dist/web/server/assets/policy-Dxs78_GO.js +40 -0
  100. package/dist/web/server/assets/{router-BpBZgRwn.js → router-_izWQUeG.js} +156 -101
  101. package/dist/web/server/assets/{routes-Ce2VWrU9.js → routes-BSSKp3Rv.js} +4 -4
  102. package/dist/web/server/assets/{routes-C61gBiXa.js → routes-BrTOoeth.js} +5 -5
  103. package/dist/web/server/assets/{routes-V9URcp1v.js → routes-DOj6ljcm.js} +1 -1
  104. package/dist/web/server/assets/{services-B91w2f-X.js → services-CHe4ihJk.js} +11 -11
  105. package/dist/web/server/assets/{services-Ccc5s2bS.js → services-Pv_V88VA.js} +3 -3
  106. package/dist/web/server/assets/{skills-dLyBZb3B.js → skills-D89ND2kR.js} +67 -7
  107. package/dist/web/server/assets/{skills-CpsyR_WA.js → skills-l2cyQ3zS.js} +1 -1
  108. package/dist/web/server/assets/{start-CYDpZ6cb.js → start-DlHq0RaQ.js} +1 -1
  109. package/dist/web/server/assets/team-policy-Csvc5EDd.js +180 -0
  110. package/dist/web/server/assets/teams-35Oprf6e.js +14 -0
  111. package/dist/web/server/assets/teams-3im0oQnS.js +11 -0
  112. package/dist/web/server/assets/teams-B5IF65p2.js +12 -0
  113. package/dist/web/server/assets/teams-B9O-WDH5.js +108 -0
  114. package/dist/web/server/assets/teams-DFkN7ic7.js +36 -0
  115. package/dist/web/server/assets/teams-DH1CvWmT.js +12 -0
  116. package/dist/web/server/assets/teams-zcm9XaQU.js +174 -0
  117. package/dist/web/server/assets/{telegram-DfAddLdv.js → telegram-C9sQFwWj.js} +7 -7
  118. package/dist/web/server/assets/{telegram-T3l9KtiE.js → telegram-mTnJCOmn.js} +1 -1
  119. package/dist/web/server/assets/{welcome-CP4CZ9B6.js → welcome-CDGE2Sdk.js} +2 -2
  120. package/dist/web/server/assets/{wire-constants-Deb4NxBb.js → wire-constants-C8nBJcU3.js} +3 -3
  121. package/dist/web/server/server.js +64 -42
  122. package/dist/worker.js +180 -128
  123. package/dist/worker.js.map +1 -1
  124. package/package.json +7 -7
  125. package/dist/migrations/0002_profile_groups.sql +0 -38
  126. package/dist/migrations/0003_agent_telegram.sql +0 -40
  127. package/dist/migrations/0004_agent_mirror_mode.sql +0 -17
  128. package/dist/migrations/0005_group_topic_name_format.sql +0 -15
  129. package/dist/migrations/0006_telegram_acl.sql +0 -18
  130. package/dist/migrations/0007_mcp_servers.sql +0 -30
  131. package/dist/migrations/0008_seed_user_md.sql +0 -39
  132. package/dist/web/client/assets/MembersEditor-C6UpqDdV.js +0 -1
  133. package/dist/web/client/assets/SpawnTeamModal-BEkNCKXm.js +0 -1
  134. package/dist/web/client/assets/TemplatesTabs-Da7mg9FI.js +0 -1
  135. package/dist/web/client/assets/_id-BdKmo0gb.js +0 -1
  136. package/dist/web/client/assets/_id-LT6Ejjr0.js +0 -1
  137. package/dist/web/client/assets/_id-MR2XjWh0.js +0 -1
  138. package/dist/web/client/assets/_id-_6jIt0_-.js +0 -1
  139. package/dist/web/client/assets/agents-0arKbVYG.js +0 -1
  140. package/dist/web/client/assets/groups-BqTkhHes.js +0 -1
  141. package/dist/web/client/assets/inbox-ozoCXzr5.js +0 -1
  142. package/dist/web/client/assets/index-iayCEuU2.js +0 -12
  143. package/dist/web/client/assets/memory-D1GQjEvN.js +0 -1
  144. package/dist/web/client/assets/profile-groups-C2yJPTaE.js +0 -1
  145. package/dist/web/client/assets/profiles-BV7AAZjj.js +0 -1
  146. package/dist/web/client/assets/routes-DSHQLA7K.js +0 -1
  147. package/dist/web/client/assets/services-BbCJe1Du.js +0 -1
  148. package/dist/web/client/assets/skills-C6czKR5I.js +0 -1
  149. package/dist/web/client/assets/styles-C06axZZk.css +0 -2
  150. package/dist/web/client/assets/telegram-gE4j8gte.js +0 -1
  151. package/dist/web/client/assets/triggers-WljnfEfJ.js +0 -1
  152. package/dist/web/client/assets/welcome-Dn-zvmBE.js +0 -1
  153. package/dist/web/client/assets/wire-constants-BkT5-597.js +0 -1
  154. package/dist/web/server/assets/MembersEditor-BWQztvrX.js +0 -131
  155. package/dist/web/server/assets/SpawnTeamModal-dSN421k_.js +0 -107
  156. package/dist/web/server/assets/_id-BKev9H1p.js +0 -12
  157. package/dist/web/server/assets/_id-BNwlbWHP.js +0 -24
  158. package/dist/web/server/assets/_id-CRqqi8IE.js +0 -161
  159. package/dist/web/server/assets/_tanstack-start-manifest_v-DBlFH2gg.js +0 -178
  160. package/dist/web/server/assets/groups-CbSwND2r.js +0 -12
  161. package/dist/web/server/assets/groups-CeRRlZaZ.js +0 -150
  162. package/dist/web/server/assets/groups-pk4CYSuf.js +0 -21
  163. package/dist/web/server/assets/memory-CQaqWnyM.js +0 -284
  164. package/dist/web/server/assets/profile-groups-CiU06yN1.js +0 -28
  165. package/dist/web/server/assets/profile-groups-D21MYoLM.js +0 -208
  166. package/dist/web/server/assets/profile-groups-aoJleXHP.js +0 -12
@@ -1,284 +0,0 @@
1
- import { t as Route } from "./memory-Ns2-Z31p.js";
2
- import { useEffect, useRef, useState } from "react";
3
- import { jsx, jsxs } from "react/jsx-runtime";
4
- //#region src/routes/groups/$id/memory.tsx?tsr-split=component
5
- function encodeKey(key) {
6
- return key.split("/").map(encodeURIComponent).join("/");
7
- }
8
- function MemoryPage() {
9
- const { group, memberCount, entries: initialEntries } = Route.useLoaderData();
10
- const groupId = group.id;
11
- const [rows, setRows] = useState(() => initialEntries.map((e) => ({
12
- key: e.key,
13
- preview: e.content.slice(0, 80)
14
- })));
15
- const [isSearch, setIsSearch] = useState(false);
16
- const [query, setQuery] = useState("");
17
- const [selectedKey, setSelectedKey] = useState(null);
18
- const [mode, setMode] = useState("none");
19
- const [keyInput, setKeyInput] = useState("");
20
- const [content, setContent] = useState("");
21
- const [status, setStatus] = useState(null);
22
- const searchTimer = useRef(null);
23
- async function loadList(q) {
24
- try {
25
- const url = q.trim().length > 0 ? `/api/groups/${encodeURIComponent(groupId)}/memory/search?q=${encodeURIComponent(q)}&limit=50` : `/api/groups/${encodeURIComponent(groupId)}/memory`;
26
- const res = await fetch(url);
27
- if (!res.ok) {
28
- const body = await res.json().catch(() => null);
29
- throw new Error(body?.error ?? res.statusText);
30
- }
31
- const data = await res.json();
32
- if (q.trim().length > 0) {
33
- setRows(data.map((h) => ({
34
- key: h.key,
35
- preview: h.snippet,
36
- score: h.score
37
- })));
38
- setIsSearch(true);
39
- } else {
40
- setRows(data.map((e) => ({
41
- key: e.key,
42
- preview: e.content.slice(0, 80)
43
- })));
44
- setIsSearch(false);
45
- }
46
- } catch (err) {
47
- setStatus({
48
- msg: `error: ${err.message}`,
49
- kind: "error"
50
- });
51
- }
52
- }
53
- useEffect(() => {
54
- if (searchTimer.current) clearTimeout(searchTimer.current);
55
- searchTimer.current = setTimeout(() => {
56
- loadList(query);
57
- }, 200);
58
- return () => {
59
- if (searchTimer.current) clearTimeout(searchTimer.current);
60
- };
61
- }, [query]);
62
- async function openEntry(key) {
63
- setSelectedKey(key);
64
- setMode("edit");
65
- setStatus({
66
- msg: "loading…",
67
- kind: "info"
68
- });
69
- try {
70
- const res = await fetch(`/api/groups/${encodeURIComponent(groupId)}/memory/${encodeKey(key)}`);
71
- if (!res.ok) {
72
- const body = await res.json().catch(() => null);
73
- throw new Error(body?.error ?? res.statusText);
74
- }
75
- const entry = await res.json();
76
- setKeyInput(entry.key);
77
- setContent(entry.content ?? "");
78
- setStatus({
79
- msg: `loaded ${entry.key}`,
80
- kind: "info"
81
- });
82
- } catch (err) {
83
- setStatus({
84
- msg: `error: ${err.message}`,
85
- kind: "error"
86
- });
87
- }
88
- }
89
- function newEntry() {
90
- setSelectedKey(null);
91
- setMode("new");
92
- setKeyInput("");
93
- setContent("");
94
- setStatus({
95
- msg: "new entry — type a key and content, then save",
96
- kind: "info"
97
- });
98
- }
99
- async function save() {
100
- const key = keyInput.trim();
101
- if (!key) {
102
- setStatus({
103
- msg: "key is required",
104
- kind: "error"
105
- });
106
- return;
107
- }
108
- try {
109
- const res = await fetch(`/api/groups/${encodeURIComponent(groupId)}/memory/${encodeKey(key)}`, {
110
- method: "PUT",
111
- headers: { "content-type": "application/json" },
112
- body: JSON.stringify({ content })
113
- });
114
- if (!res.ok) {
115
- const body = await res.json().catch(() => null);
116
- throw new Error(body?.error ?? res.statusText);
117
- }
118
- setSelectedKey(key);
119
- setMode("edit");
120
- setStatus({
121
- msg: "saved",
122
- kind: "info"
123
- });
124
- await loadList(query);
125
- } catch (err) {
126
- setStatus({
127
- msg: `error: ${err.message}`,
128
- kind: "error"
129
- });
130
- }
131
- }
132
- async function del() {
133
- if (!selectedKey) return;
134
- if (!confirm(`delete ${selectedKey}?`)) return;
135
- try {
136
- const res = await fetch(`/api/groups/${encodeURIComponent(groupId)}/memory/${encodeKey(selectedKey)}`, { method: "DELETE" });
137
- if (!res.ok && res.status !== 204) {
138
- const body = await res.json().catch(() => null);
139
- throw new Error(body?.error ?? res.statusText);
140
- }
141
- setSelectedKey(null);
142
- setMode("none");
143
- setKeyInput("");
144
- setContent("");
145
- setStatus({
146
- msg: "deleted",
147
- kind: "info"
148
- });
149
- await loadList(query);
150
- } catch (err) {
151
- setStatus({
152
- msg: `error: ${err.message}`,
153
- kind: "error"
154
- });
155
- }
156
- }
157
- const canSave = mode !== "none" && keyInput.trim().length > 0;
158
- const canDelete = mode === "edit" && selectedKey !== null;
159
- return /* @__PURE__ */ jsxs("main", {
160
- className: "mx-auto max-w-5xl px-6 py-8",
161
- children: [/* @__PURE__ */ jsxs("header", {
162
- className: "mb-6",
163
- children: [/* @__PURE__ */ jsxs("h1", {
164
- className: "font-serif text-3xl text-foreground",
165
- children: [
166
- group.name,
167
- " ",
168
- /* @__PURE__ */ jsx("span", {
169
- className: "text-muted-foreground text-base",
170
- children: "/ shared memory"
171
- })
172
- ]
173
- }), /* @__PURE__ */ jsxs("p", {
174
- className: "text-muted-foreground text-sm mt-1",
175
- children: [
176
- "BM25-indexed markdown notes shared by every agent in",
177
- " ",
178
- /* @__PURE__ */ jsx("a", {
179
- href: `/groups/${encodeURIComponent(group.id)}`,
180
- className: "font-mono underline",
181
- children: group.id
182
- }),
183
- " ",
184
- "(",
185
- memberCount,
186
- " member",
187
- memberCount === 1 ? "" : "s",
188
- "). Anything written here is visible to every member; per-agent notes belong in the agent's own",
189
- " ",
190
- /* @__PURE__ */ jsx("code", {
191
- className: "font-mono",
192
- children: "IDENTITY.md"
193
- }),
194
- " via ",
195
- /* @__PURE__ */ jsx("code", { children: "home_write" }),
196
- "."
197
- ]
198
- })]
199
- }), /* @__PURE__ */ jsxs("div", {
200
- className: "grid grid-cols-1 gap-6 lg:grid-cols-[320px_1fr]",
201
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
202
- className: "overflow-hidden rounded-[16px] border border-frost bg-snow",
203
- children: [/* @__PURE__ */ jsx("div", {
204
- className: "border-b border-frost p-2",
205
- children: /* @__PURE__ */ jsx("input", {
206
- type: "text",
207
- placeholder: "search (BM25)...",
208
- autoComplete: "off",
209
- value: query,
210
- onChange: (e) => setQuery(e.target.value)
211
- })
212
- }), /* @__PURE__ */ jsx("div", {
213
- className: "max-h-[520px] overflow-y-auto",
214
- children: rows.length === 0 ? /* @__PURE__ */ jsx("div", {
215
- className: "p-8 text-center text-mocha-light",
216
- children: "no entries"
217
- }) : rows.map((r) => {
218
- return /* @__PURE__ */ jsxs("button", {
219
- type: "button",
220
- onClick: () => openEntry(r.key),
221
- className: `unstyled block w-full cursor-pointer border-b border-frost/50 px-3.5 py-2 text-left font-mono text-[0.84em] transition-colors last:border-b-0 hover:bg-sapphire-glow ${r.key === selectedKey ? "bg-sapphire-glow font-medium text-sapphire-deep" : ""}`,
222
- children: [
223
- isSearch && r.score !== void 0 && /* @__PURE__ */ jsx("span", {
224
- className: "float-right text-[0.75em] text-sapphire",
225
- children: r.score.toFixed(2)
226
- }),
227
- r.key,
228
- r.preview && /* @__PURE__ */ jsx("span", {
229
- className: "mt-1 block text-[0.9em] font-normal text-mocha-light",
230
- children: r.preview
231
- })
232
- ]
233
- }, r.key);
234
- })
235
- })]
236
- }), /* @__PURE__ */ jsx("button", {
237
- type: "button",
238
- className: "ghost-btn mt-3 w-full",
239
- onClick: newEntry,
240
- children: "+ new entry"
241
- })] }), /* @__PURE__ */ jsxs("div", { children: [
242
- /* @__PURE__ */ jsx("div", {
243
- className: "mb-3 flex items-center gap-2",
244
- children: /* @__PURE__ */ jsx("input", {
245
- type: "text",
246
- placeholder: "key (e.g. prefs/hiking.md)",
247
- value: keyInput,
248
- onChange: (e) => setKeyInput(e.target.value),
249
- disabled: mode !== "new",
250
- className: "flex-1 font-mono"
251
- })
252
- }),
253
- /* @__PURE__ */ jsx("textarea", {
254
- placeholder: "select an entry on the left, or create a new one.",
255
- value: content,
256
- onChange: (e) => setContent(e.target.value),
257
- className: "min-h-[360px] w-full font-mono text-[0.9em] leading-[1.55]"
258
- }),
259
- /* @__PURE__ */ jsxs("div", {
260
- className: "mt-3 flex gap-2",
261
- children: [/* @__PURE__ */ jsx("button", {
262
- type: "button",
263
- className: "btn-primary",
264
- onClick: save,
265
- disabled: !canSave,
266
- children: "save"
267
- }), /* @__PURE__ */ jsx("button", {
268
- type: "button",
269
- className: "ghost-btn",
270
- onClick: del,
271
- disabled: !canDelete,
272
- children: "delete"
273
- })]
274
- }),
275
- status && /* @__PURE__ */ jsx("p", {
276
- className: `mt-2 text-[0.9em] ${status.kind === "error" ? "text-[#9B3D3D]" : "text-mocha-light"}`,
277
- children: status.msg
278
- })
279
- ] })]
280
- })]
281
- });
282
- }
283
- //#endregion
284
- export { MemoryPage as component };
@@ -1,28 +0,0 @@
1
- import { t as createServerFn } from "../server.js";
2
- import { t as createServerRpc } from "./createServerRpc-CeKECg65.js";
3
- import { n as daemonClient } from "./daemon-client-2NRMzlTr.js";
4
- //#region src/routes/profile-groups/index.tsx?tss-serverfn-split
5
- var fetchProfileGroupsData_createServerFn_handler = createServerRpc({
6
- id: "be2ab9d2d20bd46baa655e08a8f6f0c2161b01657d0362564a58edeaf2195a31",
7
- name: "fetchProfileGroupsData",
8
- filename: "src/routes/profile-groups/index.tsx"
9
- }, (opts) => fetchProfileGroupsData.__executeServer(opts));
10
- var fetchProfileGroupsData = createServerFn({ method: "GET" }).handler(fetchProfileGroupsData_createServerFn_handler, async () => {
11
- const c = daemonClient();
12
- const [profileGroups, groups, profiles, models, templates] = await Promise.all([
13
- c.get("/api/profile-groups"),
14
- c.get("/api/groups"),
15
- c.get("/api/profiles"),
16
- c.get("/api/config/available-models"),
17
- c.get("/api/profiles/_/templates")
18
- ]);
19
- return {
20
- profileGroups,
21
- groups,
22
- profiles,
23
- modelGroups: models.groups,
24
- userMdDefault: templates.userMd
25
- };
26
- });
27
- //#endregion
28
- export { fetchProfileGroupsData_createServerFn_handler };
@@ -1,208 +0,0 @@
1
- import { t as Route } from "./profile-groups-aoJleXHP.js";
2
- import { t as Button } from "./Button-Dsnw22OF.js";
3
- import { t as SpawnTeamModal } from "./SpawnTeamModal-dSN421k_.js";
4
- import { t as MembersEditor } from "./MembersEditor-BWQztvrX.js";
5
- import { t as TemplatesTabs } from "./TemplatesTabs---7h5GYa.js";
6
- import { useState } from "react";
7
- import { useRouter } from "@tanstack/react-router";
8
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
- //#region src/routes/profile-groups/index.tsx?tsr-split=component
10
- function ProfileGroupsPage() {
11
- const { profileGroups, groups, profiles, modelGroups, userMdDefault } = Route.useLoaderData();
12
- const router = useRouter();
13
- const [spawningId, setSpawningId] = useState(null);
14
- async function del(id) {
15
- if (!confirm("delete this profile group? (does not affect spawned agents)")) return;
16
- const res = await fetch(`/api/profile-groups/${id}`, { method: "DELETE" });
17
- if (!res.ok && res.status !== 204) {
18
- const e = await res.json().catch(() => null);
19
- alert(e?.error ?? res.statusText);
20
- return;
21
- }
22
- await router.invalidate();
23
- }
24
- return /* @__PURE__ */ jsxs("div", { children: [
25
- /* @__PURE__ */ jsx(TemplatesTabs, {}),
26
- /* @__PURE__ */ jsx("h1", { children: "profile groups" }),
27
- /* @__PURE__ */ jsx("p", {
28
- className: "muted",
29
- children: "A profile group is a reusable team template. Each one holds an ordered list of members — profile + agent-name + optional overrides — that get replayed as a single transactional spawn into a target group."
30
- }),
31
- /* @__PURE__ */ jsx(CreateProfileGroupForm, {
32
- profiles,
33
- modelGroups,
34
- userMdDefault,
35
- onCreated: () => router.invalidate()
36
- }),
37
- /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
38
- /* @__PURE__ */ jsx("th", { children: "id" }),
39
- /* @__PURE__ */ jsx("th", { children: "name" }),
40
- /* @__PURE__ */ jsx("th", { children: "members" }),
41
- /* @__PURE__ */ jsx("th", {})
42
- ] }) }), /* @__PURE__ */ jsxs("tbody", { children: [profileGroups.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
43
- colSpan: 4,
44
- className: "muted",
45
- children: "no profile groups yet"
46
- }) }), profileGroups.map((g) => /* @__PURE__ */ jsxs("tr", { children: [
47
- /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("a", {
48
- href: `/profile-groups/${g.id}`,
49
- children: /* @__PURE__ */ jsx("code", { children: g.id })
50
- }) }),
51
- /* @__PURE__ */ jsx("td", { children: g.name }),
52
- /* @__PURE__ */ jsx("td", { children: g.memberCount }),
53
- /* @__PURE__ */ jsxs("td", {
54
- className: "flex gap-2",
55
- children: [/* @__PURE__ */ jsx(Button, {
56
- variant: "primary",
57
- disabled: g.memberCount === 0,
58
- title: g.memberCount === 0 ? "add at least one member before spawning" : void 0,
59
- onClick: () => setSpawningId(g.id),
60
- children: "spawn team"
61
- }), /* @__PURE__ */ jsx(Button, {
62
- variant: "danger",
63
- onClick: () => del(g.id),
64
- children: "delete"
65
- })]
66
- })
67
- ] }, g.id))] })] }),
68
- spawningId && /* @__PURE__ */ jsx(SpawnTeamModal, {
69
- profileGroup: profileGroups.find((g) => g.id === spawningId),
70
- groups,
71
- onClose: () => setSpawningId(null),
72
- onSpawned: (slug) => {
73
- setSpawningId(null);
74
- router.navigate({
75
- to: "/groups/$id",
76
- params: { id: slug }
77
- });
78
- }
79
- })
80
- ] });
81
- }
82
- function CreateProfileGroupForm({ profiles, modelGroups, userMdDefault, onCreated }) {
83
- const [id, setId] = useState("");
84
- const [name, setName] = useState("");
85
- const [userMd, setUserMd] = useState(userMdDefault);
86
- const [members, setMembers] = useState([]);
87
- const [err, setErr] = useState(null);
88
- const [submitting, setSubmitting] = useState(false);
89
- async function submit(e) {
90
- e.preventDefault();
91
- setErr(null);
92
- if (!id.trim()) {
93
- setErr("id is required");
94
- return;
95
- }
96
- setSubmitting(true);
97
- try {
98
- const createBody = { id: id.trim() };
99
- if (name.trim()) createBody.name = name.trim();
100
- if (userMd) createBody.userMd = userMd;
101
- const createRes = await fetch("/api/profile-groups", {
102
- method: "POST",
103
- headers: { "content-type": "application/json" },
104
- body: JSON.stringify(createBody)
105
- });
106
- if (!createRes.ok) {
107
- const e2 = await createRes.json().catch(() => null);
108
- throw new Error(e2?.error ?? createRes.statusText);
109
- }
110
- if (members.length > 0) {
111
- const membersRes = await fetch(`/api/profile-groups/${id.trim()}/members`, {
112
- method: "PUT",
113
- headers: { "content-type": "application/json" },
114
- body: JSON.stringify({ members })
115
- });
116
- if (!membersRes.ok) {
117
- const e2 = await membersRes.json().catch(() => null);
118
- throw new Error(`group created, member save failed: ${e2?.error ?? membersRes.statusText}`);
119
- }
120
- }
121
- setId("");
122
- setName("");
123
- setUserMd(userMdDefault);
124
- setMembers([]);
125
- onCreated();
126
- } catch (e2) {
127
- setErr(e2.message);
128
- } finally {
129
- setSubmitting(false);
130
- }
131
- }
132
- return /* @__PURE__ */ jsxs("form", {
133
- className: "card",
134
- onSubmit: submit,
135
- children: [
136
- /* @__PURE__ */ jsx("h3", { children: "create profile group" }),
137
- err && /* @__PURE__ */ jsx("div", {
138
- className: "err",
139
- children: err
140
- }),
141
- /* @__PURE__ */ jsxs("div", {
142
- className: "flex gap-4",
143
- children: [/* @__PURE__ */ jsxs("label", {
144
- className: "flex-1",
145
- children: ["id (slug)", /* @__PURE__ */ jsx("input", {
146
- value: id,
147
- onChange: (e) => setId(e.target.value),
148
- required: true,
149
- placeholder: "platform-team"
150
- })]
151
- }), /* @__PURE__ */ jsxs("label", {
152
- className: "flex-1",
153
- children: ["name", /* @__PURE__ */ jsx("input", {
154
- value: name,
155
- onChange: (e) => setName(e.target.value),
156
- placeholder: "Platform Team"
157
- })]
158
- })]
159
- }),
160
- /* @__PURE__ */ jsxs("label", { children: ["starter USER.md (seeded into freshly-created target groups; prefilled with the built-in default — edit to customise)", /* @__PURE__ */ jsx("textarea", {
161
- rows: 3,
162
- value: userMd,
163
- onChange: (e) => setUserMd(e.target.value),
164
- className: "font-mono text-[0.88em] leading-[1.55]"
165
- })] }),
166
- /* @__PURE__ */ jsxs("div", {
167
- className: "mt-4",
168
- children: [
169
- /* @__PURE__ */ jsx("h4", {
170
- className: "mb-1 text-[0.95em] font-medium",
171
- children: "members"
172
- }),
173
- /* @__PURE__ */ jsxs("p", {
174
- className: "muted mb-2 text-[0.88em]",
175
- children: [
176
- "Each member becomes one agent when the team is spawned. You can also configure members later from the detail page.",
177
- " ",
178
- profiles.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
179
- "Available profiles:",
180
- " ",
181
- profiles.map((p, i) => /* @__PURE__ */ jsxs("span", { children: [i > 0 && ", ", /* @__PURE__ */ jsx("code", { children: p.id })] }, p.id)),
182
- "."
183
- ] })
184
- ]
185
- }),
186
- /* @__PURE__ */ jsx(MembersEditor, {
187
- members,
188
- onChange: setMembers,
189
- profiles,
190
- modelGroups,
191
- emptyHint: "No members configured yet — add one to pick a profile for each team member."
192
- })
193
- ]
194
- }),
195
- /* @__PURE__ */ jsx("div", {
196
- className: "mt-4",
197
- children: /* @__PURE__ */ jsx(Button, {
198
- variant: "primary",
199
- type: "submit",
200
- disabled: submitting,
201
- children: submitting ? "creating…" : "create"
202
- })
203
- })
204
- ]
205
- });
206
- }
207
- //#endregion
208
- export { ProfileGroupsPage as component };
@@ -1,12 +0,0 @@
1
- import { t as createServerFn } from "../server.js";
2
- import { t as createSsrRpc } from "./createSsrRpc-ZBGxhl8t.js";
3
- import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
- //#region src/routes/profile-groups/index.tsx
5
- var $$splitComponentImporter = () => import("./profile-groups-D21MYoLM.js");
6
- var fetchProfileGroupsData = createServerFn({ method: "GET" }).handler(createSsrRpc("be2ab9d2d20bd46baa655e08a8f6f0c2161b01657d0362564a58edeaf2195a31"));
7
- var Route = createFileRoute("/profile-groups/")({
8
- loader: () => fetchProfileGroupsData(),
9
- component: lazyRouteComponent($$splitComponentImporter, "component")
10
- });
11
- //#endregion
12
- export { Route as t };