bazilion 0.8.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 (163) hide show
  1. package/README.md +47 -5
  2. package/dist/cli.js +1184 -628
  3. package/dist/cli.js.map +1 -1
  4. package/dist/daemon.js +5194 -1574
  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-DIuEc5bm.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-CawJX16E.js → login-Bk2wwIHQ.js} +1 -1
  30. package/dist/web/client/assets/{mcp-DIrh9-v_.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-Da0MURjY.js → skills-B__fLZjx.js} +1 -1
  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-E_JvO5JN.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-BdRiQb2H.js → _id-B6g9wmPR.js} +126 -27
  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-DUIrFV3G.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-BrDascdO.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/{start-CYDpZ6cb.js → start-DlHq0RaQ.js} +1 -1
  107. package/dist/web/server/assets/team-policy-Csvc5EDd.js +180 -0
  108. package/dist/web/server/assets/teams-35Oprf6e.js +14 -0
  109. package/dist/web/server/assets/teams-3im0oQnS.js +11 -0
  110. package/dist/web/server/assets/teams-B5IF65p2.js +12 -0
  111. package/dist/web/server/assets/teams-B9O-WDH5.js +108 -0
  112. package/dist/web/server/assets/teams-DFkN7ic7.js +36 -0
  113. package/dist/web/server/assets/teams-DH1CvWmT.js +12 -0
  114. package/dist/web/server/assets/teams-zcm9XaQU.js +174 -0
  115. package/dist/web/server/assets/{telegram-DfAddLdv.js → telegram-C9sQFwWj.js} +7 -7
  116. package/dist/web/server/assets/{telegram-T3l9KtiE.js → telegram-mTnJCOmn.js} +1 -1
  117. package/dist/web/server/assets/{welcome-CP4CZ9B6.js → welcome-CDGE2Sdk.js} +2 -2
  118. package/dist/web/server/assets/{wire-constants-Deb4NxBb.js → wire-constants-C8nBJcU3.js} +3 -3
  119. package/dist/web/server/server.js +64 -42
  120. package/dist/worker.js +180 -128
  121. package/dist/worker.js.map +1 -1
  122. package/package.json +7 -7
  123. package/dist/migrations/0002_profile_groups.sql +0 -38
  124. package/dist/migrations/0003_agent_telegram.sql +0 -40
  125. package/dist/migrations/0004_agent_mirror_mode.sql +0 -17
  126. package/dist/migrations/0005_group_topic_name_format.sql +0 -15
  127. package/dist/migrations/0006_telegram_acl.sql +0 -18
  128. package/dist/migrations/0007_mcp_servers.sql +0 -30
  129. package/dist/migrations/0008_seed_user_md.sql +0 -39
  130. package/dist/web/client/assets/MembersEditor-C6UpqDdV.js +0 -1
  131. package/dist/web/client/assets/SpawnTeamModal-BEkNCKXm.js +0 -1
  132. package/dist/web/client/assets/TemplatesTabs-UM04RMO9.js +0 -1
  133. package/dist/web/client/assets/_id-BNJapCT4.js +0 -1
  134. package/dist/web/client/assets/_id-CjGoV8Mr.js +0 -1
  135. package/dist/web/client/assets/_id-DehuCHUw.js +0 -1
  136. package/dist/web/client/assets/_id-Dz9fjcCM.js +0 -1
  137. package/dist/web/client/assets/agents-M6omAXcZ.js +0 -1
  138. package/dist/web/client/assets/groups-DpE2d2zZ.js +0 -1
  139. package/dist/web/client/assets/inbox-BPnLsRNf.js +0 -1
  140. package/dist/web/client/assets/index-MAJuXnie.js +0 -12
  141. package/dist/web/client/assets/memory-BpHbdKsd.js +0 -1
  142. package/dist/web/client/assets/profile-groups-ByoKak0c.js +0 -1
  143. package/dist/web/client/assets/profiles-BEjv8LGo.js +0 -1
  144. package/dist/web/client/assets/routes-D2COHy7v.js +0 -1
  145. package/dist/web/client/assets/services-D212jSK_.js +0 -1
  146. package/dist/web/client/assets/styles-BgE5bCHA.css +0 -2
  147. package/dist/web/client/assets/telegram-Czh2MdVm.js +0 -1
  148. package/dist/web/client/assets/triggers-BBRZQOm7.js +0 -1
  149. package/dist/web/client/assets/welcome-Dn-zvmBE.js +0 -1
  150. package/dist/web/client/assets/wire-constants-BkT5-597.js +0 -1
  151. package/dist/web/server/assets/MembersEditor-BWQztvrX.js +0 -131
  152. package/dist/web/server/assets/SpawnTeamModal-dSN421k_.js +0 -107
  153. package/dist/web/server/assets/_id-BKev9H1p.js +0 -12
  154. package/dist/web/server/assets/_id-BNwlbWHP.js +0 -24
  155. package/dist/web/server/assets/_id-CRqqi8IE.js +0 -161
  156. package/dist/web/server/assets/_tanstack-start-manifest_v-D9FLKShQ.js +0 -178
  157. package/dist/web/server/assets/groups-CbSwND2r.js +0 -12
  158. package/dist/web/server/assets/groups-CeRRlZaZ.js +0 -150
  159. package/dist/web/server/assets/groups-pk4CYSuf.js +0 -21
  160. package/dist/web/server/assets/memory-CQaqWnyM.js +0 -284
  161. package/dist/web/server/assets/profile-groups-CiU06yN1.js +0 -28
  162. package/dist/web/server/assets/profile-groups-D21MYoLM.js +0 -208
  163. package/dist/web/server/assets/profile-groups-aoJleXHP.js +0 -12
