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,242 @@
1
+ import { t as Route } from "./approvals-Dw2LJoSA.js";
2
+ import { t as Button } from "./Button-Dsnw22OF.js";
3
+ import { useState } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/routes/approvals/index.tsx?tsr-split=component
6
+ function ApprovalQueue() {
7
+ const [approvals, setApprovals] = useState(Route.useLoaderData().approvals);
8
+ const [status, setStatus] = useState("pending");
9
+ const [selected, setSelected] = useState(null);
10
+ const [busy, setBusy] = useState(false);
11
+ const [notice, setNotice] = useState(null);
12
+ const visible = approvals.filter((item) => status === "all" || item.status === status);
13
+ const refresh = async () => {
14
+ const response = await fetch("/api/approvals?limit=100");
15
+ if (!response.ok) throw new Error(`Could not refresh approvals (${response.status})`);
16
+ setApprovals((await response.json()).approvals);
17
+ };
18
+ const inspect = async (id) => {
19
+ const response = await fetch(`/api/approvals/${encodeURIComponent(id)}`);
20
+ if (!response.ok) throw new Error(`Could not load approval (${response.status})`);
21
+ setSelected(await response.json());
22
+ };
23
+ const decide = async (action) => {
24
+ if (!selected) return;
25
+ setBusy(true);
26
+ setNotice(null);
27
+ try {
28
+ const response = await fetch(`/api/approvals/${encodeURIComponent(selected.id)}/${action}`, {
29
+ method: "POST",
30
+ headers: { "content-type": "application/json" },
31
+ body: JSON.stringify({ reason: action === "deny" ? "Denied by operator" : void 0 })
32
+ });
33
+ const body = await response.json();
34
+ if (!response.ok) throw new Error(body.error ?? `Decision failed (${response.status})`);
35
+ await refresh();
36
+ await inspect(selected.id);
37
+ setNotice(action === "approve" ? "Approved and delivered once." : "Denied.");
38
+ } catch (error) {
39
+ setNotice(error instanceof Error ? error.message : String(error));
40
+ await refresh();
41
+ await inspect(selected.id);
42
+ } finally {
43
+ setBusy(false);
44
+ }
45
+ };
46
+ return /* @__PURE__ */ jsxs("div", {
47
+ className: "mx-auto max-w-6xl space-y-5 px-4 py-6 sm:px-6",
48
+ children: [
49
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", { children: "communication approvals" }), /* @__PURE__ */ jsx("p", {
50
+ className: "muted",
51
+ children: "One durable queue for policy-protected attempts. Approval authorizes only the captured attempt."
52
+ })] }),
53
+ /* @__PURE__ */ jsxs("label", {
54
+ className: "block max-w-xs text-sm",
55
+ children: ["Status", /* @__PURE__ */ jsxs("select", {
56
+ value: status,
57
+ onChange: (event) => setStatus(event.target.value),
58
+ children: [
59
+ /* @__PURE__ */ jsx("option", {
60
+ value: "pending",
61
+ children: "Pending"
62
+ }),
63
+ /* @__PURE__ */ jsx("option", {
64
+ value: "all",
65
+ children: "All history"
66
+ }),
67
+ /* @__PURE__ */ jsx("option", {
68
+ value: "delivered",
69
+ children: "Delivered"
70
+ }),
71
+ /* @__PURE__ */ jsx("option", {
72
+ value: "denied",
73
+ children: "Denied"
74
+ }),
75
+ /* @__PURE__ */ jsx("option", {
76
+ value: "expired",
77
+ children: "Expired"
78
+ }),
79
+ /* @__PURE__ */ jsx("option", {
80
+ value: "cancelled",
81
+ children: "Cancelled"
82
+ }),
83
+ /* @__PURE__ */ jsx("option", {
84
+ value: "delivery_failed",
85
+ children: "Delivery failed"
86
+ })
87
+ ]
88
+ })]
89
+ }),
90
+ /* @__PURE__ */ jsxs("div", {
91
+ className: "grid gap-5 lg:grid-cols-[minmax(0,1fr)_minmax(320px,0.8fr)]",
92
+ children: [/* @__PURE__ */ jsxs("div", {
93
+ className: "overflow-x-auto rounded-lg border border-frost",
94
+ children: [/* @__PURE__ */ jsxs("table", {
95
+ className: "w-full",
96
+ children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
97
+ /* @__PURE__ */ jsx("th", { children: "Status" }),
98
+ /* @__PURE__ */ jsx("th", { children: "Path" }),
99
+ /* @__PURE__ */ jsx("th", { children: "Origin" }),
100
+ /* @__PURE__ */ jsx("th", { children: "Expires" })
101
+ ] }) }), /* @__PURE__ */ jsx("tbody", { children: visible.map((item) => /* @__PURE__ */ jsxs("tr", {
102
+ tabIndex: 0,
103
+ role: "button",
104
+ "aria-label": `Inspect ${item.attemptKind} approval`,
105
+ onClick: () => void inspect(item.id),
106
+ onKeyDown: (event) => {
107
+ if (event.key === "Enter" || event.key === " ") inspect(item.id);
108
+ },
109
+ className: "cursor-pointer",
110
+ children: [
111
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Status, { value: item.status }) }),
112
+ /* @__PURE__ */ jsxs("td", { children: [
113
+ endpoint(item.source),
114
+ " → ",
115
+ endpoint(item.target)
116
+ ] }),
117
+ /* @__PURE__ */ jsx("td", { children: item.origin }),
118
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("time", {
119
+ dateTime: new Date(item.expiresAt).toISOString(),
120
+ children: formatTimestamp(item.expiresAt)
121
+ }) })
122
+ ]
123
+ }, item.id)) })]
124
+ }), !visible.length && /* @__PURE__ */ jsx("p", {
125
+ className: "muted p-4",
126
+ children: "No approvals match this filter."
127
+ })]
128
+ }), /* @__PURE__ */ jsx("aside", {
129
+ className: "card min-w-0",
130
+ "aria-label": "Approval detail",
131
+ children: !selected ? /* @__PURE__ */ jsx("p", {
132
+ className: "muted",
133
+ children: "Select an attempt to inspect its policy and audit history."
134
+ }) : /* @__PURE__ */ jsxs("div", {
135
+ className: "space-y-4",
136
+ children: [
137
+ /* @__PURE__ */ jsxs("div", {
138
+ className: "flex flex-wrap items-center gap-2",
139
+ children: [/* @__PURE__ */ jsx("h2", {
140
+ className: "m-0 text-lg",
141
+ children: "attempt detail"
142
+ }), /* @__PURE__ */ jsx(Status, { value: selected.status })]
143
+ }),
144
+ /* @__PURE__ */ jsxs("dl", {
145
+ className: "grid gap-3 text-sm",
146
+ children: [
147
+ /* @__PURE__ */ jsx(Fact, {
148
+ label: "Attempt",
149
+ value: `${selected.attemptKind}:${selected.attemptId}`
150
+ }),
151
+ /* @__PURE__ */ jsx(Fact, {
152
+ label: "Operation",
153
+ value: selected.operation
154
+ }),
155
+ /* @__PURE__ */ jsx(Fact, {
156
+ label: "Path",
157
+ value: `${endpoint(selected.source)} → ${endpoint(selected.target)}`
158
+ }),
159
+ /* @__PURE__ */ jsx(Fact, {
160
+ label: "Policy",
161
+ value: selected.policyRefs.map((ref) => `${ref.teamId}@${ref.revision}`).join(", ")
162
+ }),
163
+ /* @__PURE__ */ jsx(Fact, {
164
+ label: "Expires",
165
+ value: formatTimestamp(selected.expiresAt)
166
+ })
167
+ ]
168
+ }),
169
+ /* @__PURE__ */ jsxs("details", { children: [/* @__PURE__ */ jsx("summary", {
170
+ className: "cursor-pointer text-sm font-semibold",
171
+ children: "Sensitive payload"
172
+ }), /* @__PURE__ */ jsx("pre", {
173
+ className: "mt-2 max-h-48 overflow-auto rounded bg-ivory p-2 text-xs",
174
+ children: JSON.stringify(selected.payload, null, 2)
175
+ })] }),
176
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
177
+ className: "text-sm",
178
+ children: "Audit history"
179
+ }), /* @__PURE__ */ jsx("ol", {
180
+ className: "mt-2 space-y-1 text-xs",
181
+ children: selected.events.map((item) => /* @__PURE__ */ jsxs("li", { children: [
182
+ formatTimestamp(item.createdAt),
183
+ " · ",
184
+ item.event,
185
+ " · ",
186
+ item.actor
187
+ ] }, item.id))
188
+ })] }),
189
+ notice && /* @__PURE__ */ jsx("p", {
190
+ role: "status",
191
+ className: "text-sm",
192
+ children: notice
193
+ }),
194
+ selected.status === "pending" && /* @__PURE__ */ jsxs("div", {
195
+ className: "flex gap-2",
196
+ children: [/* @__PURE__ */ jsx(Button, {
197
+ variant: "primary",
198
+ disabled: busy,
199
+ onClick: () => void decide("approve"),
200
+ children: "Approve once"
201
+ }), /* @__PURE__ */ jsx(Button, {
202
+ variant: "danger",
203
+ disabled: busy,
204
+ onClick: () => void decide("deny"),
205
+ children: "Deny"
206
+ })]
207
+ })
208
+ ]
209
+ })
210
+ })]
211
+ })
212
+ ]
213
+ });
214
+ }
215
+ function Status({ value }) {
216
+ return /* @__PURE__ */ jsx("span", {
217
+ className: `rounded px-2 py-0.5 text-xs ${value === "pending" ? "bg-amber-100 text-amber-900 dark:bg-amber-900/40 dark:text-amber-100" : value === "delivered" ? "bg-sapphire-glow text-sapphire-deep" : "bg-rose-baziu/10 text-chocolate"}`,
218
+ children: value.replace("_", " ")
219
+ });
220
+ }
221
+ function endpoint(value) {
222
+ return value.kind === "agent" ? `Agent ${value.id}` : value.kind === "user" ? "User" : `Outside ${value.teamId}`;
223
+ }
224
+ function Fact({ label, value }) {
225
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", {
226
+ className: "text-xs font-semibold uppercase text-mocha-light",
227
+ children: label
228
+ }), /* @__PURE__ */ jsx("dd", {
229
+ className: "break-all",
230
+ children: value
231
+ })] });
232
+ }
233
+ var timestampFormatter = new Intl.DateTimeFormat("en-GB", {
234
+ dateStyle: "medium",
235
+ timeStyle: "medium",
236
+ timeZone: "UTC"
237
+ });
238
+ function formatTimestamp(value) {
239
+ return `${timestampFormatter.format(new Date(value))} UTC`;
240
+ }
241
+ //#endregion
242
+ export { ApprovalQueue as component };
@@ -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/approvals/index.tsx
5
+ var $$splitErrorComponentImporter = () => import("./approvals-CbFXFvG8.js");
6
+ var $$splitComponentImporter = () => import("./approvals-DHgARzd8.js");
7
+ var loadApprovals = createServerFn({ method: "GET" }).handler(createSsrRpc("816fcbc7b3c7f2952660d3a2c8f49bb0c91084627a284c185b333b1d418fadf8"));
8
+ var Route = createFileRoute("/approvals/")({
9
+ loader: () => loadApprovals(),
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/approvals/index.tsx?tss-serverfn-split
5
+ var loadApprovals_createServerFn_handler = createServerRpc({
6
+ id: "816fcbc7b3c7f2952660d3a2c8f49bb0c91084627a284c185b333b1d418fadf8",
7
+ name: "loadApprovals",
8
+ filename: "src/routes/approvals/index.tsx"
9
+ }, (opts) => loadApprovals.__executeServer(opts));
10
+ var loadApprovals = createServerFn({ method: "GET" }).handler(loadApprovals_createServerFn_handler, () => daemonClient().get("/api/approvals?limit=100"));
11
+ //#endregion
12
+ export { loadApprovals_createServerFn_handler };
@@ -19,7 +19,11 @@ var fetchAuthState = createServerFn({ method: "GET" }).handler(fetchAuthState_cr
19
19
  authed: false,
20
20
  setupComplete: false
21
21
  };
22
- throw err;
22
+ return {
23
+ authed: true,
24
+ setupComplete: true,
25
+ degraded: true
26
+ };
23
27
  }
24
28
  });
