@jait/gateway 0.1.461 → 0.1.463

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 (406) hide show
  1. package/dist/api-contracts.d.ts +29 -0
  2. package/dist/api-contracts.d.ts.map +1 -0
  3. package/dist/api-contracts.js +2 -0
  4. package/dist/api-contracts.js.map +1 -0
  5. package/dist/cli/doctor.js +1 -1
  6. package/dist/cli/doctor.js.map +1 -1
  7. package/dist/db/connection.d.ts.map +1 -1
  8. package/dist/db/connection.js +15 -8
  9. package/dist/db/connection.js.map +1 -1
  10. package/dist/db/migrations.d.ts.map +1 -1
  11. package/dist/db/migrations.js +185 -0
  12. package/dist/db/migrations.js.map +1 -1
  13. package/dist/db/schema.d.ts +71 -35
  14. package/dist/db/schema.d.ts.map +1 -1
  15. package/dist/db/schema.js +21 -19
  16. package/dist/db/schema.js.map +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +108 -67
  19. package/dist/index.js.map +1 -1
  20. package/dist/memory/contracts.d.ts +2 -1
  21. package/dist/memory/contracts.d.ts.map +1 -1
  22. package/dist/memory/service.d.ts +1 -0
  23. package/dist/memory/service.d.ts.map +1 -1
  24. package/dist/memory/service.js +110 -11
  25. package/dist/memory/service.js.map +1 -1
  26. package/dist/memory/sqlite-backend.d.ts +1 -0
  27. package/dist/memory/sqlite-backend.d.ts.map +1 -1
  28. package/dist/memory/sqlite-backend.js +15 -0
  29. package/dist/memory/sqlite-backend.js.map +1 -1
  30. package/dist/plugins/contracts.d.ts +1 -1
  31. package/dist/plugins/contracts.d.ts.map +1 -1
  32. package/dist/plugins/manager.d.ts +2 -2
  33. package/dist/plugins/manager.d.ts.map +1 -1
  34. package/dist/plugins/manager.js +3 -3
  35. package/dist/plugins/manager.js.map +1 -1
  36. package/dist/providers/contracts.d.ts +2 -61
  37. package/dist/providers/contracts.d.ts.map +1 -1
  38. package/dist/providers/jait-provider.js +6 -6
  39. package/dist/providers/jait-provider.js.map +1 -1
  40. package/dist/providers/model-fetchers.d.ts +18 -0
  41. package/dist/providers/model-fetchers.d.ts.map +1 -0
  42. package/dist/providers/model-fetchers.js +136 -0
  43. package/dist/providers/model-fetchers.js.map +1 -0
  44. package/dist/providers/provider-auth.d.ts +1 -0
  45. package/dist/providers/provider-auth.d.ts.map +1 -1
  46. package/dist/providers/provider-auth.js +33 -4
  47. package/dist/providers/provider-auth.js.map +1 -1
  48. package/dist/providers/registry.d.ts +1 -1
  49. package/dist/providers/registry.d.ts.map +1 -1
  50. package/dist/providers/registry.js +2 -2
  51. package/dist/providers/registry.js.map +1 -1
  52. package/dist/routes/architecture.js +10 -10
  53. package/dist/routes/architecture.js.map +1 -1
  54. package/dist/routes/auth.js +10 -10
  55. package/dist/routes/auth.js.map +1 -1
  56. package/dist/routes/chat.d.ts +2 -2
  57. package/dist/routes/chat.d.ts.map +1 -1
  58. package/dist/routes/chat.js +197 -77
  59. package/dist/routes/chat.js.map +1 -1
  60. package/dist/routes/environment.d.ts +2 -2
  61. package/dist/routes/environment.d.ts.map +1 -1
  62. package/dist/routes/environment.js +11 -11
  63. package/dist/routes/environment.js.map +1 -1
  64. package/dist/routes/filesystem.d.ts +1 -1
  65. package/dist/routes/filesystem.js +1 -1
  66. package/dist/routes/git.js +1 -1
  67. package/dist/routes/git.js.map +1 -1
  68. package/dist/routes/jobs.js +2 -2
  69. package/dist/routes/jobs.js.map +1 -1
  70. package/dist/routes/mcp-server.d.ts +1 -1
  71. package/dist/routes/mcp-server.d.ts.map +1 -1
  72. package/dist/routes/mcp-server.js +13 -13
  73. package/dist/routes/mcp-server.js.map +1 -1
  74. package/dist/routes/preview.js +1 -1
  75. package/dist/routes/preview.js.map +1 -1
  76. package/dist/routes/project.d.ts +16 -0
  77. package/dist/routes/project.d.ts.map +1 -0
  78. package/dist/routes/{workspace.js → project.js} +100 -100
  79. package/dist/routes/project.js.map +1 -0
  80. package/dist/routes/projects.d.ts +15 -0
  81. package/dist/routes/projects.d.ts.map +1 -0
  82. package/dist/routes/{workspaces.js → projects.js} +98 -98
  83. package/dist/routes/projects.js.map +1 -0
  84. package/dist/routes/providers.d.ts.map +1 -1
  85. package/dist/routes/providers.js +1 -96
  86. package/dist/routes/providers.js.map +1 -1
  87. package/dist/routes/reminders.d.ts +2 -2
  88. package/dist/routes/reminders.d.ts.map +1 -1
  89. package/dist/routes/reminders.js +39 -17
  90. package/dist/routes/reminders.js.map +1 -1
  91. package/dist/routes/repo-proposals.d.ts.map +1 -1
  92. package/dist/routes/repo-proposals.js +16 -10
  93. package/dist/routes/repo-proposals.js.map +1 -1
  94. package/dist/routes/repositories.d.ts +2 -2
  95. package/dist/routes/repositories.d.ts.map +1 -1
  96. package/dist/routes/repositories.js +7 -6
  97. package/dist/routes/repositories.js.map +1 -1
  98. package/dist/routes/sessions.d.ts +2 -2
  99. package/dist/routes/sessions.d.ts.map +1 -1
  100. package/dist/routes/sessions.js +20 -20
  101. package/dist/routes/sessions.js.map +1 -1
  102. package/dist/routes/terminals.js +7 -7
  103. package/dist/routes/terminals.js.map +1 -1
  104. package/dist/routes/threads.js +2 -2
  105. package/dist/routes/threads.js.map +1 -1
  106. package/dist/scheduler/hooks.d.ts +1 -1
  107. package/dist/scheduler/hooks.d.ts.map +1 -1
  108. package/dist/scheduler/hooks.js +5 -5
  109. package/dist/scheduler/hooks.js.map +1 -1
  110. package/dist/scheduler/service.d.ts +3 -3
  111. package/dist/scheduler/service.d.ts.map +1 -1
  112. package/dist/scheduler/service.js +8 -8
  113. package/dist/scheduler/service.js.map +1 -1
  114. package/dist/security/path-guard.d.ts +6 -6
  115. package/dist/security/path-guard.d.ts.map +1 -1
  116. package/dist/security/path-guard.js +8 -8
  117. package/dist/security/path-guard.js.map +1 -1
  118. package/dist/security/sandbox-manager.d.ts +5 -5
  119. package/dist/security/sandbox-manager.d.ts.map +1 -1
  120. package/dist/security/sandbox-manager.js +14 -14
  121. package/dist/security/sandbox-manager.js.map +1 -1
  122. package/dist/security/tool-permissions.d.ts +1 -1
  123. package/dist/security/tool-permissions.d.ts.map +1 -1
  124. package/dist/security/tool-profiles.d.ts.map +1 -1
  125. package/dist/security/tool-profiles.js +15 -12
  126. package/dist/security/tool-profiles.js.map +1 -1
  127. package/dist/server.d.ts +4 -4
  128. package/dist/server.d.ts.map +1 -1
  129. package/dist/server.js +16 -16
  130. package/dist/server.js.map +1 -1
  131. package/dist/services/architecture-diagrams.d.ts +3 -3
  132. package/dist/services/architecture-diagrams.d.ts.map +1 -1
  133. package/dist/services/architecture-diagrams.js +19 -19
  134. package/dist/services/architecture-diagrams.js.map +1 -1
  135. package/dist/services/git.d.ts +1 -1
  136. package/dist/services/git.d.ts.map +1 -1
  137. package/dist/services/git.js +3 -3
  138. package/dist/services/git.js.map +1 -1
  139. package/dist/services/live-view-manager.d.ts +1 -1
  140. package/dist/services/live-view-manager.d.ts.map +1 -1
  141. package/dist/services/live-view-manager.js +2 -2
  142. package/dist/services/live-view-manager.js.map +1 -1
  143. package/dist/services/plans.d.ts +2 -13
  144. package/dist/services/plans.d.ts.map +1 -1
  145. package/dist/services/plans.js.map +1 -1
  146. package/dist/services/preview-runner.d.ts +5 -5
  147. package/dist/services/preview-runner.d.ts.map +1 -1
  148. package/dist/services/preview-runner.js +19 -19
  149. package/dist/services/preview-runner.js.map +1 -1
  150. package/dist/services/preview.d.ts +2 -2
  151. package/dist/services/preview.d.ts.map +1 -1
  152. package/dist/services/preview.js +8 -8
  153. package/dist/services/preview.js.map +1 -1
  154. package/dist/services/project-repositories.d.ts +35 -0
  155. package/dist/services/project-repositories.d.ts.map +1 -0
  156. package/dist/services/{workspace-repositories.js → project-repositories.js} +34 -34
  157. package/dist/services/project-repositories.js.map +1 -0
  158. package/dist/services/project-state.d.ts +8 -0
  159. package/dist/services/project-state.d.ts.map +1 -0
  160. package/dist/services/{workspace-state.js → project-state.js} +25 -25
  161. package/dist/services/project-state.js.map +1 -0
  162. package/dist/services/{workspace-watcher.d.ts → project-watcher.d.ts} +8 -8
  163. package/dist/services/project-watcher.d.ts.map +1 -0
  164. package/dist/services/{workspace-watcher.js → project-watcher.js} +7 -7
  165. package/dist/services/project-watcher.js.map +1 -0
  166. package/dist/services/{workspaces.d.ts → projects.d.ts} +13 -13
  167. package/dist/services/projects.d.ts.map +1 -0
  168. package/dist/services/{workspaces.js → projects.js} +54 -54
  169. package/dist/services/projects.js.map +1 -0
  170. package/dist/services/reminders.d.ts +16 -4
  171. package/dist/services/reminders.d.ts.map +1 -1
  172. package/dist/services/reminders.js +152 -11
  173. package/dist/services/reminders.js.map +1 -1
  174. package/dist/services/repo-proposals.d.ts +3 -14
  175. package/dist/services/repo-proposals.d.ts.map +1 -1
  176. package/dist/services/repo-proposals.js.map +1 -1
  177. package/dist/services/repositories.d.ts +3 -13
  178. package/dist/services/repositories.d.ts.map +1 -1
  179. package/dist/services/repositories.js +10 -2
  180. package/dist/services/repositories.js.map +1 -1
  181. package/dist/services/session-search.d.ts +34 -0
  182. package/dist/services/session-search.d.ts.map +1 -0
  183. package/dist/services/session-search.js +137 -0
  184. package/dist/services/session-search.js.map +1 -0
  185. package/dist/services/session-state.js +1 -1
  186. package/dist/services/sessions.d.ts +22 -22
  187. package/dist/services/sessions.d.ts.map +1 -1
  188. package/dist/services/sessions.js +21 -21
  189. package/dist/services/sessions.js.map +1 -1
  190. package/dist/services/threads.d.ts +3 -50
  191. package/dist/services/threads.d.ts.map +1 -1
  192. package/dist/services/threads.js.map +1 -1
  193. package/dist/services/users.d.ts +4 -4
  194. package/dist/services/users.d.ts.map +1 -1
  195. package/dist/services/users.js +16 -16
  196. package/dist/services/users.js.map +1 -1
  197. package/dist/sessions/contracts.d.ts +4 -4
  198. package/dist/sessions/contracts.d.ts.map +1 -1
  199. package/dist/skills/index.d.ts +1 -1
  200. package/dist/skills/index.d.ts.map +1 -1
  201. package/dist/surfaces/browser.js +1 -1
  202. package/dist/surfaces/browser.js.map +1 -1
  203. package/dist/surfaces/contracts.d.ts +1 -1
  204. package/dist/surfaces/contracts.d.ts.map +1 -1
  205. package/dist/surfaces/filesystem.d.ts +1 -1
  206. package/dist/surfaces/filesystem.d.ts.map +1 -1
  207. package/dist/surfaces/filesystem.js +18 -18
  208. package/dist/surfaces/filesystem.js.map +1 -1
  209. package/dist/surfaces/remote-filesystem.d.ts +2 -2
  210. package/dist/surfaces/remote-filesystem.d.ts.map +1 -1
  211. package/dist/surfaces/remote-filesystem.js +6 -6
  212. package/dist/surfaces/remote-filesystem.js.map +1 -1
  213. package/dist/surfaces/terminal.js +2 -2
  214. package/dist/surfaces/terminal.js.map +1 -1
  215. package/dist/tools/agent-loop.d.ts +15 -0
  216. package/dist/tools/agent-loop.d.ts.map +1 -1
  217. package/dist/tools/agent-loop.js +121 -14
  218. package/dist/tools/agent-loop.js.map +1 -1
  219. package/dist/tools/agent-tools.d.ts.map +1 -1
  220. package/dist/tools/agent-tools.js +2 -1
  221. package/dist/tools/agent-tools.js.map +1 -1
  222. package/dist/tools/architecture-tools.js +8 -8
  223. package/dist/tools/architecture-tools.js.map +1 -1
  224. package/dist/tools/browser-tools.d.ts +1 -1
  225. package/dist/tools/browser-tools.d.ts.map +1 -1
  226. package/dist/tools/browser-tools.js +3 -3
  227. package/dist/tools/browser-tools.js.map +1 -1
  228. package/dist/tools/chat-modes.d.ts +1 -1
  229. package/dist/tools/chat-modes.d.ts.map +1 -1
  230. package/dist/tools/chat-modes.js +2 -0
  231. package/dist/tools/chat-modes.js.map +1 -1
  232. package/dist/tools/contracts.d.ts +1 -1
  233. package/dist/tools/contracts.d.ts.map +1 -1
  234. package/dist/tools/core/execute.d.ts +1 -1
  235. package/dist/tools/core/execute.d.ts.map +1 -1
  236. package/dist/tools/core/execute.js +1 -1
  237. package/dist/tools/core/execute.js.map +1 -1
  238. package/dist/tools/core/get-fs.d.ts +9 -9
  239. package/dist/tools/core/get-fs.d.ts.map +1 -1
  240. package/dist/tools/core/get-fs.js +20 -20
  241. package/dist/tools/core/get-fs.js.map +1 -1
  242. package/dist/tools/core/jait.d.ts +3 -3
  243. package/dist/tools/core/jait.d.ts.map +1 -1
  244. package/dist/tools/core/jait.js +9 -9
  245. package/dist/tools/core/jait.js.map +1 -1
  246. package/dist/tools/core/read.d.ts +1 -1
  247. package/dist/tools/core/read.d.ts.map +1 -1
  248. package/dist/tools/core/search.d.ts +2 -2
  249. package/dist/tools/core/search.d.ts.map +1 -1
  250. package/dist/tools/core/search.js +5 -5
  251. package/dist/tools/core/search.js.map +1 -1
  252. package/dist/tools/cron-tools.js +2 -2
  253. package/dist/tools/cron-tools.js.map +1 -1
  254. package/dist/tools/elevated-tools.js +3 -3
  255. package/dist/tools/elevated-tools.js.map +1 -1
  256. package/dist/tools/file-tools.js +4 -4
  257. package/dist/tools/file-tools.js.map +1 -1
  258. package/dist/tools/index.d.ts +7 -4
  259. package/dist/tools/index.d.ts.map +1 -1
  260. package/dist/tools/index.js +14 -7
  261. package/dist/tools/index.js.map +1 -1
  262. package/dist/tools/memory-tools.d.ts +8 -4
  263. package/dist/tools/memory-tools.d.ts.map +1 -1
  264. package/dist/tools/memory-tools.js +58 -11
  265. package/dist/tools/memory-tools.js.map +1 -1
  266. package/dist/tools/preview-tools.d.ts +1 -1
  267. package/dist/tools/preview-tools.d.ts.map +1 -1
  268. package/dist/tools/preview-tools.js +10 -10
  269. package/dist/tools/preview-tools.js.map +1 -1
  270. package/dist/tools/{workspace-tools.d.ts → project-tools.d.ts} +4 -4
  271. package/dist/tools/project-tools.d.ts.map +1 -0
  272. package/dist/tools/{workspace-tools.js → project-tools.js} +28 -28
  273. package/dist/tools/project-tools.js.map +1 -0
  274. package/dist/tools/prompts/claude-prompt.js +4 -4
  275. package/dist/tools/prompts/default-openai-prompt.js +1 -1
  276. package/dist/tools/prompts/default-prompt.js +1 -1
  277. package/dist/tools/prompts/gemini-prompt.js +4 -4
  278. package/dist/tools/prompts/gpt5-prompt.js +3 -3
  279. package/dist/tools/prompts/gpt51-prompt.js +2 -2
  280. package/dist/tools/prompts/gpt52-prompt.js +2 -2
  281. package/dist/tools/prompts/prompt-registry.d.ts +2 -2
  282. package/dist/tools/prompts/prompt-registry.d.ts.map +1 -1
  283. package/dist/tools/prompts/prompt-registry.js +5 -5
  284. package/dist/tools/prompts/prompt-registry.js.map +1 -1
  285. package/dist/tools/prompts/shared-sections.d.ts +3 -3
  286. package/dist/tools/prompts/shared-sections.d.ts.map +1 -1
  287. package/dist/tools/prompts/shared-sections.js +12 -10
  288. package/dist/tools/prompts/shared-sections.js.map +1 -1
  289. package/dist/tools/prompts/xai-prompt.js +2 -2
  290. package/dist/tools/remote-executor.d.ts +7 -7
  291. package/dist/tools/remote-executor.d.ts.map +1 -1
  292. package/dist/tools/remote-executor.js +14 -13
  293. package/dist/tools/remote-executor.js.map +1 -1
  294. package/dist/tools/repo-proposal-tools.js +5 -5
  295. package/dist/tools/repo-proposal-tools.js.map +1 -1
  296. package/dist/tools/session-search-tools.d.ts +12 -0
  297. package/dist/tools/session-search-tools.d.ts.map +1 -0
  298. package/dist/tools/session-search-tools.js +59 -0
  299. package/dist/tools/session-search-tools.js.map +1 -0
  300. package/dist/tools/ssh-tools.js +1 -1
  301. package/dist/tools/ssh-tools.js.map +1 -1
  302. package/dist/tools/surface-tools.d.ts +1 -1
  303. package/dist/tools/surface-tools.d.ts.map +1 -1
  304. package/dist/tools/surface-tools.js +2 -2
  305. package/dist/tools/surface-tools.js.map +1 -1
  306. package/dist/tools/terminal-tools.d.ts +2 -2
  307. package/dist/tools/terminal-tools.d.ts.map +1 -1
  308. package/dist/tools/terminal-tools.js +10 -10
  309. package/dist/tools/terminal-tools.js.map +1 -1
  310. package/dist/tools/thread-tools.d.ts.map +1 -1
  311. package/dist/tools/thread-tools.js +53 -8
  312. package/dist/tools/thread-tools.js.map +1 -1
  313. package/dist/tools/token-estimator.d.ts.map +1 -1
  314. package/dist/tools/token-estimator.js +30 -1
  315. package/dist/tools/token-estimator.js.map +1 -1
  316. package/dist/tools/tool-names.d.ts +2 -1
  317. package/dist/tools/tool-names.d.ts.map +1 -1
  318. package/dist/tools/tool-names.js +2 -1
  319. package/dist/tools/tool-names.js.map +1 -1
  320. package/dist/voice-assistant/service.d.ts +1 -1
  321. package/dist/voice-assistant/service.js +4 -4
  322. package/dist/voice-assistant/tools.d.ts +2 -2
  323. package/dist/voice-assistant/tools.d.ts.map +1 -1
  324. package/dist/voice-assistant/tools.js +14 -14
  325. package/dist/voice-assistant/tools.js.map +1 -1
  326. package/dist/ws.d.ts +1 -1
  327. package/dist/ws.d.ts.map +1 -1
  328. package/dist/ws.js +2 -2
  329. package/dist/ws.js.map +1 -1
  330. package/package.json +2 -2
  331. package/web-dist/assets/{_basePickBy-BxTNhXHf.js → _basePickBy-BM8eesD4.js} +1 -1
  332. package/web-dist/assets/{_baseUniq-BzmTBuCK.js → _baseUniq-BM6-oAti.js} +1 -1
  333. package/web-dist/assets/{arc-D_str31s.js → arc-DCuHZnW6.js} +1 -1
  334. package/web-dist/assets/{architectureDiagram-2XIMDMQ5-iGpZ5eMv.js → architectureDiagram-2XIMDMQ5-CbghC0Jt.js} +1 -1
  335. package/web-dist/assets/{blockDiagram-WCTKOSBZ-CzaQqynl.js → blockDiagram-WCTKOSBZ-CY4EJBQ6.js} +1 -1
  336. package/web-dist/assets/{c4Diagram-IC4MRINW-PyiTG4vY.js → c4Diagram-IC4MRINW-CWy0R6Nw.js} +1 -1
  337. package/web-dist/assets/channel-C4yEM23r.js +1 -0
  338. package/web-dist/assets/{chunk-4BX2VUAB-D0T3UNJp.js → chunk-4BX2VUAB-Dc3yo1Gc.js} +1 -1
  339. package/web-dist/assets/{chunk-55IACEB6-CEZ65WgK.js → chunk-55IACEB6-ugBuFkg4.js} +1 -1
  340. package/web-dist/assets/{chunk-FMBD7UC4-P5kWRofC.js → chunk-FMBD7UC4-cu6QQh2a.js} +1 -1
  341. package/web-dist/assets/{chunk-JSJVCQXG-Cn1owVt4.js → chunk-JSJVCQXG-DTdBqiLF.js} +1 -1
  342. package/web-dist/assets/{chunk-KX2RTZJC-CC0b6eqX.js → chunk-KX2RTZJC-DFApvQwT.js} +1 -1
  343. package/web-dist/assets/{chunk-NQ4KR5QH-CNIgo-1z.js → chunk-NQ4KR5QH-4yOScl2J.js} +1 -1
  344. package/web-dist/assets/{chunk-QZHKN3VN-DF6TeuK6.js → chunk-QZHKN3VN-CM38B0WV.js} +1 -1
  345. package/web-dist/assets/{chunk-WL4C6EOR-DaZTFehP.js → chunk-WL4C6EOR-eBVrWGce.js} +1 -1
  346. package/web-dist/assets/classDiagram-VBA2DB6C-QCajg6F3.js +1 -0
  347. package/web-dist/assets/classDiagram-v2-RAHNMMFH-QCajg6F3.js +1 -0
  348. package/web-dist/assets/clone-Dqpxz3OJ.js +1 -0
  349. package/web-dist/assets/{cose-bilkent-S5V4N54A-BxdF5cV-.js → cose-bilkent-S5V4N54A-HHRRPeV9.js} +1 -1
  350. package/web-dist/assets/{dagre-KLK3FWXG-Dm4scFIL.js → dagre-KLK3FWXG-aAUSG7Mo.js} +1 -1
  351. package/web-dist/assets/{diagram-E7M64L7V-Bne6RKl6.js → diagram-E7M64L7V-BJt3zK9H.js} +1 -1
  352. package/web-dist/assets/{diagram-IFDJBPK2-j2mQ5C5l.js → diagram-IFDJBPK2-BSK9w0bb.js} +1 -1
  353. package/web-dist/assets/{diagram-P4PSJMXO-CdzuLWEw.js → diagram-P4PSJMXO-DylDASun.js} +1 -1
  354. package/web-dist/assets/{erDiagram-INFDFZHY-DZrdptsJ.js → erDiagram-INFDFZHY-C2CoituG.js} +1 -1
  355. package/web-dist/assets/{flowDiagram-PKNHOUZH-DgjJzAMy.js → flowDiagram-PKNHOUZH-C2UR2xxJ.js} +1 -1
  356. package/web-dist/assets/{ganttDiagram-A5KZAMGK-BUK9KV20.js → ganttDiagram-A5KZAMGK-ClxfUfSR.js} +1 -1
  357. package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-D30kLUud.js → gitGraphDiagram-K3NZZRJ6-CHp_onyn.js} +1 -1
  358. package/web-dist/assets/{graph-Uq5Ey2rZ.js → graph-CG2WS7_t.js} +1 -1
  359. package/web-dist/assets/{index-Ceg7oKI4.js → index-BwYKBEGE.js} +1 -1
  360. package/web-dist/assets/index-CPIpYLuw.js +1504 -0
  361. package/web-dist/assets/index-CjPicmz_.css +32 -0
  362. package/web-dist/assets/{index-Dl_78WX8.js → index-DwvrR7An.js} +1 -1
  363. package/web-dist/assets/{infoDiagram-LFFYTUFH-CcayyObn.js → infoDiagram-LFFYTUFH-D-1oFNFC.js} +1 -1
  364. package/web-dist/assets/{ishikawaDiagram-PHBUUO56-CoNyYrRv.js → ishikawaDiagram-PHBUUO56-DWcJu4vD.js} +1 -1
  365. package/web-dist/assets/{journeyDiagram-4ABVD52K-DhNuQwoO.js → journeyDiagram-4ABVD52K-CyrGxq5f.js} +1 -1
  366. package/web-dist/assets/{kanban-definition-K7BYSVSG-CiBoEtT_.js → kanban-definition-K7BYSVSG-Bq9ecx3z.js} +1 -1
  367. package/web-dist/assets/{layout-CclAjc31.js → layout-DnxR75j6.js} +1 -1
  368. package/web-dist/assets/{linear-D0T2Ue4i.js → linear-Bj4ZUyD2.js} +1 -1
  369. package/web-dist/assets/{mindmap-definition-YRQLILUH-Bs5KOLlF.js → mindmap-definition-YRQLILUH-CCzvprBn.js} +1 -1
  370. package/web-dist/assets/{pieDiagram-SKSYHLDU-D5ft8t9O.js → pieDiagram-SKSYHLDU-xDO_MmaO.js} +1 -1
  371. package/web-dist/assets/{quadrantDiagram-337W2JSQ-CTrNOfNq.js → quadrantDiagram-337W2JSQ-DACNxopk.js} +1 -1
  372. package/web-dist/assets/{requirementDiagram-Z7DCOOCP-Lfkxswx5.js → requirementDiagram-Z7DCOOCP-CMqe5H--.js} +1 -1
  373. package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-D7VXd1gH.js → sankeyDiagram-WA2Y5GQK-jn75MYj4.js} +1 -1
  374. package/web-dist/assets/{sequenceDiagram-2WXFIKYE-BobMUXZE.js → sequenceDiagram-2WXFIKYE-C8afKJhS.js} +1 -1
  375. package/web-dist/assets/{stateDiagram-RAJIS63D-BiTIuwsM.js → stateDiagram-RAJIS63D-Ftq6oKpa.js} +1 -1
  376. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DaZO7yY_.js +1 -0
  377. package/web-dist/assets/{timeline-definition-YZTLITO2-rKlur9hp.js → timeline-definition-YZTLITO2-DQ4bUy-3.js} +1 -1
  378. package/web-dist/assets/{treemap-KZPCXAKY-BtERtPNk.js → treemap-KZPCXAKY-C9ovvl15.js} +1 -1
  379. package/web-dist/assets/{vennDiagram-LZ73GAT5-Ke0QhSrP.js → vennDiagram-LZ73GAT5-D3O9WbYV.js} +1 -1
  380. package/web-dist/assets/{xychartDiagram-JWTSCODW-Cl96gv3X.js → xychartDiagram-JWTSCODW-UqN90bHw.js} +1 -1
  381. package/web-dist/index.html +2 -2
  382. package/dist/routes/workspace.d.ts +0 -16
  383. package/dist/routes/workspace.d.ts.map +0 -1
  384. package/dist/routes/workspace.js.map +0 -1
  385. package/dist/routes/workspaces.d.ts +0 -15
  386. package/dist/routes/workspaces.d.ts.map +0 -1
  387. package/dist/routes/workspaces.js.map +0 -1
  388. package/dist/services/workspace-repositories.d.ts +0 -35
  389. package/dist/services/workspace-repositories.d.ts.map +0 -1
  390. package/dist/services/workspace-repositories.js.map +0 -1
  391. package/dist/services/workspace-state.d.ts +0 -8
  392. package/dist/services/workspace-state.d.ts.map +0 -1
  393. package/dist/services/workspace-state.js.map +0 -1
  394. package/dist/services/workspace-watcher.d.ts.map +0 -1
  395. package/dist/services/workspace-watcher.js.map +0 -1
  396. package/dist/services/workspaces.d.ts.map +0 -1
  397. package/dist/services/workspaces.js.map +0 -1
  398. package/dist/tools/workspace-tools.d.ts.map +0 -1
  399. package/dist/tools/workspace-tools.js.map +0 -1
  400. package/web-dist/assets/channel-Dpmc9iFy.js +0 -1
  401. package/web-dist/assets/classDiagram-VBA2DB6C-yqgzo6kv.js +0 -1
  402. package/web-dist/assets/classDiagram-v2-RAHNMMFH-yqgzo6kv.js +0 -1
  403. package/web-dist/assets/clone-BV2MQMkR.js +0 -1
  404. package/web-dist/assets/index-Bir79SR1.css +0 -32
  405. package/web-dist/assets/index-CPsRY9iy.js +0 -1503
  406. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-BxQjvEWb.js +0 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * WorkspaceWatcher — native recursive file system watching, inspired by VS Code's
