bazilion 0.13.0 → 0.14.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/dist/cli.js +1 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/daemon.js +25 -5
  4. package/dist/daemon.js.map +1 -1
  5. package/dist/web/client/assets/AgentTabs-BcmmwYJc.js +1 -0
  6. package/dist/web/client/assets/ConfigPage-BCLp-FUC.js +1 -0
  7. package/dist/web/client/assets/ConfirmDialog-CyL9A20V.js +1 -0
  8. package/dist/web/client/assets/FieldRow-D6REbYUa.js +1 -0
  9. package/dist/web/client/assets/Page-NV96O47A.js +1 -0
  10. package/dist/web/client/assets/ProductionTeamPolicyEditor-DBKnOezm.js +7 -0
  11. package/dist/web/client/assets/{ProfileCommunicationEditor-BcSf2Hao.js → ProfileCommunicationEditor-4RK2laqO.js} +1 -1
  12. package/dist/web/client/assets/SectionTabs-4kCQXuFY.js +1 -0
  13. package/dist/web/client/assets/TeamTabs-CdtNEqt4.js +1 -0
  14. package/dist/web/client/assets/{TemplatesTabs-CyDVzrOl.js → TemplatesTabs-CZyss2Y0.js} +1 -1
  15. package/dist/web/client/assets/UnsavedChangesGuard-CEoK-ZcN.js +1 -0
  16. package/dist/web/client/assets/_id-4ZS-w_Aj.js +1 -0
  17. package/dist/web/client/assets/{_id-DWTMH7Eb.js → _id-DIqtdQij.js} +1 -1
  18. package/dist/web/client/assets/_id-DbcC2E7F.js +1 -0
  19. package/dist/web/client/assets/_id-f_r5M0p3.js +1 -0
  20. package/dist/web/client/assets/activity-CB9Ufth-.js +1 -0
  21. package/dist/web/client/assets/agents-D-JGXVg9.js +1 -0
  22. package/dist/web/client/assets/agents-DS2XafoA.js +1 -0
  23. package/dist/web/client/assets/approvals-Cke_mrJv.js +1 -0
  24. package/dist/web/client/assets/attention-PYwRM2wC.js +1 -0
  25. package/dist/web/client/assets/chevron-right-BG4OeFRQ.js +1 -0
  26. package/dist/web/client/assets/config-DF9Gqmfa.js +3 -0
  27. package/dist/web/client/assets/{inbox-D2NypLee.js → inbox-DC_HdOfI.js} +1 -1
  28. package/dist/web/client/assets/index-Cp6UHWr2.js +52 -0
  29. package/dist/web/client/assets/learning-BfrQ4YZY.js +1 -0
  30. package/dist/web/client/assets/login-D4n3AcBR.js +1 -0
  31. package/dist/web/client/assets/mcp-CnjQc_JJ.js +1 -0
  32. package/dist/web/client/assets/members-wxsVTJdW.js +1 -0
  33. package/dist/web/client/assets/memory-Du60O3pE.js +1 -0
  34. package/dist/web/client/assets/{policy-CHM95pMU.js → policy-BOfnkJsL.js} +1 -1
  35. package/dist/web/client/assets/{preload-helper-mNuBjNXU.js → preload-helper-bztXdkDj.js} +1 -1
  36. package/dist/web/client/assets/routes-B9CuhzUW.js +1 -0
  37. package/dist/web/client/assets/services-DyvqJqM2.js +1 -0
  38. package/dist/web/client/assets/skills-DQo7ioW7.js +1 -0
  39. package/dist/web/client/assets/styles-B5vcgXln.css +2 -0
  40. package/dist/web/client/assets/{teams-Dm_huGxn.js → teams-DPggy97H.js} +1 -1
  41. package/dist/web/client/assets/teams-DdawcfNR.js +1 -0
  42. package/dist/web/client/assets/telegram-DcTeDpP5.js +1 -0
  43. package/dist/web/client/assets/tokens-CIEKwZXc.js +1 -0
  44. package/dist/web/client/assets/triggers-Bc2RrUPm.js +1 -0
  45. package/dist/web/client/assets/utils-B6KiDbIe.js +1 -0
  46. package/dist/web/client/assets/welcome-DlhNXUIa.js +1 -0
  47. package/dist/web/client/assets/wire-constants-BzdHSc6A.js +74 -0
  48. package/dist/web/client/assets/x-DAXGIe_Q.js +1 -0
  49. package/dist/web/server/assets/{AgentTabs-aXdsiiMp.js → AgentTabs-Dq8hDM2Q.js} +9 -2
  50. package/dist/web/server/assets/{ChatPane-Ba5wTsVk.js → ChatPane-CgSe7tsy.js} +81 -43
  51. package/dist/web/server/assets/{ConfigPage-BKlh5vOU.js → ConfigPage-CiQ-gxmJ.js} +3 -2
  52. package/dist/web/server/assets/ConfirmDialog-C-MPYYSU.js +99 -0
  53. package/dist/web/server/assets/FieldRow-DCOF07kl.js +160 -0
  54. package/dist/web/server/assets/{Page-LENulSXY.js → Page-Bz-ydB8j.js} +4 -10
  55. package/dist/web/server/assets/{ProductionTeamPolicyEditor-Y4mzFFvR.js → ProductionTeamPolicyEditor-DQSdP7Yx.js} +140 -123
  56. package/dist/web/server/assets/{SectionTabs-BJTPr5nU.js → SectionTabs-B2Yw81XN.js} +2 -2
  57. package/dist/web/server/assets/{Sidebar-DsRVCszF.js → Sidebar-DKyk7oIo.js} +563 -283
  58. package/dist/web/server/assets/{TeamTabs-zZzbP1t_.js → TeamTabs-Co3n2exj.js} +2 -6
  59. package/dist/web/server/assets/{TemplatesTabs-CcRxZhJe.js → TemplatesTabs-B0fA361R.js} +1 -1
  60. package/dist/web/server/assets/UnsavedChangesGuard-CiStXyBI.js +40 -0
  61. package/dist/web/server/assets/{_id-xTD_6ApX.js → _id-BAA9KJBU.js} +1 -1
  62. package/dist/web/server/assets/{_id-BQ2zoMiR.js → _id-BM5m2FLT.js} +4 -4
  63. package/dist/web/server/assets/{_id-BENqNBfK.js → _id-BYKpT2Tu.js} +1 -2
  64. package/dist/web/server/assets/{_id-BreRHYV2.js → _id-BeKhPKw3.js} +350 -185
  65. package/dist/web/server/assets/{_id-CPIXIqyO.js → _id-BqWTB8Wl.js} +188 -86
  66. package/dist/web/server/assets/{_id-DkrNqqTw.js → _id-BwvCtzlD.js} +1 -1
  67. package/dist/web/server/assets/{_id-BZWunvy7.js → _id-DYU6uIBx.js} +0 -1
  68. package/dist/web/server/assets/{_id-BFELaMIN.js → _id-ndxFHx0t.js} +75 -71
  69. package/dist/web/server/assets/{_id-CvYqVJPU.js → _id-sNu5aXZt.js} +2 -1
  70. package/dist/web/server/assets/{_tanstack-start-manifest_v-COkJjXt_.js → _tanstack-start-manifest_v-C-OiOZeM.js} +110 -87
  71. package/dist/web/server/assets/{activity-B6N1T_5N.js → activity-BWv1goK6.js} +3 -3
  72. package/dist/web/server/assets/{activity-BazZNfvf.js → activity-LjpblbDL.js} +1 -1
  73. package/dist/web/server/assets/{agents-BpSeOA30.js → agents-BDFGrU3o.js} +1 -1
  74. package/dist/web/server/assets/{agents-DY630p6x.js → agents-CJk4pxKu.js} +1 -1
  75. package/dist/web/server/assets/{agents-wSYNPuyK.js → agents-CYw1xHoY.js} +138 -16
  76. package/dist/web/server/assets/{agents-DfoLnTyD.js → agents-DfNKc_Q7.js} +52 -8
  77. package/dist/web/server/assets/{approvals-BkUGmYU9.js → approvals-7JOoBchn.js} +1 -1
  78. package/dist/web/server/assets/{approvals-BYajNOdE.js → approvals-Bz123liE.js} +59 -21
  79. package/dist/web/server/assets/{attention-Bw_wiiqI.js → attention-B35JvhOL.js} +1 -1
  80. package/dist/web/server/assets/{attention-Z3bGuxOD.js → attention-C1pPWSXw.js} +3 -3
  81. package/dist/web/server/assets/{config-wYtIhkRm.js → config-BlMkHStx.js} +1 -1
  82. package/dist/web/server/assets/config-ExacOzHX.js +958 -0
  83. package/dist/web/server/assets/{inbox-DTTfSuGU.js → inbox-RweGCV3D.js} +3 -3
  84. package/dist/web/server/assets/{inbox-0iiSg-Y1.js → inbox-cu3jLzNP.js} +1 -1
  85. package/dist/web/server/assets/{learning-DpyLNVe8.js → learning-BaKM6qaw.js} +1 -1
  86. package/dist/web/server/assets/{learning-fG8316uc.js → learning-CbtNlqYo.js} +76 -23
  87. package/dist/web/server/assets/{login-D_GDeTrB.js → login-BNj3U6ok.js} +21 -11
  88. package/dist/web/server/assets/{login-CrFVVUaE.js → login-Be8eP4Jp.js} +2 -2
  89. package/dist/web/server/assets/{mcp-BQtp2T87.js → mcp-B0goWO8Q.js} +1 -1
  90. package/dist/web/server/assets/mcp-CiBs8unU.js +332 -0
  91. package/dist/web/server/assets/members-DHYTVgwb.js +100 -0
  92. package/dist/web/server/assets/{members-DXu2oAS_.js → members-DiYtr-zm.js} +1 -1
  93. package/dist/web/server/assets/{memory-C6fX_FKI.js → memory-CkXUgf5s.js} +150 -48
  94. package/dist/web/server/assets/{memory-Iq2M0-Yc.js → memory-DTFEmfF3.js} +1 -1
  95. package/dist/web/server/assets/{policy-D7kj3Cy7.js → policy-BddK4xom.js} +1 -1
  96. package/dist/web/server/assets/{policy-Bg6u-rTq.js → policy-Bvvav8fh.js} +4 -4
  97. package/dist/web/server/assets/{router-D-6TzLRZ.js → router-pjH2t8Rl.js} +345 -172
  98. package/dist/web/server/assets/{routes-CiPfEldd.js → routes-BgHisAxH.js} +22 -5
  99. package/dist/web/server/assets/{routes-CNRzy79H.js → routes-COtkyZG1.js} +1 -1
  100. package/dist/web/server/assets/{routes-D933ngZS.js → routes-DAU2g7Uz.js} +1 -1
  101. package/dist/web/server/assets/services-ClyGBU7W.js +83 -0
  102. package/dist/web/server/assets/{services-OB4LAr2A.js → services-DgoU1udp.js} +1 -1
  103. package/dist/web/server/assets/{skills-Babb9jsQ.js → skills-CYih9TJw.js} +47 -6
  104. package/dist/web/server/assets/{skills-D5DQL8bM.js → skills-Dw3cI3si.js} +1 -1
  105. package/dist/web/server/assets/{start-uKQNK6if.js → start-D4Wq9iTa.js} +1 -1
  106. package/dist/web/server/assets/{teams-Dz6ZEMRo.js → teams-BJuoNOTB.js} +1 -1
  107. package/dist/web/server/assets/{teams-Bk6ZT0MD.js → teams-DF3RViAg.js} +3 -3
  108. package/dist/web/server/assets/{teams-DqC4wZxu.js → teams-DFnuc660.js} +1 -1
  109. package/dist/web/server/assets/{teams-Cc2Czynq.js → teams-TV6nbEN_.js} +101 -10
  110. package/dist/web/server/assets/{telegram-J4T0XhwQ.js → telegram-DbOFpTFm.js} +1 -1
  111. package/dist/web/server/assets/{telegram-DUbDIVGX.js → telegram-Dj4Wwhd6.js} +147 -47
  112. package/dist/web/server/assets/{tokens-CJM_0NDa.js → tokens-DDwtO15P.js} +88 -19
  113. package/dist/web/server/assets/{tokens-DO5BzNOn.js → tokens-_2hptHP6.js} +1 -1
  114. package/dist/web/server/assets/{triggers-BdBx-HwR.js → triggers-BvjYNmmY.js} +1 -1
  115. package/dist/web/server/assets/triggers-CHk9O3rU.js +367 -0
  116. package/dist/web/server/assets/utils-C_uf36nf.js +8 -0
  117. package/dist/web/server/assets/{welcome-DDB11L5j.js → welcome-B8nchXdF.js} +9 -8
  118. package/dist/web/server/server.js +5 -9
  119. package/package.json +3 -3
  120. package/dist/web/client/assets/AgentTabs-R6gSjIj3.js +0 -1
  121. package/dist/web/client/assets/ConfigPage-BCwfgyjD.js +0 -1
  122. package/dist/web/client/assets/FieldRow-avAFLgYW.js +0 -1
  123. package/dist/web/client/assets/Page-CwNuDhWz.js +0 -1
  124. package/dist/web/client/assets/ProductionTeamPolicyEditor-DdpYInwV.js +0 -7
  125. package/dist/web/client/assets/SectionTabs-DZzy01az.js +0 -1
  126. package/dist/web/client/assets/TeamTabs-Bk89JfN7.js +0 -1
  127. package/dist/web/client/assets/_id-CAJTTnee.js +0 -1
  128. package/dist/web/client/assets/_id-CN6jPaBu.js +0 -1
  129. package/dist/web/client/assets/_id-DGwJqqDc.js +0 -1
  130. package/dist/web/client/assets/activity-DK_M0-bn.js +0 -1
  131. package/dist/web/client/assets/agents-B-i5pASm.js +0 -1
  132. package/dist/web/client/assets/agents-n8U7qNxw.js +0 -1
  133. package/dist/web/client/assets/approvals-CmVxCy0Z.js +0 -1
  134. package/dist/web/client/assets/attention-F0lUQCWE.js +0 -1
  135. package/dist/web/client/assets/chevron-down-OndG7r1U.js +0 -1
  136. package/dist/web/client/assets/config-DuApZ9xS.js +0 -3
  137. package/dist/web/client/assets/context-C1sMnW6K.js +0 -1
  138. package/dist/web/client/assets/index-B3vdrEEg.js +0 -12
  139. package/dist/web/client/assets/learning-zYDCfVxT.js +0 -1
  140. package/dist/web/client/assets/login-B1Un51Zx.js +0 -1
  141. package/dist/web/client/assets/mcp-DSVmJBdv.js +0 -1
  142. package/dist/web/client/assets/members-Pl7hXJcN.js +0 -1
  143. package/dist/web/client/assets/memory-Co3BEaAq.js +0 -1
  144. package/dist/web/client/assets/plus-Dor-_wmL.js +0 -1
  145. package/dist/web/client/assets/routes-D29qjwG0.js +0 -1
  146. package/dist/web/client/assets/services-CCQ_6YWQ.js +0 -1
  147. package/dist/web/client/assets/skills-3xAIvzvP.js +0 -1
  148. package/dist/web/client/assets/styles-D6RPN7RK.css +0 -2
  149. package/dist/web/client/assets/teams-UGLyjHYj.js +0 -1
  150. package/dist/web/client/assets/telegram-3KvrJVO6.js +0 -1
  151. package/dist/web/client/assets/tokens-DUSFmV5_.js +0 -1
  152. package/dist/web/client/assets/triggers-DlQ2KF1h.js +0 -1
  153. package/dist/web/client/assets/welcome-DkP8qzK1.js +0 -1
  154. package/dist/web/client/assets/wire-constants-BhVKOCQa.js +0 -74
  155. package/dist/web/server/assets/FieldRow-B4eTegH9.js +0 -94
  156. package/dist/web/server/assets/config-DGzM28F_.js +0 -554
  157. package/dist/web/server/assets/context-BkDDwbby.js +0 -12
  158. package/dist/web/server/assets/context-DMc0KyHh.js +0 -12
  159. package/dist/web/server/assets/context-poimKI7w.js +0 -47
  160. package/dist/web/server/assets/mcp-DlgXUcAS.js +0 -261
  161. package/dist/web/server/assets/members-CteHKPSF.js +0 -46
  162. package/dist/web/server/assets/services-DJRA1A0-.js +0 -79
  163. package/dist/web/server/assets/triggers-B87fycBl.js +0 -216