25
29
  //#endregion
@@ -1,4 +1,4 @@
1
- import { t as Route } from "./config-Bq3o924J.js";
1
+ import { t as Route } from "./config-QvHaxGlP.js";
2
2
  import { t as ConfigTabs } from "./ConfigTabs-CyuxzesF.js";
3
3
  import { t as FieldRow } from "./FieldRow-DwyqycWI.js";
4
4
  import { useState } from "react";
@@ -245,8 +245,8 @@ function ProviderCard({ p, openaiCodexStatus }) {
245
245
  }
246
246
  function exampleModelFor(providerId) {
247
247
  switch (providerId) {
248
- case "openai-codex": return "gpt-5.3-codex-spark";
249
- case "openai": return "gpt-5.5";
248
+ case "openai-codex": return "gpt-5.6-luna";
249
+ case "openai": return "gpt-5.6-luna";
250
250
  case "anthropic": return "claude-opus-4-8";
251
251
  case "google": return "gemini-3-pro-preview";
252
252
  case "google-vertex": return "gemini-3.1-pro-preview";
@@ -278,7 +278,7 @@ function exampleModelFor(providerId) {
278
278
  case "opencode": return "claude-opus-4-8";
279
279
  case "opencode-go": return "kimi-k2.7-code";
280
280
  case "zai-coding-cn": return "glm-5.2";
281
- case "azure-openai": return "gpt-5.5";
281
+ case "azure-openai": return "gpt-5.6-luna";
282
282
  case "bedrock": return "anthropic.claude-opus-4-8";
283
283
  case "ollama": return "llama3.3";
284
284
  case "lmstudio": return "qwen3-coder-30b";
@@ -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/config/index.tsx
5
- var $$splitComponentImporter = () => import("./config-CdVjqjin.js");
5
+ var $$splitComponentImporter = () => import("./config-BvKctDOX.js");
6
6
  var fetchProvidersData = createServerFn({ method: "GET" }).handler(createSsrRpc("b18a227687dba45b99ea5a2ac7a5bf8efcd9bc54387bc279cd87510fd2f83f7e"));
7
7
  var Route = createFileRoute("/config/")({
8
8
  loader: () => fetchProvidersData(),
@@ -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/context.tsx?tss-serverfn-split
5
+ var fetchContext_createServerFn_handler = createServerRpc({
6
+ id: "b859e1340a80871c50b0d3e60bd3f3b48fe3c66b083f8ff9d5b2981720d36a81",
7
+ name: "fetchContext",
8
+ filename: "src/routes/teams/$id/context.tsx"
9
+ }, (opts) => fetchContext.__executeServer(opts));
10
+ var fetchContext = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(fetchContext_createServerFn_handler, ({ data }) => daemonClient().get(`/api/teams/${encodeURIComponent(data.id)}`));
11
+ //#endregion
12
+ export { fetchContext_createServerFn_handler };
@@ -0,0 +1,49 @@
1
+ import { t as Route } from "./context-D3Egm-vY.js";
2
+ import { t as TeamTabs } from "./TeamTabs-BPxDBfqy.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/routes/teams/$id/context.tsx?tsr-split=component
5
+ function ContextPage() {
6
+ const team = Route.useLoaderData();
7
+ return /* @__PURE__ */ jsxs("div", {
8
+ className: "mx-auto max-w-5xl px-6 py-8",
9
+ children: [
10
+ /* @__PURE__ */ jsx("h1", { children: "team context" }),
11
+ /* @__PURE__ */ jsx("p", {
12
+ className: "muted",
13
+ children: "Workspace, operator context, and integrations owned by this Team."
14
+ }),
15
+ /* @__PURE__ */ jsx(TeamTabs, { teamId: team.id }),
16
+ /* @__PURE__ */ jsxs("section", {
17
+ className: "card",
18
+ children: [/* @__PURE__ */ jsxs("dl", {
19
+ className: "grid gap-4 sm:grid-cols-2",
20
+ children: [
21
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", {
22
+ className: "muted",
23
+ children: "workspace path"
24
+ }), /* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx("code", { children: team.path }) })] }),
25
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", {
26
+ className: "muted",
27
+ children: "Telegram topic format"
28
+ }), /* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx("code", { children: team.telegramTopicNameFormat ?? "built-in naming" }) })] }),
29
+ /* @__PURE__ */ jsxs("div", {
30
+ className: "sm:col-span-2",
31
+ children: [/* @__PURE__ */ jsx("dt", {
32
+ className: "muted",
33
+ children: "USER.md"
34
+ }), /* @__PURE__ */ jsx("dd", {
35
+ className: "mt-2 whitespace-pre-wrap rounded-md border border-frost bg-ivory p-3 text-sm",
36
+ children: team.userMd || "No operator context configured."
37
+ })]
38
+ })
39
+ ]
40
+ }), /* @__PURE__ */ jsx("p", {
41
+ className: "mt-4 text-sm text-mocha",
42
+ children: "Edit USER.md and Telegram naming from Overview during this transition. This route is the canonical context projection."
43
+ })]
44
+ })
45
+ ]
46
+ });
47
+ }
48
+ //#endregion
49
+ export { ContextPage as component };
@@ -0,0 +1,12 @@
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/context.tsx
5
+ var $$splitComponentImporter = () => import("./context-CEr4-xiA.js");
6
+ var fetchContext = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("b859e1340a80871c50b0d3e60bd3f3b48fe3c66b083f8ff9d5b2981720d36a81"));
7
+ var Route = createFileRoute("/teams/$id/context")({
8
+ loader: ({ params }) => fetchContext({ data: params }),
9
+ component: lazyRouteComponent($$splitComponentImporter, "component")
10
+ });
11
+ //#endregion
12
+ export { Route as t };
@@ -0,0 +1,48 @@
1
+ import { t as Route } from "./members-ksELRsyk.js";
2
+ import { t as TeamTabs } from "./TeamTabs-BPxDBfqy.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/routes/teams/$id/members.tsx?tsr-split=component
5
+ function TeamMembersPage() {
6
+ const detail = Route.useLoaderData();
7
+ const { id } = Route.useParams();
8
+ return /* @__PURE__ */ jsxs("div", {
9
+ className: "mx-auto max-w-5xl px-6 py-8",
10
+ children: [
11
+ /* @__PURE__ */ jsx("h1", { children: "team members" }),
12
+ /* @__PURE__ */ jsxs("p", {
13
+ className: "muted",
14
+ children: [/* @__PURE__ */ jsx("code", { children: "agents.team_id" }), " is the only live-membership authority."]
15
+ }),
16
+ /* @__PURE__ */ jsx(TeamTabs, { teamId: id }),
17
+ /* @__PURE__ */ jsx("div", {
18
+ className: "overflow-x-auto rounded-md border border-frost",
19
+ children: /* @__PURE__ */ jsxs("table", {
20
+ className: "w-full",
21
+ children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
22
+ /* @__PURE__ */ jsx("th", { children: "agent" }),
23
+ /* @__PURE__ */ jsx("th", { children: "status" }),
24
+ /* @__PURE__ */ jsx("th", { children: "agent template" }),
25
+ /* @__PURE__ */ jsx("th", { children: "source slot" })
26
+ ] }) }), /* @__PURE__ */ jsxs("tbody", { children: [detail.members.map((agent) => {
27
+ const binding = detail.bindings.find((item) => item.agentId === agent.id);
28
+ return /* @__PURE__ */ jsxs("tr", { children: [
29
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("a", {
30
+ href: `/agents/${agent.id}`,
31
+ children: agent.name
32
+ }) }),
33
+ /* @__PURE__ */ jsx("td", { children: agent.status }),
34
+ /* @__PURE__ */ jsx("td", { children: agent.profileId }),
35
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: binding?.sourceSlotId ?? "live-only" }) })
36
+ ] }, agent.id);
37
+ }), detail.members.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
38
+ colSpan: 4,
39
+ className: "muted",
40
+ children: "No agents belong to this team."
41
+ }) })] })]
42
+ })
43
+ })
44
+ ]
45
+ });
46
+ }
47
+ //#endregion
48
+ export { TeamMembersPage as component };
@@ -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/members.tsx?tss-serverfn-split
5
+ var fetchMembers_createServerFn_handler = createServerRpc({
6
+ id: "0a6e766d2b4ea526da34cefed5342a6ecc5ff35ad1ce38fba4129b8c24d8e6e5",
7
+ name: "fetchMembers",
8
+ filename: "src/routes/teams/$id/members.tsx"
9
+ }, (opts) => fetchMembers.__executeServer(opts));
10
+ var fetchMembers = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(fetchMembers_createServerFn_handler, ({ data }) => daemonClient().get(`/api/teams/${encodeURIComponent(data.id)}/policy`));
11
+ //#endregion
12
+ export { fetchMembers_createServerFn_handler };
@@ -0,0 +1,12 @@
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/members.tsx
5
+ var $$splitComponentImporter = () => import("./members-40DxRdVj.js");
6
+ var fetchMembers = createServerFn({ method: "POST" }).inputValidator((data) => data).handler(createSsrRpc("0a6e766d2b4ea526da34cefed5342a6ecc5ff35ad1ce38fba4129b8c24d8e6e5"));
7
+ var Route = createFileRoute("/teams/$id/members")({
8
+ loader: ({ params }) => fetchMembers({ data: params }),
9
+ component: lazyRouteComponent($$splitComponentImporter, "component")
10
+ });
11
+ //#endregion
12
+ export { Route as t };
@@ -1,13 +1,13 @@
1
1
  import { t as createServerFn } from "../server.js";
