@jacques-ai/server 0.0.7-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/dist/config/config.d.ts +34 -0
  2. package/dist/config/config.d.ts.map +1 -0
  3. package/dist/config/config.js +32 -0
  4. package/dist/config/config.js.map +1 -0
  5. package/dist/connection/applescript.d.ts +46 -0
  6. package/dist/connection/applescript.d.ts.map +1 -0
  7. package/dist/connection/applescript.js +62 -0
  8. package/dist/connection/applescript.js.map +1 -0
  9. package/dist/connection/applescript.test.d.ts +5 -0
  10. package/dist/connection/applescript.test.d.ts.map +1 -0
  11. package/dist/connection/applescript.test.js +64 -0
  12. package/dist/connection/applescript.test.js.map +1 -0
  13. package/dist/connection/constants.d.ts +88 -0
  14. package/dist/connection/constants.d.ts.map +1 -0
  15. package/dist/connection/constants.js +110 -0
  16. package/dist/connection/constants.js.map +1 -0
  17. package/dist/connection/git-info.d.ts +30 -0
  18. package/dist/connection/git-info.d.ts.map +1 -0
  19. package/dist/connection/git-info.js +52 -0
  20. package/dist/connection/git-info.js.map +1 -0
  21. package/dist/connection/git-info.test.d.ts +5 -0
  22. package/dist/connection/git-info.test.d.ts.map +1 -0
  23. package/dist/connection/git-info.test.js +35 -0
  24. package/dist/connection/git-info.test.js.map +1 -0
  25. package/dist/connection/index.d.ts +19 -0
  26. package/dist/connection/index.d.ts.map +1 -0
  27. package/dist/connection/index.js +36 -0
  28. package/dist/connection/index.js.map +1 -0
  29. package/dist/connection/process-detection.d.ts +58 -0
  30. package/dist/connection/process-detection.d.ts.map +1 -0
  31. package/dist/connection/process-detection.js +239 -0
  32. package/dist/connection/process-detection.js.map +1 -0
  33. package/dist/connection/process-detection.test.d.ts +5 -0
  34. package/dist/connection/process-detection.test.d.ts.map +1 -0
  35. package/dist/connection/process-detection.test.js +43 -0
  36. package/dist/connection/process-detection.test.js.map +1 -0
  37. package/dist/connection/session-discovery.d.ts +55 -0
  38. package/dist/connection/session-discovery.d.ts.map +1 -0
  39. package/dist/connection/session-discovery.js +311 -0
  40. package/dist/connection/session-discovery.js.map +1 -0
  41. package/dist/connection/terminal-key.d.ts +126 -0
  42. package/dist/connection/terminal-key.d.ts.map +1 -0
  43. package/dist/connection/terminal-key.js +271 -0
  44. package/dist/connection/terminal-key.js.map +1 -0
  45. package/dist/connection/terminal-key.test.d.ts +5 -0
  46. package/dist/connection/terminal-key.test.d.ts.map +1 -0
  47. package/dist/connection/terminal-key.test.js +221 -0
  48. package/dist/connection/terminal-key.test.js.map +1 -0
  49. package/dist/connection/worktree.d.ts +114 -0
  50. package/dist/connection/worktree.d.ts.map +1 -0
  51. package/dist/connection/worktree.js +320 -0
  52. package/dist/connection/worktree.js.map +1 -0
  53. package/dist/connection/worktree.test.d.ts +5 -0
  54. package/dist/connection/worktree.test.d.ts.map +1 -0
  55. package/dist/connection/worktree.test.js +113 -0
  56. package/dist/connection/worktree.test.js.map +1 -0
  57. package/dist/focus-watcher.d.ts +51 -0
  58. package/dist/focus-watcher.d.ts.map +1 -0
  59. package/dist/focus-watcher.js +169 -0
  60. package/dist/focus-watcher.js.map +1 -0
  61. package/dist/handlers/event-handler.d.ts +93 -0
  62. package/dist/handlers/event-handler.d.ts.map +1 -0
  63. package/dist/handlers/event-handler.js +196 -0
  64. package/dist/handlers/event-handler.js.map +1 -0
  65. package/dist/handlers/event-handler.test.d.ts +5 -0
  66. package/dist/handlers/event-handler.test.d.ts.map +1 -0
  67. package/dist/handlers/event-handler.test.js +305 -0
  68. package/dist/handlers/event-handler.test.js.map +1 -0
  69. package/dist/handlers/session-handler.d.ts +23 -0
  70. package/dist/handlers/session-handler.d.ts.map +1 -0
  71. package/dist/handlers/session-handler.js +104 -0
  72. package/dist/handlers/session-handler.js.map +1 -0
  73. package/dist/handlers/session-handler.test.d.ts +5 -0
  74. package/dist/handlers/session-handler.test.d.ts.map +1 -0
  75. package/dist/handlers/session-handler.test.js +89 -0
  76. package/dist/handlers/session-handler.test.js.map +1 -0
  77. package/dist/handlers/settings-handler.d.ts +32 -0
  78. package/dist/handlers/settings-handler.d.ts.map +1 -0
  79. package/dist/handlers/settings-handler.js +127 -0
  80. package/dist/handlers/settings-handler.js.map +1 -0
  81. package/dist/handlers/settings-handler.test.d.ts +5 -0
  82. package/dist/handlers/settings-handler.test.d.ts.map +1 -0
  83. package/dist/handlers/settings-handler.test.js +105 -0
  84. package/dist/handlers/settings-handler.test.js.map +1 -0
  85. package/dist/handlers/window-handler.d.ts +30 -0
  86. package/dist/handlers/window-handler.d.ts.map +1 -0
  87. package/dist/handlers/window-handler.js +486 -0
  88. package/dist/handlers/window-handler.js.map +1 -0
  89. package/dist/handlers/window-handler.test.d.ts +8 -0
  90. package/dist/handlers/window-handler.test.d.ts.map +1 -0
  91. package/dist/handlers/window-handler.test.js +167 -0
  92. package/dist/handlers/window-handler.test.js.map +1 -0
  93. package/dist/handlers/worktree-handler.d.ts +28 -0
  94. package/dist/handlers/worktree-handler.d.ts.map +1 -0
  95. package/dist/handlers/worktree-handler.js +268 -0
  96. package/dist/handlers/worktree-handler.js.map +1 -0
  97. package/dist/handlers/worktree-handler.test.d.ts +8 -0
  98. package/dist/handlers/worktree-handler.test.d.ts.map +1 -0
  99. package/dist/handlers/worktree-handler.test.js +118 -0
  100. package/dist/handlers/worktree-handler.test.js.map +1 -0
  101. package/dist/handlers/ws-utils.d.ts +12 -0
  102. package/dist/handlers/ws-utils.d.ts.map +1 -0
  103. package/dist/handlers/ws-utils.js +16 -0
  104. package/dist/handlers/ws-utils.js.map +1 -0
  105. package/dist/http-api.d.ts +26 -0
  106. package/dist/http-api.d.ts.map +1 -0
  107. package/dist/http-api.js +148 -0
  108. package/dist/http-api.js.map +1 -0
  109. package/dist/logger.d.ts +42 -0
  110. package/dist/logger.d.ts.map +1 -0
  111. package/dist/logger.js +147 -0
  112. package/dist/logger.js.map +1 -0
  113. package/dist/logging/logger-factory.d.ts +51 -0
  114. package/dist/logging/logger-factory.d.ts.map +1 -0
  115. package/dist/logging/logger-factory.js +59 -0
  116. package/dist/logging/logger-factory.js.map +1 -0
  117. package/dist/mcp/search-tool.d.ts +65 -0
  118. package/dist/mcp/search-tool.d.ts.map +1 -0
  119. package/dist/mcp/search-tool.js +176 -0
  120. package/dist/mcp/search-tool.js.map +1 -0
  121. package/dist/mcp/server.d.ts +9 -0
  122. package/dist/mcp/server.d.ts.map +1 -0
  123. package/dist/mcp/server.js +152 -0
  124. package/dist/mcp/server.js.map +1 -0
  125. package/dist/process-scanner.d.ts +96 -0
  126. package/dist/process-scanner.d.ts.map +1 -0
  127. package/dist/process-scanner.js +194 -0
  128. package/dist/process-scanner.js.map +1 -0
  129. package/dist/routes/__tests__/archive-routes.test.d.ts +5 -0
  130. package/dist/routes/__tests__/archive-routes.test.d.ts.map +1 -0
  131. package/dist/routes/__tests__/archive-routes.test.js +158 -0
  132. package/dist/routes/__tests__/archive-routes.test.js.map +1 -0
  133. package/dist/routes/__tests__/config-routes.test.d.ts +5 -0
  134. package/dist/routes/__tests__/config-routes.test.d.ts.map +1 -0
  135. package/dist/routes/__tests__/config-routes.test.js +112 -0
  136. package/dist/routes/__tests__/config-routes.test.js.map +1 -0
  137. package/dist/routes/__tests__/http-utils.test.d.ts +5 -0
  138. package/dist/routes/__tests__/http-utils.test.d.ts.map +1 -0
  139. package/dist/routes/__tests__/http-utils.test.js +102 -0
  140. package/dist/routes/__tests__/http-utils.test.js.map +1 -0
  141. package/dist/routes/__tests__/notification-routes.test.d.ts +5 -0
  142. package/dist/routes/__tests__/notification-routes.test.d.ts.map +1 -0
  143. package/dist/routes/__tests__/notification-routes.test.js +91 -0
  144. package/dist/routes/__tests__/notification-routes.test.js.map +1 -0
  145. package/dist/routes/__tests__/project-routes.test.d.ts +5 -0
  146. package/dist/routes/__tests__/project-routes.test.d.ts.map +1 -0
  147. package/dist/routes/__tests__/project-routes.test.js +168 -0
  148. package/dist/routes/__tests__/project-routes.test.js.map +1 -0
  149. package/dist/routes/__tests__/session-routes.test.d.ts +5 -0
  150. package/dist/routes/__tests__/session-routes.test.d.ts.map +1 -0
  151. package/dist/routes/__tests__/session-routes.test.js +198 -0
  152. package/dist/routes/__tests__/session-routes.test.js.map +1 -0
  153. package/dist/routes/__tests__/source-routes.test.d.ts +5 -0
  154. package/dist/routes/__tests__/source-routes.test.d.ts.map +1 -0
  155. package/dist/routes/__tests__/source-routes.test.js +142 -0
  156. package/dist/routes/__tests__/source-routes.test.js.map +1 -0
  157. package/dist/routes/__tests__/sync-routes.test.d.ts +5 -0
  158. package/dist/routes/__tests__/sync-routes.test.d.ts.map +1 -0
  159. package/dist/routes/__tests__/sync-routes.test.js +77 -0
  160. package/dist/routes/__tests__/sync-routes.test.js.map +1 -0
  161. package/dist/routes/__tests__/test-helpers.d.ts +47 -0
  162. package/dist/routes/__tests__/test-helpers.d.ts.map +1 -0
  163. package/dist/routes/__tests__/test-helpers.js +97 -0
  164. package/dist/routes/__tests__/test-helpers.js.map +1 -0
  165. package/dist/routes/archive-routes.d.ts +15 -0
  166. package/dist/routes/archive-routes.d.ts.map +1 -0
  167. package/dist/routes/archive-routes.js +181 -0
  168. package/dist/routes/archive-routes.js.map +1 -0
  169. package/dist/routes/claude-routes.d.ts +9 -0
  170. package/dist/routes/claude-routes.d.ts.map +1 -0
  171. package/dist/routes/claude-routes.js +47 -0
  172. package/dist/routes/claude-routes.js.map +1 -0
  173. package/dist/routes/config-routes.d.ts +9 -0
  174. package/dist/routes/config-routes.d.ts.map +1 -0
  175. package/dist/routes/config-routes.js +56 -0
  176. package/dist/routes/config-routes.js.map +1 -0
  177. package/dist/routes/config-store.d.ts +41 -0
  178. package/dist/routes/config-store.d.ts.map +1 -0
  179. package/dist/routes/config-store.js +52 -0
  180. package/dist/routes/config-store.js.map +1 -0
  181. package/dist/routes/http-utils.d.ts +32 -0
  182. package/dist/routes/http-utils.d.ts.map +1 -0
  183. package/dist/routes/http-utils.js +123 -0
  184. package/dist/routes/http-utils.js.map +1 -0
  185. package/dist/routes/index.d.ts +19 -0
  186. package/dist/routes/index.d.ts.map +1 -0
  187. package/dist/routes/index.js +17 -0
  188. package/dist/routes/index.js.map +1 -0
  189. package/dist/routes/notification-routes.d.ts +10 -0
  190. package/dist/routes/notification-routes.d.ts.map +1 -0
  191. package/dist/routes/notification-routes.js +64 -0
  192. package/dist/routes/notification-routes.js.map +1 -0
  193. package/dist/routes/project-routes.d.ts +22 -0
  194. package/dist/routes/project-routes.d.ts.map +1 -0
  195. package/dist/routes/project-routes.js +415 -0
  196. package/dist/routes/project-routes.js.map +1 -0
  197. package/dist/routes/session-routes.d.ts +18 -0
  198. package/dist/routes/session-routes.d.ts.map +1 -0
  199. package/dist/routes/session-routes.js +609 -0
  200. package/dist/routes/session-routes.js.map +1 -0
  201. package/dist/routes/source-routes.d.ts +12 -0
  202. package/dist/routes/source-routes.d.ts.map +1 -0
  203. package/dist/routes/source-routes.js +119 -0
  204. package/dist/routes/source-routes.js.map +1 -0
  205. package/dist/routes/static-routes.d.ts +12 -0
  206. package/dist/routes/static-routes.d.ts.map +1 -0
  207. package/dist/routes/static-routes.js +52 -0
  208. package/dist/routes/static-routes.js.map +1 -0
  209. package/dist/routes/sync-routes.d.ts +9 -0
  210. package/dist/routes/sync-routes.d.ts.map +1 -0
  211. package/dist/routes/sync-routes.js +78 -0
  212. package/dist/routes/sync-routes.js.map +1 -0
  213. package/dist/routes/tile-routes.d.ts +10 -0
  214. package/dist/routes/tile-routes.d.ts.map +1 -0
  215. package/dist/routes/tile-routes.js +108 -0
  216. package/dist/routes/tile-routes.js.map +1 -0
  217. package/dist/routes/types.d.ts +17 -0
  218. package/dist/routes/types.d.ts.map +1 -0
  219. package/dist/routes/types.js +5 -0
  220. package/dist/routes/types.js.map +1 -0
  221. package/dist/routes/usage-routes.d.ts +8 -0
  222. package/dist/routes/usage-routes.d.ts.map +1 -0
  223. package/dist/routes/usage-routes.js +18 -0
  224. package/dist/routes/usage-routes.js.map +1 -0
  225. package/dist/server.d.ts +8 -0
  226. package/dist/server.d.ts.map +1 -0
  227. package/dist/server.js +173 -0
  228. package/dist/server.js.map +1 -0
  229. package/dist/services/branch-divergence-service.d.ts +48 -0
  230. package/dist/services/branch-divergence-service.d.ts.map +1 -0
  231. package/dist/services/branch-divergence-service.js +156 -0
  232. package/dist/services/branch-divergence-service.js.map +1 -0
  233. package/dist/services/broadcast-service.d.ts +68 -0
  234. package/dist/services/broadcast-service.d.ts.map +1 -0
  235. package/dist/services/broadcast-service.js +78 -0
  236. package/dist/services/broadcast-service.js.map +1 -0
  237. package/dist/services/broadcast-service.test.d.ts +5 -0
  238. package/dist/services/broadcast-service.test.d.ts.map +1 -0
  239. package/dist/services/broadcast-service.test.js +130 -0
  240. package/dist/services/broadcast-service.test.js.map +1 -0
  241. package/dist/services/chat-service.d.ts +72 -0
  242. package/dist/services/chat-service.d.ts.map +1 -0
  243. package/dist/services/chat-service.js +342 -0
  244. package/dist/services/chat-service.js.map +1 -0
  245. package/dist/services/chat-system-prompt.d.ts +14 -0
  246. package/dist/services/chat-system-prompt.d.ts.map +1 -0
  247. package/dist/services/chat-system-prompt.js +68 -0
  248. package/dist/services/chat-system-prompt.js.map +1 -0
  249. package/dist/services/notification-service.d.ts +115 -0
  250. package/dist/services/notification-service.d.ts.map +1 -0
  251. package/dist/services/notification-service.js +424 -0
  252. package/dist/services/notification-service.js.map +1 -0
  253. package/dist/services/notification-service.test.d.ts +5 -0
  254. package/dist/services/notification-service.test.d.ts.map +1 -0
  255. package/dist/services/notification-service.test.js +918 -0
  256. package/dist/services/notification-service.test.js.map +1 -0
  257. package/dist/session/cleanup-service.d.ts +51 -0
  258. package/dist/session/cleanup-service.d.ts.map +1 -0
  259. package/dist/session/cleanup-service.js +98 -0
  260. package/dist/session/cleanup-service.js.map +1 -0
  261. package/dist/session/cleanup-service.test.d.ts +5 -0
  262. package/dist/session/cleanup-service.test.d.ts.map +1 -0
  263. package/dist/session/cleanup-service.test.js +121 -0
  264. package/dist/session/cleanup-service.test.js.map +1 -0
  265. package/dist/session/process-monitor.d.ts +79 -0
  266. package/dist/session/process-monitor.d.ts.map +1 -0
  267. package/dist/session/process-monitor.js +270 -0
  268. package/dist/session/process-monitor.js.map +1 -0
  269. package/dist/session/process-monitor.test.d.ts +5 -0
  270. package/dist/session/process-monitor.test.d.ts.map +1 -0
  271. package/dist/session/process-monitor.test.js +367 -0
  272. package/dist/session/process-monitor.test.js.map +1 -0
  273. package/dist/session/session-factory.d.ts +29 -0
  274. package/dist/session/session-factory.d.ts.map +1 -0
  275. package/dist/session/session-factory.js +123 -0
  276. package/dist/session/session-factory.js.map +1 -0
  277. package/dist/session/session-factory.test.d.ts +5 -0
  278. package/dist/session/session-factory.test.d.ts.map +1 -0
  279. package/dist/session/session-factory.test.js +299 -0
  280. package/dist/session/session-factory.test.js.map +1 -0
  281. package/dist/session-registry.d.ts +168 -0
  282. package/dist/session-registry.d.ts.map +1 -0
  283. package/dist/session-registry.js +626 -0
  284. package/dist/session-registry.js.map +1 -0
  285. package/dist/session-registry.test.d.ts +5 -0
  286. package/dist/session-registry.test.d.ts.map +1 -0
  287. package/dist/session-registry.test.js +582 -0
  288. package/dist/session-registry.test.js.map +1 -0
  289. package/dist/start-server.d.ts +31 -0
  290. package/dist/start-server.d.ts.map +1 -0
  291. package/dist/start-server.js +408 -0
  292. package/dist/start-server.js.map +1 -0
  293. package/dist/terminal-activator.d.ts +29 -0
  294. package/dist/terminal-activator.d.ts.map +1 -0
  295. package/dist/terminal-activator.js +264 -0
  296. package/dist/terminal-activator.js.map +1 -0
  297. package/dist/terminal-activator.test.d.ts +9 -0
  298. package/dist/terminal-activator.test.d.ts.map +1 -0
  299. package/dist/terminal-activator.test.js +95 -0
  300. package/dist/terminal-activator.test.js.map +1 -0
  301. package/dist/terminal-launcher.d.ts +51 -0
  302. package/dist/terminal-launcher.d.ts.map +1 -0
  303. package/dist/terminal-launcher.js +298 -0
  304. package/dist/terminal-launcher.js.map +1 -0
  305. package/dist/terminal-launcher.test.d.ts +8 -0
  306. package/dist/terminal-launcher.test.d.ts.map +1 -0
  307. package/dist/terminal-launcher.test.js +222 -0
  308. package/dist/terminal-launcher.test.js.map +1 -0
  309. package/dist/types.d.ts +796 -0
  310. package/dist/types.d.ts.map +1 -0
  311. package/dist/types.js +15 -0
  312. package/dist/types.js.map +1 -0
  313. package/dist/unix-socket.d.ts +68 -0
  314. package/dist/unix-socket.d.ts.map +1 -0
  315. package/dist/unix-socket.js +180 -0
  316. package/dist/unix-socket.js.map +1 -0
  317. package/dist/usage-limits.d.ts +13 -0
  318. package/dist/usage-limits.d.ts.map +1 -0
  319. package/dist/usage-limits.js +112 -0
  320. package/dist/usage-limits.js.map +1 -0
  321. package/dist/watchers/handoff-watcher.d.ts +74 -0
  322. package/dist/watchers/handoff-watcher.d.ts.map +1 -0
  323. package/dist/watchers/handoff-watcher.js +124 -0
  324. package/dist/watchers/handoff-watcher.js.map +1 -0
  325. package/dist/watchers/handoff-watcher.test.d.ts +8 -0
  326. package/dist/watchers/handoff-watcher.test.d.ts.map +1 -0
  327. package/dist/watchers/handoff-watcher.test.js +142 -0
  328. package/dist/watchers/handoff-watcher.test.js.map +1 -0
  329. package/dist/websocket.d.ts +107 -0
  330. package/dist/websocket.d.ts.map +1 -0
  331. package/dist/websocket.js +268 -0
  332. package/dist/websocket.js.map +1 -0
  333. package/dist/window-manager/index.d.ts +28 -0
  334. package/dist/window-manager/index.d.ts.map +1 -0
  335. package/dist/window-manager/index.js +56 -0
  336. package/dist/window-manager/index.js.map +1 -0
  337. package/dist/window-manager/layouts.d.ts +42 -0
  338. package/dist/window-manager/layouts.d.ts.map +1 -0
  339. package/dist/window-manager/layouts.js +133 -0
  340. package/dist/window-manager/layouts.js.map +1 -0
  341. package/dist/window-manager/linux-manager.d.ts +45 -0
  342. package/dist/window-manager/linux-manager.d.ts.map +1 -0
  343. package/dist/window-manager/linux-manager.js +299 -0
  344. package/dist/window-manager/linux-manager.js.map +1 -0
  345. package/dist/window-manager/macos-manager.d.ts +103 -0
  346. package/dist/window-manager/macos-manager.d.ts.map +1 -0
  347. package/dist/window-manager/macos-manager.js +637 -0
  348. package/dist/window-manager/macos-manager.js.map +1 -0
  349. package/dist/window-manager/smart-layouts.d.ts +116 -0
  350. package/dist/window-manager/smart-layouts.d.ts.map +1 -0
  351. package/dist/window-manager/smart-layouts.js +188 -0
  352. package/dist/window-manager/smart-layouts.js.map +1 -0
  353. package/dist/window-manager/smart-layouts.test.d.ts +8 -0
  354. package/dist/window-manager/smart-layouts.test.d.ts.map +1 -0
  355. package/dist/window-manager/smart-layouts.test.js +311 -0
  356. package/dist/window-manager/smart-layouts.test.js.map +1 -0
  357. package/dist/window-manager/tile-state.d.ts +87 -0
  358. package/dist/window-manager/tile-state.d.ts.map +1 -0
  359. package/dist/window-manager/tile-state.js +136 -0
  360. package/dist/window-manager/tile-state.js.map +1 -0
  361. package/dist/window-manager/tile-state.test.d.ts +8 -0
  362. package/dist/window-manager/tile-state.test.d.ts.map +1 -0
  363. package/dist/window-manager/tile-state.test.js +179 -0
  364. package/dist/window-manager/tile-state.test.js.map +1 -0
  365. package/dist/window-manager/types.d.ts +104 -0
  366. package/dist/window-manager/types.d.ts.map +1 -0
  367. package/dist/window-manager/types.js +8 -0
  368. package/dist/window-manager/types.js.map +1 -0
  369. package/dist/window-manager/windows-manager.d.ts +44 -0
  370. package/dist/window-manager/windows-manager.d.ts.map +1 -0
  371. package/dist/window-manager/windows-manager.js +281 -0
  372. package/dist/window-manager/windows-manager.js.map +1 -0
  373. package/dist/window-manager/windows-manager.test.d.ts +8 -0
  374. package/dist/window-manager/windows-manager.test.d.ts.map +1 -0
  375. package/dist/window-manager/windows-manager.test.js +183 -0
  376. package/dist/window-manager/windows-manager.test.js.map +1 -0
  377. package/gui-dist/assets/index-BmYIHRYe.js +142 -0
  378. package/gui-dist/assets/index-D_N5RH8O.css +1 -0
  379. package/gui-dist/assets/vendor-icons-ByXNrcwf.js +336 -0
  380. package/gui-dist/assets/vendor-markdown-DWPYwU1x.js +22 -0
  381. package/gui-dist/assets/vendor-react-CpILBTDM.js +59 -0
  382. package/gui-dist/index.html +17 -0
  383. package/gui-dist/jacsub.png +0 -0
  384. package/package.json +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-system-prompt.js","sourceRoot":"","sources":["../../src/services/chat-system-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IAC7D,IAAI,KAAmB,CAAC;IACxB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACnG,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,8DAA8D,WAAW,EAAE,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sGAAsG,CAAC,CAAC;IACnH,KAAK,CAAC,IAAI,CAAC,kHAAkH,CAAC,CAAC;IAC/H,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;IAClG,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,qBAAqB;IACrB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,aAAa;IACb,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;QAC3G,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;IAElG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Notification Service