@@ -0,0 +1,100 @@
1
+ import { t as Route } from "./members-DiYtr-zm.js";
2
+ import { a as StatusBadge, i as SectionCard, r as PageShell, t as EmptyState } from "./Page-Bz-ydB8j.js";
3
+ import { t as TeamTabs } from "./TeamTabs-Co3n2exj.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/routes/teams/$id/members.tsx?tsr-split=component
6
+ function TeamMembersPage() {
7
+ const detail = Route.useLoaderData();
8
+ const { id } = Route.useParams();
9
+ return /* @__PURE__ */ jsxs(PageShell, { children: [
10
+ /* @__PURE__ */ jsx("h1", { children: "Team members" }),
11
+ /* @__PURE__ */ jsxs("p", {
12
+ className: "muted",
13
+ children: [/* @__PURE__ */ jsx("code", { children: "agents.team_id" }), " is the only live-membership authority."]
14
+ }),
15
+ /* @__PURE__ */ jsx(TeamTabs, { teamId: id }),
16
+ detail.members.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
17
+ title: "No Team members",
18
+ description: "Spawn an Agent into this Team from the Agents page or apply a Team template.",
19
+ actions: /* @__PURE__ */ jsx("a", {
20
+ href: "/agents",
21
+ className: "btn-primary no-underline",
22
+ children: "Spawn an Agent"
23
+ })
24
+ }) : /* @__PURE__ */ jsxs(SectionCard, {
25
+ title: "Live roster",
26
+ description: "Every Agent belongs to exactly one Team; source slots show reusable-template lineage only.",
27
+ children: [/* @__PURE__ */ jsx("div", {
28
+ className: "hidden overflow-x-auto rounded-md border border-frost md:block",
29
+ children: /* @__PURE__ */ jsxs("table", {
30
+ className: "w-full",
31
+ children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
32
+ /* @__PURE__ */ jsx("th", { children: "agent" }),
33
+ /* @__PURE__ */ jsx("th", { children: "status" }),
34
+ /* @__PURE__ */ jsx("th", { children: "agent template" }),
35
+ /* @__PURE__ */ jsx("th", { children: "source slot" })
36
+ ] }) }), /* @__PURE__ */ jsx("tbody", { children: detail.members.map((agent) => {
37
+ const binding = detail.bindings.find((item) => item.agentId === agent.id);
38
+ return /* @__PURE__ */ jsxs("tr", { children: [
39
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("a", {
40
+ href: `/agents/${agent.id}`,
41
+ children: agent.name
42
+ }) }),
43
+ /* @__PURE__ */ jsx("td", { children: agent.status }),
44
+ /* @__PURE__ */ jsx("td", { children: agent.profileId }),
45
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: binding?.sourceSlotId ?? "live-only" }) })
46
+ ] }, agent.id);
47
+ }) })]
48
+ })
49
+ }), /* @__PURE__ */ jsx("div", {
50
+ className: "grid gap-3 md:hidden",
51
+ children: detail.members.map((agent) => {
52
+ const binding = detail.bindings.find((item) => item.agentId === agent.id);
53
+ return /* @__PURE__ */ jsxs("article", {
54
+ className: "min-w-0 rounded-xl border border-border bg-muted/20 p-4",
55
+ children: [/* @__PURE__ */ jsxs("div", {
56
+ className: "flex min-w-0 items-start justify-between gap-3",
57
+ children: [/* @__PURE__ */ jsxs("div", {
58
+ className: "min-w-0",
59
+ children: [/* @__PURE__ */ jsx("a", {
60
+ href: `/agents/${agent.id}`,
61
+ className: "block truncate font-semibold text-foreground",
62
+ children: agent.name
63
+ }), /* @__PURE__ */ jsx("p", {
64
+ className: "mt-0.5 truncate font-mono text-xs text-muted-foreground",
65
+ children: agent.id
66
+ })]
67
+ }), /* @__PURE__ */ jsx(StatusBadge, {
68
+ variant: agent.status === "archived" ? "warning" : "success",
69
+ children: agent.status
70
+ })]
71
+ }), /* @__PURE__ */ jsxs("dl", {
72
+ className: "mt-3 grid gap-2 text-xs",
73
+ children: [/* @__PURE__ */ jsxs("div", {
74
+ className: "rounded-lg bg-muted p-2",
75
+ children: [/* @__PURE__ */ jsx("dt", {
76
+ className: "font-semibold text-muted-foreground",
77
+ children: "Agent template"
78
+ }), /* @__PURE__ */ jsx("dd", {
79
+ className: "mt-0.5 break-all font-mono",
80
+ children: agent.profileId
81
+ })]
82
+ }), /* @__PURE__ */ jsxs("div", {
83
+ className: "rounded-lg bg-muted p-2",
84
+ children: [/* @__PURE__ */ jsx("dt", {
85
+ className: "font-semibold text-muted-foreground",
86
+ children: "Source slot"
87
+ }), /* @__PURE__ */ jsx("dd", {
88
+ className: "mt-0.5 break-all font-mono",
89
+ children: binding?.sourceSlotId ?? "live-only"
90
+ })]
91
+ })]
92
+ })]
93
+ }, agent.id);
94
+ })
95
+ })]
96
+ })
97
+ ] });
98
+ }
99
+ //#endregion
100
+ export { TeamMembersPage as component };
@@ -2,7 +2,7 @@ import { n as createServerFn } from "../server.js";
2
2
  import { t as createSsrRpc } from "./createSsrRpc-6LHNEsSK.js";
