bazilion 0.13.0 → 0.14.1

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 +16 -5
  2. package/dist/cli.js +285 -86
  3. package/dist/cli.js.map +1 -1
  4. package/dist/daemon.js +539 -81
  5. package/dist/daemon.js.map +1 -1
  6. package/dist/web/client/assets/AgentTabs-BcmmwYJc.js +1 -0
  7. package/dist/web/client/assets/ConfigPage-BCLp-FUC.js +1 -0
  8. package/dist/web/client/assets/ConfirmDialog-BAiyYC8w.js +1 -0
  9. package/dist/web/client/assets/FieldRow-DsWhqiIQ.js +1 -0
  10. package/dist/web/client/assets/Page-NV96O47A.js +1 -0
  11. package/dist/web/client/assets/ProductionTeamPolicyEditor-CHBKZMpY.js +7 -0
  12. package/dist/web/client/assets/{ProfileCommunicationEditor-BcSf2Hao.js → ProfileCommunicationEditor-DZ8yTQvV.js} +1 -1
  13. package/dist/web/client/assets/SectionTabs-4kCQXuFY.js +1 -0
  14. package/dist/web/client/assets/TeamTabs-BfC1pfQe.js +1 -0
  15. package/dist/web/client/assets/{TemplatesTabs-CyDVzrOl.js → TemplatesTabs-BwsLjN0Q.js} +1 -1
  16. package/dist/web/client/assets/UnsavedChangesGuard-C7U9rsPw.js +1 -0
  17. package/dist/web/client/assets/{_id-DWTMH7Eb.js → _id-CG9YM1tY.js} +1 -1
  18. package/dist/web/client/assets/_id-DfzTSFBA.js +1 -0
  19. package/dist/web/client/assets/_id-DtHL-U-0.js +1 -0
  20. package/dist/web/client/assets/_id-J0kM-98d.js +1 -0
  21. package/dist/web/client/assets/activity-CBQGMwWo.js +1 -0
  22. package/dist/web/client/assets/agents-BWGBjF2Y.js +1 -0
  23. package/dist/web/client/assets/agents-DTY5RXgO.js +1 -0
  24. package/dist/web/client/assets/approvals-DwMk9S4Z.js +1 -0
  25. package/dist/web/client/assets/attention-7qYFtwOW.js +1 -0
  26. package/dist/web/client/assets/chevron-right-DK703skW.js +1 -0
  27. package/dist/web/client/assets/config-D59MT3Y5.js +3 -0
  28. package/dist/web/client/assets/{inbox-D2NypLee.js → inbox-CpKuNfOj.js} +1 -1
  29. package/dist/web/client/assets/index-BVfpuiby.js +52 -0
  30. package/dist/web/client/assets/learning-631_q6a9.js +1 -0
  31. package/dist/web/client/assets/login-JjfTCGIb.js +1 -0
  32. package/dist/web/client/assets/mcp-DHgUOUPG.js +1 -0
  33. package/dist/web/client/assets/members-CLCUdo-h.js +1 -0
  34. package/dist/web/client/assets/memory-paAiM6ix.js +1 -0
  35. package/dist/web/client/assets/{policy-CHM95pMU.js → policy-Fy_Wnq6p.js} +1 -1
  36. package/dist/web/client/assets/{preload-helper-mNuBjNXU.js → preload-helper-bztXdkDj.js} +1 -1
  37. package/dist/web/client/assets/routes-DciiC6QA.js +1 -0
  38. package/dist/web/client/assets/services-i_RmJYAO.js +1 -0
  39. package/dist/web/client/assets/skills-BX42OGpp.js +1 -0
  40. package/dist/web/client/assets/styles-B5vcgXln.css +2 -0
  41. package/dist/web/client/assets/{teams-Dm_huGxn.js → teams-4ySkP31k.js} +1 -1
  42. package/dist/web/client/assets/teams-D6nIPyC0.js +1 -0
  43. package/dist/web/client/assets/telegram-CphoIRWP.js +1 -0
  44. package/dist/web/client/assets/tokens-2j3NQudt.js +1 -0
  45. package/dist/web/client/assets/triggers-sDA075Nu.js +1 -0
  46. package/dist/web/client/assets/utils-B6KiDbIe.js +1 -0
  47. package/dist/web/client/assets/welcome-Do427w4M.js +1 -0
  48. package/dist/web/client/assets/wire-constants-B7b2CQp1.js +74 -0
  49. package/dist/web/client/assets/x-CbAF-3_T.js +1 -0
  50. package/dist/web/server/assets/{AgentTabs-aXdsiiMp.js → AgentTabs-Dq8hDM2Q.js} +9 -2
  51. package/dist/web/server/assets/{ChatPane-Ba5wTsVk.js → ChatPane-CgSe7tsy.js} +81 -43
  52. package/dist/web/server/assets/{ConfigPage-BKlh5vOU.js → ConfigPage-CiQ-gxmJ.js} +3 -2
  53. package/dist/web/server/assets/ConfirmDialog-C-MPYYSU.js +99 -0
  54. package/dist/web/server/assets/FieldRow-DCOF07kl.js +160 -0
  55. package/dist/web/server/assets/{Page-LENulSXY.js → Page-Bz-ydB8j.js} +4 -10
  56. package/dist/web/server/assets/{ProductionTeamPolicyEditor-Y4mzFFvR.js → ProductionTeamPolicyEditor-DQSdP7Yx.js} +140 -123
  57. package/dist/web/server/assets/{SectionTabs-BJTPr5nU.js → SectionTabs-B2Yw81XN.js} +2 -2
  58. package/dist/web/server/assets/{Sidebar-DsRVCszF.js → Sidebar-DKyk7oIo.js} +563 -283
  59. package/dist/web/server/assets/{TeamTabs-zZzbP1t_.js → TeamTabs-Co3n2exj.js} +2 -6
  60. package/dist/web/server/assets/{TemplatesTabs-CcRxZhJe.js → TemplatesTabs-B0fA361R.js} +1 -1
  61. package/dist/web/server/assets/UnsavedChangesGuard-CiStXyBI.js +40 -0
  62. package/dist/web/server/assets/{_id-xTD_6ApX.js → _id-BAA9KJBU.js} +1 -1
  63. package/dist/web/server/assets/{_id-BQ2zoMiR.js → _id-BM5m2FLT.js} +4 -4
  64. package/dist/web/server/assets/{_id-BENqNBfK.js → _id-BYKpT2Tu.js} +1 -2
  65. package/dist/web/server/assets/{_id-BreRHYV2.js → _id-BeKhPKw3.js} +350 -185
  66. package/dist/web/server/assets/{_id-CPIXIqyO.js → _id-BqWTB8Wl.js} +188 -86
  67. package/dist/web/server/assets/{_id-DkrNqqTw.js → _id-BwvCtzlD.js} +1 -1
  68. package/dist/web/server/assets/{_id-BZWunvy7.js → _id-DYU6uIBx.js} +0 -1
  69. package/dist/web/server/assets/{_id-BFELaMIN.js → _id-ndxFHx0t.js} +75 -71
  70. package/dist/web/server/assets/{_id-CvYqVJPU.js → _id-sNu5aXZt.js} +2 -1
  71. package/dist/web/server/assets/{_tanstack-start-manifest_v-COkJjXt_.js → _tanstack-start-manifest_v-DR7wyKcH.js} +113 -90
  72. package/dist/web/server/assets/{activity-B6N1T_5N.js → activity-BWv1goK6.js} +3 -3
  73. package/dist/web/server/assets/{activity-BazZNfvf.js → activity-LjpblbDL.js} +1 -1
  74. package/dist/web/server/assets/{agents-BpSeOA30.js → agents-BDFGrU3o.js} +1 -1
  75. package/dist/web/server/assets/{agents-DY630p6x.js → agents-CJk4pxKu.js} +1 -1
  76. package/dist/web/server/assets/{agents-wSYNPuyK.js → agents-CYw1xHoY.js} +138 -16
  77. package/dist/web/server/assets/{agents-DfoLnTyD.js → agents-DfNKc_Q7.js} +52 -8
  78. package/dist/web/server/assets/{approvals-BkUGmYU9.js → approvals-7JOoBchn.js} +1 -1
  79. package/dist/web/server/assets/{approvals-BYajNOdE.js → approvals-Bz123liE.js} +59 -21
  80. package/dist/web/server/assets/{attention-Bw_wiiqI.js → attention-B35JvhOL.js} +1 -1
  81. package/dist/web/server/assets/{attention-Z3bGuxOD.js → attention-C1pPWSXw.js} +3 -3
  82. package/dist/web/server/assets/{config-wYtIhkRm.js → config-DQ8n0AwF.js} +1 -1
  83. package/dist/web/server/assets/config-XSTLuRaT.js +980 -0
  84. package/dist/web/server/assets/{inbox-DTTfSuGU.js → inbox-RweGCV3D.js} +3 -3
  85. package/dist/web/server/assets/{inbox-0iiSg-Y1.js → inbox-cu3jLzNP.js} +1 -1
  86. package/dist/web/server/assets/{learning-DpyLNVe8.js → learning-BaKM6qaw.js} +1 -1
  87. package/dist/web/server/assets/{learning-fG8316uc.js → learning-CbtNlqYo.js} +76 -23
  88. package/dist/web/server/assets/{login-D_GDeTrB.js → login-BNj3U6ok.js} +21 -11
  89. package/dist/web/server/assets/{login-CrFVVUaE.js → login-Be8eP4Jp.js} +2 -2
  90. package/dist/web/server/assets/{mcp-BQtp2T87.js → mcp-B0goWO8Q.js} +1 -1
  91. package/dist/web/server/assets/mcp-CiBs8unU.js +332 -0
  92. package/dist/web/server/assets/members-DHYTVgwb.js +100 -0
  93. package/dist/web/server/assets/{members-DXu2oAS_.js → members-DiYtr-zm.js} +1 -1
  94. package/dist/web/server/assets/{memory-C6fX_FKI.js → memory-CkXUgf5s.js} +150 -48
  95. package/dist/web/server/assets/{memory-Iq2M0-Yc.js → memory-DTFEmfF3.js} +1 -1
  96. package/dist/web/server/assets/{policy-D7kj3Cy7.js → policy-BddK4xom.js} +1 -1
  97. package/dist/web/server/assets/{policy-Bg6u-rTq.js → policy-Bvvav8fh.js} +4 -4
  98. package/dist/web/server/assets/{router-D-6TzLRZ.js → router-M0lutIDA.js} +347 -173
  99. package/dist/web/server/assets/{routes-CiPfEldd.js → routes-BgHisAxH.js} +22 -5
  100. package/dist/web/server/assets/{routes-CNRzy79H.js → routes-COtkyZG1.js} +1 -1
  101. package/dist/web/server/assets/{routes-D933ngZS.js → routes-DAU2g7Uz.js} +1 -1
  102. package/dist/web/server/assets/services-ClyGBU7W.js +83 -0
  103. package/dist/web/server/assets/{services-OB4LAr2A.js → services-DgoU1udp.js} +1 -1
  104. package/dist/web/server/assets/{skills-Babb9jsQ.js → skills-CYih9TJw.js} +47 -6
  105. package/dist/web/server/assets/{skills-D5DQL8bM.js → skills-Dw3cI3si.js} +1 -1
  106. package/dist/web/server/assets/{start-uKQNK6if.js → start-D4Wq9iTa.js} +1 -1
  107. package/dist/web/server/assets/{teams-Dz6ZEMRo.js → teams-BJuoNOTB.js} +1 -1
  108. package/dist/web/server/assets/{teams-Bk6ZT0MD.js → teams-DF3RViAg.js} +3 -3
  109. package/dist/web/server/assets/{teams-DqC4wZxu.js → teams-DFnuc660.js} +1 -1
  110. package/dist/web/server/assets/{teams-Cc2Czynq.js → teams-TV6nbEN_.js} +101 -10
  111. package/dist/web/server/assets/{telegram-J4T0XhwQ.js → telegram-DbOFpTFm.js} +1 -1
  112. package/dist/web/server/assets/{telegram-DUbDIVGX.js → telegram-Dj4Wwhd6.js} +147 -47
  113. package/dist/web/server/assets/{tokens-CJM_0NDa.js → tokens-DDwtO15P.js} +88 -19
  114. package/dist/web/server/assets/{tokens-DO5BzNOn.js → tokens-_2hptHP6.js} +1 -1
  115. package/dist/web/server/assets/{triggers-BdBx-HwR.js → triggers-BvjYNmmY.js} +1 -1
  116. package/dist/web/server/assets/triggers-CHk9O3rU.js +367 -0
  117. package/dist/web/server/assets/utils-C_uf36nf.js +8 -0
  118. package/dist/web/server/assets/{welcome-DDB11L5j.js → welcome-B8nchXdF.js} +9 -8
  119. package/dist/web/server/server.js +5 -9
  120. package/dist/worker.js +64 -19
  121. package/dist/worker.js.map +1 -1
  122. package/package.json +3 -3
  123. package/dist/web/client/assets/AgentTabs-R6gSjIj3.js +0 -1
  124. package/dist/web/client/assets/ConfigPage-BCwfgyjD.js +0 -1
  125. package/dist/web/client/assets/FieldRow-avAFLgYW.js +0 -1
  126. package/dist/web/client/assets/Page-CwNuDhWz.js +0 -1
  127. package/dist/web/client/assets/ProductionTeamPolicyEditor-DdpYInwV.js +0 -7
  128. package/dist/web/client/assets/SectionTabs-DZzy01az.js +0 -1
  129. package/dist/web/client/assets/TeamTabs-Bk89JfN7.js +0 -1
  130. package/dist/web/client/assets/_id-CAJTTnee.js +0 -1
  131. package/dist/web/client/assets/_id-CN6jPaBu.js +0 -1
  132. package/dist/web/client/assets/_id-DGwJqqDc.js +0 -1
  133. package/dist/web/client/assets/activity-DK_M0-bn.js +0 -1
  134. package/dist/web/client/assets/agents-B-i5pASm.js +0 -1
  135. package/dist/web/client/assets/agents-n8U7qNxw.js +0 -1
  136. package/dist/web/client/assets/approvals-CmVxCy0Z.js +0 -1
  137. package/dist/web/client/assets/attention-F0lUQCWE.js +0 -1
  138. package/dist/web/client/assets/chevron-down-OndG7r1U.js +0 -1
  139. package/dist/web/client/assets/config-DuApZ9xS.js +0 -3
  140. package/dist/web/client/assets/context-C1sMnW6K.js +0 -1
  141. package/dist/web/client/assets/index-B3vdrEEg.js +0 -12
  142. package/dist/web/client/assets/learning-zYDCfVxT.js +0 -1
  143. package/dist/web/client/assets/login-B1Un51Zx.js +0 -1
  144. package/dist/web/client/assets/mcp-DSVmJBdv.js +0 -1
  145. package/dist/web/client/assets/members-Pl7hXJcN.js +0 -1
  146. package/dist/web/client/assets/memory-Co3BEaAq.js +0 -1
  147. package/dist/web/client/assets/plus-Dor-_wmL.js +0 -1
  148. package/dist/web/client/assets/routes-D29qjwG0.js +0 -1
  149. package/dist/web/client/assets/services-CCQ_6YWQ.js +0 -1
  150. package/dist/web/client/assets/skills-3xAIvzvP.js +0 -1
  151. package/dist/web/client/assets/styles-D6RPN7RK.css +0 -2
  152. package/dist/web/client/assets/teams-UGLyjHYj.js +0 -1
  153. package/dist/web/client/assets/telegram-3KvrJVO6.js +0 -1
  154. package/dist/web/client/assets/tokens-DUSFmV5_.js +0 -1
  155. package/dist/web/client/assets/triggers-DlQ2KF1h.js +0 -1
  156. package/dist/web/client/assets/welcome-DkP8qzK1.js +0 -1
  157. package/dist/web/client/assets/wire-constants-BhVKOCQa.js +0 -74
  158. package/dist/web/server/assets/FieldRow-B4eTegH9.js +0 -94
  159. package/dist/web/server/assets/config-DGzM28F_.js +0 -554
  160. package/dist/web/server/assets/context-BkDDwbby.js +0 -12
  161. package/dist/web/server/assets/context-DMc0KyHh.js +0 -12
  162. package/dist/web/server/assets/context-poimKI7w.js +0 -47
  163. package/dist/web/server/assets/mcp-DlgXUcAS.js +0 -261
  164. package/dist/web/server/assets/members-CteHKPSF.js +0 -46
  165. package/dist/web/server/assets/services-DJRA1A0-.js +0 -79
  166. package/dist/web/server/assets/triggers-B87fycBl.js +0 -216
