@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":"ws-utils.d.ts","sourceRoot":"","sources":["../../src/handlers/ws-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAIlE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * WebSocket Utilities
3
+ *
4
+ * Shared response helpers to eliminate the repeated
5
+ * `if (ws.readyState === WebSocket.OPEN) { ws.send(...) }` pattern.
6
+ */
7
+ import { WebSocket } from 'ws';
8
+ /**
9
+ * Send a JSON response to a WebSocket client if the connection is still open.
10
+ */
11
+ export function sendWsResponse(ws, response) {
12
+ if (ws.readyState === WebSocket.OPEN) {
13
+ ws.send(JSON.stringify(response));
14
+ }
15
+ }
16
+ //# sourceMappingURL=ws-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-utils.js","sourceRoot":"","sources":["../../src/handlers/ws-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAI,EAAa,EAAE,QAAW;IAC1D,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * HTTP API Server — Thin Orchestrator
3
+ *
4
+ * Creates an HTTP server and chains domain-specific route handlers.
5
+ * Each handler returns true if it handled the request, false to pass.
6
+ * Runs on port 4243 by default.
7
+ */
8
+ import type { NotificationService } from './services/notification-service.js';
9
+ export interface ApiLog {
10
+ method: string;
11
+ path: string;
12
+ status: number;
13
+ durationMs: number;
14
+ timestamp: number;
15
+ }
16
+ export interface HttpApiOptions {
17
+ port?: number;
18
+ silent?: boolean;
19
+ onApiLog?: (log: ApiLog) => void;
20
+ notificationService?: NotificationService;
21
+ }
22
+ export interface HttpApiServer {
23
+ stop: () => Promise<void>;
24
+ }
25
+ export declare function createHttpApi(options?: HttpApiOptions): Promise<HttpApiServer>;
26
+ //# sourceMappingURL=http-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-api.d.ts","sourceRoot":"","sources":["../src/http-api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAkB9E,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAgBD,wBAAsB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8HxF"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * HTTP API Server — Thin Orchestrator
3
+ *
4
+ * Creates an HTTP server and chains domain-specific route handlers.
5
+ * Each handler returns true if it handled the request, false to pass.
6
+ * Runs on port 4243 by default.
7
+ */
8
+ import { createServer } from 'http';
9
+ import { statSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { sendJson, handleCors } from './routes/http-utils.js';
12
+ import { isGuiAvailable, getGuiDistPath } from './routes/static-routes.js';
13
+ import { usageRoutes, configRoutes, notificationRoutes, claudeRoutes, sourceRoutes, archiveRoutes, tileRoutes, syncRoutes, sessionRoutes, projectRoutes, staticRoutes, } from './routes/index.js';
14
+ const handlers = [
15
+ usageRoutes,
16
+ sourceRoutes,
17
+ configRoutes,
18
+ sessionRoutes,
19
+ projectRoutes,
20
+ archiveRoutes,
21
+ notificationRoutes,
22
+ syncRoutes,
23
+ claudeRoutes,
24
+ tileRoutes,
25
+ staticRoutes,
26
+ ];
27
+ export async function createHttpApi(options = {}) {
28
+ const { port = 4243, silent = false, onApiLog, notificationService } = options;
29
+ const log = silent ? (() => { }) : console.log.bind(console);
30
+ const guiAvailable = isGuiAvailable();
31
+ const guiDistPath = getGuiDistPath();
32
+ if (!guiAvailable && !silent) {
33
+ log('[HTTP API] GUI not built. Run: npm run build:gui');
34
+ }
35
+ else if (guiAvailable && !silent) {
36
+ const guiIndexPath = join(guiDistPath, 'index.html');
37
+ const guiSrcApp = join(guiDistPath, '..', 'src', 'App.tsx');
38
+ try {
39
+ const distMtime = statSync(guiIndexPath).mtimeMs;
40
+ const srcMtime = statSync(guiSrcApp).mtimeMs;
41
+ if (srcMtime > distMtime) {
42
+ log('[HTTP API] GUI build is stale. Run: npm run build:gui');
43
+ }
44
+ }
45
+ catch { /* ignore - source file may not exist in production */ }
46
+ }
47
+ const server = createServer(async (req, res) => {
48
+ const rawUrl = req.url || '/';
49
+ const method = req.method || 'GET';
50
+ const startTime = Date.now();
51
+ // API request logging
52
+ const logApiRequest = (status) => {
53
+ if (onApiLog && rawUrl.startsWith('/api/')) {
54
+ onApiLog({
55
+ method,
56
+ path: rawUrl.split('?')[0],
57
+ status,
58
+ durationMs: Date.now() - startTime,
59
+ timestamp: Date.now(),
60
+ });
61
+ }
62
+ };
63
+ const originalWriteHead = res.writeHead.bind(res);
64
+ let responseStatus = 200;
65
+ res.writeHead = (statusCode, ...args) => {
66
+ responseStatus = statusCode;
67
+ // @ts-expect-error - TypeScript doesn't handle rest args well here
68
+ return originalWriteHead(statusCode, ...args);
69
+ };
70
+ res.on('finish', () => logApiRequest(responseStatus));
71
+ // CORS preflight
72
+ if (method === 'OPTIONS') {
73
+ handleCors(res);
74
+ return;
75
+ }
76
+ // Parse URL for route context
77
+ const parsedUrl = new URL(rawUrl, `http://${req.headers.host || 'localhost'}`);
78
+ const ctx = {
79
+ req,
80
+ res,
81
+ url: parsedUrl.pathname,
82
+ rawUrl,
83
+ method,
84
+ query: parsedUrl.searchParams,
85
+ notificationService,
86
+ log,
87
+ };
88
+ // Chain handlers — first match wins
89
+ for (const handler of handlers) {
90
+ if (await handler(ctx))
91
+ return;
92
+ }
93
+ // 404 fallback
94
+ if (rawUrl.startsWith('/api/')) {
95
+ sendJson(res, 404, { error: 'Not found' });
96
+ }
97
+ else if (guiAvailable) {
98
+ // SPA fallback for unknown GUI routes
99
+ const { serveStaticFile } = await import('./routes/http-utils.js');
100
+ const indexPath = join(guiDistPath, 'index.html');
101
+ if (!serveStaticFile(res, indexPath)) {
102
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
103
+ res.end('Not found');
104
+ }
105
+ }
106
+ else {
107
+ res.writeHead(503, { 'Content-Type': 'text/html' });
108
+ res.end(`
109
+ <html>
110
+ <head><title>Jacques GUI</title></head>
111
+ <body style="font-family: sans-serif; padding: 40px; background: #1a1a1a; color: #fff;">
112
+ <h1>Jacques GUI Not Built</h1>
113
+ <p>Run <code style="background: #333; padding: 4px 8px; border-radius: 4px;">npm run build:gui</code> to build the GUI.</p>
114
+ <p>Then restart <code style="background: #333; padding: 4px 8px; border-radius: 4px;">jacques</code>.</p>
115
+ </body>
116
+ </html>
117
+ `);
118
+ }
119
+ });
120
+ return new Promise((resolve, reject) => {
121
+ server.on('error', (err) => {
122
+ if (err.code === 'EADDRINUSE') {
123
+ log(`[HTTP API] Port ${port} is already in use`);
124
+ }
125
+ reject(err);
126
+ });
127
+ server.listen(port, () => {
128
+ log(`[HTTP API] Listening on http://localhost:${port}`);
129
+ if (guiAvailable) {
130
+ log(`[HTTP API] GUI available at http://localhost:${port}`);
131
+ }
132
+ resolve({
133
+ stop: () => new Promise((resolveStop, rejectStop) => {
134
+ server.close((err) => {
135
+ if (err) {
136
+ rejectStop(err);
137
+ }
138
+ else {
139
+ log('[HTTP API] Stopped');
140
+ resolveStop();
141
+ }
142
+ });
143
+ }),
144
+ });
145
+ });
146
+ });
147
+ }
148
+ //# sourceMappingURL=http-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-api.js","sourceRoot":"","sources":["../src/http-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Logger Module
3
+ *
4
+ * Provides console interception and WebSocket broadcasting for server logs.
5
+ * Allows GUI to display real-time server logs.
6
+ */
7
+ import type { ServerLogMessage } from './types.js';
8
+ type LogCallback = (message: ServerLogMessage) => void;
9
+ /**
10
+ * Log directly to the original console, bypassing interception.
11
+ * Use this for logging that should NOT be broadcast to WebSocket clients
12
+ * (e.g., broadcast confirmation messages, to prevent feedback loops).
13
+ */
14
+ export declare function logDirect(...args: unknown[]): void;
15
+ /**
16
+ * Start intercepting console output.
17
+ * @param options.silent When true, suppress writing to stdout/stderr
18
+ * (still broadcasts to WebSocket listeners). Use in embedded/TUI mode
19
+ * to prevent core module console.error calls from leaking onto the
20
+ * alternate screen buffer and causing visual flickering.
21
+ */
22
+ export declare function startLogInterception(options?: {
23
+ silent?: boolean;
24
+ }): void;
25
+ /**
26
+ * Stop intercepting console output
27
+ */
28
+ export declare function stopLogInterception(): void;
29
+ /**
30
+ * Add a log listener
31
+ */
32
+ export declare function addLogListener(callback: LogCallback): () => void;
33
+ /**
34
+ * Get log history
35
+ */
36
+ export declare function getLogHistory(): ServerLogMessage[];
37
+ /**
38
+ * Clear log history
39
+ */
40
+ export declare function clearLogHistory(): void;
41
+ export {};
42
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,KAAK,WAAW,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAevD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAElD;AAmED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAuBzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,IAAI,CAGhE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,gBAAgB,EAAE,CAElD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
package/dist/logger.js ADDED
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Logger Module
3
+ *
4
+ * Provides console interception and WebSocket broadcasting for server logs.
5
+ * Allows GUI to display real-time server logs.
6
+ */
7
+ // Store original console methods
8
+ const originalConsole = {
9
+ log: console.log.bind(console),
10
+ warn: console.warn.bind(console),
11
+ error: console.error.bind(console),
12
+ };
13
+ // Log listeners
14
+ const listeners = new Set();
15
+ // Re-entrancy guard: prevents infinite loop when broadcast() logs via console.log
16
+ let isBroadcasting = false;
17
+ /**
18
+ * Log directly to the original console, bypassing interception.
19
+ * Use this for logging that should NOT be broadcast to WebSocket clients
20
+ * (e.g., broadcast confirmation messages, to prevent feedback loops).
21
+ */
22
+ export function logDirect(...args) {
23
+ originalConsole.log(...args);
24
+ }
25
+ // Max log history for new clients
26
+ const LOG_HISTORY_SIZE = 100;
27
+ const logHistory = [];
28
+ /**
29
+ * Create a log message
30
+ */
31
+ function createLogMessage(level, args, source) {
32
+ const message = args
33
+ .map(arg => {
34
+ if (typeof arg === 'string')
35
+ return arg;
36
+ if (arg instanceof Error)
37
+ return arg.message;
38
+ try {
39
+ return JSON.stringify(arg);
40
+ }
41
+ catch {
42
+ return String(arg);
43
+ }
44
+ })
45
+ .join(' ');
46
+ return {
47
+ type: 'server_log',
48
+ level,
49
+ message,
50
+ timestamp: Date.now(),
51
+ source,
52
+ };
53
+ }
54
+ /**
55
+ * Parse source from log message (e.g., "[Server]" or "[HTTP API]")
56
+ */
57
+ function parseSource(message) {
58
+ const match = message.match(/^\[([^\]]+)\]/);
59
+ return match ? match[1] : 'Server';
60
+ }
61
+ /**
62
+ * Broadcast log to all listeners
63
+ */
64
+ function broadcastLog(logMessage) {
65
+ // Prevent infinite recursion: broadcast() → console.log → broadcastLog → broadcast()
66
+ if (isBroadcasting)
67
+ return;
68
+ // Add to history
69
+ logHistory.push(logMessage);
70
+ if (logHistory.length > LOG_HISTORY_SIZE) {
71
+ logHistory.shift();
72
+ }
73
+ // Notify listeners (with re-entrancy guard)
74
+ isBroadcasting = true;
75
+ try {
76
+ for (const listener of listeners) {
77
+ try {
78
+ listener(logMessage);
79
+ }
80
+ catch {
81
+ // Ignore listener errors
82
+ }
83
+ }
84
+ }
85
+ finally {
86
+ isBroadcasting = false;
87
+ }
88
+ }
89
+ /**
90
+ * Start intercepting console output.
91
+ * @param options.silent When true, suppress writing to stdout/stderr
92
+ * (still broadcasts to WebSocket listeners). Use in embedded/TUI mode
93
+ * to prevent core module console.error calls from leaking onto the
94
+ * alternate screen buffer and causing visual flickering.
95
+ */
96
+ export function startLogInterception(options) {
97
+ const suppressConsole = options?.silent ?? false;
98
+ console.log = (...args) => {
99
+ if (!suppressConsole)
100
+ originalConsole.log(...args);
101
+ const firstArg = String(args[0] || '');
102
+ const source = parseSource(firstArg);
103
+ broadcastLog(createLogMessage('info', args, source));
104
+ };
105
+ console.warn = (...args) => {
106
+ if (!suppressConsole)
107
+ originalConsole.warn(...args);
108
+ const firstArg = String(args[0] || '');
109
+ const source = parseSource(firstArg);
110
+ broadcastLog(createLogMessage('warn', args, source));
111
+ };
112
+ console.error = (...args) => {
113
+ if (!suppressConsole)
114
+ originalConsole.error(...args);
115
+ const firstArg = String(args[0] || '');
116
+ const source = parseSource(firstArg);
117
+ broadcastLog(createLogMessage('error', args, source));
118
+ };
119
+ }
120
+ /**
121
+ * Stop intercepting console output
122
+ */
123
+ export function stopLogInterception() {
124
+ console.log = originalConsole.log;
125
+ console.warn = originalConsole.warn;
126
+ console.error = originalConsole.error;
127
+ }
128
+ /**
129
+ * Add a log listener
130
+ */
131
+ export function addLogListener(callback) {
132
+ listeners.add(callback);
133
+ return () => listeners.delete(callback);
134
+ }
135
+ /**
136
+ * Get log history
137
+ */
138
+ export function getLogHistory() {
139
+ return [...logHistory];
140
+ }
141
+ /**
142
+ * Clear log history
143
+ */
144
+ export function clearLogHistory() {
145
+ logHistory.length = 0;
146
+ }
147
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Logger Factory
3
+ *
4
+ * Provides injectable logging for server components.
5
+ * Replaces duplicated logging boilerplate across modules.
6
+ */
7
+ /**
8
+ * Logger interface for dependency injection
9
+ */
10
+ export interface Logger {
11
+ log: (...args: unknown[]) => void;
12
+ warn: (...args: unknown[]) => void;
13
+ error: (...args: unknown[]) => void;
14
+ }
15
+ /**
16
+ * Options for creating a logger
17
+ */
18
+ export interface LoggerOptions {
19
+ /** Suppress all output */
20
+ silent?: boolean;
21
+ /** Optional prefix prepended to all log messages */
22
+ prefix?: string;
23
+ }
24
+ /**
25
+ * Create a logger instance
26
+ *
27
+ * @param options Logger configuration options
28
+ * @returns Logger instance
29
+ *
30
+ * @example
31
+ * // Silent logger (no output)
32
+ * const logger = createLogger({ silent: true });
33
+ *
34
+ * @example
35
+ * // Logger with prefix
36
+ * const logger = createLogger({ prefix: 'MyComponent' });
37
+ * logger.log('Hello'); // Output: [MyComponent] Hello
38
+ */
39
+ export declare function createLogger(options?: LoggerOptions): Logger;
40
+ /**
41
+ * Create a logger from a silent flag (backward compatibility helper)
42
+ *
43
+ * This allows components to accept either a Logger or a silent boolean
44
+ * for backward compatibility during the migration.
45
+ *
46
+ * @param silentOrLogger Either a boolean (silent flag) or a Logger instance
47
+ * @param prefix Optional prefix if creating from boolean
48
+ * @returns Logger instance
49
+ */
50
+ export declare function resolveLogger(silentOrLogger: boolean | Logger | undefined, prefix?: string): Logger;
51
+ //# sourceMappingURL=logger-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-factory.d.ts","sourceRoot":"","sources":["../../src/logging/logger-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAuBhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,cAAc,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,EAC5C,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAKR"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Logger Factory
3
+ *
4
+ * Provides injectable logging for server components.
5
+ * Replaces duplicated logging boilerplate across modules.
6
+ */
7
+ /**
8
+ * Create a logger instance
9
+ *
10
+ * @param options Logger configuration options
11
+ * @returns Logger instance
12
+ *
13
+ * @example
14
+ * // Silent logger (no output)
15
+ * const logger = createLogger({ silent: true });
16
+ *
17
+ * @example
18
+ * // Logger with prefix
19
+ * const logger = createLogger({ prefix: 'MyComponent' });
20
+ * logger.log('Hello'); // Output: [MyComponent] Hello
21
+ */
22
+ export function createLogger(options = {}) {
23
+ const { silent = false, prefix } = options;
24
+ if (silent) {
25
+ return {
26
+ log: () => { },
27
+ warn: () => { },
28
+ error: () => { },
29
+ };
30
+ }
31
+ const formatArgs = (args) => {
32
+ if (prefix) {
33
+ return [`[${prefix}]`, ...args];
34
+ }
35
+ return args;
36
+ };
37
+ return {
38
+ log: (...args) => console.log(...formatArgs(args)),
39
+ warn: (...args) => console.warn(...formatArgs(args)),
40
+ error: (...args) => console.error(...formatArgs(args)),
41
+ };
42
+ }
43
+ /**
44
+ * Create a logger from a silent flag (backward compatibility helper)
45
+ *
46
+ * This allows components to accept either a Logger or a silent boolean
47
+ * for backward compatibility during the migration.
48
+ *
49
+ * @param silentOrLogger Either a boolean (silent flag) or a Logger instance
50
+ * @param prefix Optional prefix if creating from boolean
51
+ * @returns Logger instance
52
+ */
53
+ export function resolveLogger(silentOrLogger, prefix) {
54
+ if (typeof silentOrLogger === 'object' && silentOrLogger !== null) {
55
+ return silentOrLogger;
56
+ }
57
+ return createLogger({ silent: silentOrLogger, prefix });
58
+ }
59
+ //# sourceMappingURL=logger-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-factory.js","sourceRoot":"","sources":["../../src/logging/logger-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;YACb,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,IAAe,EAAa,EAAE;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,cAA4C,EAC5C,MAAe;IAEf,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAClE,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * MCP Search Tool
3
+ *
4
+ * Implements the search_conversations tool for the MCP server.
5
+ */
6
+ import { z } from "zod";
7
+ interface SearchResult {
8
+ rank: number;
9
+ id: string;
10
+ score: number;
11
+ title: string;
12
+ project: string;
13
+ date: string;
14
+ preview: string;
15
+ filesModified: string[];
16
+ technologies: string[];
17
+ messageCount: number;
18
+ durationMinutes: number;
19
+ }
20
+ interface SearchOutput {
21
+ query: string;
22
+ filters: {
23
+ project?: string;
24
+ dateFrom?: string;
25
+ dateTo?: string;
26
+ technologies?: string[];
27
+ };
28
+ totalMatches: number;
29
+ showing: {
30
+ from: number;
31
+ to: number;
32
+ };
33
+ hasMore: boolean;
34
+ results: SearchResult[];
35
+ }
36
+ export declare const searchConversationsSchema: z.ZodObject<{
37
+ query: z.ZodString;
38
+ project: z.ZodOptional<z.ZodString>;
39
+ dateFrom: z.ZodOptional<z.ZodString>;
40
+ dateTo: z.ZodOptional<z.ZodString>;
41
+ technologies: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
42
+ limit: z.ZodDefault<z.ZodNumber>;
43
+ offset: z.ZodDefault<z.ZodNumber>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ query: string;
46
+ limit: number;
47
+ offset: number;
48
+ project?: string | undefined;
49
+ dateFrom?: string | undefined;
50
+ dateTo?: string | undefined;
51
+ technologies?: string[] | undefined;
52
+ }, {
53
+ query: string;
54
+ project?: string | undefined;
55
+ dateFrom?: string | undefined;
56
+ dateTo?: string | undefined;
57
+ technologies?: string[] | undefined;
58
+ limit?: number | undefined;
59
+ offset?: number | undefined;
60
+ }>;
61
+ export type SearchConversationsInput = z.infer<typeof searchConversationsSchema>;
62
+ export declare function searchConversations(input: SearchConversationsInput): Promise<SearchOutput>;
63
+ export declare function handleSearchConversations(args: unknown): Promise<string>;
64
+ export {};
65
+ //# sourceMappingURL=search-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-tool.d.ts","sourceRoot":"","sources":["../../src/mcp/search-tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsDxB,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAMD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;EAQpC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AA4FjF,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,YAAY,CAAC,CA8EvB;AAMD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,MAAM,CAAC,CAYjB"}