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
@@ -1,11 +1,12 @@
1
- import { t as Route } from "./_id-81NrHA5d.js";
1
+ import { t as Route } from "./_id-DkFgCIb-.js";
2
2
  import { t as AgentTabs } from "./AgentTabs-BOjTN7QF.js";
3
3
  import { t as AgentAvatar } from "./AgentAvatar-8gTAy_tP.js";
4
- import { t as ChatPane } from "./ChatPane-BvpswYvF.js";
5
- import { r as REASONING_LEVELS } from "./wire-constants-Deb4NxBb.js";
4
+ import { t as ChatPane } from "./ChatPane-Dh3qxzdb.js";
5
+ import { r as REASONING_LEVELS } from "./wire-constants-C8nBJcU3.js";
6
6
  import { useState } from "react";
7
7
  import { useRouter } from "@tanstack/react-router";
8
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { ArrowLeft } from "lucide-react";
9
10
  //#region src/components/CopyButton.tsx
10
11
  function CopyButton({ value, className, ariaLabel = "Copy to clipboard", title = "Copy to clipboard" }) {
11
12
  const [copied, setCopied] = useState(false);
@@ -48,7 +49,8 @@ function CopyButton({ value, className, ariaLabel = "Copy to clipboard", title =
48
49
  //#endregion
49
50
  //#region src/routes/agents/$id/index.tsx?tsr-split=component
50
51
  function AgentDetailPage() {
51
- const { resolved, initialMessages, sessionHead, groups, skills, modelGroups, telegramConfigured } = Route.useLoaderData();
52
+ const { resolved, initialMessages, sessionHead, teams, skills, modelGroups, telegramConfigured } = Route.useLoaderData();
53
+ const search = Route.useSearch();
52
54
  const router = useRouter();
53
55
  async function archive() {
54
56
  if (!confirm(`archive "${resolved.agent.name}"? (reversible)`)) return;
@@ -62,7 +64,13 @@ function AgentDetailPage() {
62
64
  async function del() {
63
65
  const msg = `Permanently delete agent "${resolved.agent.name}"?\n\nThis removes the DB rows (messages, triggers, skill attachments) AND the agent's on-disk directory (memory, templates, state, sessions). This cannot be undone.`;
64
66
  if (!confirm(msg)) return;
65
- const res = await fetch(`/api/agents/${resolved.agent.id}`, { method: "DELETE" });
67
+ const policyResponse = await fetch(`/api/teams/${encodeURIComponent(resolved.team.id)}/policy`);
68
+ if (!policyResponse.ok) {
69
+ alert("The current Team policy is unavailable. Nothing was deleted.");
70
+ return;
71
+ }
72
+ const current = await policyResponse.json();
73
+ const res = await fetch(`/api/agents/${resolved.agent.id}?expectedTeamRevision=${current.teamPolicy.revision}`, { method: "DELETE" });
66
74
  if (res.ok || res.status === 204) window.location.assign("/agents");
67
75
  else alert(`failed: ${res.statusText}`);
68
76
  }
@@ -70,6 +78,17 @@ function AgentDetailPage() {
70
78
  /* @__PURE__ */ jsxs("header", {
71
79
  className: "mb-8",
72
80
  children: [
81
+ search.teamPolicy && /* @__PURE__ */ jsxs("div", {
82
+ className: "mb-4 flex flex-wrap items-center gap-2",
83
+ children: [/* @__PURE__ */ jsxs("a", {
84
+ href: `/teams/${encodeURIComponent(search.teamPolicy)}/policy?view=${search.view ?? "flow"}&selected=${encodeURIComponent(search.selected ?? "")}&vx=${search.vx ?? 0}&vy=${search.vy ?? 0}&vz=${search.vz ?? .9}`,
85
+ className: "ghost-btn",
86
+ children: [/* @__PURE__ */ jsx(ArrowLeft, { className: "h-4 w-4" }), " back to Team policy"]
87
+ }), /* @__PURE__ */ jsx("span", {
88
+ className: "text-xs text-mocha-light",
89
+ children: "Returns to the same projection, viewport, and selection."
90
+ })]
91
+ }),
73
92
  /* @__PURE__ */ jsxs("div", {
74
93
  className: "flex items-center gap-3",
75
94
  children: [/* @__PURE__ */ jsx(AgentAvatar, {
@@ -103,18 +122,18 @@ function AgentDetailPage() {
103
122
  children: resolved.profile.id
104
123
  })] }),
105
124
  /* @__PURE__ */ jsxs(Tag, { children: [
106
- "group:",
125
+ "team:",
107
126
  " ",
108
127
  /* @__PURE__ */ jsx("a", {
109
- href: `/groups/${encodeURIComponent(resolved.group.id)}`,
128
+ href: `/teams/${encodeURIComponent(resolved.team.id)}`,
110
129
  className: "ml-1 bg-transparent px-0 font-mono underline",
111
- children: resolved.group.id
130
+ children: resolved.team.id
112
131
  }),
113
132
  " ",
114
133
  "·",
115
134
  " ",
116
135
  /* @__PURE__ */ jsx("a", {
117
- href: `/groups/${encodeURIComponent(resolved.group.id)}/memory`,
136
+ href: `/teams/${encodeURIComponent(resolved.team.id)}/memory`,
118
137
  className: "ml-0.5 underline",
119
138
  children: "shared memory →"
120
139
  })
@@ -198,29 +217,29 @@ function AgentDetailPage() {
198
217
  /* @__PURE__ */ jsxs("section", {
199
218
  className: "mt-10",
200
219
  children: [
201
- /* @__PURE__ */ jsx(SectionTitle, { children: "Group" }),
220
+ /* @__PURE__ */ jsx(SectionTitle, { children: "Team" }),
202
221
  /* @__PURE__ */ jsxs("p", {
203
222
  className: "text-[0.9em] text-mocha-light",
204
223
  children: [
205
- "Current group: ",
206
- /* @__PURE__ */ jsx("code", { children: resolved.group.id }),
224
+ "Current team: ",
225
+ /* @__PURE__ */ jsx("code", { children: resolved.team.id }),
207
226
  " (",
208
- resolved.group.name,
227
+ resolved.team.name,
209
228
  ") —",
210
229
  " ",
211
- /* @__PURE__ */ jsx("code", { children: resolved.group.path }),
230
+ /* @__PURE__ */ jsx("code", { children: resolved.team.path }),
212
231
  ".",
213
232
  " ",
214
233
  /* @__PURE__ */ jsx("a", {
215
- href: `/groups/${resolved.group.id}`,
234
+ href: `/teams/${resolved.team.id}`,
216
235
  children: "view / edit USER.md"
217
236
  })
218
237
  ]
219
238
  }),
220
239
  /* @__PURE__ */ jsx(MoveGroupForm, {
221
240
  agentId: resolved.agent.id,
222
- currentGroupId: resolved.group.id,
223
- groups
241
+ currentTeamId: resolved.team.id,
242
+ teams
224
243
  })
225
244
  ]
226
245
  }),
@@ -356,21 +375,50 @@ function SettingsDetails({ agentId, currentModelOverride, profileDefaultModel, c
356
375
  })]
357
376
  });
358
377
  }
359
- function MoveGroupForm({ agentId, currentGroupId, groups }) {
378
+ function MoveGroupForm({ agentId, currentTeamId, teams }) {
360
379
  const router = useRouter();
361
- const [groupId, setGroupId] = useState(currentGroupId);
380
+ const [teamId, setTeamId] = useState(currentTeamId);
362
381
  const [moving, setMoving] = useState(false);
382
+ const [placement, setPlacement] = useState("profile_defaults");
363
383
  const [err, setErr] = useState(null);
384
+ const [preview, setPreview] = useState(null);
364
385
  async function move(e) {
365
386
  e.preventDefault();
366
- if (groupId === currentGroupId) return;
387
+ if (teamId === currentTeamId) return;
367
388
  setMoving(true);
368
389
  setErr(null);
369
390
  try {
370
- const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}/group`, {
391
+ const [sourceResponse, destinationResponse] = await Promise.all([fetch(`/api/teams/${encodeURIComponent(currentTeamId)}/policy`), fetch(`/api/teams/${encodeURIComponent(teamId)}/policy`)]);
392
+ if (!sourceResponse.ok || !destinationResponse.ok) throw new Error("A Team policy is unavailable. Nothing was moved.");
393
+ const source = await sourceResponse.json();
394
+ const destination = await destinationResponse.json();
395
+ const request = {
396
+ teamId,
397
+ sourceExpectedRevision: source.teamPolicy.revision,
398
+ destinationExpectedRevision: destination.teamPolicy.revision,
399
+ placement
400
+ };
401
+ if (!preview) {
402
+ const response = await fetch(`/api/agents/${encodeURIComponent(agentId)}/team/preview`, {
403
+ method: "POST",
404
+ headers: { "content-type": "application/json" },
405
+ body: JSON.stringify(request)
406
+ });
407
+ if (!response.ok) {
408
+ const body = await response.json().catch(() => null);
409
+ throw new Error(body?.error ?? response.statusText);
410
+ }
411
+ setPreview(await response.json());
412
+ return;
413
+ }
414
+ const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}/team`, {
371
415
  method: "PATCH",
372
416
  headers: { "content-type": "application/json" },
373
- body: JSON.stringify({ groupId })
417
+ body: JSON.stringify({
418
+ ...request,
419
+ sourceExpectedRevision: preview.source.currentRevision,
420
+ destinationExpectedRevision: preview.destination.currentRevision
421
+ })
374
422
  });
375
423
  if (!res.ok) {
376
424
  const body = await res.json().catch(() => null);
@@ -390,10 +438,13 @@ function MoveGroupForm({ agentId, currentGroupId, groups }) {
390
438
  /* @__PURE__ */ jsxs("label", {
391
439
  className: "flex flex-col gap-1 text-[0.85em] text-mocha-light",
392
440
  children: ["move to:", /* @__PURE__ */ jsx("select", {
393
- value: groupId,
394
- onChange: (e) => setGroupId(e.target.value),
441
+ value: teamId,
442
+ onChange: (e) => {
443
+ setTeamId(e.target.value);
444
+ setPreview(null);
445
+ },
395
446
  className: "min-w-[18rem] rounded-sm border border-frost bg-snow px-2 py-1.5",
396
- children: groups.map((g) => /* @__PURE__ */ jsxs("option", {
447
+ children: teams.map((g) => /* @__PURE__ */ jsxs("option", {
397
448
  value: g.id,
398
449
  children: [
399
450
  g.id,
@@ -403,14 +454,62 @@ function MoveGroupForm({ agentId, currentGroupId, groups }) {
403
454
  }, g.id))
404
455
  })]
405
456
  }),
457
+ /* @__PURE__ */ jsxs("label", {
458
+ className: "flex flex-col gap-1 text-[0.85em] text-mocha-light",
459
+ children: ["destination placement:", /* @__PURE__ */ jsxs("select", {
460
+ value: placement,
461
+ onChange: (e) => {
462
+ setPlacement(e.target.value);
463
+ setPreview(null);
464
+ },
465
+ className: "rounded-sm border border-frost bg-snow px-2 py-1.5",
466
+ children: [
467
+ /* @__PURE__ */ jsx("option", {
468
+ value: "profile_defaults",
469
+ children: "agent-template defaults"
470
+ }),
471
+ /* @__PURE__ */ jsx("option", {
472
+ value: "isolated",
473
+ children: "isolated"
474
+ }),
475
+ /* @__PURE__ */ jsx("option", {
476
+ value: "open",
477
+ children: "open"
478
+ })
479
+ ]
480
+ })]
481
+ }),
406
482
  /* @__PURE__ */ jsx("button", {
407
483
  type: "submit",
408
- disabled: moving || groupId === currentGroupId,
409
- children: moving ? "moving…" : "move"
484
+ disabled: moving || teamId === currentTeamId,
485
+ children: moving ? "working…" : preview ? "commit reviewed move" : "review move"
410
486
  }),
411
487
  err && /* @__PURE__ */ jsx("span", {
412
488
  className: "text-[0.85em] text-[#9B3D3D]",
413
489
  children: err
490
+ }),
491
+ preview && /* @__PURE__ */ jsxs("div", {
492
+ className: "basis-full rounded-md border border-sapphire-light bg-sapphire-glow p-3 text-sm",
493
+ children: [/* @__PURE__ */ jsxs("p", { children: [
494
+ "Source revision ",
495
+ preview.source.currentRevision,
496
+ " → ",
497
+ /* @__PURE__ */ jsx("strong", { children: preview.source.resultingRevision }),
498
+ ", removing ",
499
+ preview.source.removedEdges.length,
500
+ " incident edges. Destination revision ",
501
+ preview.destination.currentRevision,
502
+ " → ",
503
+ /* @__PURE__ */ jsx("strong", { children: preview.destination.resultingRevision }),
504
+ ", adding ",
505
+ preview.destination.addedEdges.length,
506
+ " edges to ",
507
+ preview.destination.existingEdges.length,
508
+ " existing edges."
509
+ ] }), /* @__PURE__ */ jsx("p", {
510
+ className: "mt-1 muted",
511
+ children: preview.lineage
512
+ })]
414
513
  })
415
514
  ]
416
515
  });
@@ -419,14 +518,19 @@ function SkillsTable({ agentId, attached, all }) {
419
518
  const router = useRouter();
420
519
  const [pending, setPending] = useState(null);
421
520
  const [err, setErr] = useState(null);
422
- async function attach(name) {
423
- setPending(name);
521
+ async function attach(skill) {
522
+ const findings = skill.scanFindings ?? [];
523
+ if (!(findings.length === 0 || confirm(`Skill "${skill.name}" has ${findings.length} scan finding${findings.length === 1 ? "" : "s"}. Attach it anyway?`))) return;
524
+ setPending(skill.name);
424
525
  setErr(null);
425
526
  try {
426
527
  const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}/skills`, {
427
528
  method: "POST",
428
529
  headers: { "content-type": "application/json" },
429
- body: JSON.stringify({ skill: name })
530
+ body: JSON.stringify({
531
+ skill: skill.name,
532
+ allowFindings: findings.length > 0
533
+ })
430
534
  });
431
535
  if (!res.ok) {
432
536
  const body = await res.json().catch(() => null);
@@ -465,6 +569,7 @@ function SkillsTable({ agentId, attached, all }) {
465
569
  }), /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
466
570
  /* @__PURE__ */ jsx("th", { children: "name" }),
467
571
  /* @__PURE__ */ jsx("th", { children: "description" }),
572
+ /* @__PURE__ */ jsx("th", { children: "scan" }),
468
573
  /* @__PURE__ */ jsx("th", {})
469
574
  ] }) }), /* @__PURE__ */ jsx("tbody", { children: all.map((s) => {
470
575
  const isAttached = attached.has(s.name);
@@ -475,6 +580,7 @@ function SkillsTable({ agentId, attached, all }) {
475
580
  className: "text-mocha-light",
476
581
  children: "—"
477
582
  }) }),
583
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(SkillFindingSummary, { findings: s.scanFindings ?? [] }) }),
478
584
  /* @__PURE__ */ jsx("td", { children: isAttached ? /* @__PURE__ */ jsx("button", {
479
585
  type: "button",
480
586
  className: "ghost-btn",
@@ -485,12 +591,42 @@ function SkillsTable({ agentId, attached, all }) {
485
591
  type: "button",
486
592
  className: "ghost-btn",
487
593
  disabled: busy,
488
- onClick: () => attach(s.name),
594
+ onClick: () => attach(s),
489
595
  children: busy ? "…" : "attach"
490
596
  }) })
491
597
  ] }, s.name);
492
598
  }) })] })] });
493
599
  }
600
+ function SkillFindingSummary({ findings }) {
601
+ if (findings.length === 0) return /* @__PURE__ */ jsx("span", {
602
+ className: "text-mocha-light",
603
+ children: "clean"
604
+ });
605
+ return /* @__PURE__ */ jsxs("details", {
606
+ className: "text-[0.82em]",
607
+ children: [/* @__PURE__ */ jsxs("summary", {
608
+ className: findings.some((f) => f.severity === "danger") ? "cursor-pointer text-[#9B3D3D]" : "cursor-pointer text-mocha",
609
+ children: [
610
+ findings.length,
611
+ " finding",
612
+ findings.length === 1 ? "" : "s"
613
+ ]
614
+ }), /* @__PURE__ */ jsx("ul", {
615
+ className: "m-0 list-disc pl-4",
616
+ children: findings.map((f, i) => /* @__PURE__ */ jsxs("li", { children: [
617
+ /* @__PURE__ */ jsx("span", {
618
+ className: "font-mono",
619
+ children: f.severity
620
+ }),
621
+ ": ",
622
+ f.code,
623
+ f.line ? ` line ${f.line}` : "",
624
+ " - ",
625
+ f.message
626
+ ] }, `${f.code}-${f.line ?? 0}-${i}`))
627
+ })]
628
+ });
629
+ }
494
630
  function TelegramSection({ agent }) {
495
631
  const router = useRouter();
496
632
  const [busy, setBusy] = useState(false);
@@ -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/templates/teams/$id/index.tsx
5
+ var $$splitErrorComponentImporter = () => import("./_id-A8Xiv6Lc.js");
6
+ var $$splitComponentImporter = () => import("./_id-C4AOhstq.js");
7
+ var fetchTeam = createServerFn({ method: "POST" }).validator((data) => data).handler(createSsrRpc("a0bbbee5d0c1240a05e35c04d56a0e95ec78f05265e4e937eec48c8ac2041e58"));
8
+ var Route = createFileRoute("/templates/teams/$id/")({
9
+ loader: ({ params }) => fetchTeam({ data: params }),
10
+ component: lazyRouteComponent($$splitComponentImporter, "component"),
11
+ errorComponent: lazyRouteComponent($$splitErrorComponentImporter, "errorComponent")
12
+ });
13
+ //#endregion
14
+ export { Route as t };
@@ -0,0 +1,44 @@
1
+ import { t as Route } from "./_id-ButXHnRH.js";
2
+ import { t as RecoveryState } from "./RecoveryState-B2SG-mrY.js";
3
+ import { t as ProductionTeamPolicyEditor } from "./ProductionTeamPolicyEditor-Bke5doyl.js";
4
+ import { t as TemplatesTabs } from "./TemplatesTabs-zf4YhStd.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/routes/templates/teams/$id/index.tsx?tsr-split=component
7
+ function TeamDetailPage() {
8
+ const result = Route.useLoaderData();
9
+ if (!result.ok) return /* @__PURE__ */ jsx(RecoveryState, {
10
+ title: "Team template unavailable",
11
+ error: new Error(result.error),
12
+ reset: () => window.location.reload(),
13
+ fallbackHref: "/templates/teams"
14
+ });
15
+ const { detail, profiles } = result.value;
16
+ return /* @__PURE__ */ jsxs("div", {
17
+ className: "space-y-5",
18
+ children: [
19
+ /* @__PURE__ */ jsx(TemplatesTabs, {}),
20
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("a", {
21
+ href: "/templates/teams",
22
+ children: "← team templates"
23
+ }) }),
24
+ detail.template.deletedAt && /* @__PURE__ */ jsx("div", {
25
+ role: "alert",
26
+ className: "err rounded-md border p-3",
27
+ children: "Source deleted — lineage is read-only and cannot be edited or spawned."
28
+ }),
29
+ /* @__PURE__ */ jsx(ProductionTeamPolicyEditor, {
30
+ source: {
31
+ kind: "template",
32
+ detail
33
+ },
34
+ profiles
35
+ }),
36
+ /* @__PURE__ */ jsx("p", {
37
+ className: "muted text-xs",
38
+ children: "Stable slot IDs remain distinct from live Agent IDs. Every successful save creates a new immutable revision; the reconciled editor badge is authoritative."
39
+ })
40
+ ]
41
+ });
42
+ }
43
+ //#endregion
44
+ export { TeamDetailPage as component };
@@ -1,8 +1,10 @@
1
- import { t as Route } from "./_id-BqnDy_Ca.js";
1
+ import { t as Route } from "./_id-B04VaQlh.js";
2
+ import { t as DEFAULT_PROFILE_COMMUNICATION } from "./team-policy-Csvc5EDd.js";
3
+ import { t as ProfileCommunicationEditor } from "./ProfileCommunicationEditor-C2RU-2QB.js";
2
4
  import { useState } from "react";
3
5
  import { useRouter } from "@tanstack/react-router";
4
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
- //#region src/routes/profiles/$id.tsx?tsr-split=component
7
+ //#region src/routes/templates/agents/$id/index.tsx?tsr-split=component
6
8
  function ProfileDetailPage() {
7
9
  const { loaded, modelGroups, skills } = Route.useLoaderData();
8
10
  const [tab, setTab] = useState("basics");
@@ -11,9 +13,9 @@ function ProfileDetailPage() {
11
13
  className: "mb-1",
12
14
  children: [
13
15
  /* @__PURE__ */ jsx("a", {
14
- href: "/profiles",
16
+ href: "/templates/agents",
15
17
  className: "mb-1 inline-block text-[0.85em] text-mocha-light hover:text-sapphire",
16
- children: "← profiles"
18
+ children: "← agent templates"
17
19
  }),
18
20
  /* @__PURE__ */ jsx("h1", { children: loaded.profile.name }),
19
21
  /* @__PURE__ */ jsxs("div", {
@@ -29,20 +31,27 @@ function ProfileDetailPage() {
29
31
  /* @__PURE__ */ jsxs("p", {
30
32
  className: "muted my-6",
31
33
  children: [
32
- "These settings and files seed every agent spawned from this profile going forward.",
34
+ "These settings and files seed every agent spawned from this Agent template going forward.",
33
35
  " ",
34
36
  /* @__PURE__ */ jsx("strong", { children: "Existing agents keep their own copies" }),
35
37
  " — edits here don't propagate to already-spawned agents."
36
38
  ]
37
39
  }),
38
40
  /* @__PURE__ */ jsx(Tabs, {
39
- items: [{
40
- id: "basics",
41
- label: "1. basics"
42
- }, {
43
- id: "skills",
44
- label: "2. skills"
45
- }],
41
+ items: [
42
+ {
43
+ id: "basics",
44
+ label: "1. basics"
45
+ },
46
+ {
47
+ id: "skills",
48
+ label: "2. skills"
49
+ },
50
+ {
51
+ id: "communication",
52
+ label: "3. communication"
53
+ }
54
+ ],
46
55
  active: tab,
47
56
  onChange: (t) => setTab(t)
48
57
  }),
@@ -104,9 +113,60 @@ function ProfileDetailPage() {
104
113
  initialMode: loaded.profile.skillsMode,
105
114
  initialPicked: new Set(loaded.defaultSkills),
106
115
  skills
116
+ }),
117
+ tab === "communication" && /* @__PURE__ */ jsx(ProfileCommunicationCard, {
118
+ profileId: loaded.profile.id,
119
+ initial: loaded.profile.communicationDefaults ?? DEFAULT_PROFILE_COMMUNICATION
107
120
  })
108
121
  ] });
109
122
  }
123
+ function ProfileCommunicationCard({ profileId, initial }) {
124
+ const [value, setValue] = useState(initial);
125
+ const [savedAt, setSavedAt] = useState(null);
126
+ const dirty = JSON.stringify(value) !== JSON.stringify(initial);
127
+ const save = async () => {
128
+ const response = await fetch(`/api/profiles/${encodeURIComponent(profileId)}`, {
129
+ method: "PATCH",
130
+ headers: { "content-type": "application/json" },
131
+ body: JSON.stringify({ communicationDefaults: value })
132
+ });
133
+ if (!response.ok) throw new Error((await response.json().catch(() => null))?.error ?? response.statusText);
134
+ setSavedAt(Date.now());
135
+ };
136
+ return /* @__PURE__ */ jsxs("section", {
137
+ className: "rounded-md border border-frost bg-snow p-5 shadow-baziu-sm",
138
+ children: [
139
+ /* @__PURE__ */ jsx("div", {
140
+ className: "mb-2 flex flex-wrap items-center gap-2",
141
+ children: /* @__PURE__ */ jsx("h3", {
142
+ className: "m-0 font-body text-[0.95rem] font-semibold normal-case text-chocolate",
143
+ children: "Communication defaults"
144
+ })
145
+ }),
146
+ /* @__PURE__ */ jsx("p", {
147
+ className: "muted mb-4",
148
+ children: "Materialized into new Team and Team policy snapshots after preset resolution. Existing snapshots never inherit later changes. Stored by the daemon."
149
+ }),
150
+ /* @__PURE__ */ jsx(ProfileCommunicationEditor, {
151
+ value,
152
+ onChange: setValue
153
+ }),
154
+ /* @__PURE__ */ jsxs("div", {
155
+ className: "mt-4 flex items-center gap-3",
156
+ children: [/* @__PURE__ */ jsx("button", {
157
+ type: "button",
158
+ className: "btn-primary",
159
+ disabled: !dirty,
160
+ onClick: save,
161
+ children: "save communication defaults"
162
+ }), savedAt && /* @__PURE__ */ jsx("span", {
163
+ className: "text-xs text-sapphire",
164
+ children: "saved to daemon"
165
+ })]
166
+ })
167
+ ]
168
+ });
169
+ }
110
170
  function Tabs({ items, active, onChange }) {
111
171
  return /* @__PURE__ */ jsx("nav", {
112
172
  role: "tablist",
@@ -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/index.tsx?tss-serverfn-split
4
+ //#region src/routes/teams/$id/index.tsx?tss-serverfn-split
5
5
  var fetchGroup_createServerFn_handler = createServerRpc({
6
- id: "c64d52cbb25600424729185370431bf1182e1058dad2eacd250820ca1d62dae0",
6
+ id: "4773184b3ddd3656fb80ec74375a6d304e25acb56b79f1d349dcabf9f0914359",
7
7
  name: "fetchGroup",
8
- filename: "src/routes/groups/$id/index.tsx"
8
+ filename: "src/routes/teams/$id/index.tsx"
9
9
  }, (opts) => fetchGroup.__executeServer(opts));
10
10
  var fetchGroup = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(fetchGroup_createServerFn_handler, async ({ data }) => {
11
11
  const c = daemonClient();
12
- let group;
12
+ let team;
13
13
  try {
14
- group = await c.get(`/api/groups/${encodeURIComponent(data.id)}`);
14
+ team = await c.get(`/api/teams/${encodeURIComponent(data.id)}`);
15
15
  } catch (err) {
16
16
  if (err instanceof ApiClientError && err.status === 404) return null;
17
17
  throw err;
18
18
  }
19
- const [all, profileGroups] = await Promise.all([c.get("/api/agents?includeArchived=true"), c.get("/api/profile-groups")]);
20
- const members = all.filter((a) => a.groupId === group.id);
19
+ const [all, profileGroups] = await Promise.all([c.get("/api/agents?includeArchived=true"), c.get("/api/team-templates")]);
20
+ const members = all.filter((a) => a.teamId === team.id);
21
21
  return {
22
- group,
22
+ team,
23
23
  members,
24
24
  profileGroups
25
25
  };
@@ -0,0 +1,42 @@
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/templates/teams/$id/index.tsx?tss-serverfn-split
5
+ var fetchTeam_createServerFn_handler = createServerRpc({
6
+ id: "a0bbbee5d0c1240a05e35c04d56a0e95ec78f05265e4e937eec48c8ac2041e58",
7
+ name: "fetchTeam",
8
+ filename: "src/routes/templates/teams/$id/index.tsx"
9
+ }, (opts) => fetchTeam.__executeServer(opts));
10
+ var fetchTeam = createServerFn({ method: "POST" }).validator((data) => data).handler(fetchTeam_createServerFn_handler, async ({ data }) => {
11
+ try {
12
+ const client = daemonClient();
13
+ const [detail, profiles] = await Promise.all([client.get(`/api/team-templates/${encodeURIComponent(data.id)}`), client.get("/api/profiles")]);
14
+ return {
15
+ ok: true,
16
+ value: {
17
+ detail: {
18
+ ...detail,
19
+ slots: detail.slots.map((slot) => ({
20
+ ...slot,
21
+ display: null
22
+ })),
23
+ currentSnapshot: {
24
+ ...detail.currentSnapshot,
25
+ slots: detail.currentSnapshot.slots.map((slot) => ({
26
+ ...slot,
27
+ display: null
28
+ }))
29
+ }
30
+ },
31
+ profiles
32
+ }
33
+ };
34
+ } catch (error) {
35
+ return {
36
+ ok: false,
37
+ error: error instanceof Error ? error.message : String(error)
38
+ };
39
+ }
40
+ });
41
+ //#endregion
42
+ export { fetchTeam_createServerFn_handler };
@@ -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/index.tsx
5
- var $$splitComponentImporter = () => import("./_id-CXg-Blec.js");
6
- var fetchGroup = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("c64d52cbb25600424729185370431bf1182e1058dad2eacd250820ca1d62dae0"));
7
- var Route = createFileRoute("/groups/$id/")({
4
+ //#region src/routes/teams/$id/index.tsx
5
+ var $$splitComponentImporter = () => import("./_id-5lLzLwcv.js");
6
+ var fetchGroup = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("4773184b3ddd3656fb80ec74375a6d304e25acb56b79f1d349dcabf9f0914359"));
7
+ var Route = createFileRoute("/teams/$id/")({
8
8
  loader: async ({ params }) => {
9
9
  const data = await fetchGroup({ data: { id: params.id } });
10
- if (!data) throw redirect({ to: "/groups" });
10
+ if (!data) throw redirect({ to: "/teams" });
11
11
  return data;
12
12
  },
13
13
  component: lazyRouteComponent($$splitComponentImporter, "component")
@@ -2,9 +2,17 @@ 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
4
  //#region src/routes/agents/$id/index.tsx
5
- var $$splitComponentImporter = () => import("./_id-D0ytyXGY.js");
5
+ var $$splitComponentImporter = () => import("./_id-B6g9wmPR.js");
6
6
  var fetchAgent = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("846c9081aed17057351730985f133b0aab67a5dabfca9562552829a90ff30849"));
7
7
  var Route = createFileRoute("/agents/$id/")({
8
+ validateSearch: (search) => ({
9
+ ...typeof search.teamPolicy === "string" && search.teamPolicy ? { teamPolicy: search.teamPolicy } : {},
10
+ ...search.view === "matrix" || search.view === "flow" ? { view: search.view } : {},
11
+ ...typeof search.selected === "string" ? { selected: search.selected } : {},
12
+ ...Number.isFinite(Number(search.vx)) ? { vx: Number(search.vx) } : {},
13
+ ...Number.isFinite(Number(search.vy)) ? { vy: Number(search.vy) } : {},
14
+ ...Number.isFinite(Number(search.vz)) ? { vz: Number(search.vz) } : {}
15
+ }),
8
16
  loader: async ({ params }) => {
9
17
  const data = await fetchAgent({ data: { id: params.id } });
10
18
  if (!data) throw redirect({ to: "/agents" });
@@ -1,11 +1,12 @@
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/profiles/$id.tsx?tss-serverfn-split
4
+ import "react";
5
+ //#region src/routes/templates/agents/$id/index.tsx?tss-serverfn-split
5
6
  var fetchProfile_createServerFn_handler = createServerRpc({
6
- id: "280ae44073f538bf230afd3a1407fc41f9c78cd0cf71b6a06fb0cceff0872d1c",
7
+ id: "032d74b7d41c718191dbdde6b06ba44993340ce1154af1fa6723a6d4f7a7236e",
7
8
  name: "fetchProfile",
8
- filename: "src/routes/profiles/$id.tsx"
9
+ filename: "src/routes/templates/agents/$id/index.tsx"
9
10
  }, (opts) => fetchProfile.__executeServer(opts));
10
11
  var fetchProfile = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(fetchProfile_createServerFn_handler, async ({ data }) => {
11
12
  const c = daemonClient();
@@ -19,7 +20,7 @@ var fetchProfile = createServerFn({ method: "POST" }).inputValidator((d) => d).h
19
20
  const [models, skills] = await Promise.all([c.get("/api/config/available-models"), c.get("/api/skills")]);
20
21
  return {
21
22
  loaded,
22
- modelGroups: models.groups,
23
+ modelGroups: models.teams,
23
24
  skills
24
25
  };
25
26
  });