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
@@ -0,0 +1,377 @@
1
+ import { t as Route } from "./_id-Dj1yZ3zJ.js";
2
+ import { r as PageShell } from "./Page-LENulSXY.js";
3
+ import { t as Button } from "./Button-Dsnw22OF.js";
4
+ import { t as TeamTabs } from "./TeamTabs-zZzbP1t_.js";
5
+ import { useState } from "react";
6
+ import { useRouter } from "@tanstack/react-router";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/routes/teams/$id/index.tsx?tsr-split=component
9
+ function TeamDetailPage() {
10
+ const { team, members, profileGroups } = Route.useLoaderData();
11
+ const router = useRouter();
12
+ const [userMd, setUserMd] = useState(team.userMd);
13
+ const [busy, setBusy] = useState(false);
14
+ const [err, setErr] = useState(null);
15
+ const [savedAt, setSavedAt] = useState(null);
16
+ async function save() {
17
+ setBusy(true);
18
+ setErr(null);
19
+ try {
20
+ const res = await fetch(`/api/teams/${encodeURIComponent(team.id)}/user-md`, {
21
+ method: "PUT",
22
+ headers: { "content-type": "application/json" },
23
+ body: JSON.stringify({ userMd })
24
+ });
25
+ if (!res.ok) {
26
+ const e = await res.json().catch(() => ({}));
27
+ throw new Error(e.error ?? `${res.status} ${res.statusText}`);
28
+ }
29
+ setSavedAt(Date.now());
30
+ await router.invalidate();
31
+ } catch (e) {
32
+ setErr(e.message);
33
+ } finally {
34
+ setBusy(false);
35
+ }
36
+ }
37
+ return /* @__PURE__ */ jsxs(PageShell, { children: [
38
+ /* @__PURE__ */ jsxs("h1", {
39
+ className: "font-serif text-3xl text-foreground",
40
+ children: [
41
+ team.name,
42
+ " ",
43
+ /* @__PURE__ */ jsxs("span", {
44
+ className: "text-muted-foreground text-base",
45
+ children: [
46
+ "(",
47
+ team.id,
48
+ ")"
49
+ ]
50
+ })
51
+ ]
52
+ }),
53
+ /* @__PURE__ */ jsxs("p", {
54
+ className: "text-muted-foreground text-sm mb-6 mt-1",
55
+ children: [
56
+ /* @__PURE__ */ jsx("code", {
57
+ className: "font-mono",
58
+ children: team.path
59
+ }),
60
+ " · ",
61
+ members.length,
62
+ " ",
63
+ "member",
64
+ members.length === 1 ? "" : "s",
65
+ " ·",
66
+ " ",
67
+ /* @__PURE__ */ jsx("a", {
68
+ href: `/teams/${encodeURIComponent(team.id)}/memory`,
69
+ className: "text-primary underline",
70
+ children: "shared memory →"
71
+ })
72
+ ]
73
+ }),
74
+ /* @__PURE__ */ jsx(TeamTabs, { teamId: team.id }),
75
+ /* @__PURE__ */ jsxs("section", {
76
+ className: "rounded-lg border bg-card p-5 mb-6",
77
+ children: [
78
+ /* @__PURE__ */ jsx("h3", {
79
+ className: "font-serif text-xl mb-1",
80
+ children: "USER.md"
81
+ }),
82
+ /* @__PURE__ */ jsx("p", {
83
+ className: "text-muted-foreground text-sm mb-3",
84
+ children: "Read-only context about the human, injected into every member agent's system prompt. 12 KB cap. Agents cannot edit this file — only you can."
85
+ }),
86
+ /* @__PURE__ */ jsx("textarea", {
87
+ value: userMd,
88
+ onChange: (e) => setUserMd(e.target.value),
89
+ rows: 16,
90
+ className: "w-full rounded-md border bg-background px-3 py-2 font-mono text-sm outline-none focus:ring-2 focus:ring-ring/30",
91
+ placeholder: "What the agent should know about you in this team context…"
92
+ }),
93
+ /* @__PURE__ */ jsxs("div", {
94
+ className: "flex items-center gap-3 mt-3",
95
+ children: [
96
+ /* @__PURE__ */ jsx(Button, {
97
+ variant: "primary",
98
+ onClick: save,
99
+ disabled: busy || userMd === team.userMd,
100
+ children: busy ? "saving…" : "save"
101
+ }),
102
+ /* @__PURE__ */ jsxs("span", {
103
+ className: "text-xs text-muted-foreground",
104
+ children: [userMd.length, " / 12000 chars"]
105
+ }),
106
+ savedAt && /* @__PURE__ */ jsx("span", {
107
+ className: "text-xs text-success",
108
+ children: "✓ saved"
109
+ }),
110
+ err && /* @__PURE__ */ jsx("span", {
111
+ className: "text-xs text-danger",
112
+ children: err
113
+ })
114
+ ]
115
+ })
116
+ ]
117
+ }),
118
+ /* @__PURE__ */ jsx(TopicNameFormatCard, {
119
+ team,
120
+ sampleAgent: members[0]?.name ?? "researcher",
121
+ onSaved: () => router.invalidate()
122
+ }),
123
+ members.length === 0 && /* @__PURE__ */ jsx(SpawnFromTemplateCard, {
124
+ teamId: team.id,
125
+ profileGroups,
126
+ onSpawned: () => router.invalidate()
127
+ }),
128
+ /* @__PURE__ */ jsxs("section", {
129
+ className: "rounded-lg border bg-card p-5",
130
+ children: [/* @__PURE__ */ jsx("h3", {
131
+ className: "font-serif text-xl mb-3",
132
+ children: "members"
133
+ }), members.length === 0 ? /* @__PURE__ */ jsx("p", {
134
+ className: "text-muted-foreground text-sm",
135
+ children: "No agents in this team yet."
136
+ }) : /* @__PURE__ */ jsxs("table", {
137
+ className: "w-full text-sm",
138
+ children: [/* @__PURE__ */ jsx("thead", {
139
+ className: "text-left text-muted-foreground border-b",
140
+ children: /* @__PURE__ */ jsxs("tr", { children: [
141
+ /* @__PURE__ */ jsx("th", {
142
+ className: "py-2",
143
+ children: "name"
144
+ }),
145
+ /* @__PURE__ */ jsx("th", { children: "status" }),
146
+ /* @__PURE__ */ jsx("th", { children: "profile" }),
147
+ /* @__PURE__ */ jsx("th", {})
148
+ ] })
149
+ }), /* @__PURE__ */ jsx("tbody", { children: members.map((m) => /* @__PURE__ */ jsxs("tr", {
150
+ className: "border-b last:border-0",
151
+ children: [
152
+ /* @__PURE__ */ jsx("td", {
153
+ className: "py-2",
154
+ children: /* @__PURE__ */ jsx("a", {
155
+ href: `/agents/${m.id}`,
156
+ className: "text-primary underline",
157
+ children: m.name
158
+ })
159
+ }),
160
+ /* @__PURE__ */ jsx("td", { children: m.status }),
161
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", {
162
+ className: "font-mono text-xs",
163
+ children: m.profileId
164
+ }) }),
165
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("code", {
166
+ className: "font-mono text-xs text-muted-foreground",
167
+ children: [m.id.slice(0, 8), "…"]
168
+ }) })
169
+ ]
170
+ }, m.id)) })]
171
+ })]
172
+ })
173
+ ] });
174
+ }
175
+ function TopicNameFormatCard({ team, sampleAgent, onSaved }) {
176
+ const [format, setFormat] = useState(team.telegramTopicNameFormat ?? "");
177
+ const [busy, setBusy] = useState(false);
178
+ const [err, setErr] = useState(null);
179
+ const [savedAt, setSavedAt] = useState(null);
180
+ const trimmed = format.trim();
181
+ const preview = trimmed ? trimmed.replaceAll("{agent.name}", sampleAgent).replaceAll("{team.name}", team.name).replaceAll("{team.slug}", team.id) : team.id === "default" ? sampleAgent : `${team.id} › ${sampleAgent}`;
182
+ const dirty = (team.telegramTopicNameFormat ?? "") !== format;
183
+ async function save(clear) {
184
+ setBusy(true);
185
+ setErr(null);
186
+ try {
187
+ const res = await fetch(`/api/teams/${encodeURIComponent(team.id)}/topic-format`, {
188
+ method: "PUT",
189
+ headers: { "content-type": "application/json" },
190
+ body: JSON.stringify({ format: clear ? null : format })
191
+ });
192
+ if (!res.ok) {
193
+ const e = await res.json().catch(() => ({}));
194
+ throw new Error(e.error ?? `${res.status} ${res.statusText}`);
195
+ }
196
+ if (clear) setFormat("");
197
+ setSavedAt(Date.now());
198
+ onSaved();
199
+ } catch (e) {
200
+ setErr(e.message);
201
+ } finally {
202
+ setBusy(false);
203
+ }
204
+ }
205
+ return /* @__PURE__ */ jsxs("section", {
206
+ className: "rounded-lg border bg-card p-5 mb-6",
207
+ children: [
208
+ /* @__PURE__ */ jsx("h3", {
209
+ className: "font-serif text-xl mb-1",
210
+ children: "Telegram topic names"
211
+ }),
212
+ /* @__PURE__ */ jsxs("p", {
213
+ className: "text-muted-foreground text-sm mb-3",
214
+ children: [
215
+ "Template for this team's Telegram forum-topic titles. Leave empty for built-in naming. Tokens: ",
216
+ /* @__PURE__ */ jsx("code", {
217
+ className: "font-mono",
218
+ children: "{agent.name}"
219
+ }),
220
+ " ",
221
+ /* @__PURE__ */ jsx("code", {
222
+ className: "font-mono",
223
+ children: "{team.name}"
224
+ }),
225
+ " ",
226
+ /* @__PURE__ */ jsx("code", {
227
+ className: "font-mono",
228
+ children: "{team.slug}"
229
+ }),
230
+ " — must include",
231
+ " ",
232
+ /* @__PURE__ */ jsx("code", {
233
+ className: "font-mono",
234
+ children: "{agent.name}"
235
+ }),
236
+ ". Saving renames existing topics that you haven't manually renamed in Telegram."
237
+ ]
238
+ }),
239
+ /* @__PURE__ */ jsx("input", {
240
+ value: format,
241
+ onChange: (e) => setFormat(e.target.value),
242
+ placeholder: "{team.name} / {agent.name}",
243
+ className: "w-full rounded-md border bg-background px-3 py-2 font-mono text-sm outline-none focus:ring-2 focus:ring-ring/30"
244
+ }),
245
+ /* @__PURE__ */ jsxs("p", {
246
+ className: "text-xs text-muted-foreground mt-2",
247
+ children: ["preview: ", /* @__PURE__ */ jsx("span", {
248
+ className: "font-mono text-foreground",
249
+ children: preview
250
+ })]
251
+ }),
252
+ /* @__PURE__ */ jsxs("div", {
253
+ className: "flex items-center gap-3 mt-3",
254
+ children: [
255
+ /* @__PURE__ */ jsx(Button, {
256
+ variant: "primary",
257
+ onClick: () => save(false),
258
+ disabled: busy || !dirty || trimmed.length === 0,
259
+ children: busy ? "saving…" : "save"
260
+ }),
261
+ team.telegramTopicNameFormat && /* @__PURE__ */ jsx(Button, {
262
+ variant: "ghost",
263
+ onClick: () => save(true),
264
+ disabled: busy,
265
+ children: "clear"
266
+ }),
267
+ savedAt && /* @__PURE__ */ jsx("span", {
268
+ className: "text-xs text-success",
269
+ children: "✓ saved"
270
+ }),
271
+ err && /* @__PURE__ */ jsx("span", {
272
+ className: "text-xs text-danger",
273
+ children: err
274
+ })
275
+ ]
276
+ })
277
+ ]
278
+ });
279
+ }
280
+ function SpawnFromTemplateCard({ teamId, profileGroups, onSpawned }) {
281
+ const eligible = profileGroups.filter((g) => g.slotCount > 0 && !g.deletedAt);
282
+ const [selected, setSelected] = useState(eligible[0]?.id ?? "");
283
+ const [busy, setBusy] = useState(false);
284
+ const [err, setErr] = useState(null);
285
+ async function spawn() {
286
+ if (!selected) return;
287
+ setBusy(true);
288
+ setErr(null);
289
+ try {
290
+ const template = eligible.find((item) => item.id === selected);
291
+ if (!template) throw new Error("Team template is unavailable.");
292
+ const policyResponse = await fetch(`/api/teams/${encodeURIComponent(teamId)}/policy`);
293
+ if (!policyResponse.ok) throw new Error("The current Team policy is unavailable.");
294
+ const current = await policyResponse.json();
295
+ const res = await fetch(`/api/team-templates/${encodeURIComponent(selected)}/spawn`, {
296
+ method: "POST",
297
+ headers: { "content-type": "application/json" },
298
+ body: JSON.stringify({
299
+ templateExpectedRevision: template.currentRevision,
300
+ teamId,
301
+ teamExpectedRevision: current.teamPolicy.revision,
302
+ mode: "initialize"
303
+ })
304
+ });
305
+ if (!res.ok) {
306
+ const e = await res.json().catch(() => ({}));
307
+ throw new Error(e.error ?? `${res.status} ${res.statusText}`);
308
+ }
309
+ onSpawned();
310
+ } catch (e) {
311
+ setErr(e.message);
312
+ } finally {
313
+ setBusy(false);
314
+ }
315
+ }
316
+ return /* @__PURE__ */ jsxs("section", {
317
+ className: "rounded-lg border bg-card p-5 mb-6",
318
+ children: [
319
+ /* @__PURE__ */ jsx("h3", {
320
+ className: "font-serif text-xl mb-1",
321
+ children: "spawn a team into this team"
322
+ }),
323
+ /* @__PURE__ */ jsx("p", {
324
+ className: "text-muted-foreground text-sm mb-3",
325
+ children: "This Team is empty. Pick a canonical Team template to initialize its roster and policy at the current reviewed Team and Team revisions."
326
+ }),
327
+ eligible.length === 0 ? /* @__PURE__ */ jsxs("p", {
328
+ className: "text-muted-foreground text-sm",
329
+ children: [
330
+ "No Team templates with slots yet. Build one on",
331
+ " ",
332
+ /* @__PURE__ */ jsx("a", {
333
+ href: "/templates/teams",
334
+ className: "text-primary underline",
335
+ children: "Team templates"
336
+ }),
337
+ " ",
338
+ "first."
339
+ ]
340
+ }) : /* @__PURE__ */ jsxs("div", {
341
+ className: "flex items-center gap-3",
342
+ children: [
343
+ /* @__PURE__ */ jsx("select", {
344
+ value: selected,
345
+ onChange: (e) => setSelected(e.target.value),
346
+ className: "rounded-md border bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring/30",
347
+ children: eligible.map((g) => /* @__PURE__ */ jsxs("option", {
348
+ value: g.id,
349
+ children: [
350
+ g.name,
351
+ " (",
352
+ g.slotCount,
353
+ " slot",
354
+ g.slotCount === 1 ? "" : "s",
355
+ ", r",
356
+ g.currentRevision,
357
+ ")"
358
+ ]
359
+ }, g.id))
360
+ }),
361
+ /* @__PURE__ */ jsx(Button, {
362
+ variant: "primary",
363
+ onClick: spawn,
364
+ disabled: busy || !selected,
365
+ children: busy ? "spawning…" : "spawn team"
366
+ }),
367
+ err && /* @__PURE__ */ jsx("span", {
368
+ className: "text-xs text-danger",
369
+ children: err
370
+ })
371
+ ]
372
+ })
373
+ ]
374
+ });
375
+ }
376
+ //#endregion
377
+ export { TeamDetailPage as component };
@@ -0,0 +1,14 @@
1
+ import { t as createServerFn } from "../server.js";
2
+ import { t as createSsrRpc } from "./createSsrRpc-DFsIAfFd.js";
3
+ import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
+ //#region src/routes/templates/teams/$id/index.tsx
5
+ var $$splitErrorComponentImporter = () => import("./_id-A8Xiv6Lc.js");
6
+ var $$splitComponentImporter = () => import("./_id-LrvXU4Nr.js");
7
+ var fetchTeam = createServerFn({ method: "POST" }).validator((data) => data).handler(createSsrRpc("a0bbbee5d0c1240a05e35c04d56a0e95ec78f05265e4e937eec48c8ac2041e58"));
8
+ var Route = createFileRoute("/templates/teams/$id/")({
9
+ loader: ({ params }) => fetchTeam({ data: params }),
10
+ component: lazyRouteComponent($$splitComponentImporter, "component"),
11
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent")
12
+ });
13
+ //#endregion
14
+ export { Route as t };
@@ -1,13 +1,13 @@
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, redirect } from "@tanstack/react-router";
4
- //#region src/routes/groups/$id/index.tsx
5
- var $$splitComponentImporter = () => import("./_id-CXg-Blec.js");
6
- var fetchGroup = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("c64d52cbb25600424729185370431bf1182e1058dad2eacd250820ca1d62dae0"));
7
- var Route = createFileRoute("/groups/$id/")({
4
+ //#region src/routes/teams/$id/index.tsx
5
+ var $$splitComponentImporter = () => import("./_id-D3Ap7zZA.js");
6
+ var fetchGroup = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("4773184b3ddd3656fb80ec74375a6d304e25acb56b79f1d349dcabf9f0914359"));
7
+ var Route = createFileRoute("/teams/$id/")({
8
8
  loader: async ({ params }) => {
9
9
  const data = await fetchGroup({ data: { id: params.id } });
10
- if (!data) throw redirect({ to: "/groups" });
10
+ if (!data) throw redirect({ to: "/teams" });
11
11
  return data;
12
12
  },
13
13
  component: lazyRouteComponent($$splitComponentImporter, "component")
@@ -1,10 +1,18 @@
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, redirect } from "@tanstack/react-router";
4
4
  //#region src/routes/agents/$id/index.tsx
5
- var $$splitComponentImporter = () => import("./_id-BdRiQb2H.js");
5
+ var $$splitComponentImporter = () => import("./_id-ClN9hY2x.js");
6
6
  var fetchAgent = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("846c9081aed17057351730985f133b0aab67a5dabfca9562552829a90ff30849"));
7
7
  var Route = createFileRoute("/agents/$id/")({
8
+ validateSearch: (search) => ({
9
+ ...typeof search.teamPolicy === "string" && search.teamPolicy ? { teamPolicy: search.teamPolicy } : {},
10
+ ...search.view === "matrix" || search.view === "flow" ? { view: search.view } : {},
11
+ ...typeof search.selected === "string" ? { selected: search.selected } : {},
12
+ ...Number.isFinite(Number(search.vx)) ? { vx: Number(search.vx) } : {},
13
+ ...Number.isFinite(Number(search.vy)) ? { vy: Number(search.vy) } : {},
14
+ ...Number.isFinite(Number(search.vz)) ? { vz: Number(search.vz) } : {}
15
+ }),
8
16
  loader: async ({ params }) => {
9
17
  const data = await fetchAgent({ data: { id: params.id } });
10
18
  if (!data) throw redirect({ to: "/agents" });
@@ -1,25 +1,25 @@
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, r as ApiClientError } from "./daemon-client-2NRMzlTr.js";
4
- //#region src/routes/groups/$id/index.tsx?tss-serverfn-split
4
+ //#region src/routes/teams/$id/index.tsx?tss-serverfn-split
5
5
  var fetchGroup_createServerFn_handler = createServerRpc({
6
- id: "c64d52cbb25600424729185370431bf1182e1058dad2eacd250820ca1d62dae0",
6
+ id: "4773184b3ddd3656fb80ec74375a6d304e25acb56b79f1d349dcabf9f0914359",
7
7
  name: "fetchGroup",
8
- filename: "src/routes/groups/$id/index.tsx"
8
+ filename: "src/routes/teams/$id/index.tsx"
9
9
  }, (opts) => fetchGroup.__executeServer(opts));
10
10
  var fetchGroup = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(fetchGroup_createServerFn_handler, async ({ data }) => {
11
11
  const c = daemonClient();
12
- let group;
12
+ let team;
13
13
  try {
14
- group = await c.get(`/api/groups/${encodeURIComponent(data.id)}`);
14
+ team = await c.get(`/api/teams/${encodeURIComponent(data.id)}`);
15
15
  } catch (err) {
16
16
  if (err instanceof ApiClientError && err.status === 404) return null;
17
17
  throw err;
18
18
  }
19
- const [all, profileGroups] = await Promise.all([c.get("/api/agents?includeArchived=true"), c.get("/api/profile-groups")]);
20
- const members = all.filter((a) => a.groupId === group.id);
19
+ const [all, profileGroups] = await Promise.all([c.get("/api/agents?includeArchived=true"), c.get("/api/team-templates")]);
20
+ const members = all.filter((a) => a.teamId === team.id);
21
21
  return {
22
- group,
22
+ team,
23
23
  members,
24
24
  profileGroups
25
25
  };
@@ -0,0 +1,45 @@
1
+ import { t as Route } from "./_id-DinTp_7X.js";
2
+ import { r as PageShell } from "./Page-LENulSXY.js";
3
+ import { t as RecoveryState } from "./RecoveryState-B2SG-mrY.js";
4
+ import { t as ProductionTeamPolicyEditor } from "./ProductionTeamPolicyEditor-Y4mzFFvR.js";
5
+ import { t as TemplatesTabs } from "./TemplatesTabs-CcRxZhJe.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/routes/templates/teams/$id/index.tsx?tsr-split=component
8
+ function TeamDetailPage() {
9
+ const result = Route.useLoaderData();
10
+ if (!result.ok) return /* @__PURE__ */ jsx(RecoveryState, {
11
+ title: "Team template unavailable",
12
+ error: new Error(result.error),
13
+ reset: () => window.location.reload(),
14
+ fallbackHref: "/templates/teams"
15
+ });
16
+ const { detail, profiles } = result.value;
17
+ return /* @__PURE__ */ jsxs(PageShell, {
18
+ size: "wide",
19
+ children: [
20
+ /* @__PURE__ */ jsx(TemplatesTabs, {}),
21
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("a", {
22
+ href: "/templates/teams",
23
+ children: "← team templates"
24
+ }) }),
25
+ detail.template.deletedAt && /* @__PURE__ */ jsx("div", {
26
+ role: "alert",
27
+ className: "err rounded-md border p-3",
28
+ children: "Source deleted — lineage is read-only and cannot be edited or spawned."
29
+ }),
30
+ /* @__PURE__ */ jsx(ProductionTeamPolicyEditor, {
31
+ source: {
32
+ kind: "template",
33
+ detail
34
+ },
35
+ profiles
36
+ }),
37
+ /* @__PURE__ */ jsx("p", {
38
+ className: "muted text-xs",
39
+ children: "Stable slot IDs remain distinct from live Agent IDs. Every successful save creates a new immutable revision; the reconciled editor badge is authoritative."
40
+ })
41
+ ]
42
+ });
43
+ }
44
+ //#endregion
45
+ export { TeamDetailPage as component };
@@ -0,0 +1,42 @@
1
+ import { t as createServerFn } from "../server.js";
2
+ import { t as createServerRpc } from "./createServerRpc-pU-IQV2Y.js";
3
+ import { n as daemonClient } from "./daemon-client-2NRMzlTr.js";
4
+ //#region src/routes/templates/teams/$id/index.tsx?tss-serverfn-split
5
+ var fetchTeam_createServerFn_handler = createServerRpc({
6
+ id: "a0bbbee5d0c1240a05e35c04d56a0e95ec78f05265e4e937eec48c8ac2041e58",
7
+ name: "fetchTeam",
8
+ filename: "src/routes/templates/teams/$id/index.tsx"
9
+ }, (opts) => fetchTeam.__executeServer(opts));
10
+ var fetchTeam = createServerFn({ method: "POST" }).validator((data) => data).handler(fetchTeam_createServerFn_handler, async ({ data }) => {
11
+ try {
12
+ const client = daemonClient();
13
+ const [detail, profiles] = await Promise.all([client.get(`/api/team-templates/${encodeURIComponent(data.id)}`), client.get("/api/profiles")]);
14
+ return {
15
+ ok: true,
16
+ value: {
17
+ detail: {
18
+ ...detail,
19
+ slots: detail.slots.map((slot) => ({
20
+ ...slot,
21
+ display: null
22
+ })),
23
+ currentSnapshot: {
24
+ ...detail.currentSnapshot,
25
+ slots: detail.currentSnapshot.slots.map((slot) => ({
26
+ ...slot,
27
+ display: null
28
+ }))
29
+ }
30
+ },
31
+ profiles
32
+ }
33
+ };
34
+ } catch (error) {
35
+ return {
36
+ ok: false,
37
+ error: error instanceof Error ? error.message : String(error)
38
+ };
39
+ }
40
+ });
41
+ //#endregion
42
+ export { fetchTeam_createServerFn_handler };