@@ -0,0 +1,170 @@
1
+ import { t as Route } from "./activity-DedraoFj.js";
2
+ import { t as Button } from "./Button-Dsnw22OF.js";
3
+ import { t as TeamTabs } from "./TeamTabs-BPxDBfqy.js";
4
+ import { useState } from "react";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { ChevronDown } from "lucide-react";
7
+ //#region src/routes/teams/$id/activity.tsx?tsr-split=component
8
+ function ActivityPage() {
9
+ const initial = Route.useLoaderData();
10
+ const { id } = Route.useParams();
11
+ const [page, setPage] = useState(initial);
12
+ const [loading, setLoading] = useState(false);
13
+ const [error, setError] = useState(null);
14
+ const loadMore = async () => {
15
+ if (!page.nextCursor) return;
16
+ setLoading(true);
17
+ setError(null);
18
+ try {
19
+ const response = await fetch(`/api/teams/${encodeURIComponent(id)}/policy/blocks?limit=25&cursor=${encodeURIComponent(page.nextCursor)}`);
20
+ if (!response.ok) throw new Error(`Could not load activity (${response.status})`);
21
+ const next = await response.json();
22
+ setPage({
23
+ blocks: [...page.blocks, ...next.blocks],
24
+ nextCursor: next.nextCursor
25
+ });
26
+ } catch (cause) {
27
+ setError(cause instanceof Error ? cause.message : String(cause));
28
+ } finally {
29
+ setLoading(false);
30
+ }
31
+ };
32
+ return /* @__PURE__ */ jsxs("div", {
33
+ className: "mx-auto max-w-5xl space-y-5 px-4 py-6 sm:px-6",
34
+ children: [
35
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", { children: "blocked communication" }), /* @__PURE__ */ jsx("p", {
36
+ className: "muted",
37
+ children: "Durable denial evidence. Diagnostic simulations never create these records."
38
+ })] }),
39
+ /* @__PURE__ */ jsx(TeamTabs, { teamId: id }),
40
+ /* @__PURE__ */ jsxs("div", {
41
+ className: "space-y-3",
42
+ children: [page.blocks.map((block) => /* @__PURE__ */ jsx(BlockCard, { block }, block.id)), page.blocks.length === 0 && /* @__PURE__ */ jsx("p", {
43
+ className: "card muted",
44
+ children: "No blocked communication has been recorded for this team."
45
+ })]
46
+ }),
47
+ error && /* @__PURE__ */ jsx("p", {
48
+ role: "alert",
49
+ className: "err",
50
+ children: error
51
+ }),
52
+ page.nextCursor && /* @__PURE__ */ jsx(Button, {
53
+ variant: "ghost",
54
+ disabled: loading,
55
+ onClick: loadMore,
56
+ children: loading ? "Loading…" : "Load older evidence"
57
+ })
58
+ ]
59
+ });
60
+ }
61
+ function BlockCard({ block }) {
62
+ return /* @__PURE__ */ jsxs("details", {
63
+ className: "card team",
64
+ children: [
65
+ /* @__PURE__ */ jsxs("summary", {
66
+ className: "flex cursor-pointer list-none flex-wrap items-center gap-2",
67
+ children: [
68
+ /* @__PURE__ */ jsx("strong", {
69
+ className: "mr-auto break-all",
70
+ children: block.reason_code
71
+ }),
72
+ /* @__PURE__ */ jsx("time", {
73
+ className: "text-xs text-mocha-light",
74
+ children: new Date(block.created_at).toLocaleString()
75
+ }),
76
+ /* @__PURE__ */ jsx(ChevronDown, { className: "h-4 w-4 transition-transform team-open:rotate-180" })
77
+ ]
78
+ }),
79
+ /* @__PURE__ */ jsxs("dl", {
80
+ className: "mt-4 grid gap-3 text-sm sm:grid-cols-2",
81
+ children: [
82
+ /* @__PURE__ */ jsx(Fact, {
83
+ label: "Path",
84
+ value: `${endpoint(block.source_kind, block.source_id)} → ${endpoint(block.target_kind, block.target_id)}`
85
+ }),
86
+ /* @__PURE__ */ jsx(Fact, {
87
+ label: "Channel / origin",
88
+ value: `${block.channel} · ${block.origin}`
89
+ }),
90
+ /* @__PURE__ */ jsx(Fact, {
91
+ label: "Operation",
92
+ value: block.operation
93
+ }),
94
+ /* @__PURE__ */ jsx(Fact, {
95
+ label: "Attempt identity",
96
+ value: `${block.attempt_kind}:${block.attempt_id}`,
97
+ code: true
98
+ }),
99
+ /* @__PURE__ */ jsx(Fact, {
100
+ label: "Reason",
101
+ value: block.reason,
102
+ wide: true
103
+ })
104
+ ]
105
+ }),
106
+ /* @__PURE__ */ jsx("h3", {
107
+ className: "mt-5 text-sm",
108
+ children: "Policy revisions"
109
+ }),
110
+ /* @__PURE__ */ jsx("ul", {
111
+ className: "mt-2 text-sm",
112
+ children: block.policyRefs.map((ref) => /* @__PURE__ */ jsxs("li", { children: [
113
+ /* @__PURE__ */ jsx("code", { children: ref.teamId }),
114
+ " revision ",
115
+ ref.revision
116
+ ] }, `${ref.teamId}:${ref.revision}`))
117
+ }),
118
+ block.componentOutcomes.length > 1 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("h3", {
119
+ className: "mt-5 text-sm",
120
+ children: "Cross-Team consent components"
121
+ }), /* @__PURE__ */ jsx("div", {
122
+ className: "mt-2 overflow-x-auto",
123
+ children: /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
124
+ /* @__PURE__ */ jsx("th", { children: "Team" }),
125
+ /* @__PURE__ */ jsx("th", { children: "Required edge" }),
126
+ /* @__PURE__ */ jsx("th", { children: "Matched" })
127
+ ] }) }), /* @__PURE__ */ jsx("tbody", { children: block.componentOutcomes.map((item) => /* @__PURE__ */ jsxs("tr", { children: [
128
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: item.teamId }) }),
129
+ /* @__PURE__ */ jsx("td", {
130
+ className: "break-all",
131
+ children: /* @__PURE__ */ jsx("code", { children: item.edge })
132
+ }),
133
+ /* @__PURE__ */ jsx("td", { children: item.matched ? "yes" : "no" })
134
+ ] }, `${item.teamId}:${item.edge}`)) })] })
135
+ })] }),
136
+ /* @__PURE__ */ jsxs("div", {
137
+ className: "mt-4 grid gap-3 sm:grid-cols-2",
138
+ children: [/* @__PURE__ */ jsx(Fact, {
139
+ label: "Required edges",
140
+ value: block.requiredEdgeIds.join(", ") || "none",
141
+ code: true
142
+ }), /* @__PURE__ */ jsx(Fact, {
143
+ label: "Matched edges",
144
+ value: block.matchedEdgeIds.join(", ") || "none",
145
+ code: true
146
+ })]
147
+ })
148
+ ]
149
+ });
150
+ }
151
+ function Fact({ label, value, code = false, wide = false }) {
152
+ return /* @__PURE__ */ jsxs("div", {
153
+ className: wide ? "sm:col-span-2" : "",
154
+ children: [/* @__PURE__ */ jsx("dt", {
155
+ className: "text-xs font-semibold uppercase text-mocha-light",
156
+ children: label
157
+ }), /* @__PURE__ */ jsx("dd", {
158
+ className: "mt-1 break-words",
159
+ children: code ? /* @__PURE__ */ jsx("code", {
160
+ className: "break-all",
161
+ children: value
162
+ }) : value
163
+ })]
164
+ });
165
+ }
166
+ function endpoint(kind, id) {
167
+ return id ? `${kind}:${id}` : kind;
168
+ }
169
+ //#endregion
170
+ export { ActivityPage as component };
@@ -0,0 +1,11 @@
1
+ import { t as RecoveryState } from "./RecoveryState-B2SG-mrY.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/routes/teams/$id/activity.tsx?tsr-split=errorComponent
4
+ var SplitErrorComponent = ({ error, reset }) => /* @__PURE__ */ jsx(RecoveryState, {
5
+ title: "Policy activity unavailable",
6
+ error,
7
+ reset,
8
+ fallbackHref: "/teams"
9
+ });
10
+ //#endregion
11
+ export { SplitErrorComponent as errorComponent };
@@ -0,0 +1,14 @@
1
+ import { t as createServerFn } from "../server.js";
2
+ import { t as createSsrRpc } from "./createSsrRpc-ZBGxhl8t.js";
3
+ import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
+ //#region src/routes/teams/$id/activity.tsx
5
+ var $$splitErrorComponentImporter = () => import("./activity-CGCf8BQf.js");
6
+ var $$splitComponentImporter = () => import("./activity-C2ZKg1Q9.js");
7
+ var fetchActivity = createServerFn({ method: "POST" }).validator((data) => data).handler(createSsrRpc("5cdb81f2b930818ee9ab1d626ac99828ea652ff447fcbfc21b24dea415f8b39e"));
8
+ var Route = createFileRoute("/teams/$id/activity")({
9
+ loader: ({ params }) => fetchActivity({ data: params }),
10
+ component: lazyRouteComponent($$splitComponentImporter, "component"),
11
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent")
12
+ });
13
+ //#endregion
14
+ export { Route as t };
@@ -0,0 +1,12 @@
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/activity.tsx?tss-serverfn-split
5
+ var fetchActivity_createServerFn_handler = createServerRpc({
6
+ id: "5cdb81f2b930818ee9ab1d626ac99828ea652ff447fcbfc21b24dea415f8b39e",
7
+ name: "fetchActivity",
8
+ filename: "src/routes/teams/$id/activity.tsx"
9
+ }, (opts) => fetchActivity.__executeServer(opts));
10
+ var fetchActivity = createServerFn({ method: "POST" }).validator((data) => data).handler(fetchActivity_createServerFn_handler, ({ data }) => daemonClient().get(`/api/teams/${encodeURIComponent(data.id)}/policy/blocks?limit=25`));
11
+ //#endregion
12
+ export { fetchActivity_createServerFn_handler };
@@ -1,10 +1,10 @@
1
1
  import { t as createServerFn } from "../server.js";
