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