clawatch 1.0.22 → 1.0.26

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 (388) hide show
  1. package/backend/dist/alertChecker.d.ts.map +1 -1
  2. package/backend/dist/alertChecker.js +44 -0
  3. package/backend/dist/alertChecker.js.map +1 -1
  4. package/backend/dist/db.d.ts +33 -3
  5. package/backend/dist/db.d.ts.map +1 -1
  6. package/backend/dist/db.js +140 -10
  7. package/backend/dist/db.js.map +1 -1
  8. package/backend/dist/index.js +41 -34
  9. package/backend/dist/index.js.map +1 -1
  10. package/backend/dist/routes.d.ts.map +1 -1
  11. package/backend/dist/routes.js +118 -11
  12. package/backend/dist/routes.js.map +1 -1
  13. package/backend/dist/seed.js +115 -109
  14. package/backend/dist/seed.js.map +1 -1
  15. package/backend/dist/sessions.d.ts +2 -0
  16. package/backend/dist/sessions.d.ts.map +1 -1
  17. package/backend/dist/sessions.js +9 -0
  18. package/backend/dist/sessions.js.map +1 -1
  19. package/backend/dist/sync.d.ts +1 -4
  20. package/backend/dist/sync.d.ts.map +1 -1
  21. package/backend/dist/sync.js +4 -0
  22. package/backend/dist/sync.js.map +1 -1
  23. package/backend/node_modules/.package-lock.json +4 -380
  24. package/backend/node_modules/sql.js/.devcontainer/Dockerfile +76 -0
  25. package/backend/node_modules/sql.js/.devcontainer/devcontainer.json +20 -0
  26. package/backend/node_modules/sql.js/.jsdoc.config.json +38 -0
  27. package/backend/node_modules/sql.js/.nojekyll +0 -0
  28. package/backend/node_modules/sql.js/AUTHORS +8 -0
  29. package/backend/node_modules/sql.js/dist/sql-asm-debug.js +140890 -0
  30. package/backend/node_modules/sql.js/dist/sql-asm-memory-growth.js +204 -0
  31. package/backend/node_modules/sql.js/dist/sql-asm.js +202 -0
  32. package/backend/node_modules/sql.js/dist/sql-wasm-browser-debug.js +7157 -0
  33. package/backend/node_modules/sql.js/dist/sql-wasm-browser-debug.wasm +0 -0
  34. package/backend/node_modules/sql.js/dist/sql-wasm-browser.js +183 -0
  35. package/backend/node_modules/sql.js/dist/sql-wasm-browser.wasm +0 -0
  36. package/backend/node_modules/sql.js/dist/sql-wasm-debug.js +7265 -0
  37. package/backend/node_modules/sql.js/dist/sql-wasm-debug.wasm +0 -0
  38. package/backend/node_modules/sql.js/dist/sql-wasm.js +185 -0
  39. package/backend/node_modules/sql.js/dist/sql-wasm.wasm +0 -0
  40. package/backend/node_modules/sql.js/dist/worker.sql-asm-debug.js +141011 -0
  41. package/backend/node_modules/sql.js/dist/worker.sql-asm.js +323 -0
  42. package/backend/node_modules/sql.js/dist/worker.sql-wasm-debug.js +7386 -0
  43. package/backend/node_modules/sql.js/dist/worker.sql-wasm.js +306 -0
  44. package/backend/node_modules/sql.js/eslint.config.cjs +57 -0
  45. package/backend/node_modules/sql.js/logo.svg +13 -0
  46. package/backend/node_modules/sql.js/package.json +58 -0
  47. package/backend/package-lock.json +5 -392
  48. package/backend/package.json +1 -2
  49. package/dist/cli.js +0 -38
  50. package/dist/cli.js.map +1 -1
  51. package/frontend/.env +1 -0
  52. package/frontend/.next/BUILD_ID +1 -1
  53. package/frontend/.next/app-path-routes-manifest.json +1 -0
  54. package/frontend/.next/build-manifest.json +2 -2
  55. package/frontend/.next/prerender-manifest.json +24 -0
  56. package/frontend/.next/routes-manifest.json +6 -0
  57. package/frontend/.next/server/app/_global-error.html +2 -2
  58. package/frontend/.next/server/app/_global-error.rsc +1 -1
  59. package/frontend/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  60. package/frontend/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  61. package/frontend/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  62. package/frontend/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  63. package/frontend/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  64. package/frontend/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  65. package/frontend/.next/server/app/_not-found.html +1 -1
  66. package/frontend/.next/server/app/_not-found.rsc +2 -2
  67. package/frontend/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  68. package/frontend/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  69. package/frontend/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  70. package/frontend/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  71. package/frontend/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  72. package/frontend/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  73. package/frontend/.next/server/app/dashboard/costs/page/app-paths-manifest.json +3 -0
  74. package/frontend/.next/server/app/dashboard/costs/page/build-manifest.json +17 -0
  75. package/frontend/.next/server/app/dashboard/costs/page/next-font-manifest.json +11 -0
  76. package/frontend/.next/server/app/dashboard/costs/page/react-loadable-manifest.json +1 -0
  77. package/frontend/.next/server/app/dashboard/costs/page/server-reference-manifest.json +4 -0
  78. package/frontend/.next/server/app/dashboard/costs/page.js +16 -0
  79. package/frontend/.next/server/app/dashboard/costs/page.js.map +5 -0
  80. package/frontend/.next/server/app/dashboard/costs/page.js.nft.json +1 -0
  81. package/frontend/.next/server/app/dashboard/costs/page_client-reference-manifest.js +2 -0
  82. package/frontend/.next/server/app/dashboard/costs.html +1 -0
  83. package/frontend/.next/server/app/dashboard/costs.meta +16 -0
  84. package/frontend/.next/server/app/dashboard/costs.rsc +20 -0
  85. package/frontend/.next/server/app/dashboard/costs.segments/_full.segment.rsc +20 -0
  86. package/frontend/.next/server/app/dashboard/costs.segments/_head.segment.rsc +6 -0
  87. package/frontend/.next/server/app/dashboard/costs.segments/_index.segment.rsc +5 -0
  88. package/frontend/.next/server/app/dashboard/costs.segments/_tree.segment.rsc +4 -0
  89. package/frontend/.next/server/app/dashboard/costs.segments/dashboard/costs/__PAGE__.segment.rsc +9 -0
  90. package/frontend/.next/server/app/dashboard/costs.segments/dashboard/costs.segment.rsc +4 -0
  91. package/frontend/.next/server/app/dashboard/costs.segments/dashboard.segment.rsc +4 -0
  92. package/frontend/.next/server/app/dashboard/page.js.nft.json +1 -1
  93. package/frontend/.next/server/app/dashboard/page_client-reference-manifest.js +1 -1
  94. package/frontend/.next/server/app/dashboard/projects/[id]/page.js.nft.json +1 -1
  95. package/frontend/.next/server/app/dashboard/projects/[id]/page_client-reference-manifest.js +1 -1
  96. package/frontend/.next/server/app/dashboard/sessions/[id]/page.js.nft.json +1 -1
  97. package/frontend/.next/server/app/dashboard/sessions/[id]/page_client-reference-manifest.js +1 -1
  98. package/frontend/.next/server/app/dashboard.html +1 -1
  99. package/frontend/.next/server/app/dashboard.rsc +3 -3
  100. package/frontend/.next/server/app/dashboard.segments/_full.segment.rsc +3 -3
  101. package/frontend/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  102. package/frontend/.next/server/app/dashboard.segments/_index.segment.rsc +2 -2
  103. package/frontend/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  104. package/frontend/.next/server/app/dashboard.segments/dashboard/__PAGE__.segment.rsc +2 -2
  105. package/frontend/.next/server/app/dashboard.segments/dashboard.segment.rsc +1 -1
  106. package/frontend/.next/server/app/index.html +1 -1
  107. package/frontend/.next/server/app/index.rsc +3 -3
  108. package/frontend/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  109. package/frontend/.next/server/app/index.segments/_full.segment.rsc +3 -3
  110. package/frontend/.next/server/app/index.segments/_head.segment.rsc +1 -1
  111. package/frontend/.next/server/app/index.segments/_index.segment.rsc +2 -2
  112. package/frontend/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  113. package/frontend/.next/server/app/page.js.nft.json +1 -1
  114. package/frontend/.next/server/app/page_client-reference-manifest.js +1 -1
  115. package/frontend/.next/server/app-paths-manifest.json +1 -0
  116. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__96998d39._.js +3 -0
  117. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__ad9c7c6a._.js +3 -0
  118. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__cb471d02._.js +3 -0
  119. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__f99f8278._.js +3 -0
  120. package/frontend/.next/server/chunks/ssr/{_2bfdd77b._.js → _7062b9c0._.js} +2 -2
  121. package/frontend/.next/server/chunks/ssr/_81435076._.js +3 -0
  122. package/frontend/.next/server/chunks/ssr/_8f399861._.js +4 -0
  123. package/frontend/.next/server/chunks/ssr/{_f26b1aca._.js → _aa02b285._.js} +2 -2
  124. package/frontend/.next/server/chunks/ssr/_b0ae6d33._.js +1 -1
  125. package/frontend/.next/server/chunks/ssr/_next-internal_server_app_dashboard_costs_page_actions_b5efa95e.js +3 -0
  126. package/frontend/.next/server/chunks/ssr/node_modules_09eef5ec._.js +3 -0
  127. package/frontend/.next/server/chunks/ssr/node_modules_b4c16e3a._.js +3 -0
  128. package/frontend/.next/server/chunks/ssr/src_app_dashboard_page_tsx_196c74b5._.js +3 -0
  129. package/frontend/.next/server/chunks/ssr/src_app_page_tsx_a7111f3e._.js +1 -1
  130. package/frontend/.next/server/chunks/ssr/src_components_ui_button_tsx_d75cfe12._.js +3 -0
  131. package/frontend/.next/server/next-font-manifest.js +1 -1
  132. package/frontend/.next/server/next-font-manifest.json +4 -0
  133. package/frontend/.next/server/pages/404.html +1 -1
  134. package/frontend/.next/server/pages/500.html +2 -2
  135. package/frontend/.next/static/chunks/139d48bcbc462224.js +1 -0
  136. package/frontend/.next/static/chunks/25c0d885ca7bcbe1.js +1 -0
  137. package/frontend/.next/static/chunks/31f0905710e3dfc3.js +1 -0
  138. package/frontend/.next/static/chunks/34b822c87d271e34.js +1 -0
  139. package/frontend/.next/static/chunks/790649543cff1084.js +1 -0
  140. package/frontend/.next/static/chunks/88a2c1056ccf4825.js +1 -0
  141. package/frontend/.next/static/chunks/9dc87ca9ab86c348.css +3 -0
  142. package/frontend/.next/static/chunks/b1b1c7e52e2182c7.js +1 -0
  143. package/frontend/.next/static/chunks/be5e61723b600d44.js +1 -0
  144. package/frontend/.next/static/chunks/c3af0c75d8e1b7b4.js +1 -0
  145. package/frontend/.next/static/chunks/f5dbb90939b55e4f.js +1 -0
  146. package/frontend/public/providers/nanobot.png +0 -0
  147. package/frontend/public/providers/nanoclaw.webp +0 -0
  148. package/frontend/public/providers/picoclaw.ico +0 -0
  149. package/frontend/public/providers/trustclaw.svg +1 -0
  150. package/frontend/public/providers/zeroclaw.png +0 -0
  151. package/package.json +2 -2
  152. package/backend/node_modules/base64-js/base64js.min.js +0 -1
  153. package/backend/node_modules/base64-js/index.d.ts +0 -3
  154. package/backend/node_modules/base64-js/index.js +0 -150
  155. package/backend/node_modules/base64-js/package.json +0 -47
  156. package/backend/node_modules/better-sqlite3/binding.gyp +0 -38
  157. package/backend/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
  158. package/backend/node_modules/better-sqlite3/deps/common.gypi +0 -68
  159. package/backend/node_modules/better-sqlite3/deps/copy.js +0 -31
  160. package/backend/node_modules/better-sqlite3/deps/defines.gypi +0 -41
  161. package/backend/node_modules/better-sqlite3/deps/download.sh +0 -122
  162. package/backend/node_modules/better-sqlite3/deps/patches/1208.patch +0 -15
  163. package/backend/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +0 -261480
  164. package/backend/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +0 -13715
  165. package/backend/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +0 -719
  166. package/backend/node_modules/better-sqlite3/deps/sqlite3.gyp +0 -80
  167. package/backend/node_modules/better-sqlite3/deps/test_extension.c +0 -21
  168. package/backend/node_modules/better-sqlite3/lib/database.js +0 -90
  169. package/backend/node_modules/better-sqlite3/lib/index.js +0 -3
  170. package/backend/node_modules/better-sqlite3/lib/methods/aggregate.js +0 -43
  171. package/backend/node_modules/better-sqlite3/lib/methods/backup.js +0 -67
  172. package/backend/node_modules/better-sqlite3/lib/methods/function.js +0 -31
  173. package/backend/node_modules/better-sqlite3/lib/methods/inspect.js +0 -7
  174. package/backend/node_modules/better-sqlite3/lib/methods/pragma.js +0 -12
  175. package/backend/node_modules/better-sqlite3/lib/methods/serialize.js +0 -16
  176. package/backend/node_modules/better-sqlite3/lib/methods/table.js +0 -189
  177. package/backend/node_modules/better-sqlite3/lib/methods/transaction.js +0 -78
  178. package/backend/node_modules/better-sqlite3/lib/methods/wrappers.js +0 -54
  179. package/backend/node_modules/better-sqlite3/lib/sqlite-error.js +0 -20
  180. package/backend/node_modules/better-sqlite3/lib/util.js +0 -12
  181. package/backend/node_modules/better-sqlite3/package.json +0 -54
  182. package/backend/node_modules/better-sqlite3/src/better_sqlite3.cpp +0 -2186
  183. package/backend/node_modules/better-sqlite3/src/better_sqlite3.hpp +0 -1036
  184. package/backend/node_modules/bindings/bindings.js +0 -221
  185. package/backend/node_modules/bindings/package.json +0 -28
  186. package/backend/node_modules/buffer/index.d.ts +0 -186
  187. package/backend/node_modules/buffer/index.js +0 -1817
  188. package/backend/node_modules/buffer/package.json +0 -96
  189. package/backend/node_modules/chownr/chownr.js +0 -167
  190. package/backend/node_modules/chownr/package.json +0 -29
  191. package/backend/node_modules/decompress-response/index.d.ts +0 -22
  192. package/backend/node_modules/decompress-response/index.js +0 -58
  193. package/backend/node_modules/decompress-response/license +0 -9
  194. package/backend/node_modules/decompress-response/package.json +0 -56
  195. package/backend/node_modules/deep-extend/index.js +0 -1
  196. package/backend/node_modules/deep-extend/lib/deep-extend.js +0 -150
  197. package/backend/node_modules/deep-extend/package.json +0 -62
  198. package/backend/node_modules/detect-libc/index.d.ts +0 -14
  199. package/backend/node_modules/detect-libc/lib/detect-libc.js +0 -313
  200. package/backend/node_modules/detect-libc/lib/elf.js +0 -39
  201. package/backend/node_modules/detect-libc/lib/filesystem.js +0 -51
  202. package/backend/node_modules/detect-libc/lib/process.js +0 -24
  203. package/backend/node_modules/detect-libc/package.json +0 -44
  204. package/backend/node_modules/expand-template/.travis.yml +0 -6
  205. package/backend/node_modules/expand-template/index.js +0 -26
  206. package/backend/node_modules/expand-template/package.json +0 -29
  207. package/backend/node_modules/expand-template/test.js +0 -67
  208. package/backend/node_modules/file-uri-to-path/.travis.yml +0 -30
  209. package/backend/node_modules/file-uri-to-path/index.d.ts +0 -2
  210. package/backend/node_modules/file-uri-to-path/index.js +0 -66
  211. package/backend/node_modules/file-uri-to-path/package.json +0 -32
  212. package/backend/node_modules/fs-constants/browser.js +0 -1
  213. package/backend/node_modules/fs-constants/index.js +0 -1
  214. package/backend/node_modules/fs-constants/package.json +0 -19
  215. package/backend/node_modules/github-from-package/.travis.yml +0 -4
  216. package/backend/node_modules/github-from-package/index.js +0 -17
  217. package/backend/node_modules/github-from-package/package.json +0 -30
  218. package/backend/node_modules/github-from-package/readme.markdown +0 -53
  219. package/backend/node_modules/ieee754/index.d.ts +0 -10
  220. package/backend/node_modules/ieee754/index.js +0 -85
  221. package/backend/node_modules/ieee754/package.json +0 -52
  222. package/backend/node_modules/ini/ini.js +0 -206
  223. package/backend/node_modules/ini/package.json +0 -33
  224. package/backend/node_modules/mimic-response/index.d.ts +0 -17
  225. package/backend/node_modules/mimic-response/index.js +0 -77
  226. package/backend/node_modules/mimic-response/license +0 -9
  227. package/backend/node_modules/mimic-response/package.json +0 -42
  228. package/backend/node_modules/minimist/.github/FUNDING.yml +0 -12
  229. package/backend/node_modules/minimist/.nycrc +0 -14
  230. package/backend/node_modules/minimist/index.js +0 -263
  231. package/backend/node_modules/minimist/package.json +0 -75
  232. package/backend/node_modules/mkdirp-classic/index.js +0 -98
  233. package/backend/node_modules/mkdirp-classic/package.json +0 -18
  234. package/backend/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +0 -31
  235. package/backend/node_modules/napi-build-utils/index.js +0 -214
  236. package/backend/node_modules/napi-build-utils/package.json +0 -42
  237. package/backend/node_modules/node-abi/abi_registry.json +0 -432
  238. package/backend/node_modules/node-abi/index.js +0 -179
  239. package/backend/node_modules/node-abi/package.json +0 -45
  240. package/backend/node_modules/prebuild-install/asset.js +0 -44
  241. package/backend/node_modules/prebuild-install/bin.js +0 -78
  242. package/backend/node_modules/prebuild-install/download.js +0 -142
  243. package/backend/node_modules/prebuild-install/error.js +0 -14
  244. package/backend/node_modules/prebuild-install/help.txt +0 -16
  245. package/backend/node_modules/prebuild-install/index.js +0 -1
  246. package/backend/node_modules/prebuild-install/log.js +0 -33
  247. package/backend/node_modules/prebuild-install/node_modules/pump/.github/FUNDING.yml +0 -2
  248. package/backend/node_modules/prebuild-install/node_modules/pump/.travis.yml +0 -5
  249. package/backend/node_modules/prebuild-install/node_modules/pump/LICENSE +0 -21
  250. package/backend/node_modules/prebuild-install/node_modules/pump/README.md +0 -74
  251. package/backend/node_modules/prebuild-install/node_modules/pump/SECURITY.md +0 -5
  252. package/backend/node_modules/prebuild-install/node_modules/pump/empty.js +0 -1
  253. package/backend/node_modules/prebuild-install/node_modules/pump/index.js +0 -86
  254. package/backend/node_modules/prebuild-install/node_modules/pump/package.json +0 -30
  255. package/backend/node_modules/prebuild-install/node_modules/pump/test-browser.js +0 -66
  256. package/backend/node_modules/prebuild-install/node_modules/pump/test-node.js +0 -53
  257. package/backend/node_modules/prebuild-install/package.json +0 -67
  258. package/backend/node_modules/prebuild-install/proxy.js +0 -35
  259. package/backend/node_modules/prebuild-install/rc.js +0 -64
  260. package/backend/node_modules/prebuild-install/util.js +0 -143
  261. package/backend/node_modules/rc/browser.js +0 -7
  262. package/backend/node_modules/rc/cli.js +0 -4
  263. package/backend/node_modules/rc/index.js +0 -53
  264. package/backend/node_modules/rc/lib/utils.js +0 -104
  265. package/backend/node_modules/rc/package.json +0 -29
  266. package/backend/node_modules/semver/bin/semver.js +0 -191
  267. package/backend/node_modules/semver/classes/comparator.js +0 -143
  268. package/backend/node_modules/semver/classes/index.js +0 -7
  269. package/backend/node_modules/semver/classes/range.js +0 -557
  270. package/backend/node_modules/semver/classes/semver.js +0 -333
  271. package/backend/node_modules/semver/functions/clean.js +0 -8
  272. package/backend/node_modules/semver/functions/cmp.js +0 -54
  273. package/backend/node_modules/semver/functions/coerce.js +0 -62
  274. package/backend/node_modules/semver/functions/compare-build.js +0 -9
  275. package/backend/node_modules/semver/functions/compare-loose.js +0 -5
  276. package/backend/node_modules/semver/functions/compare.js +0 -7
  277. package/backend/node_modules/semver/functions/diff.js +0 -60
  278. package/backend/node_modules/semver/functions/eq.js +0 -5
  279. package/backend/node_modules/semver/functions/gt.js +0 -5
  280. package/backend/node_modules/semver/functions/gte.js +0 -5
  281. package/backend/node_modules/semver/functions/inc.js +0 -21
  282. package/backend/node_modules/semver/functions/lt.js +0 -5
  283. package/backend/node_modules/semver/functions/lte.js +0 -5
  284. package/backend/node_modules/semver/functions/major.js +0 -5
  285. package/backend/node_modules/semver/functions/minor.js +0 -5
  286. package/backend/node_modules/semver/functions/neq.js +0 -5
  287. package/backend/node_modules/semver/functions/parse.js +0 -18
  288. package/backend/node_modules/semver/functions/patch.js +0 -5
  289. package/backend/node_modules/semver/functions/prerelease.js +0 -8
  290. package/backend/node_modules/semver/functions/rcompare.js +0 -5
  291. package/backend/node_modules/semver/functions/rsort.js +0 -5
  292. package/backend/node_modules/semver/functions/satisfies.js +0 -12
  293. package/backend/node_modules/semver/functions/sort.js +0 -5
  294. package/backend/node_modules/semver/functions/valid.js +0 -8
  295. package/backend/node_modules/semver/index.js +0 -91
  296. package/backend/node_modules/semver/internal/constants.js +0 -37
  297. package/backend/node_modules/semver/internal/debug.js +0 -11
  298. package/backend/node_modules/semver/internal/identifiers.js +0 -29
  299. package/backend/node_modules/semver/internal/lrucache.js +0 -42
  300. package/backend/node_modules/semver/internal/parse-options.js +0 -17
  301. package/backend/node_modules/semver/internal/re.js +0 -223
  302. package/backend/node_modules/semver/package.json +0 -78
  303. package/backend/node_modules/semver/preload.js +0 -4
  304. package/backend/node_modules/semver/range.bnf +0 -16
  305. package/backend/node_modules/semver/ranges/gtr.js +0 -6
  306. package/backend/node_modules/semver/ranges/intersects.js +0 -9
  307. package/backend/node_modules/semver/ranges/ltr.js +0 -6
  308. package/backend/node_modules/semver/ranges/max-satisfying.js +0 -27
  309. package/backend/node_modules/semver/ranges/min-satisfying.js +0 -26
  310. package/backend/node_modules/semver/ranges/min-version.js +0 -63
  311. package/backend/node_modules/semver/ranges/outside.js +0 -82
  312. package/backend/node_modules/semver/ranges/simplify.js +0 -49
  313. package/backend/node_modules/semver/ranges/subset.js +0 -249
  314. package/backend/node_modules/semver/ranges/to-comparators.js +0 -10
  315. package/backend/node_modules/semver/ranges/valid.js +0 -13
  316. package/backend/node_modules/simple-concat/.travis.yml +0 -3
  317. package/backend/node_modules/simple-concat/index.js +0 -15
  318. package/backend/node_modules/simple-concat/package.json +0 -47
  319. package/backend/node_modules/simple-get/.github/dependabot.yml +0 -15
  320. package/backend/node_modules/simple-get/.github/workflows/ci.yml +0 -23
  321. package/backend/node_modules/simple-get/index.js +0 -108
  322. package/backend/node_modules/simple-get/package.json +0 -67
  323. package/backend/node_modules/strip-json-comments/index.js +0 -70
  324. package/backend/node_modules/strip-json-comments/license +0 -21
  325. package/backend/node_modules/strip-json-comments/package.json +0 -42
  326. package/backend/node_modules/tar-fs/.travis.yml +0 -6
  327. package/backend/node_modules/tar-fs/index.js +0 -363
  328. package/backend/node_modules/tar-fs/node_modules/pump/.github/FUNDING.yml +0 -2
  329. package/backend/node_modules/tar-fs/node_modules/pump/.travis.yml +0 -5
  330. package/backend/node_modules/tar-fs/node_modules/pump/LICENSE +0 -21
  331. package/backend/node_modules/tar-fs/node_modules/pump/README.md +0 -74
  332. package/backend/node_modules/tar-fs/node_modules/pump/SECURITY.md +0 -5
  333. package/backend/node_modules/tar-fs/node_modules/pump/empty.js +0 -1
  334. package/backend/node_modules/tar-fs/node_modules/pump/index.js +0 -86
  335. package/backend/node_modules/tar-fs/node_modules/pump/package.json +0 -30
  336. package/backend/node_modules/tar-fs/node_modules/pump/test-browser.js +0 -66
  337. package/backend/node_modules/tar-fs/node_modules/pump/test-node.js +0 -53
  338. package/backend/node_modules/tar-fs/package.json +0 -41
  339. package/backend/node_modules/tar-stream/extract.js +0 -257
  340. package/backend/node_modules/tar-stream/headers.js +0 -295
  341. package/backend/node_modules/tar-stream/index.js +0 -2
  342. package/backend/node_modules/tar-stream/node_modules/bl/.travis.yml +0 -17
  343. package/backend/node_modules/tar-stream/node_modules/bl/BufferList.js +0 -396
  344. package/backend/node_modules/tar-stream/node_modules/bl/LICENSE.md +0 -13
  345. package/backend/node_modules/tar-stream/node_modules/bl/README.md +0 -247
  346. package/backend/node_modules/tar-stream/node_modules/bl/bl.js +0 -84
  347. package/backend/node_modules/tar-stream/node_modules/bl/package.json +0 -37
  348. package/backend/node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  349. package/backend/node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md +0 -136
  350. package/backend/node_modules/tar-stream/node_modules/readable-stream/LICENSE +0 -47
  351. package/backend/node_modules/tar-stream/node_modules/readable-stream/README.md +0 -106
  352. package/backend/node_modules/tar-stream/node_modules/readable-stream/errors-browser.js +0 -127
  353. package/backend/node_modules/tar-stream/node_modules/readable-stream/errors.js +0 -116
  354. package/backend/node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js +0 -17
  355. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  356. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  357. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  358. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  359. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  360. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  361. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  362. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  363. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  364. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  365. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  366. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  367. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  368. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  369. package/backend/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  370. package/backend/node_modules/tar-stream/node_modules/readable-stream/package.json +0 -68
  371. package/backend/node_modules/tar-stream/node_modules/readable-stream/readable-browser.js +0 -9
  372. package/backend/node_modules/tar-stream/node_modules/readable-stream/readable.js +0 -16
  373. package/backend/node_modules/tar-stream/pack.js +0 -255
  374. package/backend/node_modules/tar-stream/package.json +0 -58
  375. package/backend/node_modules/tar-stream/sandbox.js +0 -11
  376. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__008d27c3._.js +0 -3
  377. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__69cb56c5._.js +0 -3
  378. package/frontend/.next/server/chunks/ssr/_e17fe96b._.js +0 -3
  379. package/frontend/.next/static/chunks/641e855850e79de9.css +0 -3
  380. package/frontend/.next/static/chunks/88faea50dcf8f778.js +0 -1
  381. package/frontend/.next/static/chunks/8ffedcb68f4a998f.js +0 -1
  382. package/frontend/.next/static/chunks/a909e37955d0604e.js +0 -1
  383. package/frontend/.next/static/chunks/ba72b58eb8cb3f4e.js +0 -1
  384. package/frontend/.next/static/chunks/c8ee4845be50f9b7.js +0 -1
  385. package/frontend/.next/static/chunks/e975763f7a359fb5.js +0 -1
  386. /package/frontend/.next/static/{3i-dBEEyQLocTNHX5oPZn → w4h18_Clp_ODehKO0HkwI}/_buildManifest.js +0 -0
  387. /package/frontend/.next/static/{3i-dBEEyQLocTNHX5oPZn → w4h18_Clp_ODehKO0HkwI}/_clientMiddlewareManifest.json +0 -0
  388. /package/frontend/.next/static/{3i-dBEEyQLocTNHX5oPZn → w4h18_Clp_ODehKO0HkwI}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"alertChecker.d.ts","sourceRoot":"","sources":["../src/alertChecker.ts"],"names":[],"mappings":"AAmOA,wBAAgB,eAAe,IAAI,IAAI,CAQtC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,OAAO,CAGlD"}