@@ -0,0 +1,367 @@
1
+ import { t as Route } from "./triggers-BvjYNmmY.js";
2
+ import { r as PageShell } from "./Page-Bz-ydB8j.js";
3
+ import { t as AgentTabs } from "./AgentTabs-Dq8hDM2Q.js";
4
+ import { t as Button } from "./Button-Dsnw22OF.js";
5
+ import { t as ConfirmDialog } from "./ConfirmDialog-C-MPYYSU.js";
6
+ import { useState } from "react";
7
+ import { useRouter } from "@tanstack/react-router";
8
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ //#region src/routes/agents/$id/triggers.tsx?tsr-split=component
10
+ function TriggersPage() {
11
+ const { resolved, triggers, dispatches } = Route.useLoaderData();
12
+ const router = useRouter();
13
+ const [deleteTarget, setDeleteTarget] = useState(null);
14
+ const [mutationError, setMutationError] = useState(null);
15
+ const [busyId, setBusyId] = useState(null);
16
+ async function toggle(t) {
17
+ setBusyId(t.id);
18
+ setMutationError(null);
19
+ try {
20
+ const response = await fetch(`/api/triggers/${encodeURIComponent(t.id)}`, {
21
+ method: "PATCH",
22
+ headers: { "content-type": "application/json" },
23
+ body: JSON.stringify({ enabled: !t.enabled })
24
+ });
25
+ if (!response.ok) {
26
+ const body = await response.json().catch(() => null);
27
+ throw new Error(body?.error ?? `Could not ${t.enabled ? "disable" : "enable"} trigger`);
28
+ }
29
+ await router.invalidate();
30
+ } catch (error) {
31
+ setMutationError(error instanceof Error ? error.message : String(error));
32
+ } finally {
33
+ setBusyId(null);
34
+ }
35
+ }
36
+ async function del(id) {
37
+ const response = await fetch(`/api/triggers/${encodeURIComponent(id)}`, { method: "DELETE" });
38
+ if (!response.ok && response.status !== 204) {
39
+ const body = await response.json().catch(() => null);
40
+ throw new Error(body?.error ?? "Could not delete trigger");
41
+ }
42
+ await router.invalidate();
43
+ }
44
+ return /* @__PURE__ */ jsxs(PageShell, { children: [
45
+ /* @__PURE__ */ jsx("header", {
46
+ className: "mb-6",
47
+ children: /* @__PURE__ */ jsx("h1", { children: resolved.agent.name })
48
+ }),
49
+ /* @__PURE__ */ jsx(AgentTabs, {
50
+ agentId: resolved.agent.id,
51
+ active: "triggers",
52
+ archived: resolved.agent.status === "archived"
53
+ }),
54
+ /* @__PURE__ */ jsx(AddTriggerForm, {
55
+ agentId: resolved.agent.id,
56
+ onAdded: () => router.invalidate()
57
+ }),
58
+ mutationError && /* @__PURE__ */ jsx("p", {
59
+ role: "alert",
60
+ className: "err mt-4",
61
+ children: mutationError
62
+ }),
63
+ /* @__PURE__ */ jsx("h3", {
64
+ className: "mb-3 mt-6 font-body text-[0.85em] font-semibold uppercase tracking-wider text-mocha-light",
65
+ children: "Active triggers"
66
+ }),
67
+ triggers.length === 0 ? /* @__PURE__ */ jsx("p", {
68
+ className: "muted",
69
+ children: "no triggers yet — add one above."
70
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
71
+ className: "grid gap-3 md:hidden",
72
+ children: triggers.map((t) => {
73
+ const spec = t.kind === "interval" ? `every ${t.intervalSec}s` : t.cronExpr;
74
+ const last = t.lastFiredAt ? new Date(t.lastFiredAt).toLocaleString() : "Never";
75
+ return /* @__PURE__ */ jsxs("article", {
76
+ className: `card min-w-0 ${t.enabled ? "" : "opacity-60"}`,
77
+ children: [
78
+ /* @__PURE__ */ jsxs("div", {
79
+ className: "flex min-w-0 items-start justify-between gap-3",
80
+ children: [/* @__PURE__ */ jsxs("div", {
81
+ className: "min-w-0",
82
+ children: [/* @__PURE__ */ jsx("p", {
83
+ className: "m-0 break-all font-mono text-xs text-muted-foreground",
84
+ children: t.id
85
+ }), /* @__PURE__ */ jsx("p", {
86
+ className: "mb-0 mt-1 font-medium text-foreground",
87
+ children: spec
88
+ })]
89
+ }), /* @__PURE__ */ jsx("span", {
90
+ className: "shrink-0 rounded-sm border border-frost bg-ivory px-2 py-0.5 font-mono text-xs text-mocha",
91
+ children: t.kind
92
+ })]
93
+ }),
94
+ /* @__PURE__ */ jsx("p", {
95
+ className: "my-3 break-words text-sm text-foreground",
96
+ children: t.message
97
+ }),
98
+ /* @__PURE__ */ jsxs("p", {
99
+ className: "mb-3 text-xs text-muted-foreground",
100
+ children: ["Last fired: ", last]
101
+ }),
102
+ /* @__PURE__ */ jsxs("div", {
103
+ className: "flex flex-wrap gap-2",
104
+ children: [/* @__PURE__ */ jsx(Button, {
105
+ variant: "ghost",
106
+ disabled: busyId === t.id,
107
+ onClick: () => void toggle(t),
108
+ children: busyId === t.id ? "Working…" : t.enabled ? "Disable" : "Enable"
109
+ }), /* @__PURE__ */ jsx(Button, {
110
+ variant: "danger",
111
+ disabled: busyId === t.id,
112
+ onClick: () => {
113
+ setMutationError(null);
114
+ setDeleteTarget(t);
115
+ },
116
+ children: "Delete"
117
+ })]
118
+ })
119
+ ]
120
+ }, t.id);
121
+ })
122
+ }), /* @__PURE__ */ jsx("div", {
123
+ className: "hidden overflow-x-auto md:block",
124
+ children: /* @__PURE__ */ jsxs("table", {
125
+ className: "min-w-full",
126
+ children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
127
+ /* @__PURE__ */ jsx("th", { children: "id" }),
128
+ /* @__PURE__ */ jsx("th", { children: "kind" }),
129
+ /* @__PURE__ */ jsx("th", { children: "spec" }),
130
+ /* @__PURE__ */ jsx("th", { children: "message" }),
131
+ /* @__PURE__ */ jsx("th", { children: "last fired" }),
132
+ /* @__PURE__ */ jsx("th", {})
133
+ ] }) }), /* @__PURE__ */ jsx("tbody", { children: triggers.map((t) => {
134
+ const spec = t.kind === "interval" ? `every ${t.intervalSec}s` : t.cronExpr;
135
+ const last = t.lastFiredAt ? new Date(t.lastFiredAt).toLocaleString() : "(never)";
136
+ return /* @__PURE__ */ jsxs("tr", {
137
+ className: t.enabled ? "" : "opacity-60",
138
+ children: [
139
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("code", { children: [t.id.slice(0, 8), "…"] }) }),
140
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("span", {
141
+ className: "inline-block rounded-sm border border-frost bg-ivory px-2 py-0.5 font-mono text-[0.8em] text-mocha",
142
+ children: t.kind
143
+ }) }),
144
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: spec }) }),
145
+ /* @__PURE__ */ jsx("td", { children: t.message.length > 60 ? `${t.message.slice(0, 60)}…` : t.message }),
146
+ /* @__PURE__ */ jsx("td", {
147
+ className: "text-[0.82em] text-mocha-light",
148
+ children: last
149
+ }),
150
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("div", {
151
+ className: "flex gap-1.5",
152
+ children: [/* @__PURE__ */ jsx(Button, {
153
+ variant: "ghost",
154
+ disabled: busyId === t.id,
155
+ onClick: () => void toggle(t),
156
+ children: busyId === t.id ? "working…" : t.enabled ? "disable" : "enable"
157
+ }), /* @__PURE__ */ jsx(Button, {
158
+ variant: "danger",
159
+ disabled: busyId === t.id,
160
+ onClick: () => {
161
+ setMutationError(null);
162
+ setDeleteTarget(t);
163
+ },
164
+ children: "delete"
165
+ })]
166
+ }) })
167
+ ]
168
+ }, t.id);
169
+ }) })]
170
+ })
171
+ })] }),
172
+ /* @__PURE__ */ jsx("h3", {
173
+ className: "mb-3 mt-8 font-body text-[0.85em] font-semibold uppercase tracking-wider text-mocha-light",
174
+ children: "Recent dispatches"
175
+ }),
176
+ dispatches.length === 0 ? /* @__PURE__ */ jsx("p", {
177
+ className: "muted",
178
+ children: "no scheduled occurrences yet."
179
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
180
+ className: "grid gap-3 md:hidden",
181
+ children: dispatches.map((dispatch) => /* @__PURE__ */ jsxs("article", {
182
+ className: "card min-w-0",
183
+ children: [
184
+ /* @__PURE__ */ jsxs("div", {
185
+ className: "flex items-start justify-between gap-3",
186
+ children: [/* @__PURE__ */ jsx("time", {
187
+ className: "text-sm text-foreground",
188
+ children: new Date(dispatch.scheduledAt).toLocaleString()
189
+ }), /* @__PURE__ */ jsx("code", {
190
+ className: "shrink-0",
191
+ children: dispatch.status
192
+ })]
193
+ }),
194
+ /* @__PURE__ */ jsxs("p", {
195
+ className: "mb-0 mt-2 text-xs text-muted-foreground",
196
+ children: [
197
+ dispatch.attemptCount,
198
+ " attempt",
199
+ dispatch.attemptCount === 1 ? "" : "s"
200
+ ]
201
+ }),
202
+ dispatch.lastError && /* @__PURE__ */ jsx("p", {
203
+ className: "mb-0 mt-2 break-words text-sm text-danger",
204
+ children: dispatch.lastError
205
+ })
206
+ ]
207
+ }, dispatch.id))
208
+ }), /* @__PURE__ */ jsx("div", {
209
+ className: "hidden overflow-x-auto md:block",
210
+ children: /* @__PURE__ */ jsxs("table", {
211
+ className: "min-w-full",
212
+ children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
213
+ /* @__PURE__ */ jsx("th", { children: "scheduled" }),
214
+ /* @__PURE__ */ jsx("th", { children: "status" }),
215
+ /* @__PURE__ */ jsx("th", { children: "attempts" }),
216
+ /* @__PURE__ */ jsx("th", { children: "error" })
217
+ ] }) }), /* @__PURE__ */ jsx("tbody", { children: dispatches.map((dispatch) => /* @__PURE__ */ jsxs("tr", { children: [
218
+ /* @__PURE__ */ jsx("td", {
219
+ className: "text-[0.82em]",
220
+ children: new Date(dispatch.scheduledAt).toLocaleString()
221
+ }),
222
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: dispatch.status }) }),
223
+ /* @__PURE__ */ jsx("td", { children: dispatch.attemptCount }),
224
+ /* @__PURE__ */ jsx("td", {
225
+ className: "text-[0.82em] text-mocha-light",
226
+ children: dispatch.lastError ?? "—"
227
+ })
228
+ ] }, dispatch.id)) })]
229
+ })
230
+ })] }),
231
+ /* @__PURE__ */ jsx(ConfirmDialog, {
232
+ open: deleteTarget !== null,
233
+ title: `Delete ${deleteTarget?.kind ?? ""} trigger?`,
234
+ description: /* @__PURE__ */ jsxs("p", { children: [
235
+ "This permanently removes trigger",
236
+ " ",
237
+ /* @__PURE__ */ jsx("code", {
238
+ className: "font-mono",
239
+ children: deleteTarget?.id
240
+ }),
241
+ ", its recorded dispatch history, and every future scheduled occurrence for ",
242
+ resolved.agent.name,
243
+ ". The Agent itself is not deleted."
244
+ ] }),
245
+ confirmLabel: "delete trigger and history",
246
+ onConfirm: async () => {
247
+ if (!deleteTarget) return;
248
+ try {
249
+ await del(deleteTarget.id);
250
+ } catch (error) {
251
+ setMutationError(error instanceof Error ? error.message : String(error));
252
+ throw error;
253
+ }
254
+ },
255
+ onOpenChange: (open) => {
256
+ if (!open) setDeleteTarget(null);
257
+ }
258
+ })
259
+ ] });
260
+ }
261
+ function AddTriggerForm({ agentId, onAdded }) {
262
+ const [kind, setKind] = useState("interval");
263
+ const [intervalSec, setIntervalSec] = useState(300);
264
+ const [cronExpr, setCronExpr] = useState("");
265
+ const [message, setMessage] = useState("");
266
+ const [err, setErr] = useState(null);
267
+ const [submitting, setSubmitting] = useState(false);
268
+ async function submit(e) {
269
+ e.preventDefault();
270
+ setErr(null);
271
+ if (!message.trim()) {
272
+ setErr("message is required");
273
+ return;
274
+ }
275
+ if (kind === "interval" && (!Number.isFinite(intervalSec) || intervalSec <= 0)) {
276
+ setErr("interval must be a positive number");
277
+ return;
278
+ }
279
+ if (kind === "cron" && !cronExpr.trim()) {
280
+ setErr("cron expression is required");
281
+ return;
282
+ }
283
+ setSubmitting(true);
284
+ try {
285
+ const body = {
286
+ kind,
287
+ message: message.trim()
288
+ };
289
+ if (kind === "interval") body.intervalSec = intervalSec;
290
+ else body.cronExpr = cronExpr.trim();
291
+ const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}/triggers`, {
292
+ method: "POST",
293
+ headers: { "content-type": "application/json" },
294
+ body: JSON.stringify(body)
295
+ });
296
+ if (!res.ok) {
297
+ const e2 = await res.json().catch(() => null);
298
+ throw new Error(e2?.error ?? res.statusText);
299
+ }
300
+ setMessage("");
301
+ setCronExpr("");
302
+ setIntervalSec(300);
303
+ onAdded();
304
+ } catch (e2) {
305
+ setErr(e2.message);
306
+ } finally {
307
+ setSubmitting(false);
308
+ }
309
+ }
310
+ return /* @__PURE__ */ jsxs("form", {
311
+ className: "card",
312
+ onSubmit: submit,
313
+ children: [
314
+ /* @__PURE__ */ jsx("h3", { children: "Add trigger" }),
315
+ /* @__PURE__ */ jsxs("div", {
316
+ className: "mb-3 flex gap-3",
317
+ children: [/* @__PURE__ */ jsxs("label", {
318
+ className: "m-0 inline-flex cursor-pointer items-center gap-1",
319
+ children: [/* @__PURE__ */ jsx("input", {
320
+ type: "radio",
321
+ checked: kind === "interval",
322
+ onChange: () => setKind("interval")
323
+ }), "interval (every N seconds)"]
324
+ }), /* @__PURE__ */ jsxs("label", {
325
+ className: "m-0 inline-flex cursor-pointer items-center gap-1",
326
+ children: [/* @__PURE__ */ jsx("input", {
327
+ type: "radio",
328
+ checked: kind === "cron",
329
+ onChange: () => setKind("cron")
330
+ }), "cron (5-field)"]
331
+ })]
332
+ }),
333
+ kind === "interval" ? /* @__PURE__ */ jsxs("label", { children: ["interval (seconds)", /* @__PURE__ */ jsx("input", {
334
+ type: "number",
335
+ min: 1,
336
+ value: intervalSec,
337
+ onChange: (e) => setIntervalSec(Number(e.target.value))
338
+ })] }) : /* @__PURE__ */ jsxs("label", { children: ["cron expression (minute hour dom month dow)", /* @__PURE__ */ jsx("input", {
339
+ type: "text",
340
+ placeholder: "*/15 * * * *",
341
+ value: cronExpr,
342
+ onChange: (e) => setCronExpr(e.target.value)
343
+ })] }),
344
+ /* @__PURE__ */ jsxs("label", { children: ["message", /* @__PURE__ */ jsx("textarea", {
345
+ placeholder: "e.g. check your inbox and act on anything new",
346
+ value: message,
347
+ onChange: (e) => setMessage(e.target.value),
348
+ className: "font-mono text-[0.9em] min-h-[80px]"
349
+ })] }),
350
+ /* @__PURE__ */ jsxs("div", {
351
+ className: "mt-3 flex items-center gap-3",
352
+ children: [/* @__PURE__ */ jsx(Button, {
353
+ variant: "primary",
354
+ type: "submit",
355
+ disabled: submitting,
356
+ children: submitting ? "adding…" : "add"
357
+ }), err && /* @__PURE__ */ jsx("span", {
358
+ role: "alert",
359
+ className: "text-[0.85em] text-danger",
360
+ children: err
361
+ })]
362
+ })
363
+ ]
364
+ });
365
+ }
366
+ //#endregion
367
+ export { TriggersPage as component };
@@ -0,0 +1,8 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ //#region src/lib/utils.ts
4
+ function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+ //#endregion
8
+ export { cn as t };
@@ -1,4 +1,4 @@
1
- import { i as SectionCard, n as PageHeader, r as PageShell } from "./Page-LENulSXY.js";
1
+ import { i as SectionCard, n as PageHeader, r as PageShell } from "./Page-Bz-ydB8j.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { ArrowRight } from "lucide-react";
4
4
  //#region src/routes/welcome.tsx?tsr-split=component
@@ -8,18 +8,18 @@ function WelcomePage() {
8
8
  children: [/* @__PURE__ */ jsx(PageHeader, {
9
9
  eyebrow: "First run",
10
10
  title: "Welcome to bazilion",
11
- description: "Connect one model provider, then Bazilion will prepare your default Agent template and Team."
11
+ description: "Configure one model provider to prepare your defaults, then test it before the first conversation."
12
12
  }), /* @__PURE__ */ jsxs(SectionCard, {
13
13
  title: "Three steps to your first conversation",
14
14
  children: [
15
15
  /* @__PURE__ */ jsxs("p", {
16
16
  className: "text-sm leading-6 text-muted-foreground",
17
17
  children: [
18
- "Before you can spawn agents, enable a provider and save at least one concrete model id. Once you do, a ",
18
+ "Before you can spawn agents, enable a provider and save at least one concrete model id. Bazilion then creates a ",
19
19
  /* @__PURE__ */ jsx("code", { children: "default" }),
20
- " Agent template (and a ",
20
+ " Agent template and ",
21
21
  /* @__PURE__ */ jsx("code", { children: "default" }),
22
- " team directory) are created automatically and the rest of the app unlocks."
22
+ " Team. Send the small connection test before relying on that model."
23
23
  ]
24
24
  }),
25
25
  /* @__PURE__ */ jsxs("ol", {
@@ -57,10 +57,11 @@ function WelcomePage() {
57
57
  /* @__PURE__ */ jsxs(Step, {
58
58
  n: 3,
59
59
  children: [
60
- /* @__PURE__ */ jsx("strong", { children: "Start chatting." }),
61
- " You'll be redirected to the home page automatically, where the ",
60
+ /* @__PURE__ */ jsx("strong", { children: "Verify and spawn." }),
61
+ " Send the short real-model test. When setup is configured, the page gives you a direct action to spawn the first agent from the",
62
+ " ",
62
63
  /* @__PURE__ */ jsx("code", { children: "default" }),
63
- " Agent template is ready for your first spawn."
64
+ " template."
64
65
  ]
65
66
  })
66
67
  ]
@@ -3558,7 +3558,7 @@ var defaultSerovalPlugins = [
3558
3558
  * the dev styles URL for route-scoped CSS collection.
3559
3559
  */
3560
3560
  async function getStartManifest(matchedRoutes) {
3561
- const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-COkJjXt_.js");
3561
+ const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-DR7wyKcH.js");
3562
3562
  const startManifest = tsrStartManifest();
3563
3563
  let routes = startManifest.routes;
3564
3564
  routes[rootRouteId];
@@ -3586,7 +3586,7 @@ var manifest = {
3586
3586
  },
3587
3587
  "032d74b7d41c718191dbdde6b06ba44993340ce1154af1fa6723a6d4f7a7236e": {
3588
3588
  functionName: "fetchProfile_createServerFn_handler",
3589
- importer: () => import("./assets/_id-BZWunvy7.js")
3589
+ importer: () => import("./assets/_id-DYU6uIBx.js")
3590
3590
  },
3591
3591
  "0a6e766d2b4ea526da34cefed5342a6ecc5ff35ad1ce38fba4129b8c24d8e6e5": {
3592
3592
  functionName: "fetchMembers_createServerFn_handler",
@@ -3602,7 +3602,7 @@ var manifest = {
3602
3602
  },
3603
3603
  "26dbbcbe40063e8aedfd343cf1dfd4dfe5589f24591c0ba35e80c611d7c57c7c": {
3604
3604
  functionName: "fetchHomeData_createServerFn_handler",
3605
- importer: () => import("./assets/routes-CNRzy79H.js")
3605
+ importer: () => import("./assets/routes-COtkyZG1.js")
3606
3606
  },
3607
3607
  "278849457893891c3d22806d15e11a0a42cc3630b30e9e62b74cf2d3b982ded7": {
3608
3608
  functionName: "fetchServers_createServerFn_handler",
@@ -3660,10 +3660,6 @@ var manifest = {
3660
3660
  functionName: "fetchProvidersData_createServerFn_handler",
3661
3661
  importer: () => import("./assets/config-BMiajTZP.js")
3662
3662
  },
3663
- "b859e1340a80871c50b0d3e60bd3f3b48fe3c66b083f8ff9d5b2981720d36a81": {
3664
- functionName: "fetchContext_createServerFn_handler",
3665
- importer: () => import("./assets/context-DMc0KyHh.js")
3666
- },
3667
3663
  "b96a98e3ed6c8a3ab5f6a4ed8458e93da753ffd74e2912ef1724bb6e58030cb5": {
3668
3664
  functionName: "fetchMemory_createServerFn_handler",
3669
3665
  importer: () => import("./assets/memory-BqV-Afy1.js")
@@ -5560,8 +5556,8 @@ var getBaseManifest = getProdBaseManifest;
5560
5556
  var createEarlyHintsForRequest = createEarlyHintsCollector;
5561
5557
  async function loadEntries() {
5562
5558
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
5563
- import("./assets/router-D-6TzLRZ.js"),
5564
- import("./assets/start-uKQNK6if.js"),
5559
+ import("./assets/router-M0lutIDA.js"),
5560
+ import("./assets/start-D4Wq9iTa.js"),
5565
5561
  import("./assets/empty-plugin-adapters-Cq4--YW-.js")
5566
5562
  ]);
5567
5563
  return {
package/dist/worker.js CHANGED
@@ -784,20 +784,61 @@ import {
784
784
  } from "fs";
785
785
  import { dirname as dirname2, isAbsolute, join as join12, relative, resolve as resolve3, sep as sep2 } from "path";
786
786
  import { createStore, extractSnippet } from "@tobilu/qmd";
787
+
788
+ // ../daemon/src/lib/native-module-error.ts
789
+ var NODE_MODULE_ABI_MISMATCH = /was compiled against a different Node\.js version using\s+NODE_MODULE_VERSION\s+(\d+)[\s\S]*?requires\s+NODE_MODULE_VERSION\s+(\d+)/i;
790
+ function formatNativeModuleAbiMismatch(diagnostic, options = {}) {
791
+ const mismatch = NODE_MODULE_ABI_MISMATCH.exec(diagnostic);
792
+ if (!mismatch) return void 0;
793
+ const builtAbi = mismatch[1];
794
+ const requiredAbi = mismatch[2];
795
+ const rebuildCommand = /better_sqlite3\.node|better-sqlite3/i.test(diagnostic) ? "`pnpm rebuild better-sqlite3`" : "`pnpm rebuild`";
796
+ const subject = options.subject ?? "Bazilion";
797
+ return `${subject} could not load a native dependency built for Node module ABI ${builtAbi}; the current ${process.version} runtime requires ABI ${requiredAbi}. Reinstall Bazilion with this same Node.js version, then restart it. From the repository root of a source checkout, run ${rebuildCommand} (or \`pnpm install --force\`).`;
798
+ }
799
+ var NativeModuleAbiMismatchError = class extends Error {
800
+ code = "native_module_abi_mismatch";
801
+ constructor(message) {
802
+ super(message);
803
+ this.name = "NativeModuleAbiMismatchError";
804
+ }
805
+ };
806
+ function sanitizeNativeModuleError(error, options = {}) {
807
+ const diagnostic = error instanceof Error ? error.message : String(error);
808
+ const formatted = formatNativeModuleAbiMismatch(diagnostic, options);
809
+ if (!formatted) return error;
810
+ return new NativeModuleAbiMismatchError(formatted);
811
+ }
812
+ async function withNativeModuleErrorBoundary(operation, options = {}) {
813
+ try {
814
+ return await operation();
815
+ } catch (error) {
816
+ throw sanitizeNativeModuleError(error, options);
817
+ }
818
+ }
819
+
820
+ // ../daemon/src/runtime/memory/qmd.ts
787
821
  var INDEX_FILENAME = ".qmd-index.sqlite";
788
822
  var COLLECTION_NAME = "memory";
789
823
  var PATTERN = "**/*.md";
824
+ var QMD_NATIVE_ERROR_OPTIONS = { subject: "Bazilion memory" };
790
825
  var storeCache = /* @__PURE__ */ new Map();
791
- function getStore(dir) {
826
+ function getStore(dir, storeFactory) {
792
827
  let p = storeCache.get(dir);
793
828
  if (!p) {
794
- p = createStore({
795
- dbPath: join12(dir, INDEX_FILENAME),
796
- config: {
797
- collections: {
798
- [COLLECTION_NAME]: { path: dir, pattern: PATTERN }
829
+ p = withNativeModuleErrorBoundary(
830
+ () => storeFactory({
831
+ dbPath: join12(dir, INDEX_FILENAME),
832
+ config: {
833
+ collections: {
834
+ [COLLECTION_NAME]: { path: dir, pattern: PATTERN }
835
+ }
799
836
  }
800
- }
837
+ }),
838
+ QMD_NATIVE_ERROR_OPTIONS
839
+ ).catch((error) => {
840
+ storeCache.delete(dir);
841
+ throw error;
801
842
  });
802
843
  storeCache.set(dir, p);
803
844
  }
@@ -980,8 +1021,9 @@ function walkMd(root, dir, prefix, out) {
980
1021
  }
981
1022
  }
982
1023
  }
983
- function qmdBackend(root) {
1024
+ function qmdBackend(root, options = {}) {
984
1025
  let canonicalRoot;
1026
+ const storeFactory = options.createStore ?? createStore;
985
1027
  const safeRoot = () => {
986
1028
  if (!canonicalRoot) canonicalRoot = initializeSafeRoot(root);
987
1029
  else assertRootUnchanged(root, canonicalRoot);
@@ -991,8 +1033,8 @@ function qmdBackend(root) {
991
1033
  async init() {
992
1034
  const safe = safeRoot();
993
1035
  assertSafeTree(safe);
994
- const store = await getStore(safe);
995
- await store.update();
1036
+ const store = await getStore(safe, storeFactory);
1037
+ await withNativeModuleErrorBoundary(() => store.update(), QMD_NATIVE_ERROR_OPTIONS);
996
1038
  },
997
1039
  async read(key) {
998
1040
  const safe = safeRoot();
@@ -1010,19 +1052,22 @@ function qmdBackend(root) {
1010
1052
  const path = safeKey(safe, key);
1011
1053
  const stats = writeSafeFile(safe, path, content);
1012
1054
  assertSafeTree(safe);
1013
- const store = await getStore(safe);
1014
- await store.update();
1055
+ const store = await getStore(safe, storeFactory);
1056
+ await withNativeModuleErrorBoundary(() => store.update(), QMD_NATIVE_ERROR_OPTIONS);
1015
1057
  return { key, content, updatedAt: stats.mtimeMs };
1016
1058
  },
1017
1059
  async search(query, opts) {
1018
1060
  const limit = opts?.limit ?? 10;
1019
1061
  const safe = safeRoot();
1020
1062
  assertSafeTree(safe);
1021
- const store = await getStore(safe);
1022
- const results = await store.searchLex(query, {
1023
- limit,
1024
- collection: COLLECTION_NAME
1025
- });
1063
+ const store = await getStore(safe, storeFactory);
1064
+ const results = await withNativeModuleErrorBoundary(
1065
+ () => store.searchLex(query, {
1066
+ limit,
1067
+ collection: COLLECTION_NAME
1068
+ }),
1069
+ QMD_NATIVE_ERROR_OPTIONS
1070
+ );
1026
1071
  const hits = [];
1027
1072
  for (const r of results) {
1028
1073
  const prefix = `${COLLECTION_NAME}/`;
@@ -1057,8 +1102,8 @@ function qmdBackend(root) {
1057
1102
  rmSync9(path);
1058
1103
  }
1059
1104
  assertSafeTree(safe);
1060
- const store = await getStore(safe);
1061
- await store.update();
1105
+ const store = await getStore(safe, storeFactory);
1106
+ await withNativeModuleErrorBoundary(() => store.update(), QMD_NATIVE_ERROR_OPTIONS);
1062
1107
  }
1063
1108
  };
1064
1109
  }