2
+ * ProjectWatcher — native recursive file system watching, inspired by VS Code's
3
3
  * @parcel/watcher integration (src/vs/platform/files/node/watcher/parcel/parcelWatcher.ts).
4
4
  *
5
5
  * Uses @parcel/watcher for OS-native events (FSEvents on macOS, inotify on Linux,
@@ -63,7 +63,7 @@ function mapParcelType(type) {
63
63
  }
64
64
  }
65
65
  // ── Service ──────────────────────────────────────────────────────────
66
- export class WorkspaceWatcher extends EventEmitter {
66
+ export class ProjectWatcher extends EventEmitter {
67
67
  subscription = null;
68
68
  buffer = [];
69
69
  flushTimer = null;
@@ -84,15 +84,15 @@ export class WorkspaceWatcher extends EventEmitter {
84
84
  return this.subscription !== null;
85
85
  }
86
86
  /**
87
- * Start watching a workspace root directory.
87
+ * Start watching a project root directory.
88
88
  * Stops any previous watcher first.
89
89
  */
90
- async watch(workspaceRoot) {
90
+ async watch(projectRoot) {
91
91
  await this.stop();
92
- this._root = workspaceRoot;
92
+ this._root = projectRoot;
93
93
  // Dynamic import so the native module is only loaded when actually needed
94
94
  const parcel = await import("@parcel/watcher");
95
- this.subscription = await parcel.subscribe(workspaceRoot, (err, events) => {
95
+ this.subscription = await parcel.subscribe(projectRoot, (err, events) => {
96
96
  if (err) {
97
97
  this.emit("error", err);
98
98
  return;
@@ -151,4 +151,4 @@ export class WorkspaceWatcher extends EventEmitter {
151
151
  this.emit("changes", coalesced);
152
152
  }
153
153
  }
154
- //# sourceMappingURL=workspace-watcher.js.map
154
+ //# sourceMappingURL=project-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-watcher.js","sourceRoot":"","sources":["../../src/services/project-watcher.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,19 @@
1
1
  import type { JaitDB } from "../db/connection.js";
2
- import { workspaces } from "../db/schema.js";
3
- export interface CreateWorkspaceParams {
2
+ import { projects } from "../db/schema.js";
3
+ export interface CreateProjectParams {
4
4
  userId?: string;
5
5
  title?: string;
6
6
  rootPath?: string | null;
7
7
  nodeId?: string | null;
8
8
  metadata?: Record<string, unknown>;
9
9
  }
10
- type WorkspaceRow = typeof workspaces.$inferSelect;
11
- export declare function parseWorkspaceMetadata(workspace: Pick<WorkspaceRow, "metadata"> | null | undefined): Record<string, unknown>;
12
- export declare function getWorkspaceRepositoryId(workspace: Pick<WorkspaceRow, "metadata"> | null | undefined): string | null;
13
- export declare class WorkspaceService {
10
+ type ProjectRow = typeof projects.$inferSelect;
11
+ export declare function parseProjectMetadata(project: Pick<ProjectRow, "metadata"> | null | undefined): Record<string, unknown>;
12
+ export declare function getProjectRepositoryId(project: Pick<ProjectRow, "metadata"> | null | undefined): string | null;
13
+ export declare class ProjectService {
14
14
  private db;
15
15
  constructor(db: JaitDB);
16
- create(params?: CreateWorkspaceParams): {
16
+ create(params?: CreateProjectParams): {
17
17
  id: string;
18
18
  userId: string | null;
19
19
  title: string | null;
@@ -36,13 +36,13 @@ export declare class WorkspaceService {
36
36
  metadata: string | null;
37
37
  }[];
38
38
  listWithSessions(userId?: string, status?: string, limit?: number): {
39
- workspaces: {
39
+ projects: {
40
40
  sessions: {
41
41
  id: string;
42
42
  userId: string | null;
43
- workspaceId: string | null;
43
+ projectId: string | null;
44
44
  name: string | null;
45
- workspacePath: string | null;
45
+ projectPath: string | null;
46
46
  createdAt: string;
47
47
  lastActiveAt: string;
48
48
  status: string | null;
@@ -71,7 +71,7 @@ export declare class WorkspaceService {
71
71
  status: string | null;
72
72
  metadata: string | null;
73
73
  } | undefined;
74
- getOrCreateForRoot(params: CreateWorkspaceParams): {
74
+ getOrCreateForRoot(params: CreateProjectParams): {
75
75
  id: string;
76
76
  userId: string | null;
77
77
  title: string | null;
@@ -103,9 +103,9 @@ export declare class WorkspaceService {
103
103
  archive(id: string, userId?: string): void;
104
104
  restore(id: string, userId?: string): void;
105
105
  delete(id: string, userId?: string): void;
106
- /** Delete (soft) all archived workspaces for a user. Returns count of affected rows. */
106
+ /** Delete (soft) all archived projects for a user. Returns count of affected rows. */
107
107
  deleteArchived(userId: string): number;
108
108
  getActiveSessionCounts(userId: string): Map<string, number>;
109
109
  }
110
110
  export {};
111
- //# sourceMappingURL=workspaces.d.ts.map
111
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/services/projects.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAY,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGrD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,KAAK,UAAU,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAC;AAS/C,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUtH;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI9G;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAE9B,MAAM,CAAC,MAAM,GAAE,mBAAwB;;;;;;;;;;;IAiBvC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;IAmBrD,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,SAAW,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;IAkCnE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;;;;;;;IAOnC,kBAAkB,CAAC,MAAM,EAAE,mBAAmB;;;;;;;;;;;IAsB9C,KAAK,CAAC,EAAE,EAAE,MAAM;IAQhB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,MAAM;IAclJ,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;;;;;;;IASlE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQnC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQnC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQlC,sFAAsF;IACtF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAYtC,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAgB5D"}
@@ -1,18 +1,18 @@
1
1
  import { and, desc, eq, inArray, sql } from "drizzle-orm";
2
- import { sessions, workspaces } from "../db/schema.js";
2
+ import { sessions, projects } from "../db/schema.js";
3
3
  import { uuidv7 } from "../db/uuidv7.js";
4
- function fallbackWorkspaceTitle(rootPath, fallback = "Untitled Workspace") {
4
+ function fallbackProjectTitle(rootPath, fallback = "Untitled Project") {
5
5
  const normalized = rootPath?.trim();
6
6
  if (!normalized)
7
7
  return fallback;
8
8
  const parts = normalized.replace(/[\\/]+$/, "").split(/[\\/]/).filter(Boolean);
9
9
  return parts[parts.length - 1] || fallback;
10
10
  }
11
- export function parseWorkspaceMetadata(workspace) {
12
- if (!workspace?.metadata)
11
+ export function parseProjectMetadata(project) {
12
+ if (!project?.metadata)
13
13
  return {};
14
14
  try {
15
- const parsed = JSON.parse(workspace.metadata);
15
+ const parsed = JSON.parse(project.metadata);
16
16
  return parsed && typeof parsed === "object" && !Array.isArray(parsed)
17
17
  ? parsed
18
18
  : {};
@@ -21,12 +21,12 @@ export function parseWorkspaceMetadata(workspace) {
21
21
  return {};
22
22
  }
23
23
  }
24
- export function getWorkspaceRepositoryId(workspace) {
25
- const metadata = parseWorkspaceMetadata(workspace);
24
+ export function getProjectRepositoryId(project) {
25
+ const metadata = parseProjectMetadata(project);
26
26
  const value = metadata["repositoryId"] ?? metadata["repoId"];
27
27
  return typeof value === "string" && value.trim() ? value.trim() : null;
28
28
  }
29
- export class WorkspaceService {
29
+ export class ProjectService {
30
30
  db;
31
31
  constructor(db) {
32
32
  this.db = db;
@@ -34,10 +34,10 @@ export class WorkspaceService {
34
34
  create(params = {}) {
35
35
  const id = uuidv7();
36
36
  const now = new Date().toISOString();
37
- this.db.insert(workspaces).values({
37
+ this.db.insert(projects).values({
38
38
  id,
39
39
  userId: params.userId ?? null,
40
- title: params.title?.trim() || fallbackWorkspaceTitle(params.rootPath),
40
+ title: params.title?.trim() || fallbackProjectTitle(params.rootPath),
41
41
  rootPath: params.rootPath ?? null,
42
42
  nodeId: params.nodeId ?? "gateway",
43
43
  createdAt: now,
@@ -51,66 +51,66 @@ export class WorkspaceService {
51
51
  const normalizedLimit = typeof limit === "number" && Number.isFinite(limit) && limit > 0
52
52
  ? Math.floor(limit)
53
53
  : undefined;
54
- let query = this.db.select().from(workspaces).$dynamic();
54
+ let query = this.db.select().from(projects).$dynamic();
55
55
  if (status && userId) {
56
- query = query.where(and(eq(workspaces.status, status), eq(workspaces.userId, userId)));
56
+ query = query.where(and(eq(projects.status, status), eq(projects.userId, userId)));
57
57
  }
58
58
  else if (status) {
59
- query = query.where(eq(workspaces.status, status));
59
+ query = query.where(eq(projects.status, status));
60
60
  }
61
61
  else if (userId) {
62
- query = query.where(eq(workspaces.userId, userId));
62
+ query = query.where(eq(projects.userId, userId));
63
63
  }
64
- query = query.orderBy(desc(workspaces.lastActiveAt));
64
+ query = query.orderBy(desc(projects.lastActiveAt));
65
65
  return normalizedLimit ? query.limit(normalizedLimit).all() : query.all();
66
66
  }
67
67
  listWithSessions(userId, status = "active", limit) {
68
- const workspaceRows = this.list(status, userId, typeof limit === "number" ? limit + 1 : undefined);
69
- const limitedRows = typeof limit === "number" ? workspaceRows.slice(0, limit) : workspaceRows;
70
- const workspaceIds = limitedRows.map((row) => row.id);
71
- const sessionRows = workspaceIds.length > 0
68
+ const projectRows = this.list(status, userId, typeof limit === "number" ? limit + 1 : undefined);
69
+ const limitedRows = typeof limit === "number" ? projectRows.slice(0, limit) : projectRows;
70
+ const projectIds = limitedRows.map((row) => row.id);
71
+ const sessionRows = projectIds.length > 0
72
72
  ? this.db
73
73
  .select()
74
74
  .from(sessions)
75
- .where(and(inArray(sessions.workspaceId, workspaceIds), eq(sessions.status, "active"), userId ? eq(sessions.userId, userId) : sql `1 = 1`))
75
+ .where(and(inArray(sessions.projectId, projectIds), eq(sessions.status, "active"), userId ? eq(sessions.userId, userId) : sql `1 = 1`))
76
76
  .orderBy(desc(sessions.lastActiveAt))
77
77
  .all()
78
78
  : [];
79
79
  const sessionMap = new Map();
80
80
  for (const row of sessionRows) {
81
- const bucket = sessionMap.get(row.workspaceId ?? "") ?? [];
81
+ const bucket = sessionMap.get(row.projectId ?? "") ?? [];
82
82
  bucket.push(row);
83
- sessionMap.set(row.workspaceId ?? "", bucket);
83
+ sessionMap.set(row.projectId ?? "", bucket);
84
84
  }
85
85
  return {
86
- workspaces: limitedRows.map((workspace) => ({
87
- ...workspace,
88
- sessions: sessionMap.get(workspace.id) ?? [],
86
+ projects: limitedRows.map((project) => ({
87
+ ...project,
88
+ sessions: sessionMap.get(project.id) ?? [],
89
89
  })),
90
- hasMore: typeof limit === "number" ? workspaceRows.length > limit : false,
90
+ hasMore: typeof limit === "number" ? projectRows.length > limit : false,
91
91
  };
92
92
  }
93
93
  getById(id, userId) {
94
94
  if (userId) {
95
- return this.db.select().from(workspaces).where(and(eq(workspaces.id, id), eq(workspaces.userId, userId))).get();
95
+ return this.db.select().from(projects).where(and(eq(projects.id, id), eq(projects.userId, userId))).get();
96
96
  }
97
- return this.db.select().from(workspaces).where(eq(workspaces.id, id)).get();
97
+ return this.db.select().from(projects).where(eq(projects.id, id)).get();
98
98
  }
99
99
  getOrCreateForRoot(params) {
100
100
  const rootPath = params.rootPath?.trim();
101
101
  const nodeId = params.nodeId ?? "gateway";
102
102
  if (rootPath) {
103
103
  const conditions = [
104
- eq(workspaces.rootPath, rootPath),
105
- eq(workspaces.nodeId, nodeId),
106
- eq(workspaces.status, "active"),
104
+ eq(projects.rootPath, rootPath),
105
+ eq(projects.nodeId, nodeId),
106
+ eq(projects.status, "active"),
107
107
  ];
108
108
  if (params.userId) {
109
- conditions.push(eq(workspaces.userId, params.userId));
109
+ conditions.push(eq(projects.userId, params.userId));
110
110
  }
111
111
  const existing = this.db
112
112
  .select()
113
- .from(workspaces)
113
+ .from(projects)
114
114
  .where(and(...conditions))
115
115
  .get();
116
116
  if (existing)
@@ -120,9 +120,9 @@ export class WorkspaceService {
120
120
  }
121
121
  touch(id) {
122
122
  this.db
123
- .update(workspaces)
123
+ .update(projects)
124
124
  .set({ lastActiveAt: new Date().toISOString() })
125
- .where(eq(workspaces.id, id))
125
+ .where(eq(projects.id, id))
126
126
  .run();
127
127
  }
128
128
  update(id, data, userId) {
@@ -138,70 +138,70 @@ export class WorkspaceService {
138
138
  if (Object.keys(set).length === 0)
139
139
  return;
140
140
  this.db
141
- .update(workspaces)
141
+ .update(projects)
142
142
  .set(set)
143
- .where(userId ? and(eq(workspaces.id, id), eq(workspaces.userId, userId)) : eq(workspaces.id, id))
143
+ .where(userId ? and(eq(projects.id, id), eq(projects.userId, userId)) : eq(projects.id, id))
144
144
  .run();
145
145
  }
146
146
  assignRepository(id, repositoryId, userId) {
147
- const workspace = this.getById(id, userId);
148
- if (!workspace)
147
+ const project = this.getById(id, userId);
148
+ if (!project)
149
149
  return undefined;
150
- const metadata = parseWorkspaceMetadata(workspace);
150
+ const metadata = parseProjectMetadata(project);
151
151
  metadata["repositoryId"] = repositoryId;
152
152
  this.update(id, { metadata }, userId);
153
153
  return this.getById(id, userId);
154
154
  }
155
155
  archive(id, userId) {
156
156
  this.db
157
- .update(workspaces)
157
+ .update(projects)
158
158
  .set({ status: "archived" })
159
- .where(userId ? and(eq(workspaces.id, id), eq(workspaces.userId, userId)) : eq(workspaces.id, id))
159
+ .where(userId ? and(eq(projects.id, id), eq(projects.userId, userId)) : eq(projects.id, id))
160
160
  .run();
161
161
  }
162
162
  restore(id, userId) {
163
163
  this.db
164
- .update(workspaces)
164
+ .update(projects)
165
165
  .set({ status: "active" })
166
- .where(userId ? and(eq(workspaces.id, id), eq(workspaces.userId, userId)) : eq(workspaces.id, id))
166
+ .where(userId ? and(eq(projects.id, id), eq(projects.userId, userId)) : eq(projects.id, id))
167
167
  .run();
168
168
  }
169
169
  delete(id, userId) {
170
170
  this.db
171
- .update(workspaces)
171
+ .update(projects)
172
172
  .set({ status: "deleted" })
173
- .where(userId ? and(eq(workspaces.id, id), eq(workspaces.userId, userId)) : eq(workspaces.id, id))
173
+ .where(userId ? and(eq(projects.id, id), eq(projects.userId, userId)) : eq(projects.id, id))
174
174
  .run();
175
175
  }
176
- /** Delete (soft) all archived workspaces for a user. Returns count of affected rows. */
176
+ /** Delete (soft) all archived projects for a user. Returns count of affected rows. */
177
177
  deleteArchived(userId) {
178
178
  const archived = this.list("archived", userId);
179
179
  if (archived.length === 0)
180
180
  return 0;
181
181
  const ids = archived.map((w) => w.id);
182
182
  this.db
183
- .update(workspaces)
183
+ .update(projects)
184
184
  .set({ status: "deleted" })
185
- .where(and(inArray(workspaces.id, ids), eq(workspaces.userId, userId)))
185
+ .where(and(inArray(projects.id, ids), eq(projects.userId, userId)))
186
186
  .run();
187
187
  return archived.length;
188
188
  }
189
189
  getActiveSessionCounts(userId) {
190
190
  const rows = this.db
191
191
  .select({
192
- workspaceId: sessions.workspaceId,
192
+ projectId: sessions.projectId,
193
193
  count: sql `count(*)`,
194
194
  })
195
195
  .from(sessions)
196
196
  .where(and(eq(sessions.userId, userId), eq(sessions.status, "active")))
197
- .groupBy(sessions.workspaceId)
197
+ .groupBy(sessions.projectId)
198
198
  .all();
199
199
  const counts = new Map();
200
200
  for (const row of rows) {
201
- if (row.workspaceId)
202
- counts.set(row.workspaceId, Number(row.count));
201
+ if (row.projectId)
202
+ counts.set(row.projectId, Number(row.count));
203
203
  }
204
204
  return counts;
205
205
  }
206
206
  }
207
- //# sourceMappingURL=workspaces.js.map
207
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/services/projects.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ export type ReminderStatus = "active" | "archived";
4
4
  export type ReminderRow = typeof reminders.$inferSelect;
5
5
  export interface CreateReminderParams {
6
6
  userId?: string | null;
7
- workspaceId?: string | null;
7
+ projectId?: string | null;
8
8
  sessionId?: string | null;
9
9
  content: string;
10
10
  sourceType?: string | null;
@@ -15,7 +15,7 @@ export interface CreateReminderParams {
15
15
  }
16
16
  export interface UpdateReminderParams {
17
17
  content?: string;
18
- workspaceId?: string | null;
18
+ projectId?: string | null;
19
19
  sessionId?: string | null;
20
20
  status?: ReminderStatus;
21
21
  tags?: string[];
@@ -23,10 +23,18 @@ export interface UpdateReminderParams {
23
23
  export interface ListReminderOptions {
24
24
  userId?: string;
25
25
  status?: ReminderStatus | "all";
26
- workspaceId?: string;
26
+ projectId?: string;
27
27
  sessionId?: string;
28
28
  limit?: number;
29
29
  }
30
+ export interface MemoryHygieneResult {
31
+ archived: number;
32
+ flagged: number;
33
+ }
34
+ export interface OldChatMemoryScanResult {
35
+ scanned: number;
36
+ created: number;
37
+ }
30
38
  export declare class ReminderService {
31
39
  private db;
32
40
  constructor(db: JaitDB);
@@ -36,6 +44,10 @@ export declare class ReminderService {
36
44
  create(params: CreateReminderParams): ReminderRow;
37
45
  update(id: string, params: UpdateReminderParams, userId?: string): ReminderRow | undefined;
38
46
  delete(id: string, userId?: string): boolean;
39
- countByWorkspace(userId: string): Map<string, number>;
47
+ markRetrieved(ids: string[], userId?: string): number;
48
+ exportMarkdown(options?: ListReminderOptions): string;
49
+ runHygiene(userId?: string): MemoryHygieneResult;
50
+ scanOldChatsForMemory(userId?: string, limit?: number): OldChatMemoryScanResult;
51
+ countByProject(userId: string): Map<string, number>;
40
52
  }
41
53
  //# sourceMappingURL=reminders.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reminders.d.ts","sourceRoot":"","sources":["../../src/services/reminders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,CAAC;AACnD,MAAM,MAAM,WAAW,GAAG,OAAO,SAAS,CAAC,YAAY,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBD,qBAAa,eAAe;IACd,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAE9B,IAAI,CAAC,OAAO,GAAE,mBAAwB,GAAG,WAAW,EAAE;IAetD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE;IAUvC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAQ7D,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,WAAW;IAsBjD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAsB1F,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAU5C,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAgBtD"}
1
+ {"version":3,"file":"reminders.d.ts","sourceRoot":"","sources":["../../src/services/reminders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAY,SAAS,EAAY,MAAM,iBAAiB,CAAC;AAGhE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,CAAC;AACnD,MAAM,MAAM,WAAW,GAAG,OAAO,SAAS,CAAC,YAAY,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAkBD,qBAAa,eAAe;IACd,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAE9B,IAAI,CAAC,OAAO,GAAE,mBAAwB,GAAG,WAAW,EAAE;IAetD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE;IAUvC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAQ7D,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,WAAW;IAsBjD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAsB1F,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAU5C,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAsBrD,cAAc,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM;IAqBzD,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAqChD,qBAAqB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,uBAAuB;IAuC5E,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAgBpD"}
@@ -1,5 +1,5 @@
1
1
  import { and, desc, eq, inArray, sql } from "drizzle-orm";
2
- import { reminders } from "../db/schema.js";
2
+ import { messages, reminders, sessions } from "../db/schema.js";
3
3
  import { uuidv7 } from "../db/uuidv7.js";
4
4
  function normalizeTags(tags) {
5
5
  return JSON.stringify([
@@ -25,8 +25,8 @@ export class ReminderService {
25
25
  conditions.push(eq(reminders.userId, options.userId));
26
26
  if (options.status && options.status !== "all")
27
27
  conditions.push(eq(reminders.status, options.status));
28
- if (options.workspaceId)
29
- conditions.push(eq(reminders.workspaceId, options.workspaceId));
28
+ if (options.projectId)
29
+ conditions.push(eq(reminders.projectId, options.projectId));
30
30
  if (options.sessionId)
31
31
  conditions.push(eq(reminders.sessionId, options.sessionId));
32
32
  let query = this.db.select().from(reminders).$dynamic();
@@ -63,7 +63,7 @@ export class ReminderService {
63
63
  this.db.insert(reminders).values({
64
64
  id,
65
65
  userId: params.userId ?? null,
66
- workspaceId: params.workspaceId ?? null,
66
+ projectId: params.projectId ?? null,
67
67
  sessionId: params.sessionId ?? null,
68
68
  content,
69
69
  sourceType: params.sourceType?.trim() || "agent",
@@ -86,8 +86,8 @@ export class ReminderService {
86
86
  throw new Error("Reminder content must not be empty");
87
87
  set.content = content;
88
88
  }
89
- if (params.workspaceId !== undefined)
90
- set.workspaceId = params.workspaceId;
89
+ if (params.projectId !== undefined)
90
+ set.projectId = params.projectId;
91
91
  if (params.sessionId !== undefined)
92
92
  set.sessionId = params.sessionId;
93
93
  if (params.status !== undefined)
@@ -111,22 +111,163 @@ export class ReminderService {
111
111
  .run();
112
112
  return true;
113
113
  }
114
- countByWorkspace(userId) {
114
+ markRetrieved(ids, userId) {
115
+ const uniqueIds = [...new Set(ids.filter(Boolean))];
116
+ if (uniqueIds.length === 0)
117
+ return 0;
118
+ const now = new Date().toISOString();
119
+ let updated = 0;
120
+ for (const id of uniqueIds) {
121
+ const existing = this.getById(id, userId);
122
+ if (!existing)
123
+ continue;
124
+ this.db
125
+ .update(reminders)
126
+ .set({
127
+ usageCount: (existing.usageCount ?? 0) + 1,
128
+ lastRetrievedAt: now,
129
+ updatedAt: now,
130
+ })
131
+ .where(userId ? and(eq(reminders.id, id), eq(reminders.userId, userId)) : eq(reminders.id, id))
132
+ .run();
133
+ updated += 1;
134
+ }
135
+ return updated;
136
+ }
137
+ exportMarkdown(options = {}) {
138
+ const rows = this.list({ ...options, status: options.status ?? "all", limit: options.limit ?? 500 });
139
+ const lines = ["# Memory Export", ""];
140
+ for (const row of rows) {
141
+ const tags = normalizeTagsForDisplay(row.tags);
142
+ const meta = [
143
+ row.status,
144
+ row.projectId ? `project=${row.projectId}` : "project=none",
145
+ row.sessionId ? `session=${row.sessionId}` : null,
146
+ `source=${row.sourceType}:${row.sourceId ?? "none"}@${row.sourceSurface}`,
147
+ `usage=${row.usageCount ?? 0}`,
148
+ row.lastRetrievedAt ? `lastRetrieved=${row.lastRetrievedAt}` : null,
149
+ tags.length > 0 ? `tags=${tags.join(",")}` : null,
150
+ `updated=${row.updatedAt}`,
151
+ ].filter(Boolean).join("; ");
152
+ lines.push(`- ${row.content} (${meta})`);
153
+ }
154
+ lines.push("");
155
+ return lines.join("\n");
156
+ }
157
+ runHygiene(userId) {
158
+ const active = this.list({ userId, status: "active", limit: 500 });
159
+ const now = Date.now();
160
+ let archived = 0;
161
+ let flagged = 0;
162
+ for (const row of active) {
163
+ const updatedAt = new Date(row.updatedAt).getTime();
164
+ const ageDays = Number.isFinite(updatedAt) ? (now - updatedAt) / 86_400_000 : 0;
165
+ if ((row.usageCount ?? 0) === 0 && ageDays >= 180 && row.sourceType !== "user") {
166
+ this.update(row.id, { status: "archived" }, userId);
167
+ archived += 1;
168
+ }
169
+ }
170
+ const bySubject = new Map();
171
+ for (const row of active) {
172
+ const subject = memorySubject(row.content);
173
+ if (!subject)
174
+ continue;
175
+ const bucket = bySubject.get(subject) ?? [];
176
+ bucket.push(row);
177
+ bySubject.set(subject, bucket);
178
+ }
179
+ for (const bucket of bySubject.values()) {
180
+ const uniqueContents = new Set(bucket.map((row) => normalizeMemoryText(row.content)));
181
+ if (uniqueContents.size < 2)
182
+ continue;
183
+ for (const row of bucket) {
184
+ const tags = [...new Set([...normalizeTagsForDisplay(row.tags), "review:conflict", "memory:hygiene"])];
185
+ this.update(row.id, { tags }, userId);
186
+ flagged += 1;
187
+ }
188
+ }
189
+ return { archived, flagged };
190
+ }
191
+ scanOldChatsForMemory(userId, limit = 200) {
115
192
  const rows = this.db
116
193
  .select({
117
- workspaceId: reminders.workspaceId,
194
+ messageId: messages.id,
195
+ sessionId: messages.sessionId,
196
+ projectId: sessions.projectId,
197
+ content: messages.content,
198
+ })
199
+ .from(messages)
200
+ .innerJoin(sessions, eq(messages.sessionId, sessions.id))
201
+ .where(userId ? and(eq(sessions.userId, userId), eq(messages.role, "user")) : eq(messages.role, "user"))
202
+ .orderBy(desc(messages.createdAt))
203
+ .limit(normalizeLimit(limit, 200))
204
+ .all();
205
+ const existing = new Set(this.list({ userId, status: "all", limit: 500 }).map((row) => normalizeMemoryText(row.content)));
206
+ let created = 0;
207
+ for (const row of rows) {
208
+ const candidate = extractDurableMemoryCandidate(row.content);
209
+ if (!candidate)
210
+ continue;
211
+ const normalized = normalizeMemoryText(candidate);
212
+ if (existing.has(normalized))
213
+ continue;
214
+ this.create({
215
+ userId: userId ?? null,
216
+ projectId: row.projectId,
217
+ sessionId: row.sessionId,
218
+ content: candidate,
219
+ sourceType: "background_memory_scan",
220
+ sourceId: row.messageId,
221
+ sourceSurface: "chat",
222
+ tags: ["memory-scan"],
223
+ });
224
+ existing.add(normalized);
225
+ created += 1;
226
+ }
227
+ return { scanned: rows.length, created };
228
+ }
229
+ countByProject(userId) {
230
+ const rows = this.db
231
+ .select({
232
+ projectId: reminders.projectId,
118
233
  count: sql `count(*)`,
119
234
  })
120
235
  .from(reminders)
121
236
  .where(and(eq(reminders.userId, userId), eq(reminders.status, "active")))
122
- .groupBy(reminders.workspaceId)
237
+ .groupBy(reminders.projectId)
123
238
  .all();
124
239
  const counts = new Map();
125
240
  for (const row of rows) {
126
- if (row.workspaceId)
127
- counts.set(row.workspaceId, Number(row.count));
241
+ if (row.projectId)
242
+ counts.set(row.projectId, Number(row.count));
128
243
  }
129
244
  return counts;
130
245
  }
131
246
  }
247
+ function normalizeTagsForDisplay(tags) {
248
+ try {
249
+ const parsed = JSON.parse(tags);
250
+ return Array.isArray(parsed) ? parsed.filter((tag) => typeof tag === "string") : [];
251
+ }
252
+ catch {
253
+ return [];
254
+ }
255
+ }
256
+ function normalizeMemoryText(content) {
257
+ return content.toLowerCase().replace(/\s+/g, " ").trim();
258
+ }
259
+ function memorySubject(content) {
260
+ const tokens = normalizeMemoryText(content)
261
+ .split(/[^a-z0-9_]+/)
262
+ .filter((token) => token.length >= 3 && !["the", "and", "for", "with", "that", "this", "memory", "prefer", "always", "should", "use", "not", "don", "never"].includes(token));
263
+ return tokens.slice(0, 5).join(" ") || null;
264
+ }
265
+ function extractDurableMemoryCandidate(content) {
266
+ const compact = content.replace(/\s+/g, " ").trim();
267
+ if (compact.length < 12 || compact.length > 600)
268
+ return null;
269
+ if (!/\b(remember|always|prefer|preference|use .+ by default|do not|don't|never)\b/i.test(compact))
270
+ return null;
271
+ return compact.length <= 280 ? compact : `${compact.slice(0, 279)}…`;
272
+ }
132
273
  //# sourceMappingURL=reminders.js.map