1
+ {"version":3,"file":"alertChecker.d.ts","sourceRoot":"","sources":["../src/alertChecker.ts"],"names":[],"mappings":"AAqRA,wBAAgB,eAAe,IAAI,IAAI,CAStC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,OAAO,CAGlD"}
@@ -197,11 +197,55 @@ function checkCostThresholds() {
197
197
  createAndSendAlert(agent.id, "cost_spike", "warning", `Agent *${agent.name}* exceeded cost threshold — $${agent.costUsd.toFixed(2)} spent (threshold: $${COST_THRESHOLD_USD})`);
198
198
  }
199
199
  }
200
+ function checkSpendLimits() {
201
+ const limitsRow = db_1.default.prepare("SELECT value FROM settings WHERE key = ?").get("cost-limits");
202
+ if (!limitsRow)
203
+ return;
204
+ const limits = JSON.parse(limitsRow.value);
205
+ if (!limits.type || !limits.amount)
206
+ return;
207
+ // Import listSessions dynamically to avoid circular deps
208
+ const { listSessionsSync } = require("./sessions");
209
+ const sessions = listSessionsSync();
210
+ const now = new Date();
211
+ const periodKey = limits.type === "daily" ? now.toISOString().slice(0, 10) : now.toISOString().slice(0, 7);
212
+ const sliceLen = limits.type === "daily" ? 10 : 7;
213
+ // Total spend for period
214
+ const periodSessions = sessions.filter((s) => s.startedAt.slice(0, sliceLen) === periodKey);
215
+ const totalSpend = periodSessions.reduce((sum, s) => sum + s.costUsd, 0);
216
+ const pct = (totalSpend / limits.amount) * 100;
217
+ const periodLabel = limits.type === "daily" ? "today" : "this month";
218
+ // Alert at 80% (warning) — once per period
219
+ if (pct >= 80 && pct < 100) {
220
+ if (!recentAlertExists("_global", "spend_warning", limits.type === "daily" ? 86400000 : 2592000000)) {
221
+ createAndSendAlert("_global", "cost_spike", "warning", `Spend alert: $${totalSpend.toFixed(2)} ${periodLabel} — ${pct.toFixed(0)}% of $${limits.amount} ${limits.type} limit`);
222
+ }
223
+ }
224
+ // Alert at 100% (critical) — once per period
225
+ if (pct >= 100) {
226
+ if (!recentAlertExists("_global", "spend_critical", limits.type === "daily" ? 86400000 : 2592000000)) {
227
+ createAndSendAlert("_global", "cost_spike", "critical", `Spend limit exceeded: $${totalSpend.toFixed(2)} ${periodLabel} — ${pct.toFixed(0)}% of $${limits.amount} ${limits.type} limit`);
228
+ }
229
+ }
230
+ // Per-agent limits
231
+ const agentSpend = {};
232
+ for (const s of periodSessions) {
233
+ agentSpend[s.agentId] = (agentSpend[s.agentId] || 0) + s.costUsd;
234
+ }
235
+ for (const [agentId, agentLimit] of Object.entries(limits.agentLimits)) {
236
+ const spent = agentSpend[agentId] || 0;
237
+ const agentPct = (spent / agentLimit) * 100;
238
+ if (agentPct >= 100 && !recentAlertExists(agentId, "spend_critical", limits.type === "daily" ? 86400000 : 2592000000)) {
239
+ createAndSendAlert(agentId, "cost_spike", "critical", `Agent *${agentId}* exceeded ${limits.type} limit: $${spent.toFixed(2)} / $${agentLimit} ${periodLabel}`);
240
+ }
241
+ }
242
+ }
200
243
  function runAlertChecker() {
201
244
  try {
202
245
  checkStuckAgents();
203
246
  checkErrorSpikes();
204
247
  checkCostThresholds();
248
+ checkSpendLimits();
205
249
  }
206
250
  catch (err) {
207
251
  console.error("[AlertChecker] Error:", err);
@@ -1 +1 @@
1
- {"version":3,"file":"alertChecker.js","sourceRoot":"","sources":["../src/alertChecker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alertChecker.js","sourceRoot":"","sources":["../src/alertChecker.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,36 @@
1
- import Database from "better-sqlite3";
2
- declare const db: InstanceType<typeof Database>;
3
- declare function initDb(): void;
1
+ /**
2
+ * PreparedStatement mimics better-sqlite3's prepared statement API
3
+ * using sql.js under the hood. Statements are lazy — they only touch
4
+ * the database when run/get/all is called, not at creation time.
5
+ */
6
+ declare class PreparedStatement {
7
+ private readonly sql;
8
+ constructor(sql: string);
9
+ run(...params: any[]): {
10
+ changes: number;
11
+ };
12
+ get(...params: any[]): any;
13
+ all(...params: any[]): any[];
14
+ }
15
+ /**
16
+ * Database wrapper providing a better-sqlite3-compatible API
17
+ * backed by sql.js (pure WASM SQLite — no native compilation needed).
18
+ *
19
+ * Why: better-sqlite3 requires native C++ compilation (node-gyp, make, gcc).
20
+ * This fails on locked-down environments like Synology NAS. sql.js runs
21
+ * everywhere Node.js runs with zero native dependencies.
22
+ */
23
+ declare const db: {
24
+ prepare(sql: string): PreparedStatement;
25
+ exec(sql: string): void;
26
+ pragma(pragma: string): void;
27
+ transaction<T>(fn: (...args: any[]) => T): (...args: any[]) => T;
28
+ };
29
+ /**
30
+ * Initialize the sql.js database. Must be called (and awaited) before
31
+ * any DB operations. Loads existing data from disk or creates a new DB.
32
+ */
33
+ declare function initDb(): Promise<void>;
4
34
  export { initDb };
5
35
  export default db;
6
36
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAYtC,QAAA,MAAM,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAyB,CAAC;AAOhE,iBAAS,MAAM,IAAI,IAAI,CAuDtB;AAKD,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,cAAM,iBAAiB;IACT,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAExC,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAY1C,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG;IAW1B,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;CAY7B;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,EAAE;iBACO,MAAM,GAAG,iBAAiB;cAI7B,MAAM,GAAG,IAAI;mBAKR,MAAM,GAAG,IAAI;gBAQhB,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;CAkBjE,CAAC;AAEF;;;GAGG;AACH,iBAAe,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA+ErC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,eAAe,EAAE,CAAC"}
@@ -4,7 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.initDb = initDb;
7
- const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
7
+ // @ts-ignore sql.js ships without declaration files; types are inferred at runtime
8
+ const sql_js_1 = __importDefault(require("sql.js"));
8
9
  const path_1 = __importDefault(require("path"));
9
10
  const os_1 = __importDefault(require("os"));
10
11
  const fs_1 = __importDefault(require("fs"));
@@ -14,13 +15,136 @@ if (!fs_1.default.existsSync(CLAWATCH_DIR)) {
14
15
  fs_1.default.mkdirSync(CLAWATCH_DIR, { recursive: true });
15
16
  }
16
17
  const DB_PATH = path_1.default.join(CLAWATCH_DIR, "clawatch.db");
17
- const db = new better_sqlite3_1.default(DB_PATH);
18
- // Enable WAL mode for better concurrent read performance
19
- db.pragma("journal_mode = WAL");
20
- db.pragma("foreign_keys = ON");
21
- // Auto-init tables immediately (before any imports that call db.prepare)
22
- function initDb() {
23
- db.exec(`
18
+ let sqlDb = null;
19
+ let _inTransaction = false;
20
+ function requireDb() {
21
+ if (!sqlDb)
22
+ throw new Error("Database not initialized call initDb() first");
23
+ return sqlDb;
24
+ }
25
+ function persistDb() {
26
+ if (!sqlDb)
27
+ return;
28
+ fs_1.default.writeFileSync(DB_PATH, Buffer.from(sqlDb.export()));
29
+ }
30
+ /**
31
+ * PreparedStatement mimics better-sqlite3's prepared statement API
32
+ * using sql.js under the hood. Statements are lazy — they only touch
33
+ * the database when run/get/all is called, not at creation time.
34
+ */
35
+ class PreparedStatement {
36
+ sql;
37
+ constructor(sql) {
38
+ this.sql = sql;
39
+ }
40
+ run(...params) {
41
+ const db = requireDb();
42
+ if (params.length > 0) {
43
+ db.run(this.sql, params);
44
+ }
45
+ else {
46
+ db.run(this.sql);
47
+ }
48
+ const changes = db.getRowsModified();
49
+ if (!_inTransaction)
50
+ persistDb();
51
+ return { changes };
52
+ }
53
+ get(...params) {
54
+ const db = requireDb();
55
+ const stmt = db.prepare(this.sql);
56
+ try {
57
+ if (params.length > 0)
58
+ stmt.bind(params);
59
+ return stmt.step() ? stmt.getAsObject() : undefined;
60
+ }
61
+ finally {
62
+ stmt.free();
63
+ }
64
+ }
65
+ all(...params) {
66
+ const db = requireDb();
67
+ const stmt = db.prepare(this.sql);
68
+ try {
69
+ if (params.length > 0)
70
+ stmt.bind(params);
71
+ const rows = [];
72
+ while (stmt.step())
73
+ rows.push(stmt.getAsObject());
74
+ return rows;
75
+ }
76
+ finally {
77
+ stmt.free();
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * Database wrapper providing a better-sqlite3-compatible API
83
+ * backed by sql.js (pure WASM SQLite — no native compilation needed).
84
+ *
85
+ * Why: better-sqlite3 requires native C++ compilation (node-gyp, make, gcc).
86
+ * This fails on locked-down environments like Synology NAS. sql.js runs
87
+ * everywhere Node.js runs with zero native dependencies.
88
+ */
89
+ const db = {
90
+ prepare(sql) {
91
+ return new PreparedStatement(sql);
92
+ },
93
+ exec(sql) {
94
+ requireDb().exec(sql);
95
+ if (!_inTransaction)
96
+ persistDb();
97
+ },
98
+ pragma(pragma) {
99
+ try {
100
+ requireDb().exec(`PRAGMA ${pragma}`);
101
+ }
102
+ catch {
103
+ // Some pragmas (e.g. journal_mode=WAL) are not supported in WASM — ignore gracefully
104
+ }
105
+ },
106
+ transaction(fn) {
107
+ return (...args) => {
108
+ const db = requireDb();
109
+ db.exec("BEGIN");
110
+ _inTransaction = true;
111
+ try {
112
+ const result = fn(...args);
113
+ db.exec("COMMIT");
114
+ _inTransaction = false;
115
+ persistDb();
116
+ return result;
117
+ }
118
+ catch (err) {
119
+ _inTransaction = false;
120
+ try {
121
+ db.exec("ROLLBACK");
122
+ }
123
+ catch { /* best effort */ }
124
+ throw err;
125
+ }
126
+ };
127
+ },
128
+ };
129
+ /**
130
+ * Initialize the sql.js database. Must be called (and awaited) before
131
+ * any DB operations. Loads existing data from disk or creates a new DB.
132
+ */
133
+ async function initDb() {
134
+ const SQL = await (0, sql_js_1.default)();
135
+ // Load existing DB file or create a new one
136
+ if (fs_1.default.existsSync(DB_PATH)) {
137
+ const fileBuffer = fs_1.default.readFileSync(DB_PATH);
138
+ sqlDb = new SQL.Database(fileBuffer);
139
+ }
140
+ else {
141
+ sqlDb = new SQL.Database();
142
+ }
143
+ // Enable foreign keys (WAL mode is not applicable for sql.js — it uses
144
+ // in-memory storage with manual persist to disk)
145
+ sqlDb.exec("PRAGMA foreign_keys = ON");
146
+ // Create tables
147
+ sqlDb.exec(`
24
148
  CREATE TABLE IF NOT EXISTS agents (
25
149
  id TEXT PRIMARY KEY,
26
150
  name TEXT NOT NULL,
@@ -73,9 +197,15 @@ function initDb() {
73
197
  PRIMARY KEY (projectId, sessionId),
74
198
  FOREIGN KEY (projectId) REFERENCES projects(id) ON DELETE CASCADE
75
199
  );
200
+
201
+ CREATE TABLE IF NOT EXISTS settings (
202
+ key TEXT PRIMARY KEY,
203
+ value TEXT NOT NULL,
204
+ updatedAt TEXT NOT NULL
205
+ );
76
206
  `);
207
+ persistDb();
208
+ console.log("[DB] sql.js initialized (pure WASM SQLite — no native deps)");
77
209
  }
78
- // Run immediately so tables exist before other modules call db.prepare()
79
- initDb();
80
210
  exports.default = db;
81
211
  //# sourceMappingURL=db.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":";;;;;AA+ES,wBAAM;AA/Ef,oEAAsC;AACtC,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AAEpB,8DAA8D;AAC9D,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;IACjC,YAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AACD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAEvD,MAAM,EAAE,GAAkC,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;AAEhE,yDAAyD;AACzD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/B,yEAAyE;AACzE,SAAS,MAAM;IACb,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDP,CAAC,CAAC;AACL,CAAC;AAED,yEAAyE;AACzE,MAAM,EAAE,CAAC;AAGT,kBAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":";;;;;AA0MS,wBAAM;AA1Mf,qFAAqF;AACrF,oDAA+B;AAC/B,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AAEpB,8DAA8D;AAC9D,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;IACjC,YAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AACD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAEvD,IAAI,KAAK,GAAQ,IAAI,CAAC;AACtB,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B,SAAS,SAAS;IAChB,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,iBAAiB;IACQ;IAA7B,YAA6B,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAE5C,GAAG,CAAC,GAAG,MAAa;QAClB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc;YAAE,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,GAAG,MAAa;QAClB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAG,MAAa;QAClB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,IAAI,GAAU,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,EAAE,GAAG;IACT,OAAO,CAAC,GAAW;QACjB,OAAO,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,GAAW;QACd,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc;YAAE,SAAS,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC;YACH,SAAS,EAAE,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,qFAAqF;QACvF,CAAC;IACH,CAAC;IAED,WAAW,CAAI,EAAyB;QACtC,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE;YACxB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;YACvB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjB,cAAc,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC3B,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAClB,cAAc,GAAG,KAAK,CAAC;gBACvB,SAAS,EAAE,CAAC;gBACZ,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,cAAc,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC;oBAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBACxD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,KAAK,UAAU,MAAM;IACnB,MAAM,GAAG,GAAG,MAAM,IAAA,gBAAS,GAAE,CAAC;IAE9B,4CAA4C;IAC5C,IAAI,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5C,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,uEAAuE;IACvE,iDAAiD;IACjD,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAEvC,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DV,CAAC,CAAC;IAEH,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;AAC7E,CAAC;AAGD,kBAAe,EAAE,CAAC"}
@@ -7,6 +7,7 @@ const dotenv_1 = __importDefault(require("dotenv"));
7
7
  dotenv_1.default.config();
8
8
  const express_1 = __importDefault(require("express"));
9
9
  const cors_1 = __importDefault(require("cors"));
10
+ const path_1 = __importDefault(require("path"));
10
11
  const db_1 = require("./db");
11
12
  const telegram_1 = require("./telegram");
12
13
  const alertChecker_1 = require("./alertChecker");
@@ -14,41 +15,47 @@ const routes_1 = __importDefault(require("./routes"));
14
15
  const sync_1 = require("./sync");
15
16
  const PORT = parseInt(process.env.PORT || "3001", 10);
16
17
  const API_KEY = process.env.API_KEY || "";
17
- const app = (0, express_1.default)();
18
- app.use((0, cors_1.default)());
19
- app.use(express_1.default.json());
20
- // API key auth middleware (skip if no API_KEY configured)
21
- if (API_KEY) {
22
- app.use("/api", (req, res, next) => {
23
- const key = req.headers["x-clawatch-key"];
24
- if (key !== API_KEY) {
25
- res.status(401).json({ error: "Invalid or missing API key" });
26
- return;
27
- }
28
- next();
18
+ async function main() {
19
+ // Initialize sql.js database (must complete before any DB operations)
20
+ await (0, db_1.initDb)();
21
+ const app = (0, express_1.default)();
22
+ app.use((0, cors_1.default)());
23
+ app.use(express_1.default.json());
24
+ // API key auth middleware (skip if no API_KEY configured)
25
+ if (API_KEY) {
26
+ app.use("/api", (req, res, next) => {
27
+ const key = req.headers["x-clawatch-key"];
28
+ if (key !== API_KEY) {
29
+ res.status(401).json({ error: "Invalid or missing API key" });
30
+ return;
31
+ }
32
+ next();
33
+ });
34
+ }
35
+ app.use("/api", routes_1.default);
36
+ // Health check
37
+ app.get("/health", (_req, res) => {
38
+ res.json({ status: "ok", timestamp: new Date().toISOString() });
29
39
  });
30
- }
31
- app.use("/api", routes_1.default);
32
- // Health check
33
- app.get("/health", (_req, res) => {
34
- res.json({ status: "ok", timestamp: new Date().toISOString() });
35
- });
36
- // Serve embedded dashboard
37
- const path_1 = __importDefault(require("path"));
38
- app.use(express_1.default.static(path_1.default.join(__dirname, "..", "public")));
39
- app.get("*", (_req, res) => {
40
- res.sendFile(path_1.default.join(__dirname, "..", "public", "index.html"));
41
- });
42
- // Init
43
- (0, db_1.initDb)();
44
- (0, telegram_1.initTelegram)();
45
- // Sync all data from ~/.openclaw JSONL files into DB on startup
46
- (0, sync_1.syncAllData)().then(() => {
40
+ // Serve embedded dashboard
41
+ app.use(express_1.default.static(path_1.default.join(__dirname, "..", "public")));
42
+ app.get("*", (_req, res) => {
43
+ res.sendFile(path_1.default.join(__dirname, "..", "public", "index.html"));
44
+ });
45
+ // Init services
46
+ (0, telegram_1.initTelegram)();
47
+ // Sync all data from ~/.openclaw JSONL files into DB on startup
48
+ await (0, sync_1.syncAllData)();
47
49
  (0, alertChecker_1.startAlertChecker)();
48
- // Re-sync periodically (every 60s) to keep DB in sync with JSONL
49
- setInterval(() => (0, sync_1.syncAllData)(), 60_000);
50
- });
51
- app.listen(PORT, () => {
52
- console.log(`[ClaWatch] Backend running on http://localhost:${PORT}`);
50
+ // Re-sync periodically (every 15s) to keep DB in sync with JSONL
51
+ // Reduced from 60s to match session freshness and keep agents tab in sync
52
+ setInterval(() => (0, sync_1.syncAllData)(), 15_000);
53
+ app.listen(PORT, () => {
54
+ console.log(`[ClaWatch] Backend running on http://localhost:${PORT}`);
55
+ });
56
+ }
57
+ main().catch((err) => {
58
+ console.error("[ClaWatch] Fatal startup error:", err);
59
+ process.exit(1);
53
60
  });
54
61
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAC5B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,sDAA8B;AAC9B,gDAAwB;AACxB,6BAA8B;AAC9B,yCAA0C;AAC1C,iDAAmD;AACnD,sDAA8B;AAC9B,iCAAqC;AAErC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AACtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AAE1C,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;AAEtB,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;AAChB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAExB,0DAA0D;AAC1D,IAAI,OAAO,EAAE,CAAC;IACZ,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC1C,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAM,CAAC,CAAC;AAExB,eAAe;AACf,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,2BAA2B;AAC3B,gDAAwB;AACxB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACzB,GAAG,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC;AAEH,OAAO;AACP,IAAA,WAAM,GAAE,CAAC;AACT,IAAA,uBAAY,GAAE,CAAC;AAEf,gEAAgE;AAChE,IAAA,kBAAW,GAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACtB,IAAA,gCAAiB,GAAE,CAAC;IACpB,iEAAiE;IACjE,WAAW,CAAC,GAAG,EAAE,CAAC,IAAA,kBAAW,GAAE,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAC5B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,sDAA8B;AAC9B,gDAAwB;AACxB,gDAAwB;AACxB,6BAA8B;AAC9B,yCAA0C;AAC1C,iDAAmD;AACnD,sDAA8B;AAC9B,iCAAqC;AAErC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AACtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;AAE1C,KAAK,UAAU,IAAI;IACjB,sEAAsE;IACtE,MAAM,IAAA,WAAM,GAAE,CAAC;IAEf,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IAEtB,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;IAChB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,0DAA0D;IAC1D,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC1C,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAM,CAAC,CAAC;IAExB,eAAe;IACf,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACzB,GAAG,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,gBAAgB;IAChB,IAAA,uBAAY,GAAE,CAAC;IAEf,gEAAgE;IAChE,MAAM,IAAA,kBAAW,GAAE,CAAC;IACpB,IAAA,gCAAiB,GAAE,CAAC;IAEpB,iEAAiE;IACjE,0EAA0E;IAC1E,WAAW,CAAC,GAAG,EAAE,CAAC,IAAA,kBAAW,GAAE,EAAE,MAAM,CAAC,CAAC;IAEzC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACpB,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAkBA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAg7BxB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAmBA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAuiCxB,eAAe,MAAM,CAAC"}
@@ -41,8 +41,12 @@ const fs = __importStar(require("fs"));
41
41
  const path = __importStar(require("path"));
42
42
  const db_1 = __importDefault(require("./db"));
43
43
  const sessions_1 = require("./sessions");
44
+ const sync_1 = require("./sync");
44
45
  const projects_1 = require("./projects");
45
46
  const router = (0, express_1.Router)();
47
+ // ---------- Shared prepared statements ----------
48
+ const getSetting = db_1.default.prepare("SELECT value FROM settings WHERE key = ?");
49
+ const upsertSetting = db_1.default.prepare("INSERT INTO settings (key, value, updatedAt) VALUES (?, ?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value, updatedAt = excluded.updatedAt");
46
50
  // ---------- Profiles ----------
47
51
  router.get("/profiles", (_req, res) => {
48
52
  const profiles = (0, sessions_1.discoverProfiles)();
@@ -73,6 +77,13 @@ router.get("/version", (_req, res) => {
73
77
  });
74
78
  // ---------- Agents ----------
75
79
  router.get("/agents", async (_req, res) => {
80
+ // Trigger sync if last sync was >10s ago (keeps agents fresh with sessions)
81
+ if (Date.now() - (0, sync_1.getLastSyncTime)() > 10_000) {
82
+ try {
83
+ await (0, sync_1.syncAllData)();
84
+ }
85
+ catch { /* non-fatal */ }
86
+ }
76
87
  const statusFilter = _req.query.status || "active";
77
88
  const profileFilter = _req.query.profile;
78
89
  const agents = db_1.default.prepare("SELECT * FROM agents ORDER BY costUsd DESC").all();
@@ -81,17 +92,40 @@ router.get("/agents", async (_req, res) => {
81
92
  ? agents
82
93
  : agents.filter((a) => a.status === statusFilter);
83
94
  // Filter by profile: only return agents that have sessions in the selected profile
84
- if (profileFilter) {
85
- try {
86
- const sessions = await (0, sessions_1.listSessions)(profileFilter);
87
- const agentIdsInProfile = new Set(sessions.map((s) => s.agentId));
88
- filtered = filtered.filter((a) => agentIdsInProfile.has(a.id));
89
- }
90
- catch {
91
- // If profile lookup fails, return unfiltered
92
- }
95
+ let sessions = [];
96
+ try {
97
+ sessions = await (0, sessions_1.listSessions)(profileFilter);
93
98
  }
94
- res.json({ agents: filtered });
99
+ catch { /* ignore */ }
100
+ if (profileFilter) {
101
+ const agentIdsInProfile = new Set(sessions.map((s) => s.agentId));
102
+ filtered = filtered.filter((a) => agentIdsInProfile.has(a.id));
103
+ }
104
+ // Enrich with spend data
105
+ const now = new Date();
106
+ const todayStr = now.toISOString().slice(0, 10);
107
+ const monthStr = now.toISOString().slice(0, 7);
108
+ const limitsRow = getSetting?.get("cost-limits");
109
+ const limits = limitsRow ? JSON.parse(limitsRow.value) : { type: null, amount: null, agentLimits: {} };
110
+ const enriched = filtered.map((a) => {
111
+ const agentSessions = sessions.filter((s) => s.agentId === a.id);
112
+ const todaySpend = agentSessions.filter((s) => s.startedAt.slice(0, 10) === todayStr).reduce((sum, s) => sum + s.costUsd, 0);
113
+ const mtdSpend = agentSessions.filter((s) => s.startedAt.slice(0, 7) === monthStr).reduce((sum, s) => sum + s.costUsd, 0);
114
+ const agentLimit = limits.agentLimits?.[a.id] ?? limits.amount;
115
+ const limitType = limits.type;
116
+ const currentSpend = limitType === "daily" ? todaySpend : limitType === "monthly" ? mtdSpend : null;
117
+ const usagePercent = agentLimit && currentSpend !== null ? (currentSpend / agentLimit) * 100 : null;
118
+ return {
119
+ ...a,
120
+ todaySpend: +todaySpend.toFixed(2),
121
+ mtdSpend: +mtdSpend.toFixed(2),
122
+ limit: agentLimit ?? null,
123
+ limitType,
124
+ usagePercent: usagePercent !== null ? +usagePercent.toFixed(1) : null,
125
+ overLimit: usagePercent !== null && usagePercent >= 100,
126
+ };
127
+ });
128
+ res.json({ agents: enriched, limits });
95
129
  });
96
130
  router.get("/agents/:id", (req, res) => {
97
131
  const agent = db_1.default.prepare("SELECT * FROM agents WHERE id = ?").get(req.params.id);
@@ -827,7 +861,10 @@ router.get("/analytics", async (req, res) => {
827
861
  ...(bMap.get(date) || zeroBucket),
828
862
  })),
829
863
  }));
830
- res.json({ buckets, byAgent, byProject });
864
+ // Include cost limits for chart reference lines
865
+ const limitsRow2 = getSetting.get("cost-limits");
866
+ const costLimits = limitsRow2 ? JSON.parse(limitsRow2.value) : null;
867
+ res.json({ buckets, byAgent, byProject, limits: costLimits });
831
868
  }
832
869
  catch (err) {
833
870
  res.status(500).json({ error: err.message || "Failed to get analytics" });
@@ -891,5 +928,75 @@ router.delete("/projects/:id/sessions/:sessionId", (req, res) => {
891
928
  }
892
929
  res.json({ ok: true });
893
930
  });
931
+ // ---------- Settings ----------
932
+ router.get("/settings/cost-limits", (_req, res) => {
933
+ const row = getSetting.get("cost-limits");
934
+ if (!row) {
935
+ res.json({ type: null, amount: null, agentLimits: {} });
936
+ return;
937
+ }
938
+ res.json(JSON.parse(row.value));
939
+ });
940
+ router.put("/settings/cost-limits", (req, res) => {
941
+ const { type, amount, agentLimits } = req.body;
942
+ if (type && !["daily", "monthly"].includes(type)) {
943
+ res.status(400).json({ error: "type must be 'daily' or 'monthly'" });
944
+ return;
945
+ }
946
+ const config = {
947
+ type: type || null,
948
+ amount: typeof amount === "number" ? amount : null,
949
+ agentLimits: agentLimits || {},
950
+ };
951
+ upsertSetting.run("cost-limits", JSON.stringify(config), new Date().toISOString());
952
+ res.json({ ok: true, ...config });
953
+ });
954
+ // ---------- Spend ----------
955
+ router.get("/spend", async (req, res) => {
956
+ try {
957
+ const profile = req.query.profile;
958
+ const sessions = await (0, sessions_1.listSessions)(profile);
959
+ const now = new Date();
960
+ // Today's spend (UTC day)
961
+ const todayStr = now.toISOString().slice(0, 10);
962
+ const todaySessions = sessions.filter((s) => s.startedAt.slice(0, 10) === todayStr);
963
+ const todaySpend = todaySessions.reduce((sum, s) => sum + s.costUsd, 0);
964
+ // MTD spend (current month)
965
+ const monthStr = now.toISOString().slice(0, 7); // "2026-03"
966
+ const mtdSessions = sessions.filter((s) => s.startedAt.slice(0, 7) === monthStr);
967
+ const mtdSpend = mtdSessions.reduce((sum, s) => sum + s.costUsd, 0);
968
+ // Per-agent breakdown for today and MTD
969
+ const byAgent = {};
970
+ for (const s of sessions) {
971
+ if (!byAgent[s.agentId])
972
+ byAgent[s.agentId] = { today: 0, mtd: 0 };
973
+ if (s.startedAt.slice(0, 10) === todayStr)
974
+ byAgent[s.agentId].today += s.costUsd;
975
+ if (s.startedAt.slice(0, 7) === monthStr)
976
+ byAgent[s.agentId].mtd += s.costUsd;
977
+ }
978
+ // Get cost limits
979
+ const limitsRow = getSetting.get("cost-limits");
980
+ const limits = limitsRow ? JSON.parse(limitsRow.value) : { type: null, amount: null, agentLimits: {} };
981
+ // Calculate usage percentage
982
+ let usagePercent = null;
983
+ if (limits.type && limits.amount) {
984
+ const currentSpend = limits.type === "daily" ? todaySpend : mtdSpend;
985
+ usagePercent = (currentSpend / limits.amount) * 100;
986
+ }
987
+ res.json({
988
+ today: +todaySpend.toFixed(2),
989
+ mtd: +mtdSpend.toFixed(2),
990
+ byAgent,
991
+ limits,
992
+ usagePercent: usagePercent !== null ? +usagePercent.toFixed(1) : null,
993
+ periodLabel: limits.type === "daily" ? "Daily" : limits.type === "monthly" ? "Monthly" : null,
994
+ currentSpend: limits.type === "daily" ? +todaySpend.toFixed(2) : limits.type === "monthly" ? +mtdSpend.toFixed(2) : null,
995
+ });
996
+ }
997
+ catch (err) {
998
+ res.status(500).json({ error: err.message || "Failed to get spend data" });
999
+ }
1000
+ });
894
1001
  exports.default = router;
895
1002
  //# sourceMappingURL=routes.js.map