3
3
  import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
4
  //#region src/routes/teams/$id/members.tsx
5
- var $$splitComponentImporter = () => import("./members-CteHKPSF.js");
5
+ var $$splitComponentImporter = () => import("./members-DHYTVgwb.js");
6
6
  var fetchMembers = createServerFn({ method: "POST" }).validator((data) => data).handler(createSsrRpc("0a6e766d2b4ea526da34cefed5342a6ecc5ff35ad1ce38fba4129b8c24d8e6e5"));
7
7
  var Route = createFileRoute("/teams/$id/members")({
8
8
  loader: ({ params }) => fetchMembers({ data: params }),
@@ -1,6 +1,9 @@
1
- import { t as Route } from "./memory-Iq2M0-Yc.js";
2
- import { r as PageShell } from "./Page-LENulSXY.js";
3
- import { t as TeamTabs } from "./TeamTabs-zZzbP1t_.js";
1
+ import { t as Route } from "./memory-DTFEmfF3.js";
2
+ import { r as PageShell } from "./Page-Bz-ydB8j.js";
3
+ import { t as Button } from "./Button-Dsnw22OF.js";
4
+ import { t as ConfirmDialog } from "./ConfirmDialog-C-MPYYSU.js";
5
+ import { t as TeamTabs } from "./TeamTabs-Co3n2exj.js";
6
+ import { t as UnsavedChangesGuard } from "./UnsavedChangesGuard-CiStXyBI.js";
4
7
  import { useEffect, useRef, useState } from "react";
5
8
  import { jsx, jsxs } from "react/jsx-runtime";
6
9
  //#region src/routes/teams/$id/memory.tsx?tsr-split=component
@@ -20,8 +23,12 @@ function MemoryPage() {
20
23
  const [mode, setMode] = useState("none");
21
24
  const [keyInput, setKeyInput] = useState("");
22
25
  const [content, setContent] = useState("");
26
+ const [savedKey, setSavedKey] = useState("");
27
+ const [savedContent, setSavedContent] = useState("");
23
28
  const [status, setStatus] = useState(null);
29
+ const [confirmation, setConfirmation] = useState(null);
24
30
  const searchTimer = useRef(null);
31
+ const dirty = mode !== "none" && (keyInput !== savedKey || content !== savedContent);
25
32
  async function loadList(q) {
26
33
  try {
27
34
  const url = q.trim().length > 0 ? `/api/teams/${encodeURIComponent(teamId)}/memory/search?q=${encodeURIComponent(q)}&limit=50` : `/api/teams/${encodeURIComponent(teamId)}/memory`;
@@ -61,9 +68,7 @@ function MemoryPage() {
61
68
  if (searchTimer.current) clearTimeout(searchTimer.current);
62
69
  };
63
70
  }, [query]);
64
- async function openEntry(key) {
65
- setSelectedKey(key);
66
- setMode("edit");
71
+ async function loadEntry(key) {
67
72
  setStatus({
68
73
  msg: "loading…",
69
74
  kind: "info"
@@ -75,8 +80,12 @@ function MemoryPage() {
75
80
  throw new Error(body?.error ?? res.statusText);
76
81
  }
77
82
  const entry = await res.json();
83
+ setSelectedKey(entry.key);
84
+ setMode("edit");
78
85
  setKeyInput(entry.key);
79
86
  setContent(entry.content ?? "");
87
+ setSavedKey(entry.key);
88
+ setSavedContent(entry.content ?? "");
80
89
  setStatus({
81
90
  msg: `loaded ${entry.key}`,
82
91
  kind: "info"
@@ -88,16 +97,64 @@ function MemoryPage() {
88
97
  });
89
98
  }
90
99
  }
91
- function newEntry() {
100
+ function requestOpenEntry(key) {
101
+ if (mode === "edit" && key === selectedKey) return;
102
+ if (!dirty) {
103
+ loadEntry(key);
104
+ return;
105
+ }
106
+ setConfirmation({
107
+ title: "Discard unsaved memory changes?",
108
+ description: /* @__PURE__ */ jsxs("p", { children: [
109
+ "Opening ",
110
+ /* @__PURE__ */ jsx("code", {
111
+ className: "font-mono",
112
+ children: key
113
+ }),
114
+ " will permanently discard your changes to",
115
+ " ",
116
+ /* @__PURE__ */ jsx("code", {
117
+ className: "font-mono",
118
+ children: selectedKey ?? (keyInput || "this new entry")
119
+ }),
120
+ "."
121
+ ] }),
122
+ confirmLabel: "discard and open entry",
123
+ onConfirm: () => loadEntry(key)
124
+ });
125
+ }
126
+ function startNewEntry() {
92
127
  setSelectedKey(null);
93
128
  setMode("new");
94
129
  setKeyInput("");
95
130
  setContent("");
131
+ setSavedKey("");
132
+ setSavedContent("");
96
133
  setStatus({
97
134
  msg: "new entry — type a key and content, then save",
98
135
  kind: "info"
99
136
  });
100
137
  }
138
+ function requestNewEntry() {
139
+ if (!dirty) {
140
+ startNewEntry();
141
+ return;
142
+ }
143
+ setConfirmation({
144
+ title: "Discard unsaved memory changes?",
145
+ description: /* @__PURE__ */ jsxs("p", { children: [
146
+ "Starting a new entry will permanently discard your changes to",
147
+ " ",
148
+ /* @__PURE__ */ jsx("code", {
149
+ className: "font-mono",
150
+ children: selectedKey ?? (keyInput || "this new entry")
151
+ }),
152
+ "."
153
+ ] }),
154
+ confirmLabel: "discard and create new",
155
+ onConfirm: startNewEntry
156
+ });
157
+ }
101
158
  async function save() {
102
159
  const key = keyInput.trim();
103
160
  if (!key) {
@@ -119,6 +176,9 @@ function MemoryPage() {
119
176
  }
120
177
  setSelectedKey(key);
121
178
  setMode("edit");
179
+ setKeyInput(key);
180
+ setSavedKey(key);
181
+ setSavedContent(content);
122
182
  setStatus({
123
183
  msg: "saved",
124
184
  kind: "info"
@@ -131,34 +191,50 @@ function MemoryPage() {
131
191
  });
132
192
  }
133
193
  }
134
- async function del() {
194
+ async function deleteSelected() {
135
195
  if (!selectedKey) return;
136
- if (!confirm(`delete ${selectedKey}?`)) return;
137
- try {
138
- const res = await fetch(`/api/teams/${encodeURIComponent(teamId)}/memory/${encodeKey(selectedKey)}`, { method: "DELETE" });
139
- if (!res.ok && res.status !== 204) {
140
- const body = await res.json().catch(() => null);
141
- throw new Error(body?.error ?? res.statusText);
142
- }
143
- setSelectedKey(null);
144
- setMode("none");
145
- setKeyInput("");
146
- setContent("");
147
- setStatus({
148
- msg: "deleted",
149
- kind: "info"
150
- });
151
- await loadList(query);
152
- } catch (err) {
153
- setStatus({
154
- msg: `error: ${err.message}`,
155
- kind: "error"
156
- });
196
+ const key = selectedKey;
197
+ const res = await fetch(`/api/teams/${encodeURIComponent(teamId)}/memory/${encodeKey(key)}`, { method: "DELETE" });
198
+ if (!res.ok && res.status !== 204) {
199
+ const body = await res.json().catch(() => null);
200
+ throw new Error(body?.error ?? res.statusText);
157
201
  }
202
+ setSelectedKey(null);
203
+ setMode("none");
204
+ setKeyInput("");
205
+ setContent("");
206
+ setSavedKey("");
207
+ setSavedContent("");
208
+ setStatus({
209
+ msg: `${key} deleted`,
210
+ kind: "info"
211
+ });
212
+ await loadList(query);
213
+ }
214
+ function requestDelete() {
215
+ if (!selectedKey) return;
216
+ const key = selectedKey;
217
+ setConfirmation({
218
+ title: `Delete ${key}?`,
219
+ description: /* @__PURE__ */ jsxs("p", { children: [
220
+ "This permanently deletes ",
221
+ /* @__PURE__ */ jsx("code", {
222
+ className: "font-mono",
223
+ children: key
224
+ }),
225
+ " from shared Team memory and removes it from search results for every Team member. This cannot be undone."
226
+ ] }),
227
+ confirmLabel: "delete memory entry",
228
+ onConfirm: deleteSelected
229
+ });
158
230
  }
159
231
  const canSave = mode !== "none" && keyInput.trim().length > 0;
160
232
  const canDelete = mode === "edit" && selectedKey !== null;
161
233
  return /* @__PURE__ */ jsxs(PageShell, { children: [
234
+ /* @__PURE__ */ jsx(UnsavedChangesGuard, {
235
+ when: dirty,
236
+ subject: "Team memory draft"
237
+ }),
162
238
  /* @__PURE__ */ jsxs("header", {
163
239
  className: "mb-6",
164
240
  children: [/* @__PURE__ */ jsxs("h1", {
@@ -203,15 +279,20 @@ function MemoryPage() {
203
279
  className: "grid grid-cols-1 gap-6 lg:grid-cols-[320px_1fr]",
204
280
  children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
205
281
  className: "overflow-hidden rounded-[16px] border border-frost bg-snow",
206
- children: [/* @__PURE__ */ jsx("div", {
282
+ children: [/* @__PURE__ */ jsxs("div", {
207
283
  className: "border-b border-frost p-2",
208
- children: /* @__PURE__ */ jsx("input", {
284
+ children: [/* @__PURE__ */ jsx("label", {
285
+ htmlFor: "team-memory-search",
286
+ className: "sr-only",
287
+ children: "Search Team memory"
288
+ }), /* @__PURE__ */ jsx("input", {
289
+ id: "team-memory-search",
209
290
  type: "text",
210
291
  placeholder: "search (BM25)...",
211
292
  autoComplete: "off",
212
293
  value: query,
213
294
  onChange: (e) => setQuery(e.target.value)
214
- })
295
+ })]
215
296
  }), /* @__PURE__ */ jsx("div", {
216
297
  className: "max-h-[520px] overflow-y-auto",
217
298
  children: rows.length === 0 ? /* @__PURE__ */ jsx("div", {
@@ -220,7 +301,7 @@ function MemoryPage() {
220
301
  }) : rows.map((r) => {
221
302
  return /* @__PURE__ */ jsxs("button", {
222
303
  type: "button",
223
- onClick: () => openEntry(r.key),
304
+ onClick: () => requestOpenEntry(r.key),
224
305
  className: `unstyled block w-full cursor-pointer border-b border-frost/50 px-3.5 py-2 text-left font-mono text-[0.84em] transition-colors last:border-b-0 hover:bg-sapphire-glow ${r.key === selectedKey ? "bg-sapphire-glow font-medium text-sapphire-deep" : ""}`,
225
306
  children: [
226
307
  isSearch && r.score !== void 0 && /* @__PURE__ */ jsx("span", {
@@ -236,50 +317,71 @@ function MemoryPage() {
236
317
  }, r.key);
237
318
  })
238
319
  })]
239
- }), /* @__PURE__ */ jsx("button", {
240
- type: "button",
241
- className: "ghost-btn mt-3 w-full",
242
- onClick: newEntry,
320
+ }), /* @__PURE__ */ jsx(Button, {
321
+ variant: "ghost",
322
+ className: "mt-3 w-full",
323
+ onClick: requestNewEntry,
243
324
  children: "+ new entry"
244
325
  })] }), /* @__PURE__ */ jsxs("div", { children: [
245
- /* @__PURE__ */ jsx("div", {
326
+ /* @__PURE__ */ jsxs("div", {
246
327
  className: "mb-3 flex items-center gap-2",
247
- children: /* @__PURE__ */ jsx("input", {
328
+ children: [/* @__PURE__ */ jsx("label", {
329
+ htmlFor: "team-memory-key",
330
+ className: "sr-only",
331
+ children: "Memory entry key"
332
+ }), /* @__PURE__ */ jsx("input", {
333
+ id: "team-memory-key",
248
334
  type: "text",
249
335
  placeholder: "key (e.g. prefs/hiking.md)",
250
336
  value: keyInput,
251
337
  onChange: (e) => setKeyInput(e.target.value),
252
338
  disabled: mode !== "new",
253
339
  className: "flex-1 font-mono"
254
- })
340
+ })]
341
+ }),
342
+ /* @__PURE__ */ jsx("label", {
343
+ htmlFor: "team-memory-content",
344
+ className: "sr-only",
345
+ children: "Memory entry content"
255
346
  }),
256
347
  /* @__PURE__ */ jsx("textarea", {
348
+ id: "team-memory-content",
257
349
  placeholder: "select an entry on the left, or create a new one.",
258
350
  value: content,
259
351
  onChange: (e) => setContent(e.target.value),
352
+ disabled: mode === "none",
260
353
  className: "min-h-[360px] w-full font-mono text-[0.9em] leading-[1.55]"
261
354
  }),
262
355
  /* @__PURE__ */ jsxs("div", {
263
356
  className: "mt-3 flex gap-2",
264
- children: [/* @__PURE__ */ jsx("button", {
265
- type: "button",
266
- className: "btn-primary",
357
+ children: [/* @__PURE__ */ jsx(Button, {
358
+ variant: "primary",
267
359
  onClick: save,
268
- disabled: !canSave,
360
+ disabled: !canSave || !dirty,
269
361
  children: "save"
270
- }), /* @__PURE__ */ jsx("button", {
271
- type: "button",
272
- className: "ghost-btn",
273
- onClick: del,
362
+ }), /* @__PURE__ */ jsx(Button, {
363
+ variant: "danger",
364
+ onClick: requestDelete,
274
365
  disabled: !canDelete,
275
366
  children: "delete"
276
367
  })]
277
368
  }),
278
369
  status && /* @__PURE__ */ jsx("p", {
370
+ role: status.kind === "error" ? "alert" : "status",
279
371
  className: `mt-2 text-[0.9em] ${status.kind === "error" ? "text-danger" : "text-mocha-light"}`,
280
372
  children: status.msg
281
373
  })
282
374
  ] })]
375
+ }),
376
+ /* @__PURE__ */ jsx(ConfirmDialog, {
377
+ open: confirmation !== null,
378
+ title: confirmation?.title ?? "",
379
+ description: confirmation?.description ?? null,
380
+ confirmLabel: confirmation?.confirmLabel ?? "continue",
381
+ onConfirm: () => confirmation?.onConfirm(),
382
+ onOpenChange: (open) => {
383
+ if (!open) setConfirmation(null);
384
+ }
283
385
  })
284
386
  ] });
285
387
  }
@@ -2,7 +2,7 @@ import { n as createServerFn } from "../server.js";
2
2
  import { t as createSsrRpc } from "./createSsrRpc-6LHNEsSK.js";
3
3
  import { createFileRoute, lazyRouteComponent, redirect } from "@tanstack/react-router";
4
4
  //#region src/routes/teams/$id/memory.tsx
5
- var $$splitComponentImporter = () => import("./memory-C6fX_FKI.js");
5
+ var $$splitComponentImporter = () => import("./memory-CkXUgf5s.js");
6
6
  var fetchMemory = createServerFn({ method: "POST" }).validator((d) => d).handler(createSsrRpc("b96a98e3ed6c8a3ab5f6a4ed8458e93da753ffd74e2912ef1724bb6e58030cb5"));
7
7
  var Route = createFileRoute("/teams/$id/memory")({
8
8
  loader: async ({ params }) => {
@@ -3,7 +3,7 @@ import { t as createSsrRpc } from "./createSsrRpc-6LHNEsSK.js";
3
3
  import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
4
4
  //#region src/routes/teams/$id/policy.tsx
5
5
  var $$splitErrorComponentImporter = () => import("./policy-BYVXqsan.js");
6
- var $$splitComponentImporter = () => import("./policy-Bg6u-rTq.js");
6
+ var $$splitComponentImporter = () => import("./policy-Bvvav8fh.js");
7
7
  var fetchPolicy = createServerFn({ method: "POST" }).validator((data) => data).handler(createSsrRpc("fc940d6dec5305aa64bdb9b9f5f7d4f925b2ba0608cb6d39af854a94872fc867"));
8
8
  var Route = createFileRoute("/teams/$id/policy")({
9
9
  validateSearch: (search) => ({
@@ -1,9 +1,9 @@
1
- import { t as Route } from "./policy-D7kj3Cy7.js";
2
- import { r as PageShell } from "./Page-LENulSXY.js";
1
+ import { t as Route } from "./policy-BddK4xom.js";
2
+ import { r as PageShell } from "./Page-Bz-ydB8j.js";
3
3
  import { t as Button } from "./Button-Dsnw22OF.js";
4
4
  import { t as RecoveryState } from "./RecoveryState-B2SG-mrY.js";
5
- import { t as TeamTabs } from "./TeamTabs-zZzbP1t_.js";
6
- import { t as ProductionTeamPolicyEditor } from "./ProductionTeamPolicyEditor-Y4mzFFvR.js";
5
+ import { t as TeamTabs } from "./TeamTabs-Co3n2exj.js";
6
+ import { t as ProductionTeamPolicyEditor } from "./ProductionTeamPolicyEditor-DQSdP7Yx.js";
7
7
  import { useEffect, useMemo, useState } from "react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { GitCompareArrows, RefreshCw, Save } from "lucide-react";