2
2
  import { t as createSsrRpc } from "./createSsrRpc-ZBGxhl8t.js";
3
3
  import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
- //#region src/routes/profiles/index.tsx
5
- var $$splitComponentImporter = () => import("./profiles-LxcC_L6n.js");
6
- var fetchProfiles = createServerFn({ method: "GET" }).handler(createSsrRpc("d3850ae8e275fc6af55540b50dd3cc6e84712ae5b9621a8a79b24514a1271cfb"));
7
- var Route = createFileRoute("/profiles/")({
4
+ //#region src/routes/templates/agents/index.tsx
5
+ var $$splitComponentImporter = () => import("./agents-CUQmWhTp.js");
6
+ var fetchProfiles = createServerFn({ method: "GET" }).handler(createSsrRpc("bc31355f2be9889a616d03c35062d483ea77c3f967af9432d721626a81078ef3"));
7
+ var Route = createFileRoute("/templates/agents/")({
8
8
  loader: () => fetchProfiles(),
9
9
  component: lazyRouteComponent($$splitComponentImporter, "component")
10
10
  });
@@ -9,17 +9,17 @@ var fetchAgents_createServerFn_handler = createServerRpc({
9
9
  }, (opts) => fetchAgents.__executeServer(opts));
10
10
  var fetchAgents = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(fetchAgents_createServerFn_handler, async ({ data }) => {
11
11
  const c = daemonClient();
12
- const [agents, profiles, groups, models] = await Promise.all([
12
+ const [agents, profiles, teams, models] = await Promise.all([
13
13
  c.get(`/api/agents?includeArchived=${data.all}`),
14
14
  c.get("/api/profiles"),
15
- c.get("/api/groups"),
15
+ c.get("/api/teams"),
16
16
  c.get("/api/config/available-models")
17
17
  ]);
18
18
  return {
19
19
  agents,
20
20
  profiles,
21
- groups,
22
- modelGroups: models.groups
21
+ teams,
22
+ modelGroups: models.teams
23
23
  };
24
24
  });
25
25
  //#endregion
@@ -2,7 +2,7 @@ import { t as createServerFn } from "../server.js";
2
2
  import { t as createSsrRpc } from "./createSsrRpc-ZBGxhl8t.js";
3
3
  import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
4
  //#region src/routes/agents/index.tsx
5
- var $$splitComponentImporter = () => import("./agents-C7SBPN0M.js");
5
+ var $$splitComponentImporter = () => import("./agents-DU9Hqs58.js");
6
6
  var fetchAgents = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("f715bab0037380aa3db7e237e7cf1e74168c363f48a960bb1ddfa5560de3a74e"));
7
7
  var Route = createFileRoute("/agents/")({
8
8
  validateSearch: (s) => ({ all: s.all === "1" ? "1" : void 0 }),
@@ -1,10 +1,12 @@
1
- import { t as Route } from "./profiles-CZ5NkmVw.js";
1
+ import { t as Route } from "./agents-B8kinIPW.js";
2
2
  import { t as Button } from "./Button-Dsnw22OF.js";
3
- import { t as TemplatesTabs } from "./TemplatesTabs---7h5GYa.js";
3
+ import { t as DEFAULT_PROFILE_COMMUNICATION } from "./team-policy-Csvc5EDd.js";
4
+ import { t as ProfileCommunicationEditor } from "./ProfileCommunicationEditor-C2RU-2QB.js";
5
+ import { t as TemplatesTabs } from "./TemplatesTabs-zf4YhStd.js";
4
6
  import { useState } from "react";
5
7
  import { useRouter } from "@tanstack/react-router";
6
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
- //#region src/routes/profiles/index.tsx?tsr-split=component
9
+ //#region src/routes/templates/agents/index.tsx?tsr-split=component
8
10
  function ProfilesPage() {
9
11
  const { profiles, modelGroups, skills, templates } = Route.useLoaderData();
10
12
  const router = useRouter();
@@ -20,10 +22,10 @@ function ProfilesPage() {
20
22
  }
21
23
  return /* @__PURE__ */ jsxs("div", { children: [
22
24
  /* @__PURE__ */ jsx(TemplatesTabs, {}),
23
- /* @__PURE__ */ jsx("h1", { children: "profiles" }),
25
+ /* @__PURE__ */ jsx("h1", { children: "agent templates" }),
24
26
  /* @__PURE__ */ jsx("p", {
25
27
  className: "muted",
26
- children: "A profile is a spawn template — SOUL/IDENTITY templates, a default model, a skills policy. Agents choose a group at spawn time, independent of their profile."
28
+ children: "An agent template is a spawn template — SOUL/IDENTITY templates, a default model, a skills policy. Agents choose a Team at spawn time, independent of their Agent template."
27
29
  }),
28
30
  /* @__PURE__ */ jsx(CreateProfileForm, {
29
31
  modelGroups,
@@ -41,12 +43,12 @@ function ProfilesPage() {
41
43
  ] }) }), /* @__PURE__ */ jsxs("tbody", { children: [profiles.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
42
44
  colSpan: 6,
43
45
  className: "muted",
44
- children: "no profiles yet"
46
+ children: "no agent templates yet"
45
47
  }) }), profiles.map((p) => {
46
48
  const skillsLabel = p.skillsMode === "all" ? "all" : p.defaultSkills.length === 0 ? "—" : p.defaultSkills.join(", ");
47
49
  return /* @__PURE__ */ jsxs("tr", { children: [
48
50
  /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("a", {
49
- href: `/profiles/${p.id}`,
51
+ href: `/templates/agents/${p.id}`,
50
52
  children: /* @__PURE__ */ jsx("code", { children: p.id })
51
53
  }) }),
52
54
  /* @__PURE__ */ jsx("td", { children: p.name }),
@@ -89,6 +91,7 @@ function CreateProfileForm({ modelGroups, skills, templates, onCreated }) {
89
91
  if (!on && tab === key) setTab("basics");
90
92
  }
91
93
  const [skillsMode, setSkillsMode] = useState("all");
94
+ const [communication, setCommunication] = useState(DEFAULT_PROFILE_COMMUNICATION);
92
95
  const [picked, setPicked] = useState(/* @__PURE__ */ new Set());
93
96
  const [error, setError] = useState(null);
94
97
  const [submitting, setSubmitting] = useState(false);
@@ -124,7 +127,8 @@ function CreateProfileForm({ modelGroups, skills, templates, onCreated }) {
124
127
  bootstrap: enableBootstrap ? bootstrap : null,
125
128
  agents: enableAgents ? agentsTpl : null,
126
129
  tools: enableTools ? toolsTpl : null,
127
- heartbeat: enableHeartbeat ? heartbeatTpl : null
130
+ heartbeat: enableHeartbeat ? heartbeatTpl : null,
131
+ communicationDefaults: communication
128
132
  };
129
133
  const res = await fetch("/api/profiles", {
130
134
  method: "POST",
@@ -147,6 +151,7 @@ function CreateProfileForm({ modelGroups, skills, templates, onCreated }) {
147
151
  setEnableHeartbeat(false);
148
152
  setPicked(/* @__PURE__ */ new Set());
149
153
  setSkillsMode("all");
154
+ setCommunication(DEFAULT_PROFILE_COMMUNICATION);
150
155
  setTab("basics");
151
156
  onCreated();
152
157
  } catch (err) {
@@ -159,7 +164,7 @@ function CreateProfileForm({ modelGroups, skills, templates, onCreated }) {
159
164
  className: "card",
160
165
  onSubmit: submit,
161
166
  children: [
162
- /* @__PURE__ */ jsx("h3", { children: "create profile" }),
167
+ /* @__PURE__ */ jsx("h3", { children: "create agent template" }),
163
168
  error && /* @__PURE__ */ jsx("div", {
164
169
  className: "err",
165
170
  children: error
@@ -201,6 +206,10 @@ function CreateProfileForm({ modelGroups, skills, templates, onCreated }) {
201
206
  {
202
207
  id: "skills",
203
208
  label: "skills"
209
+ },
210
+ {
211
+ id: "communication",
212
+ label: "communication"
204
213
  }
205
214
  ],
206
215
  active: tab,
@@ -270,7 +279,7 @@ function CreateProfileForm({ modelGroups, skills, templates, onCreated }) {
270
279
  }),
271
280
  /* @__PURE__ */ jsx("p", {
272
281
  className: "muted mt-2 text-[0.8em]",
273
- children: "Disabled files aren't created for this profile. Each spawned agent gets its own copy of the enabled files at spawn time."
282
+ children: "Disabled files aren't created for this Agent template. Each spawned agent gets its own copy of the enabled files at spawn time."
274
283
  })
275
284
  ]
276
285
  }),
@@ -410,6 +419,23 @@ function CreateProfileForm({ modelGroups, skills, templates, onCreated }) {
410
419
  }, s.name))
411
420
  })
412
421
  ] }),
422
+ tab === "communication" && /* @__PURE__ */ jsxs("div", { children: [
423
+ /* @__PURE__ */ jsx("div", {
424
+ className: "mb-3 flex items-center gap-2",
425
+ children: /* @__PURE__ */ jsx("h4", {
426
+ className: "text-sm font-semibold text-chocolate",
427
+ children: "Communication defaults"
428
+ })
429
+ }),
430
+ /* @__PURE__ */ jsx("p", {
431
+ className: "muted mb-4",
432
+ children: "Materialized when a Team or live policy snapshot is created. Existing snapshots never inherit later changes."
433
+ }),
434
+ /* @__PURE__ */ jsx(ProfileCommunicationEditor, {
435
+ value: communication,
436
+ onChange: setCommunication
437
+ })
438
+ ] }),
413
439
  /* @__PURE__ */ jsx("div", {
414
440
  className: "mt-5 flex gap-2",
415
441
  children: /* @__PURE__ */ jsx(Button, {
@@ -1,11 +1,11 @@
1
- import { t as Route } from "./agents-ChcAJUI5.js";
1
+ import { t as Route } from "./agents-Bp1nsVs2.js";
2
2
  import { t as AgentAvatar } from "./AgentAvatar-8gTAy_tP.js";
3
3
  import { useState } from "react";
4
4
  import { useRouter } from "@tanstack/react-router";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/routes/agents/index.tsx?tsr-split=component
7
7
  function AgentsPage() {
8
- const { agents, profiles, groups, modelGroups } = Route.useLoaderData();
8
+ const { agents, profiles, teams, modelGroups } = Route.useLoaderData();
9
9
  const { all } = Route.useSearch();
10
10
  const showAll = all === "1";
11
11
  const router = useRouter();
@@ -20,14 +20,19 @@ function AgentsPage() {
20
20
  }
21
21
  async function del(id) {
22
22
  if (!confirm("permanently delete this agent and all its data?")) return;
23
- await fetch(`/api/agents/${id}`, { method: "DELETE" });
23
+ const agent = agents.find((candidate) => candidate.id === id);
24
+ if (!agent) return;
25
+ const policyResponse = await fetch(`/api/teams/${encodeURIComponent(agent.teamId)}/policy`);
26
+ if (!policyResponse.ok) return;
27
+ const policy = await policyResponse.json();
28
+ await fetch(`/api/agents/${encodeURIComponent(id)}?expectedTeamRevision=${policy.teamPolicy.revision}`, { method: "DELETE" });
24
29
  await router.invalidate();
25
30
  }
26
31
  return /* @__PURE__ */ jsxs("div", { children: [
27
32
  /* @__PURE__ */ jsx("h1", { children: "agents" }),
28
33
  /* @__PURE__ */ jsx(SpawnForm, {
29
34
  profiles,
30
- groups,
35
+ teams,
31
36
  modelGroups,
32
37
  onSpawned: router.invalidate
33
38
  }),
@@ -89,11 +94,12 @@ function AgentsPage() {
89
94
  ] }, a.id))] })] })
90
95
  ] });
91
96
  }