2
2
  import { t as createSsrRpc } from "./createSsrRpc-ZBGxhl8t.js";
3
3
  import { createFileRoute, lazyRouteComponent, redirect } from "@tanstack/react-router";
4
- //#region src/routes/groups/$id/memory.tsx
5
- var $$splitComponentImporter = () => import("./memory-CQaqWnyM.js");
6
- var fetchMemory = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("457cdd4932d22a1e823c50781026fbabb2e9d4d6b5ac9a763bb74500f2b02538"));
7
- var Route = createFileRoute("/groups/$id/memory")({
4
+ //#region src/routes/teams/$id/memory.tsx
5
+ var $$splitComponentImporter = () => import("./memory-CiTl4cN9.js");
6
+ var fetchMemory = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("b96a98e3ed6c8a3ab5f6a4ed8458e93da753ffd74e2912ef1724bb6e58030cb5"));
7
+ var Route = createFileRoute("/teams/$id/memory")({
8
8
  loader: async ({ params }) => {
9
9
  const data = await fetchMemory({ data: { id: params.id } });
10
- if (!data) throw redirect({ to: "/groups" });
10
+ if (!data) throw redirect({ to: "/teams" });
11
11
  return data;
12
12
  },
13
13
  component: lazyRouteComponent($$splitComponentImporter, "component")
@@ -1,25 +1,25 @@
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, r as ApiClientError } from "./daemon-client-2NRMzlTr.js";
4
- //#region src/routes/groups/$id/memory.tsx?tss-serverfn-split
4
+ //#region src/routes/teams/$id/memory.tsx?tss-serverfn-split
5
5
  var fetchMemory_createServerFn_handler = createServerRpc({
6
- id: "457cdd4932d22a1e823c50781026fbabb2e9d4d6b5ac9a763bb74500f2b02538",
6
+ id: "b96a98e3ed6c8a3ab5f6a4ed8458e93da753ffd74e2912ef1724bb6e58030cb5",
7
7
  name: "fetchMemory",
8
- filename: "src/routes/groups/$id/memory.tsx"
8
+ filename: "src/routes/teams/$id/memory.tsx"
9
9
  }, (opts) => fetchMemory.__executeServer(opts));
10
10
  var fetchMemory = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(fetchMemory_createServerFn_handler, async ({ data }) => {
11
11
  const c = daemonClient();
12
- let group;
12
+ let team;
13
13
  try {
14
- group = await c.get(`/api/groups/${encodeURIComponent(data.id)}`);
14
+ team = await c.get(`/api/teams/${encodeURIComponent(data.id)}`);
15
15
  } catch (err) {
16
16
  if (err instanceof ApiClientError && err.status === 404) return null;
17
17
  throw err;
18
18
  }
19
- const [entries, agents] = await Promise.all([c.get(`/api/groups/${encodeURIComponent(group.id)}/memory`), c.get("/api/agents?includeArchived=true")]);
20
- const memberCount = agents.filter((a) => a.groupId === group.id).length;
19
+ const [entries, agents] = await Promise.all([c.get(`/api/teams/${encodeURIComponent(team.id)}/memory`), c.get("/api/agents?includeArchived=true")]);
20
+ const memberCount = agents.filter((a) => a.teamId === team.id).length;
21
21
  return {
22
- group,
22
+ team,
23
23
  memberCount,
24
24
  entries
25
25
  };