3
+ *
4
+ * Server-side notification management for Jacques.
5
+ * Handles desktop OS notifications via node-notifier and broadcasts
6
+ * notification events to GUI clients via WebSocket.
7
+ *
8
+ * Settings are persisted in ~/.jacques/config.json under "notifications".
9
+ */
10
+ import type { NotificationCategory, NotificationSettings, NotificationItem } from '@jacques-ai/core/notifications';
11
+ import type { NotificationFiredMessage, Session } from '../types.js';
12
+ import type { Logger } from '../logging/logger-factory.js';
13
+ export interface NotificationServiceConfig {
14
+ /** Callback to broadcast messages to WebSocket clients */
15
+ broadcast: (message: NotificationFiredMessage) => void;
16
+ /** Optional callback to focus a terminal window by session ID */
17
+ focusTerminal?: (sessionId: string) => void;
18
+ /** Optional callback to look up session data for contextual notifications */
19
+ getSession?: (sessionId: string) => {
20
+ project: string;
21
+ git_branch?: string | null;
22
+ session_title?: string | null;
23
+ } | undefined;
24
+ /** Optional logger */
25
+ logger?: Logger;
26
+ }
27
+ interface ClaudeOperationInfo {
28
+ id: string;
29
+ operation: string;
30
+ phase: 'start' | 'complete';
31
+ totalTokens: number;
32
+ userPromptPreview?: string;
33
+ }
34
+ export declare class NotificationService {
35
+ private broadcastFn;
36
+ private focusTerminalFn?;
37
+ private getSessionFn?;
38
+ private logger;
39
+ /** Cooldown tracking: key -> last fire timestamp */
40
+ private cooldowns;
41
+ /** Per-session fired thresholds */
42
+ private firedThresholds;
43
+ /** Previous context percentages per session (for crossing detection) */
44
+ private prevContextPct;
45
+ /** Notification history (most recent first) */
46
+ private history;
47
+ /** Cached settings */
48
+ private settings;
49
+ /** Plan detection: known plan titles per session */
50
+ private knownPlanTitles;
51
+ /** Plan detection: last check timestamp per session (30s debounce) */
52
+ private planCheckTimestamp;
53
+ /** Error scanning: last byte offset per session */
54
+ private errorScanOffset;
55
+ /** Error scanning: accumulated errors since last alert */
56
+ private errorCountSinceAlert;
57
+ constructor(config: NotificationServiceConfig);
58
+ getSettings(): NotificationSettings;
59
+ updateSettings(patch: Partial<NotificationSettings>): NotificationSettings;
60
+ getHistory(): NotificationItem[];
61
+ /**
62
+ * Called when a session's context metrics are updated.
63
+ * Checks for threshold crossings and fires notifications.
64
+ */
65
+ onContextUpdate(session: Session): void;
66
+ /**
67
+ * Called when a Claude operation completes.
68
+ * Fires if the operation exceeds the token threshold.
69
+ */
70
+ onClaudeOperation(op: ClaudeOperationInfo): void;
71
+ /**
72
+ * Called when a handoff file is ready.
73
+ */
74
+ onHandoffReady(sessionId: string, path: string): void;
75
+ /**
76
+ * Called when a new plan is detected in a session.
77
+ */
78
+ onPlanReady(sessionId: string, planTitle: string): void;
79
+ /**
80
+ * Check for new plans in a session's JSONL transcript.
81
+ * Debounced to 30s per session to avoid excessive JSONL parsing.
82
+ */
83
+ checkForNewPlans(sessionId: string, transcriptPath: string): Promise<void>;
84
+ /**
85
+ * Scan a session's JSONL transcript for tool errors.
86
+ * Reads incrementally from last byte offset for efficiency.
87
+ * Fires bug-alert when error count reaches bugAlertThreshold.
88
+ */
89
+ scanForErrors(sessionId: string, transcriptPath: string): Promise<void>;
90
+ /**
91
+ * Called when a session is removed.
92
+ * Cleans up tracking state for that session.
93
+ */
94
+ onSessionRemoved(sessionId: string): void;
95
+ /**
96
+ * Fire a test notification (for development/debugging).
97
+ * Bypasses cooldowns and enabled check.
98
+ */
99
+ fireTestNotification(category: NotificationCategory, title: string, body: string, priority?: NotificationItem['priority'], sessionId?: string): void;
100
+ private fire;
101
+ /**
102
+ * Resolve project name and branch from a session ID.
103
+ */
104
+ private resolveSessionContext;
105
+ /**
106
+ * Send a native desktop notification via node-notifier.
107
+ * Format: project name as title, branch + category as subtitle, mascot as icon.
108
+ */
109
+ private sendDesktopNotification;
110
+ private canFire;
111
+ private loadSettings;
112
+ private saveSettings;
113
+ }
114
+ export {};
115
+ //# sourceMappingURL=notification-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service.d.ts","sourceRoot":"","sources":["../../src/services/notification-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,424 @@
1
+ /**
2
+ * Notification Service
3
+ *
4
+ * Server-side notification management for Jacques.
5
+ * Handles desktop OS notifications via node-notifier and broadcasts
6
+ * notification events to GUI clients via WebSocket.
7
+ *
8
+ * Settings are persisted in ~/.jacques/config.json under "notifications".
9
+ */
10
+ import notifier from 'node-notifier';
11
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
12
+ import { open as fsOpen } from 'fs/promises';
13
+ import { stat as fsStat } from 'fs/promises';
14
+ import { join, dirname } from 'path';
15
+ import { fileURLToPath } from 'url';
16
+ import { homedir } from 'os';
17
+ import { DEFAULT_NOTIFICATION_SETTINGS, NOTIFICATION_COOLDOWNS, CATEGORY_LABELS, MAX_NOTIFICATION_HISTORY, getContextThresholdPriority, } from '@jacques-ai/core/notifications';
18
+ import { parseJSONL, detectModeAndPlans } from '@jacques-ai/core';
19
+ import { createLogger } from '../logging/logger-factory.js';
20
+ // ============================================================
21
+ // Constants
22
+ // ============================================================
23
+ const JACQUES_DIR = join(homedir(), '.jacques');
24
+ const JACQUES_CONFIG_PATH = join(JACQUES_DIR, 'config.json');
25
+ const __dirname = dirname(fileURLToPath(import.meta.url));
26
+ const ICON_PATH = join(__dirname, '..', '..', '..', 'gui', 'public', 'jacsub.png');
27
+ // ============================================================
28
+ // Service
29
+ // ============================================================
30
+ export class NotificationService {
31
+ broadcastFn;
32
+ focusTerminalFn;
33
+ getSessionFn;
34
+ logger;
35
+ /** Cooldown tracking: key -> last fire timestamp */
36
+ cooldowns = new Map();
37
+ /** Per-session fired thresholds */
38
+ firedThresholds = new Map();
39
+ /** Previous context percentages per session (for crossing detection) */
40
+ prevContextPct = new Map();
41
+ /** Notification history (most recent first) */
42
+ history = [];
43
+ /** Cached settings */
44
+ settings;
45
+ /** Plan detection: known plan titles per session */
46
+ knownPlanTitles = new Map();
47
+ /** Plan detection: last check timestamp per session (30s debounce) */
48
+ planCheckTimestamp = new Map();
49
+ /** Error scanning: last byte offset per session */
50
+ errorScanOffset = new Map();
51
+ /** Error scanning: accumulated errors since last alert */
52
+ errorCountSinceAlert = new Map();
53
+ constructor(config) {
54
+ this.broadcastFn = config.broadcast;
55
+ this.focusTerminalFn = config.focusTerminal;
56
+ this.getSessionFn = config.getSession;
57
+ this.logger = config.logger ?? createLogger({ silent: true });
58
+ this.settings = this.loadSettings();
59
+ }
60
+ // ----------------------------------------------------------
61
+ // Settings
62
+ // ----------------------------------------------------------
63
+ getSettings() {
64
+ return { ...this.settings };
65
+ }
66
+ updateSettings(patch) {
67
+ if (patch.categories) {
68
+ this.settings.categories = {
69
+ ...this.settings.categories,
70
+ ...patch.categories,
71
+ };
72
+ }
73
+ if (patch.enabled !== undefined)
74
+ this.settings.enabled = patch.enabled;
75
+ if (patch.largeOperationThreshold !== undefined) {
76
+ this.settings.largeOperationThreshold = patch.largeOperationThreshold;
77
+ }
78
+ if (patch.contextThresholds !== undefined) {
79
+ this.settings.contextThresholds = patch.contextThresholds;
80
+ }
81
+ if (patch.bugAlertThreshold !== undefined) {
82
+ this.settings.bugAlertThreshold = patch.bugAlertThreshold;
83
+ }
84
+ this.saveSettings();
85
+ return this.getSettings();
86
+ }
87
+ getHistory() {
88
+ return [...this.history];
89
+ }
90
+ // ----------------------------------------------------------
91
+ // Event handlers
92
+ // ----------------------------------------------------------
93
+ /**
94
+ * Called when a session's context metrics are updated.
95
+ * Checks for threshold crossings and fires notifications.
96
+ */
97
+ onContextUpdate(session) {
98
+ const pct = session.context_metrics?.used_percentage;
99
+ if (pct == null)
100
+ return;
101
+ const sessionId = session.session_id;
102
+ const prevPct = this.prevContextPct.get(sessionId) ?? 0;
103
+ this.prevContextPct.set(sessionId, pct);
104
+ // Initialize fired thresholds set if needed
105
+ if (!this.firedThresholds.has(sessionId)) {
106
+ this.firedThresholds.set(sessionId, new Set());
107
+ }
108
+ const fired = this.firedThresholds.get(sessionId);
109
+ for (const threshold of this.settings.contextThresholds) {
110
+ // Fire if we crossed upward past the threshold and haven't fired it yet
111
+ if (pct >= threshold && prevPct < threshold && !fired.has(threshold)) {
112
+ fired.add(threshold);
113
+ const priority = getContextThresholdPriority(threshold);
114
+ this.fire('context', `${sessionId}-${threshold}`, `Context reached ${Math.round(pct)}%`, `Crossed ${threshold}% threshold`, priority, sessionId);
115
+ }
116
+ }
117
+ }
118
+ /**
119
+ * Called when a Claude operation completes.
120
+ * Fires if the operation exceeds the token threshold.
121
+ */
122
+ onClaudeOperation(op) {
123
+ if (op.phase !== 'complete')
124
+ return;
125
+ if (op.totalTokens < this.settings.largeOperationThreshold)
126
+ return;
127
+ const tokens = op.totalTokens >= 1000
128
+ ? `${Math.round(op.totalTokens / 1000)}k`
129
+ : String(op.totalTokens);
130
+ this.fire('operation', op.id, `${tokens} token operation`, op.userPromptPreview
131
+ ? op.userPromptPreview.slice(0, 80)
132
+ : `${op.operation} completed`, op.totalTokens >= 100_000 ? 'high' : 'medium');
133
+ }
134
+ /**
135
+ * Called when a handoff file is ready.
136
+ */
137
+ onHandoffReady(sessionId, path) {
138
+ const filename = path.split(/[/\\]/).pop() ?? 'handoff';
139
+ this.fire('handoff', `${sessionId}-handoff`, 'Handoff Ready', `Generated ${filename}`, 'medium', sessionId);
140
+ }
141
+ /**
142
+ * Called when a new plan is detected in a session.
143
+ */
144
+ onPlanReady(sessionId, planTitle) {
145
+ this.fire('plan', `${sessionId}-plan-${Date.now()}`, `Plan: ${planTitle}`, 'New plan detected', 'medium', sessionId);
146
+ }
147
+ /**
148
+ * Check for new plans in a session's JSONL transcript.
149
+ * Debounced to 30s per session to avoid excessive JSONL parsing.
150
+ */
151
+ async checkForNewPlans(sessionId, transcriptPath) {
152
+ try {
153
+ // 30s debounce per session
154
+ const lastCheck = this.planCheckTimestamp.get(sessionId) ?? 0;
155
+ if (Date.now() - lastCheck < 30_000)
156
+ return;
157
+ this.planCheckTimestamp.set(sessionId, Date.now());
158
+ const entries = await parseJSONL(transcriptPath);
159
+ const { planRefs } = detectModeAndPlans(entries);
160
+ if (!this.knownPlanTitles.has(sessionId)) {
161
+ this.knownPlanTitles.set(sessionId, new Set());
162
+ }
163
+ const known = this.knownPlanTitles.get(sessionId);
164
+ for (const ref of planRefs) {
165
+ const title = ref.title ?? 'Untitled Plan';
166
+ if (!known.has(title)) {
167
+ known.add(title);
168
+ this.onPlanReady(sessionId, title);
169
+ }
170
+ }
171
+ }
172
+ catch (err) {
173
+ this.logger.error(`[Notification] checkForNewPlans failed for ${sessionId}: ${err}`);
174
+ }
175
+ }
176
+ /**
177
+ * Scan a session's JSONL transcript for tool errors.
178
+ * Reads incrementally from last byte offset for efficiency.
179
+ * Fires bug-alert when error count reaches bugAlertThreshold.
180
+ */
181
+ async scanForErrors(sessionId, transcriptPath) {
182
+ try {
183
+ const fileStat = await fsStat(transcriptPath);
184
+ const currentSize = fileStat.size;
185
+ const lastOffset = this.errorScanOffset.get(sessionId) ?? 0;
186
+ if (currentSize <= lastOffset)
187
+ return;
188
+ const fh = await fsOpen(transcriptPath, 'r');
189
+ try {
190
+ const buffer = Buffer.alloc(currentSize - lastOffset);
191
+ await fh.read(buffer, 0, buffer.length, lastOffset);
192
+ this.errorScanOffset.set(sessionId, currentSize);
193
+ const newContent = buffer.toString('utf-8');
194
+ const lines = newContent.split('\n');
195
+ let errorCount = 0;
196
+ for (const line of lines) {
197
+ const trimmed = line.trim();
198
+ if (!trimmed)
199
+ continue;
200
+ try {
201
+ const entry = JSON.parse(trimmed);
202
+ // Count tool_result entries with is_error
203
+ if (entry.type === 'assistant' && Array.isArray(entry.message?.content)) {
204
+ for (const block of entry.message.content) {
205
+ if (block.type === 'tool_result' && block.is_error === true) {
206
+ errorCount++;
207
+ }
208
+ }
209
+ }
210
+ }
211
+ catch {
212
+ // Skip malformed lines
213
+ }
214
+ }
215
+ if (errorCount > 0) {
216
+ const accumulated = (this.errorCountSinceAlert.get(sessionId) ?? 0) + errorCount;
217
+ this.errorCountSinceAlert.set(sessionId, accumulated);
218
+ if (accumulated >= this.settings.bugAlertThreshold) {
219
+ this.fire('bug-alert', `${sessionId}-bug-alert`, `${accumulated} tool errors`, 'Multiple tool errors detected', accumulated >= 10 ? 'high' : 'medium', sessionId);
220
+ this.errorCountSinceAlert.set(sessionId, 0);
221
+ }
222
+ }
223
+ }
224
+ finally {
225
+ await fh.close();
226
+ }
227
+ }
228
+ catch (err) {
229
+ this.logger.error(`[Notification] scanForErrors failed for ${sessionId}: ${err}`);
230
+ }
231
+ }
232
+ /**
233
+ * Called when a session is removed.
234
+ * Cleans up tracking state for that session.
235
+ */
236
+ onSessionRemoved(sessionId) {
237
+ this.firedThresholds.delete(sessionId);
238
+ this.prevContextPct.delete(sessionId);
239
+ this.knownPlanTitles.delete(sessionId);
240
+ this.planCheckTimestamp.delete(sessionId);
241
+ this.errorScanOffset.delete(sessionId);
242
+ this.errorCountSinceAlert.delete(sessionId);
243
+ }
244
+ /**
245
+ * Fire a test notification (for development/debugging).
246
+ * Bypasses cooldowns and enabled check.
247
+ */
248
+ fireTestNotification(category, title, body, priority = 'medium', sessionId) {
249
+ const { projectName, branchName } = this.resolveSessionContext(sessionId);
250
+ const notification = {
251
+ id: `test-${category}-${Date.now()}`,
252
+ category,
253
+ title,
254
+ body,
255
+ priority,
256
+ timestamp: Date.now(),
257
+ sessionId,
258
+ projectName,
259
+ branchName,
260
+ };
261
+ // Native OS notification (if enabled)
262
+ if (this.settings.enabled) {
263
+ this.sendDesktopNotification(category, title, body, sessionId, projectName, branchName);
264
+ }
265
+ // Broadcast to GUI clients
266
+ const message = { type: 'notification_fired', notification };
267
+ this.broadcastFn(message);
268
+ this.history.unshift(notification);
269
+ if (this.history.length > MAX_NOTIFICATION_HISTORY) {
270
+ this.history = this.history.slice(0, MAX_NOTIFICATION_HISTORY);
271
+ }
272
+ }
273
+ // ----------------------------------------------------------
274
+ // Core fire logic
275
+ // ----------------------------------------------------------
276
+ fire(category, key, title, body, priority, sessionId) {
277
+ // Category gating
278
+ if (!this.settings.categories[category])
279
+ return;
280
+ // Cooldown check
281
+ if (!this.canFire(category, key))
282
+ return;
283
+ // Resolve session context for project/branch display
284
+ const { projectName, branchName } = this.resolveSessionContext(sessionId);
285
+ const notification = {
286
+ id: `notif-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
287
+ category,
288
+ title,
289
+ body,
290
+ priority,
291
+ timestamp: Date.now(),
292
+ sessionId,
293
+ projectName,
294
+ branchName,
295
+ };
296
+ // Add to history
297
+ this.history.unshift(notification);
298
+ if (this.history.length > MAX_NOTIFICATION_HISTORY) {
299
+ this.history = this.history.slice(0, MAX_NOTIFICATION_HISTORY);
300
+ }
301
+ this.logger.log(`[Notification] ${category}: ${title} - ${body}`);
302
+ // Desktop notification (if enabled)
303
+ if (this.settings.enabled) {
304
+ this.sendDesktopNotification(category, title, body, sessionId, projectName, branchName);
305
+ }
306
+ // Broadcast to GUI clients
307
+ const message = {
308
+ type: 'notification_fired',
309
+ notification,
310
+ };
311
+ this.broadcastFn(message);
312
+ }
313
+ /**
314
+ * Resolve project name and branch from a session ID.
315
+ */
316
+ resolveSessionContext(sessionId) {
317
+ if (!sessionId || !this.getSessionFn)
318
+ return {};
319
+ const session = this.getSessionFn(sessionId);
320
+ if (!session)
321
+ return {};
322
+ return {
323
+ projectName: session.project || undefined,
324
+ branchName: session.git_branch || undefined,
325
+ };
326
+ }
327
+ /**
328
+ * Send a native desktop notification via node-notifier.
329
+ * Format: project name as title, branch + category as subtitle, mascot as icon.
330
+ */
331
+ sendDesktopNotification(category, title, body, sessionId, projectName, branchName) {
332
+ try {
333
+ const categoryLabel = CATEGORY_LABELS[category];
334
+ const desktopTitle = projectName || title;
335
+ const desktopSubtitle = branchName
336
+ ? `${branchName} · ${categoryLabel}`
337
+ : categoryLabel;
338
+ notifier.notify({
339
+ title: desktopTitle,
340
+ subtitle: desktopSubtitle,
341
+ message: projectName ? title : body,
342
+ sound: 'Sosumi',
343
+ contentImage: ICON_PATH,
344
+ wait: true,
345
+ actions: ['Focus'],
346
+ }, (_err, response) => {
347
+ if ((response === 'activate' || response === 'Focus') && sessionId && this.focusTerminalFn) {
348
+ try {
349
+ this.focusTerminalFn(sessionId);
350
+ }
351
+ catch (focusErr) {
352
+ this.logger.error(`[Notification] Focus terminal failed: ${focusErr}`);
353
+ }
354
+ }
355
+ });
356
+ }
357
+ catch (err) {
358
+ this.logger.error(`[Notification] Desktop notification failed: ${err}`);
359
+ }
360
+ }
361
+ canFire(category, key) {
362
+ const cooldownKey = `${category}:${key}`;
363
+ const last = this.cooldowns.get(cooldownKey) ?? 0;
364
+ const now = Date.now();
365
+ if (now - last < NOTIFICATION_COOLDOWNS[category])
366
+ return false;
367
+ this.cooldowns.set(cooldownKey, now);
368
+ return true;
369
+ }
370
+ // ----------------------------------------------------------
371
+ // Settings persistence
372
+ // ----------------------------------------------------------
373
+ loadSettings() {
374
+ try {
375
+ if (!existsSync(JACQUES_CONFIG_PATH)) {
376
+ return { ...DEFAULT_NOTIFICATION_SETTINGS };
377
+ }
378
+ const content = readFileSync(JACQUES_CONFIG_PATH, 'utf-8');
379
+ const config = JSON.parse(content);
380
+ if (config.notifications) {
381
+ return {
382
+ ...DEFAULT_NOTIFICATION_SETTINGS,
383
+ ...config.notifications,
384
+ categories: {
385
+ ...DEFAULT_NOTIFICATION_SETTINGS.categories,
386
+ ...config.notifications.categories,
387
+ },
388
+ };
389
+ }
390
+ }
391
+ catch {
392
+ // Use defaults on any error
393
+ }
394
+ return { ...DEFAULT_NOTIFICATION_SETTINGS };
395
+ }
396
+ saveSettings() {
397
+ try {
398
+ let config = {};
399
+ if (existsSync(JACQUES_CONFIG_PATH)) {
400
+ try {
401
+ config = JSON.parse(readFileSync(JACQUES_CONFIG_PATH, 'utf-8'));
402
+ }
403
+ catch {
404
+ // Start fresh if corrupted
405
+ }
406
+ }
407
+ config.notifications = {
408
+ enabled: this.settings.enabled,
409
+ categories: { ...this.settings.categories },
410
+ largeOperationThreshold: this.settings.largeOperationThreshold,
411
+ contextThresholds: [...this.settings.contextThresholds],
412
+ bugAlertThreshold: this.settings.bugAlertThreshold,
413
+ };
414
+ if (!existsSync(JACQUES_DIR)) {
415
+ mkdirSync(JACQUES_DIR, { recursive: true });
416
+ }
417
+ writeFileSync(JACQUES_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');
418
+ }
419
+ catch (err) {
420
+ this.logger.error(`[Notification] Failed to save settings: ${err}`);
421
+ }
422
+ }
423
+ }
424
+ //# sourceMappingURL=notification-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service.js","sourceRoot":"","sources":["../../src/services/notification-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Notification Service Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=notification-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service.test.d.ts","sourceRoot":"","sources":["../../src/services/notification-service.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}