92
- function SpawnForm({ profiles, groups, modelGroups, onSpawned }) {
97
+ function SpawnForm({ profiles, teams, modelGroups, onSpawned }) {
93
98
  const [profileId, setProfileId] = useState("");
94
99
  const [name, setName] = useState("");
95
100
  const [model, setModel] = useState("");
96
- const [groupId, setGroupId] = useState(groups.find((g) => g.id === "default")?.id ?? "");
101
+ const [teamId, setTeamId] = useState(teams.find((g) => g.id === "default")?.id ?? "");
102
+ const [placement, setPlacement] = useState("profile_defaults");
97
103
  const [submitting, setSubmitting] = useState(false);
98
104
  const [err, setErr] = useState(null);
99
105
  async function submit(e) {
@@ -108,7 +114,14 @@ function SpawnForm({ profiles, groups, modelGroups, onSpawned }) {
108
114
  const body = { profile: profileId };
109
115
  if (name) body.name = name;
110
116
  if (model) body.model = model;
111
- if (groupId) body.groupId = groupId;
117
+ if (teamId) {
118
+ const policyResponse = await fetch(`/api/teams/${encodeURIComponent(teamId)}/policy`);
119
+ if (!policyResponse.ok) throw new Error("The selected Team policy is unavailable.");
120
+ const current = await policyResponse.json();
121
+ body.teamId = teamId;
122
+ body.teamExpectedRevision = current.teamPolicy.revision;
123
+ body.placement = placement;
124
+ }
112
125
  const res = await fetch("/api/agents", {
113
126
  method: "POST",
114
127
  headers: { "content-type": "application/json" },
@@ -118,6 +131,7 @@ function SpawnForm({ profiles, groups, modelGroups, onSpawned }) {
118
131
  const b = await res.json().catch(() => null);
119
132
  throw new Error(b?.error ?? res.statusText);
120
133
  }
134
+ await res.json();
121
135
  setName("");
122
136
  setModel("");
123
137
  onSpawned();
@@ -182,13 +196,13 @@ function SpawnForm({ profiles, groups, modelGroups, onSpawned }) {
182
196
  }, m))
183
197
  }, g.provider))]
