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,490 @@
1
+ import { t as Route } from "./policy-C30AeFIb.js";
2
+ import { r as PageShell } from "./Page-LENulSXY.js";
3
+ import { t as Button } from "./Button-Dsnw22OF.js";
4
+ import { t as RecoveryState } from "./RecoveryState-B2SG-mrY.js";
5
+ import { t as TeamTabs } from "./TeamTabs-zZzbP1t_.js";
6
+ import { t as ProductionTeamPolicyEditor } from "./ProductionTeamPolicyEditor-Y4mzFFvR.js";
7
+ import { useEffect, useMemo, useState } from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { GitCompareArrows, RefreshCw, Save } from "lucide-react";
10
+ //#region src/components/team-policy/TeamPolicyOperations.tsx
11
+ function TeamPolicyOperations({ teamId, detail, templates }) {
12
+ const [diff, setDiff] = useState(null);
13
+ const [error, setError] = useState(null);
14
+ const [busy, setBusy] = useState(false);
15
+ const [templateId, setTemplateId] = useState(`${teamId}-snapshot`);
16
+ const [templateName, setTemplateName] = useState(`${teamId} snapshot`);
17
+ const boundAgents = useMemo(() => new Set(detail.bindings.map((item) => item.agentId)), [detail.bindings]);
18
+ const liveOnly = detail.members.filter((agent) => !boundAgents.has(agent.id));
19
+ const reloadDiff = async () => {
20
+ const response = await fetch(`/api/teams/${encodeURIComponent(teamId)}/policy/diff`);
21
+ if (!response.ok) throw new Error((await response.json().catch(() => null))?.error ?? "Could not load source comparison");
22
+ setDiff(await response.json());
23
+ };
24
+ useEffect(() => {
25
+ reloadDiff().catch((cause) => setError(cause instanceof Error ? cause.message : String(cause)));
26
+ }, [teamId]);
27
+ const updateSource = async () => {
28
+ if (!diff?.currentSource || diff.sourceDiverged) return;
29
+ setBusy(true);
30
+ setError(null);
31
+ try {
32
+ const response = await fetch(`/api/teams/${encodeURIComponent(teamId)}/policy/update-source`, {
33
+ method: "POST",
34
+ headers: { "content-type": "application/json" },
35
+ body: JSON.stringify({
36
+ teamExpectedRevision: detail.teamPolicy.revision,
37
+ templateExpectedRevision: diff.currentSource.template.currentRevision,
38
+ includeAgentIds: liveOnly.map((agent) => agent.id)
39
+ })
40
+ });
41
+ if (!response.ok) throw new Error((await response.json().catch(() => null))?.error ?? `Update failed (${response.status})`);
42
+ window.location.reload();
43
+ } catch (cause) {
44
+ setError(cause instanceof Error ? cause.message : String(cause));
45
+ } finally {
46
+ setBusy(false);
47
+ }
48
+ };
49
+ const saveAsTemplate = async () => {
50
+ setBusy(true);
51
+ setError(null);
52
+ try {
53
+ const response = await fetch(`/api/teams/${encodeURIComponent(teamId)}/policy/save-as-template`, {
54
+ method: "POST",
55
+ headers: { "content-type": "application/json" },
56
+ body: JSON.stringify({
57
+ expectedRevision: detail.teamPolicy.revision,
58
+ id: templateId,
59
+ name: templateName
60
+ })
61
+ });
62
+ if (!response.ok) throw new Error((await response.json().catch(() => null))?.error ?? `Save failed (${response.status})`);
63
+ const saved = await response.json();
64
+ window.location.assign(`/templates/teams/${encodeURIComponent(saved.template.id)}`);
65
+ } catch (cause) {
66
+ setError(cause instanceof Error ? cause.message : String(cause));
67
+ } finally {
68
+ setBusy(false);
69
+ }
70
+ };
71
+ return /* @__PURE__ */ jsxs("section", {
72
+ className: "card space-y-4",
73
+ "aria-labelledby": "source-workflows",
74
+ children: [
75
+ /* @__PURE__ */ jsxs("div", {
76
+ className: "flex flex-wrap items-start gap-3",
77
+ children: [
78
+ /* @__PURE__ */ jsx(GitCompareArrows, { className: "mt-1 h-5 w-5 text-sapphire" }),
79
+ /* @__PURE__ */ jsxs("div", {
80
+ className: "mr-auto",
81
+ children: [/* @__PURE__ */ jsx("h2", {
82
+ id: "source-workflows",
83
+ className: "m-0 text-lg",
84
+ children: "Baseline and source"
85
+ }), /* @__PURE__ */ jsx("p", {
86
+ className: "muted mt-1 text-sm",
87
+ children: "Lineage is retained for comparison; source edits never auto-propagate."
88
+ })]
89
+ }),
90
+ /* @__PURE__ */ jsxs(Button, {
91
+ variant: "ghost",
92
+ onClick: () => void reloadDiff(),
93
+ children: [/* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4" }), "Refresh comparison"]
94
+ })
95
+ ]
96
+ }),
97
+ !diff ? /* @__PURE__ */ jsx("p", {
98
+ className: "muted",
99
+ children: "Loading comparison…"
100
+ }) : /* @__PURE__ */ jsxs("div", {
101
+ className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4",
102
+ children: [
103
+ /* @__PURE__ */ jsx(Metric, {
104
+ label: "Baseline",
105
+ value: diff.baseline ? `${diff.baseline.templateId} r${diff.baseline.templateRevision}` : "None"
106
+ }),
107
+ /* @__PURE__ */ jsx(Metric, {
108
+ label: "Live changes",
109
+ value: `+${diff.comparison.addedSinceBaseline.length} / −${diff.comparison.removedSinceBaseline.length} edges`
110
+ }),
111
+ /* @__PURE__ */ jsx(Metric, {
112
+ label: "Source slots",
113
+ value: `+${diff.comparison.currentSourceAddedSlotIds.length} / −${diff.comparison.currentSourceRemovedSlotIds.length}`
114
+ }),
115
+ /* @__PURE__ */ jsx(Metric, {
116
+ label: "Source state",
117
+ value: !diff.currentSource ? "Missing/tombstoned" : diff.sourceDiverged ? "Diverged — rebaseline required" : "Aligned",
118
+ warning: diff.sourceDiverged || !diff.currentSource
119
+ })
120
+ ]
121
+ }),
122
+ diff?.sourceDiverged && /* @__PURE__ */ jsx("div", {
123
+ role: "alert",
124
+ className: "rounded-md border border-warning/25 bg-warning/10 p-3 text-sm text-warning",
125
+ children: "The source has changed since this Team retained its baseline. Both versions remain intact. Update-source is disabled; compare and explicitly rebaseline instead."
126
+ }),
127
+ diff?.currentSource && !diff.sourceDiverged && /* @__PURE__ */ jsxs("div", {
128
+ className: "flex flex-wrap items-center gap-3",
129
+ children: [/* @__PURE__ */ jsxs("p", {
130
+ className: "mr-auto text-sm",
131
+ children: [
132
+ "Promote the current live policy to ",
133
+ /* @__PURE__ */ jsx("strong", { children: diff.currentSource.template.name }),
134
+ ", including ",
135
+ liveOnly.length,
136
+ " live-only Agent",
137
+ liveOnly.length === 1 ? "" : "s",
138
+ "."
139
+ ]
140
+ }), /* @__PURE__ */ jsx(Button, {
141
+ variant: "ghost",
142
+ disabled: busy,
143
+ onClick: updateSource,
144
+ children: "Update source after review"
145
+ })]
146
+ }),
147
+ /* @__PURE__ */ jsxs("div", {
148
+ className: "grid gap-3 border-t border-frost pt-4 sm:grid-cols-[1fr_1fr_auto]",
149
+ children: [
150
+ /* @__PURE__ */ jsxs("label", {
151
+ className: "text-xs",
152
+ children: ["New template ID", /* @__PURE__ */ jsx("input", {
153
+ value: templateId,
154
+ onChange: (e) => setTemplateId(e.target.value)
155
+ })]
156
+ }),
157
+ /* @__PURE__ */ jsxs("label", {
158
+ className: "text-xs",
159
+ children: ["New template name", /* @__PURE__ */ jsx("input", {
160
+ value: templateName,
161
+ onChange: (e) => setTemplateName(e.target.value)
162
+ })]
163
+ }),
164
+ /* @__PURE__ */ jsxs(Button, {
165
+ variant: "primary",
166
+ disabled: busy || !templateId.trim() || !templateName.trim(),
167
+ onClick: saveAsTemplate,
168
+ children: [/* @__PURE__ */ jsx(Save, { className: "h-4 w-4" }), "Save independent Team template"]
169
+ })
170
+ ]
171
+ }),
172
+ error && /* @__PURE__ */ jsx("p", {
173
+ role: "alert",
174
+ className: "err",
175
+ children: error
176
+ }),
177
+ /* @__PURE__ */ jsx(AdoptionWorkflow, {
178
+ teamId,
179
+ detail,
180
+ templates
181
+ })
182
+ ]
183
+ });
184
+ }
185
+ function Metric({ label, value, warning = false }) {
186
+ return /* @__PURE__ */ jsxs("div", {
187
+ className: `rounded-md border p-3 ${warning ? "border-warning/25 bg-warning/10 dark:bg-amber-950/30" : "border-frost bg-ivory"}`,
188
+ children: [/* @__PURE__ */ jsx("dt", {
189
+ className: "text-xs font-semibold uppercase text-mocha-light",
190
+ children: label
191
+ }), /* @__PURE__ */ jsx("dd", {
192
+ className: "mt-1 break-words text-sm font-semibold",
193
+ children: value
194
+ })]
195
+ });
196
+ }
197
+ function AdoptionWorkflow({ teamId, detail, templates }) {
198
+ const [templateId, setTemplateId] = useState(templates.find((item) => !item.deletedAt)?.id ?? "");
199
+ const [template, setTemplate] = useState(null);
200
+ const [mapping, setMapping] = useState({});
201
+ const [placements, setPlacements] = useState({});
202
+ const [preview, setPreview] = useState(null);
203
+ const [error, setError] = useState(null);
204
+ const loadTemplate = async () => {
205
+ setError(null);
206
+ setPreview(null);
207
+ const response = await fetch(`/api/team-templates/${encodeURIComponent(templateId)}`);
208
+ if (!response.ok) {
209
+ setError(`Could not load Team (${response.status})`);
210
+ return;
211
+ }
212
+ const loaded = await response.json();
213
+ setTemplate(loaded);
214
+ const next = {};
215
+ loaded.slots.forEach((slot, index) => {
216
+ const agent = detail.members[index];
217
+ if (agent) next[slot.slotId] = agent.id;
218
+ });
219
+ setMapping(next);
220
+ const mapped = new Set(Object.values(next));
221
+ setPlacements(Object.fromEntries(detail.members.filter((agent) => !mapped.has(agent.id)).map((agent) => [agent.id, "isolated"])));
222
+ };
223
+ const request = () => ({
224
+ teamExpectedRevision: detail.teamPolicy.revision,
225
+ templateId: template?.template.id,
226
+ templateExpectedRevision: template?.template.currentRevision,
227
+ slotMappings: template?.slots.map((slot) => ({
228
+ slotId: slot.slotId,
229
+ agentId: mapping[slot.slotId]
230
+ })) ?? [],
231
+ remainingPlacements: detail.members.filter((agent) => !Object.values(mapping).includes(agent.id)).map((agent) => ({
232
+ agentId: agent.id,
233
+ placement: placements[agent.id] ?? "isolated"
234
+ }))
235
+ });
236
+ const review = async () => {
237
+ if (!template || template.slots.some((slot) => !mapping[slot.slotId]) || new Set(Object.values(mapping)).size !== template.slots.length) {
238
+ setError("Map every stable slot to a distinct current Agent.");
239
+ return;
240
+ }
241
+ const response = await fetch(`/api/teams/${encodeURIComponent(teamId)}/policy/adopt-template/preview`, {
242
+ method: "POST",
243
+ headers: { "content-type": "application/json" },
244
+ body: JSON.stringify(request())
245
+ });
246
+ const body = await response.json().catch(() => null);
247
+ if (!response.ok) {
248
+ setError(body?.error ?? `Preview failed (${response.status})`);
249
+ return;
250
+ }
251
+ setPreview(body.edges);
252
+ };
253
+ const adopt = async () => {
254
+ if (!preview) return;
255
+ const response = await fetch(`/api/teams/${encodeURIComponent(teamId)}/policy/adopt-template`, {
256
+ method: "POST",
257
+ headers: { "content-type": "application/json" },
258
+ body: JSON.stringify({
259
+ ...request(),
260
+ previewEdges: preview
261
+ })
262
+ });
263
+ const body = await response.json().catch(() => null);
264
+ if (!response.ok) {
265
+ setError(body?.error ?? `Rebaseline failed (${response.status})`);
266
+ return;
267
+ }
268
+ window.location.reload();
269
+ };
270
+ return /* @__PURE__ */ jsxs("div", {
271
+ className: "space-y-4 border-t border-frost pt-5",
272
+ children: [
273
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
274
+ className: "m-0 text-base",
275
+ children: "Adopt or rebaseline from Team Template"
276
+ }), /* @__PURE__ */ jsx("p", {
277
+ className: "muted mt-1 text-sm",
278
+ children: "Map every stable source slot to one current Agent, choose placement for remaining Agents, then review the daemon-resolved edge set."
279
+ })] }),
280
+ /* @__PURE__ */ jsxs("div", {
281
+ className: "flex flex-wrap items-end gap-3",
282
+ children: [/* @__PURE__ */ jsxs("label", {
283
+ className: "min-w-52 flex-1 text-xs",
284
+ children: ["Team Template", /* @__PURE__ */ jsx("select", {
285
+ value: templateId,
286
+ onChange: (e) => {
287
+ setTemplateId(e.target.value);
288
+ setTemplate(null);
289
+ setPreview(null);
290
+ },
291
+ children: templates.filter((item) => !item.deletedAt).map((item) => /* @__PURE__ */ jsxs("option", {
292
+ value: item.id,
293
+ children: [
294
+ item.name,
295
+ " · r",
296
+ item.currentRevision
297
+ ]
298
+ }, item.id))
299
+ })]
300
+ }), /* @__PURE__ */ jsx(Button, {
301
+ variant: "ghost",
302
+ onClick: loadTemplate,
303
+ children: "Configure mapping"
304
+ })]
305
+ }),
306
+ template && /* @__PURE__ */ jsxs("div", {
307
+ className: "grid gap-3 md:grid-cols-2",
308
+ children: [/* @__PURE__ */ jsxs("div", {
309
+ className: "space-y-2",
310
+ children: [/* @__PURE__ */ jsx("p", {
311
+ className: "text-xs font-semibold uppercase text-mocha-light",
312
+ children: "Stable slots"
313
+ }), template.slots.map((slot) => /* @__PURE__ */ jsxs("label", {
314
+ className: "block text-xs",
315
+ children: [/* @__PURE__ */ jsxs("span", {
316
+ className: "block truncate",
317
+ title: slot.slotId,
318
+ children: [
319
+ slot.agentName,
320
+ " · slot ",
321
+ /* @__PURE__ */ jsx("code", { children: slot.slotId.slice(0, 8) })
322
+ ]
323
+ }), /* @__PURE__ */ jsxs("select", {
324
+ value: mapping[slot.slotId] ?? "",
325
+ onChange: (e) => {
326
+ setMapping((current) => ({
327
+ ...current,
328
+ [slot.slotId]: e.target.value
329
+ }));
330
+ setPreview(null);
331
+ },
332
+ children: [/* @__PURE__ */ jsx("option", {
333
+ value: "",
334
+ children: "Select Agent…"
335
+ }), detail.members.map((agent) => /* @__PURE__ */ jsxs("option", {
336
+ value: agent.id,
337
+ disabled: Object.entries(mapping).some(([key, value]) => key !== slot.slotId && value === agent.id),
338
+ children: [agent.name, agent.status === "archived" ? " (archived)" : ""]
339
+ }, agent.id))]
340
+ })]
341
+ }, slot.slotId))]
342
+ }), /* @__PURE__ */ jsxs("div", {
343
+ className: "space-y-2",
344
+ children: [/* @__PURE__ */ jsx("p", {
345
+ className: "text-xs font-semibold uppercase text-mocha-light",
346
+ children: "Remaining live Agents"
347
+ }), detail.members.filter((agent) => !Object.values(mapping).includes(agent.id)).map((agent) => /* @__PURE__ */ jsxs("label", {
348
+ className: "block text-xs",
349
+ children: [agent.name, /* @__PURE__ */ jsxs("select", {
350
+ value: placements[agent.id] ?? "isolated",
351
+ onChange: (e) => {
352
+ setPlacements((current) => ({
353
+ ...current,
354
+ [agent.id]: e.target.value
355
+ }));
356
+ setPreview(null);
357
+ },
358
+ children: [/* @__PURE__ */ jsx("option", {
359
+ value: "isolated",
360
+ children: "Isolated"
361
+ }), /* @__PURE__ */ jsx("option", {
362
+ value: "profile_defaults",
363
+ children: "Agent-template defaults"
364
+ })]
365
+ })]
366
+ }, agent.id))]
367
+ })]
368
+ }),
369
+ template && /* @__PURE__ */ jsx(Button, {
370
+ variant: "ghost",
371
+ onClick: review,
372
+ children: "Review exact resulting policy"
373
+ }),
374
+ preview && /* @__PURE__ */ jsxs("div", {
375
+ className: "rounded-md border border-sapphire-light bg-sapphire-glow p-3 text-sm",
376
+ children: [
377
+ /* @__PURE__ */ jsxs("p", { children: [
378
+ "The daemon resolved ",
379
+ /* @__PURE__ */ jsx("strong", { children: preview.length }),
380
+ " directed allow edges. This preview is submitted unchanged and recomputed transactionally at commit."
381
+ ] }),
382
+ /* @__PURE__ */ jsx("div", {
383
+ className: "mt-2 max-h-40 overflow-auto",
384
+ children: /* @__PURE__ */ jsx("ul", { children: preview.map((edge, index) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("code", { children: [
385
+ edge.sourceKind,
386
+ edge.sourceId ? `:${edge.sourceId}` : "",
387
+ " → ",
388
+ edge.targetKind,
389
+ edge.targetId ? `:${edge.targetId}` : ""
390
+ ] }) }, `${edge.sourceKind}:${edge.sourceId ?? ""}>${edge.targetKind}:${edge.targetId ?? ""}:${index}`)) })
391
+ }),
392
+ /* @__PURE__ */ jsx(Button, {
393
+ variant: "primary",
394
+ className: "mt-3",
395
+ onClick: adopt,
396
+ children: "Commit reviewed rebaseline"
397
+ })
398
+ ]
399
+ }),
400
+ error && /* @__PURE__ */ jsx("p", {
401
+ role: "alert",
402
+ className: "err",
403
+ children: error
404
+ })
405
+ ]
406
+ });
407
+ }
408
+ //#endregion
409
+ //#region src/routes/teams/$id/policy.tsx?tsr-split=component
410
+ function TeamPolicyPage() {
411
+ const result = Route.useLoaderData();
412
+ if (!result.ok) return /* @__PURE__ */ jsx(RecoveryState, {
413
+ title: "Team policy unavailable",
414
+ error: new Error(result.error),
415
+ reset: () => window.location.reload(),
416
+ fallbackHref: "/teams"
417
+ });
418
+ const { detail, profiles, templates } = result.value;
419
+ const { id } = Route.useParams();
420
+ const search = Route.useSearch();
421
+ const baseline = detail.baseline;
422
+ return /* @__PURE__ */ jsxs(PageShell, {
423
+ size: "wide",
424
+ children: [
425
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", { children: "Team policy" }), /* @__PURE__ */ jsxs("p", {
426
+ className: "muted",
427
+ children: [
428
+ "The sole effective live communication policy for ",
429
+ /* @__PURE__ */ jsx("code", { children: id }),
430
+ "."
431
+ ]
432
+ })] }),
433
+ /* @__PURE__ */ jsx(TeamTabs, { teamId: id }),
434
+ /* @__PURE__ */ jsxs("section", {
435
+ className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4",
436
+ "aria-label": "Policy status",
437
+ children: [
438
+ /* @__PURE__ */ jsx(Status, {
439
+ label: "Revision",
440
+ value: detail.teamPolicy.revision
441
+ }),
442
+ /* @__PURE__ */ jsx(Status, {
443
+ label: "Allow edges",
444
+ value: detail.edges.length
445
+ }),
446
+ /* @__PURE__ */ jsx(Status, {
447
+ label: "Baseline",
448
+ value: baseline ? `${baseline.templateId} r${baseline.templateRevision}` : "Not initialized"
449
+ })
450
+ ]
451
+ }),
452
+ /* @__PURE__ */ jsx(ProductionTeamPolicyEditor, {
453
+ source: {
454
+ kind: "live",
455
+ teamId: id,
456
+ detail
457
+ },
458
+ profiles,
459
+ initialUi: {
460
+ view: search.view,
461
+ selectedId: search.selected,
462
+ viewport: {
463
+ x: search.vx,
464
+ y: search.vy,
465
+ zoom: search.vz
466
+ }
467
+ }
468
+ }),
469
+ /* @__PURE__ */ jsx(TeamPolicyOperations, {
470
+ teamId: id,
471
+ detail,
472
+ templates
473
+ })
474
+ ]
475
+ });
476
+ }
477
+ function Status({ label, value }) {
478
+ return /* @__PURE__ */ jsxs("div", {
479
+ className: "card",
480
+ children: [/* @__PURE__ */ jsx("dt", {
481
+ className: "muted text-xs",
482
+ children: label
483
+ }), /* @__PURE__ */ jsx("dd", {
484
+ className: "break-words font-semibold",
485
+ children: value
486
+ })]
487
+ });
488
+ }
489
+ //#endregion
490
+ export { TeamPolicyPage as component };
@@ -0,0 +1,21 @@
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/teams/$id/policy.tsx
5
+ var $$splitErrorComponentImporter = () => import("./policy-BYVXqsan.js");
6
+ var $$splitComponentImporter = () => import("./policy-BcGELcc9.js");
7
+ var fetchPolicy = createServerFn({ method: "POST" }).validator((data) => data).handler(createSsrRpc("fc940d6dec5305aa64bdb9b9f5f7d4f925b2ba0608cb6d39af854a94872fc867"));
8
+ var Route = createFileRoute("/teams/$id/policy")({
9
+ validateSearch: (search) => ({
10
+ view: search.view === "matrix" ? "matrix" : "flow",
11
+ selected: typeof search.selected === "string" ? search.selected : null,
12
+ vx: Number.isFinite(Number(search.vx)) ? Number(search.vx) : 0,
13
+ vy: Number.isFinite(Number(search.vy)) ? Number(search.vy) : 0,
14
+ vz: Number.isFinite(Number(search.vz)) ? Number(search.vz) : .9
15
+ }),
16
+ loader: ({ params }) => fetchPolicy({ data: params }),
17
+ component: lazyRouteComponent($$splitComponentImporter, "component"),
18
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent")
19
+ });
20
+ //#endregion
21
+ export { Route as t };