184
198
  })] }),
185
- /* @__PURE__ */ jsxs("label", { children: ["group", groups.length === 0 ? /* @__PURE__ */ jsx("select", {
199
+ /* @__PURE__ */ jsxs("label", { children: ["team", teams.length === 0 ? /* @__PURE__ */ jsx("select", {
186
200
  disabled: true,
187
- children: /* @__PURE__ */ jsx("option", { children: "(no groups — register one on /groups)" })
201
+ children: /* @__PURE__ */ jsx("option", { children: "(no teams — register one on /teams)" })
188
202
  }) : /* @__PURE__ */ jsx("select", {
189
- value: groupId,
190
- onChange: (e) => setGroupId(e.target.value),
191
- children: groups.map((g) => /* @__PURE__ */ jsxs("option", {
203
+ value: teamId,
204
+ onChange: (e) => setTeamId(e.target.value),
205
+ children: teams.map((g) => /* @__PURE__ */ jsxs("option", {
192
206
  value: g.id,
193
207
  children: [
194
208
  g.id,
@@ -198,6 +212,31 @@ function SpawnForm({ profiles, groups, modelGroups, onSpawned }) {
198
212
  ]
199
213
  }, g.id))
200
214
  })] }),
215
+ /* @__PURE__ */ jsxs("label", { children: [
216
+ "initial policy placement",
217
+ /* @__PURE__ */ jsxs("select", {
218
+ value: placement,
219
+ onChange: (e) => setPlacement(e.target.value),
220
+ children: [
221
+ /* @__PURE__ */ jsx("option", {
222
+ value: "profile_defaults",
223
+ children: "agent-template defaults"
224
+ }),
225
+ /* @__PURE__ */ jsx("option", {
226
+ value: "isolated",
227
+ children: "isolated"
228
+ }),
229
+ /* @__PURE__ */ jsx("option", {
230
+ value: "open",
231
+ children: "open to current members and boundaries"
232
+ })
233
+ ]
234
+ }),
235
+ /* @__PURE__ */ jsx("span", {
236
+ className: "muted mt-1 block text-xs",
237
+ children: "Submit uses the latest displayed Team revision; a concurrent policy change is shown as a conflict and never overwritten."
238
+ })
239
+ ] }),
201
240
  /* @__PURE__ */ jsx("button", {
202
241
  type: "submit",
203
242
  disabled: submitting,
@@ -1,11 +1,11 @@
1
1
  import { t as createServerFn } from "../server.js";
2
2
  import { t as createServerRpc } from "./createServerRpc-CeKECg65.js";
3
3
  import { n as daemonClient } from "./daemon-client-2NRMzlTr.js";
4
- //#region src/routes/profiles/index.tsx?tss-serverfn-split
4
+ //#region src/routes/templates/agents/index.tsx?tss-serverfn-split
5
5
  var fetchProfiles_createServerFn_handler = createServerRpc({
6
- id: "d3850ae8e275fc6af55540b50dd3cc6e84712ae5b9621a8a79b24514a1271cfb",
6
+ id: "bc31355f2be9889a616d03c35062d483ea77c3f967af9432d721626a81078ef3",
7
7
  name: "fetchProfiles",
8
- filename: "src/routes/profiles/index.tsx"
8
+ filename: "src/routes/templates/agents/index.tsx"
9
9
  }, (opts) => fetchProfiles.__executeServer(opts));
10
10
  var fetchProfiles = createServerFn({ method: "GET" }).handler(fetchProfiles_createServerFn_handler, async () => {
11
11
  const c = daemonClient();
@@ -17,7 +17,7 @@ var fetchProfiles = createServerFn({ method: "GET" }).handler(fetchProfiles_crea
17
17
  ]);
18
18
  return {
19
19
  profiles,
20
- modelGroups: models.groups,
20
+ modelGroups: models.teams,
21
21
  skills,
22
22
  templates
23
23
  };
@@ -0,0 +1,11 @@
1
+ import { t as RecoveryState } from "./RecoveryState-B2SG-mrY.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/routes/approvals/index.tsx?tsr-split=errorComponent
4
+ var SplitErrorComponent = ({ error, reset }) => /* @__PURE__ */ jsx(RecoveryState, {
5
+ title: "Approval queue unavailable",
6
+ error,
7
+ reset,
8
+ fallbackHref: "/"
9
+ });
10
+ //#endregion
11
+ export { SplitErrorComponent as errorComponent };