lattice-orchestrator 0.7.0

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 (440) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +58 -0
  3. package/config/logrotate.conf +15 -0
  4. package/dist/cli-parser.d.ts +11 -0
  5. package/dist/cli-parser.d.ts.map +1 -0
  6. package/dist/cli-parser.js +48 -0
  7. package/dist/cli-parser.js.map +1 -0
  8. package/dist/lattice-server.d.ts +70 -0
  9. package/dist/lattice-server.d.ts.map +1 -0
  10. package/dist/lattice-server.js +969 -0
  11. package/dist/lattice-server.js.map +1 -0
  12. package/dist/mcp-server/index.d.ts +3 -0
  13. package/dist/mcp-server/index.d.ts.map +1 -0
  14. package/dist/mcp-server/index.js +190 -0
  15. package/dist/mcp-server/index.js.map +1 -0
  16. package/dist/mcp-server/lattice-tools.d.ts +15 -0
  17. package/dist/mcp-server/lattice-tools.d.ts.map +1 -0
  18. package/dist/mcp-server/lattice-tools.js +366 -0
  19. package/dist/mcp-server/lattice-tools.js.map +1 -0
  20. package/dist/middleware/cors-setup.d.ts +7 -0
  21. package/dist/middleware/cors-setup.d.ts.map +1 -0
  22. package/dist/middleware/cors-setup.js +8 -0
  23. package/dist/middleware/cors-setup.js.map +1 -0
  24. package/dist/middleware/error-handler.d.ts +4 -0
  25. package/dist/middleware/error-handler.d.ts.map +1 -0
  26. package/dist/middleware/error-handler.js +27 -0
  27. package/dist/middleware/error-handler.js.map +1 -0
  28. package/dist/middleware/query-parser.d.ts +11 -0
  29. package/dist/middleware/query-parser.d.ts.map +1 -0
  30. package/dist/middleware/query-parser.js +68 -0
  31. package/dist/middleware/query-parser.js.map +1 -0
  32. package/dist/middleware/request-logger.d.ts +4 -0
  33. package/dist/middleware/request-logger.d.ts.map +1 -0
  34. package/dist/middleware/request-logger.js +6 -0
  35. package/dist/middleware/request-logger.js.map +1 -0
  36. package/dist/process-daemon/index.d.ts +14 -0
  37. package/dist/process-daemon/index.d.ts.map +1 -0
  38. package/dist/process-daemon/index.js +51 -0
  39. package/dist/process-daemon/index.js.map +1 -0
  40. package/dist/process-daemon/process-daemon.d.ts +101 -0
  41. package/dist/process-daemon/process-daemon.d.ts.map +1 -0
  42. package/dist/process-daemon/process-daemon.js +846 -0
  43. package/dist/process-daemon/process-daemon.js.map +1 -0
  44. package/dist/process-daemon/process-manager-client.d.ts +123 -0
  45. package/dist/process-daemon/process-manager-client.d.ts.map +1 -0
  46. package/dist/process-daemon/process-manager-client.js +329 -0
  47. package/dist/process-daemon/process-manager-client.js.map +1 -0
  48. package/dist/process-daemon/process-manager-interface.d.ts +61 -0
  49. package/dist/process-daemon/process-manager-interface.d.ts.map +1 -0
  50. package/dist/process-daemon/process-manager-interface.js +8 -0
  51. package/dist/process-daemon/process-manager-interface.js.map +1 -0
  52. package/dist/process-daemon/test-daemon.d.ts +12 -0
  53. package/dist/process-daemon/test-daemon.d.ts.map +1 -0
  54. package/dist/process-daemon/test-daemon.js +81 -0
  55. package/dist/process-daemon/test-daemon.js.map +1 -0
  56. package/dist/process-daemon/types.d.ts +97 -0
  57. package/dist/process-daemon/types.d.ts.map +1 -0
  58. package/dist/process-daemon/types.js +8 -0
  59. package/dist/process-daemon/types.js.map +1 -0
  60. package/dist/routes/analysis.routes.d.ts +13 -0
  61. package/dist/routes/analysis.routes.d.ts.map +1 -0
  62. package/dist/routes/analysis.routes.js +520 -0
  63. package/dist/routes/analysis.routes.js.map +1 -0
  64. package/dist/routes/config.routes.d.ts +4 -0
  65. package/dist/routes/config.routes.d.ts.map +1 -0
  66. package/dist/routes/config.routes.js +27 -0
  67. package/dist/routes/config.routes.js.map +1 -0
  68. package/dist/routes/conversation.routes.d.ts +43 -0
  69. package/dist/routes/conversation.routes.d.ts.map +1 -0
  70. package/dist/routes/conversation.routes.js +79 -0
  71. package/dist/routes/conversation.routes.js.map +1 -0
  72. package/dist/routes/filesystem.routes.d.ts +4 -0
  73. package/dist/routes/filesystem.routes.d.ts.map +1 -0
  74. package/dist/routes/filesystem.routes.js +86 -0
  75. package/dist/routes/filesystem.routes.js.map +1 -0
  76. package/dist/routes/insights.routes.d.ts +17 -0
  77. package/dist/routes/insights.routes.d.ts.map +1 -0
  78. package/dist/routes/insights.routes.js +633 -0
  79. package/dist/routes/insights.routes.js.map +1 -0
  80. package/dist/routes/lattice.routes.d.ts +10 -0
  81. package/dist/routes/lattice.routes.d.ts.map +1 -0
  82. package/dist/routes/lattice.routes.js +123 -0
  83. package/dist/routes/lattice.routes.js.map +1 -0
  84. package/dist/routes/license.routes.d.ts +3 -0
  85. package/dist/routes/license.routes.d.ts.map +1 -0
  86. package/dist/routes/license.routes.js +95 -0
  87. package/dist/routes/license.routes.js.map +1 -0
  88. package/dist/routes/log.routes.d.ts +3 -0
  89. package/dist/routes/log.routes.d.ts.map +1 -0
  90. package/dist/routes/log.routes.js +184 -0
  91. package/dist/routes/log.routes.js.map +1 -0
  92. package/dist/routes/pending-question.routes.d.ts +9 -0
  93. package/dist/routes/pending-question.routes.d.ts.map +1 -0
  94. package/dist/routes/pending-question.routes.js +162 -0
  95. package/dist/routes/pending-question.routes.js.map +1 -0
  96. package/dist/routes/permission.routes.d.ts +18 -0
  97. package/dist/routes/permission.routes.d.ts.map +1 -0
  98. package/dist/routes/permission.routes.js +370 -0
  99. package/dist/routes/permission.routes.js.map +1 -0
  100. package/dist/routes/process-events.routes.d.ts +9 -0
  101. package/dist/routes/process-events.routes.d.ts.map +1 -0
  102. package/dist/routes/process-events.routes.js +141 -0
  103. package/dist/routes/process-events.routes.js.map +1 -0
  104. package/dist/routes/prototype.routes.d.ts +9 -0
  105. package/dist/routes/prototype.routes.d.ts.map +1 -0
  106. package/dist/routes/prototype.routes.js +757 -0
  107. package/dist/routes/prototype.routes.js.map +1 -0
  108. package/dist/routes/question.routes.d.ts +8 -0
  109. package/dist/routes/question.routes.d.ts.map +1 -0
  110. package/dist/routes/question.routes.js +83 -0
  111. package/dist/routes/question.routes.js.map +1 -0
  112. package/dist/routes/session-control.routes.d.ts +29 -0
  113. package/dist/routes/session-control.routes.d.ts.map +1 -0
  114. package/dist/routes/session-control.routes.js +455 -0
  115. package/dist/routes/session-control.routes.js.map +1 -0
  116. package/dist/routes/session-lifecycle.routes.d.ts +21 -0
  117. package/dist/routes/session-lifecycle.routes.d.ts.map +1 -0
  118. package/dist/routes/session-lifecycle.routes.js +256 -0
  119. package/dist/routes/session-lifecycle.routes.js.map +1 -0
  120. package/dist/routes/session-query.routes.d.ts +25 -0
  121. package/dist/routes/session-query.routes.d.ts.map +1 -0
  122. package/dist/routes/session-query.routes.js +363 -0
  123. package/dist/routes/session-query.routes.js.map +1 -0
  124. package/dist/routes/session-stream.routes.d.ts +21 -0
  125. package/dist/routes/session-stream.routes.d.ts.map +1 -0
  126. package/dist/routes/session-stream.routes.js +235 -0
  127. package/dist/routes/session-stream.routes.js.map +1 -0
  128. package/dist/routes/streaming.routes.d.ts +4 -0
  129. package/dist/routes/streaming.routes.d.ts.map +1 -0
  130. package/dist/routes/streaming.routes.js +33 -0
  131. package/dist/routes/streaming.routes.js.map +1 -0
  132. package/dist/routes/system.routes.d.ts +7 -0
  133. package/dist/routes/system.routes.d.ts.map +1 -0
  134. package/dist/routes/system.routes.js +214 -0
  135. package/dist/routes/system.routes.js.map +1 -0
  136. package/dist/routes/walkthrough.routes.d.ts +19 -0
  137. package/dist/routes/walkthrough.routes.d.ts.map +1 -0
  138. package/dist/routes/walkthrough.routes.js +688 -0
  139. package/dist/routes/walkthrough.routes.js.map +1 -0
  140. package/dist/routes/working-directories.routes.d.ts +4 -0
  141. package/dist/routes/working-directories.routes.d.ts.map +1 -0
  142. package/dist/routes/working-directories.routes.js +25 -0
  143. package/dist/routes/working-directories.routes.js.map +1 -0
  144. package/dist/server.d.ts +3 -0
  145. package/dist/server.d.ts.map +1 -0
  146. package/dist/server.js +34 -0
  147. package/dist/server.js.map +1 -0
  148. package/dist/services/ToolMetricsService.d.ts +53 -0
  149. package/dist/services/ToolMetricsService.d.ts.map +1 -0
  150. package/dist/services/ToolMetricsService.js +230 -0
  151. package/dist/services/ToolMetricsService.js.map +1 -0
  152. package/dist/services/claude-router-service.d.ts +19 -0
  153. package/dist/services/claude-router-service.d.ts.map +1 -0
  154. package/dist/services/claude-router-service.js +160 -0
  155. package/dist/services/claude-router-service.js.map +1 -0
  156. package/dist/services/commands-service.d.ts +20 -0
  157. package/dist/services/commands-service.d.ts.map +1 -0
  158. package/dist/services/commands-service.js +115 -0
  159. package/dist/services/commands-service.js.map +1 -0
  160. package/dist/services/connection-debug-logger.d.ts +85 -0
  161. package/dist/services/connection-debug-logger.d.ts.map +1 -0
  162. package/dist/services/connection-debug-logger.js +221 -0
  163. package/dist/services/connection-debug-logger.js.map +1 -0
  164. package/dist/services/debug-log.d.ts +6 -0
  165. package/dist/services/debug-log.d.ts.map +1 -0
  166. package/dist/services/debug-log.js +27 -0
  167. package/dist/services/debug-log.js.map +1 -0
  168. package/dist/services/gemini-service.d.ts +35 -0
  169. package/dist/services/gemini-service.d.ts.map +1 -0
  170. package/dist/services/gemini-service.js +256 -0
  171. package/dist/services/gemini-service.js.map +1 -0
  172. package/dist/services/infrastructure/config-service.d.ts +79 -0
  173. package/dist/services/infrastructure/config-service.d.ts.map +1 -0
  174. package/dist/services/infrastructure/config-service.js +431 -0
  175. package/dist/services/infrastructure/config-service.js.map +1 -0
  176. package/dist/services/infrastructure/cost-tracker.d.ts +112 -0
  177. package/dist/services/infrastructure/cost-tracker.d.ts.map +1 -0
  178. package/dist/services/infrastructure/cost-tracker.js +423 -0
  179. package/dist/services/infrastructure/cost-tracker.js.map +1 -0
  180. package/dist/services/infrastructure/file-system-service.d.ts +61 -0
  181. package/dist/services/infrastructure/file-system-service.d.ts.map +1 -0
  182. package/dist/services/infrastructure/file-system-service.js +348 -0
  183. package/dist/services/infrastructure/file-system-service.js.map +1 -0
  184. package/dist/services/infrastructure/log-formatter.d.ts +5 -0
  185. package/dist/services/infrastructure/log-formatter.d.ts.map +1 -0
  186. package/dist/services/infrastructure/log-formatter.js +77 -0
  187. package/dist/services/infrastructure/log-formatter.js.map +1 -0
  188. package/dist/services/infrastructure/log-stream-buffer.d.ts +11 -0
  189. package/dist/services/infrastructure/log-stream-buffer.d.ts.map +1 -0
  190. package/dist/services/infrastructure/log-stream-buffer.js +36 -0
  191. package/dist/services/infrastructure/log-stream-buffer.js.map +1 -0
  192. package/dist/services/infrastructure/logger.d.ts +71 -0
  193. package/dist/services/infrastructure/logger.d.ts.map +1 -0
  194. package/dist/services/infrastructure/logger.js +215 -0
  195. package/dist/services/infrastructure/logger.js.map +1 -0
  196. package/dist/services/infrastructure/service-registry.d.ts +86 -0
  197. package/dist/services/infrastructure/service-registry.d.ts.map +1 -0
  198. package/dist/services/infrastructure/service-registry.js +162 -0
  199. package/dist/services/infrastructure/service-registry.js.map +1 -0
  200. package/dist/services/infrastructure/stream-manager.d.ts +87 -0
  201. package/dist/services/infrastructure/stream-manager.d.ts.map +1 -0
  202. package/dist/services/infrastructure/stream-manager.js +436 -0
  203. package/dist/services/infrastructure/stream-manager.js.map +1 -0
  204. package/dist/services/infrastructure/timing.d.ts +72 -0
  205. package/dist/services/infrastructure/timing.d.ts.map +1 -0
  206. package/dist/services/infrastructure/timing.js +115 -0
  207. package/dist/services/infrastructure/timing.js.map +1 -0
  208. package/dist/services/insights/anthropic-service.d.ts +224 -0
  209. package/dist/services/insights/anthropic-service.d.ts.map +1 -0
  210. package/dist/services/insights/anthropic-service.js +1062 -0
  211. package/dist/services/insights/anthropic-service.js.map +1 -0
  212. package/dist/services/insights/insight-audit-repository.d.ts +119 -0
  213. package/dist/services/insights/insight-audit-repository.d.ts.map +1 -0
  214. package/dist/services/insights/insight-audit-repository.js +242 -0
  215. package/dist/services/insights/insight-audit-repository.js.map +1 -0
  216. package/dist/services/insights/insight-queue.d.ts +99 -0
  217. package/dist/services/insights/insight-queue.d.ts.map +1 -0
  218. package/dist/services/insights/insight-queue.js +277 -0
  219. package/dist/services/insights/insight-queue.js.map +1 -0
  220. package/dist/services/insights/insights-computer.d.ts +132 -0
  221. package/dist/services/insights/insights-computer.d.ts.map +1 -0
  222. package/dist/services/insights/insights-computer.js +936 -0
  223. package/dist/services/insights/insights-computer.js.map +1 -0
  224. package/dist/services/insights/insights-coordinator.d.ts +165 -0
  225. package/dist/services/insights/insights-coordinator.d.ts.map +1 -0
  226. package/dist/services/insights/insights-coordinator.js +1678 -0
  227. package/dist/services/insights/insights-coordinator.js.map +1 -0
  228. package/dist/services/insights/insights-event-log.d.ts +196 -0
  229. package/dist/services/insights/insights-event-log.d.ts.map +1 -0
  230. package/dist/services/insights/insights-event-log.js +319 -0
  231. package/dist/services/insights/insights-event-log.js.map +1 -0
  232. package/dist/services/lattice-service.d.ts +77 -0
  233. package/dist/services/lattice-service.d.ts.map +1 -0
  234. package/dist/services/lattice-service.js +195 -0
  235. package/dist/services/lattice-service.js.map +1 -0
  236. package/dist/services/license-service.d.ts +69 -0
  237. package/dist/services/license-service.d.ts.map +1 -0
  238. package/dist/services/license-service.js +330 -0
  239. package/dist/services/license-service.js.map +1 -0
  240. package/dist/services/mcp-config-generator.d.ts +32 -0
  241. package/dist/services/mcp-config-generator.d.ts.map +1 -0
  242. package/dist/services/mcp-config-generator.js +126 -0
  243. package/dist/services/mcp-config-generator.js.map +1 -0
  244. package/dist/services/message-filter.d.ts +22 -0
  245. package/dist/services/message-filter.d.ts.map +1 -0
  246. package/dist/services/message-filter.js +57 -0
  247. package/dist/services/message-filter.js.map +1 -0
  248. package/dist/services/notification-service.d.ts +45 -0
  249. package/dist/services/notification-service.d.ts.map +1 -0
  250. package/dist/services/notification-service.js +184 -0
  251. package/dist/services/notification-service.js.map +1 -0
  252. package/dist/services/pending-question-service.d.ts +97 -0
  253. package/dist/services/pending-question-service.d.ts.map +1 -0
  254. package/dist/services/pending-question-service.js +223 -0
  255. package/dist/services/pending-question-service.js.map +1 -0
  256. package/dist/services/permission-event-log.d.ts +136 -0
  257. package/dist/services/permission-event-log.d.ts.map +1 -0
  258. package/dist/services/permission-event-log.js +252 -0
  259. package/dist/services/permission-event-log.js.map +1 -0
  260. package/dist/services/permission-pattern-matcher.d.ts +82 -0
  261. package/dist/services/permission-pattern-matcher.d.ts.map +1 -0
  262. package/dist/services/permission-pattern-matcher.js +294 -0
  263. package/dist/services/permission-pattern-matcher.js.map +1 -0
  264. package/dist/services/permission-tracker.d.ts +67 -0
  265. package/dist/services/permission-tracker.d.ts.map +1 -0
  266. package/dist/services/permission-tracker.js +162 -0
  267. package/dist/services/permission-tracker.js.map +1 -0
  268. package/dist/services/process/claude-process-manager.d.ts +142 -0
  269. package/dist/services/process/claude-process-manager.d.ts.map +1 -0
  270. package/dist/services/process/claude-process-manager.js +1218 -0
  271. package/dist/services/process/claude-process-manager.js.map +1 -0
  272. package/dist/services/process/conversation-status-manager.d.ts +110 -0
  273. package/dist/services/process/conversation-status-manager.d.ts.map +1 -0
  274. package/dist/services/process/conversation-status-manager.js +349 -0
  275. package/dist/services/process/conversation-status-manager.js.map +1 -0
  276. package/dist/services/process/json-lines-parser.d.ts +19 -0
  277. package/dist/services/process/json-lines-parser.d.ts.map +1 -0
  278. package/dist/services/process/json-lines-parser.js +59 -0
  279. package/dist/services/process/json-lines-parser.js.map +1 -0
  280. package/dist/services/process/process-event-log.d.ts +263 -0
  281. package/dist/services/process/process-event-log.d.ts.map +1 -0
  282. package/dist/services/process/process-event-log.js +509 -0
  283. package/dist/services/process/process-event-log.js.map +1 -0
  284. package/dist/services/process/process-manager-factory.d.ts +109 -0
  285. package/dist/services/process/process-manager-factory.d.ts.map +1 -0
  286. package/dist/services/process/process-manager-factory.js +338 -0
  287. package/dist/services/process/process-manager-factory.js.map +1 -0
  288. package/dist/services/question-tracker.d.ts +51 -0
  289. package/dist/services/question-tracker.d.ts.map +1 -0
  290. package/dist/services/question-tracker.js +111 -0
  291. package/dist/services/question-tracker.js.map +1 -0
  292. package/dist/services/sessions/claude-history-reader.d.ts +139 -0
  293. package/dist/services/sessions/claude-history-reader.d.ts.map +1 -0
  294. package/dist/services/sessions/claude-history-reader.js +864 -0
  295. package/dist/services/sessions/claude-history-reader.js.map +1 -0
  296. package/dist/services/sessions/conversation-cache.d.ts +98 -0
  297. package/dist/services/sessions/conversation-cache.d.ts.map +1 -0
  298. package/dist/services/sessions/conversation-cache.js +329 -0
  299. package/dist/services/sessions/conversation-cache.js.map +1 -0
  300. package/dist/services/sessions/session-activity-watcher.d.ts +67 -0
  301. package/dist/services/sessions/session-activity-watcher.d.ts.map +1 -0
  302. package/dist/services/sessions/session-activity-watcher.js +236 -0
  303. package/dist/services/sessions/session-activity-watcher.js.map +1 -0
  304. package/dist/services/sessions/session-analysis-service.d.ts +72 -0
  305. package/dist/services/sessions/session-analysis-service.d.ts.map +1 -0
  306. package/dist/services/sessions/session-analysis-service.js +373 -0
  307. package/dist/services/sessions/session-analysis-service.js.map +1 -0
  308. package/dist/services/sessions/session-branch-service.d.ts +76 -0
  309. package/dist/services/sessions/session-branch-service.d.ts.map +1 -0
  310. package/dist/services/sessions/session-branch-service.js +355 -0
  311. package/dist/services/sessions/session-branch-service.js.map +1 -0
  312. package/dist/services/sessions/session-info-service.d.ts +455 -0
  313. package/dist/services/sessions/session-info-service.d.ts.map +1 -0
  314. package/dist/services/sessions/session-info-service.js +1640 -0
  315. package/dist/services/sessions/session-info-service.js.map +1 -0
  316. package/dist/services/sessions/session-marks-repository.d.ts +78 -0
  317. package/dist/services/sessions/session-marks-repository.d.ts.map +1 -0
  318. package/dist/services/sessions/session-marks-repository.js +263 -0
  319. package/dist/services/sessions/session-marks-repository.js.map +1 -0
  320. package/dist/services/sessions/session-marks-service.d.ts +137 -0
  321. package/dist/services/sessions/session-marks-service.d.ts.map +1 -0
  322. package/dist/services/sessions/session-marks-service.js +562 -0
  323. package/dist/services/sessions/session-marks-service.js.map +1 -0
  324. package/dist/services/sessions/session-review-service.d.ts +98 -0
  325. package/dist/services/sessions/session-review-service.d.ts.map +1 -0
  326. package/dist/services/sessions/session-review-service.js +629 -0
  327. package/dist/services/sessions/session-review-service.js.map +1 -0
  328. package/dist/services/sessions/turn-capture-service.d.ts +83 -0
  329. package/dist/services/sessions/turn-capture-service.d.ts.map +1 -0
  330. package/dist/services/sessions/turn-capture-service.js +477 -0
  331. package/dist/services/sessions/turn-capture-service.js.map +1 -0
  332. package/dist/services/sessions/turn-repository.d.ts +48 -0
  333. package/dist/services/sessions/turn-repository.d.ts.map +1 -0
  334. package/dist/services/sessions/turn-repository.js +103 -0
  335. package/dist/services/sessions/turn-repository.js.map +1 -0
  336. package/dist/services/walkthrough-service.d.ts +226 -0
  337. package/dist/services/walkthrough-service.d.ts.map +1 -0
  338. package/dist/services/walkthrough-service.js +1112 -0
  339. package/dist/services/walkthrough-service.js.map +1 -0
  340. package/dist/services/walkthrough-skill-prompt.d.ts +34 -0
  341. package/dist/services/walkthrough-skill-prompt.d.ts.map +1 -0
  342. package/dist/services/walkthrough-skill-prompt.js +313 -0
  343. package/dist/services/walkthrough-skill-prompt.js.map +1 -0
  344. package/dist/services/web-push-service.d.ts +48 -0
  345. package/dist/services/web-push-service.d.ts.map +1 -0
  346. package/dist/services/web-push-service.js +186 -0
  347. package/dist/services/web-push-service.js.map +1 -0
  348. package/dist/services/working-directories-service.d.ts +19 -0
  349. package/dist/services/working-directories-service.d.ts.map +1 -0
  350. package/dist/services/working-directories-service.js +103 -0
  351. package/dist/services/working-directories-service.js.map +1 -0
  352. package/dist/types/config.d.ts +122 -0
  353. package/dist/types/config.d.ts.map +1 -0
  354. package/dist/types/config.js +21 -0
  355. package/dist/types/config.js.map +1 -0
  356. package/dist/types/express.d.ts +5 -0
  357. package/dist/types/express.d.ts.map +1 -0
  358. package/dist/types/express.js +2 -0
  359. package/dist/types/express.js.map +1 -0
  360. package/dist/types/index.d.ts +400 -0
  361. package/dist/types/index.d.ts.map +1 -0
  362. package/dist/types/index.js +41 -0
  363. package/dist/types/index.js.map +1 -0
  364. package/dist/types/insights.d.ts +176 -0
  365. package/dist/types/insights.d.ts.map +1 -0
  366. package/dist/types/insights.js +23 -0
  367. package/dist/types/insights.js.map +1 -0
  368. package/dist/types/license.d.ts +70 -0
  369. package/dist/types/license.d.ts.map +1 -0
  370. package/dist/types/license.js +5 -0
  371. package/dist/types/license.js.map +1 -0
  372. package/dist/types/router-config.d.ts +13 -0
  373. package/dist/types/router-config.d.ts.map +1 -0
  374. package/dist/types/router-config.js +2 -0
  375. package/dist/types/router-config.js.map +1 -0
  376. package/dist/utils/constants.d.ts +26 -0
  377. package/dist/utils/constants.d.ts.map +1 -0
  378. package/dist/utils/constants.js +28 -0
  379. package/dist/utils/constants.js.map +1 -0
  380. package/dist/utils/machine-id.d.ts +7 -0
  381. package/dist/utils/machine-id.d.ts.map +1 -0
  382. package/dist/utils/machine-id.js +76 -0
  383. package/dist/utils/machine-id.js.map +1 -0
  384. package/dist/utils/server-startup.d.ts +11 -0
  385. package/dist/utils/server-startup.d.ts.map +1 -0
  386. package/dist/utils/server-startup.js +9 -0
  387. package/dist/utils/server-startup.js.map +1 -0
  388. package/dist/utils/update-check.d.ts +13 -0
  389. package/dist/utils/update-check.d.ts.map +1 -0
  390. package/dist/utils/update-check.js +90 -0
  391. package/dist/utils/update-check.js.map +1 -0
  392. package/dist/web/assets/ArchivedCardPrototype-S9ifiasa.js +5 -0
  393. package/dist/web/assets/BannerGallery-B__rJV6F.js +1 -0
  394. package/dist/web/assets/BannerPrototype-DBKP9Uiu.js +52 -0
  395. package/dist/web/assets/CodeHikeExperiment-B8jjWAFy.js +15 -0
  396. package/dist/web/assets/ContextTooltipVariations-DzklAFam.js +1 -0
  397. package/dist/web/assets/FontShowcasePrototype-KIMEWeP2.js +13 -0
  398. package/dist/web/assets/GeometricGallery-DddlWhHK.js +1 -0
  399. package/dist/web/assets/HistoryWalkthroughPrototype-DeniRRdw.js +18 -0
  400. package/dist/web/assets/InlineWalkthroughPrototype-Csd5r_Hk.js +1 -0
  401. package/dist/web/assets/MarkButtonPrototype-CxhxE0RP.js +1 -0
  402. package/dist/web/assets/MenuStylesPrototype-D7neA6YM.js +1 -0
  403. package/dist/web/assets/MomentCardVariations-2GT7GyFn.js +1 -0
  404. package/dist/web/assets/MomentHeaderVariations-DhGEw4XC.js +1 -0
  405. package/dist/web/assets/NarrativeWalkthroughDemo-B5C566fu.js +389 -0
  406. package/dist/web/assets/OutcomeVariations-BrZfsVcs.js +1 -0
  407. package/dist/web/assets/PermissionPatternPickerPrototype-CBOhe2Me.js +1 -0
  408. package/dist/web/assets/PermissionPrototype-BcF-a5an.js +1 -0
  409. package/dist/web/assets/PipelineGallery-BJhyM0rx.js +1 -0
  410. package/dist/web/assets/ScopeHeaderPrototype-GD1HNfaO.js +1 -0
  411. package/dist/web/assets/ScopeHeaderStylesPrototype-aa4uNJJ1.js +1 -0
  412. package/dist/web/assets/ScrollycodingPrototype-CKW1bf72.js +70 -0
  413. package/dist/web/assets/SectionHeaderVariations-DM8vUwfj.js +1 -0
  414. package/dist/web/assets/SemanticGallery-CtQEo7St.js +1 -0
  415. package/dist/web/assets/SessionCardPrototype-CgHCIMHe.js +1 -0
  416. package/dist/web/assets/SessionSidebarVariations-DMQL3Azj.js +3 -0
  417. package/dist/web/assets/SessionStartPrototype-Cwsv01Rr.js +1 -0
  418. package/dist/web/assets/SmartMenuPrototype-Br37Qbs_.js +1 -0
  419. package/dist/web/assets/StyleGallery-rZgrploB.js +1 -0
  420. package/dist/web/assets/TimelineCardPrototype-lzPc5mhe.js +19 -0
  421. package/dist/web/assets/ToolbarPrototype-Dm4BNZra.js +1 -0
  422. package/dist/web/assets/TooltipExperiment-Dy8QzTIP.js +13 -0
  423. package/dist/web/assets/WalkthroughCTAPrototype-uHoovujd.js +1 -0
  424. package/dist/web/assets/WalkthroughHeaderVariations-Do7Di1g1.js +1 -0
  425. package/dist/web/assets/WalkthroughShowcase-sGmRoPoM.js +112 -0
  426. package/dist/web/assets/arrow-right-D46Nx1mC.js +1 -0
  427. package/dist/web/assets/brain-BXIZKtOZ.js +1 -0
  428. package/dist/web/assets/grid-3x3-Cb81B62m.js +1 -0
  429. package/dist/web/assets/main-B1fyog77.js +321 -0
  430. package/dist/web/assets/main-C2PK2Klg.css +1 -0
  431. package/dist/web/assets/semantic-variations-Bd-W7ea2.js +1 -0
  432. package/dist/web/assets/target-Cf92wDTW.js +1 -0
  433. package/dist/web/favicon.png +0 -0
  434. package/dist/web/favicon.svg +22 -0
  435. package/dist/web/icon-192x192.png +0 -0
  436. package/dist/web/icon-512x512.png +0 -0
  437. package/dist/web/index.html +45 -0
  438. package/dist/web/manifest.json +61 -0
  439. package/package.json +192 -0
  440. package/scripts/postinstall.js +60 -0
@@ -0,0 +1,184 @@
1
+ import { createLogger } from './infrastructure/logger.js';
2
+ import { ConfigService } from './infrastructure/config-service.js';
3
+ import { WebPushService } from './web-push-service.js';
4
+ /**
5
+ * Service for sending push notifications via ntfy.sh
6
+ */
7
+ export class NotificationService {
8
+ logger;
9
+ configService;
10
+ machineId = null;
11
+ webPushService;
12
+ constructor() {
13
+ this.logger = createLogger('NotificationService');
14
+ this.configService = ConfigService.getInstance();
15
+ this.webPushService = WebPushService.getInstance();
16
+ }
17
+ /**
18
+ * Get machine ID from config
19
+ */
20
+ getMachineId() {
21
+ if (!this.machineId) {
22
+ try {
23
+ const config = this.configService.getConfig();
24
+ this.machineId = config.machine_id;
25
+ }
26
+ catch (error) {
27
+ this.logger.error('Failed to get machine ID from config', error);
28
+ this.machineId = 'unknown';
29
+ }
30
+ }
31
+ return this.machineId;
32
+ }
33
+ /**
34
+ * Check if notifications are enabled
35
+ */
36
+ async isEnabled() {
37
+ const config = this.configService.getConfig();
38
+ return config.interface.notifications?.enabled ?? false;
39
+ }
40
+ /**
41
+ * Get the ntfy URL from preferences
42
+ */
43
+ async getNtfyUrl() {
44
+ const config = this.configService.getConfig();
45
+ return config.interface.notifications?.ntfyUrl || 'https://ntfy.sh';
46
+ }
47
+ /**
48
+ * Send a notification for a permission request
49
+ */
50
+ async sendPermissionNotification(request, sessionId, summary) {
51
+ if (!(await this.isEnabled())) {
52
+ this.logger.debug('Notifications disabled, skipping permission notification');
53
+ return;
54
+ }
55
+ try {
56
+ const machineId = this.getMachineId();
57
+ const topic = `claudia-${machineId}`;
58
+ const ntfyUrl = await this.getNtfyUrl();
59
+ const notification = {
60
+ title: 'Claudia Permission Request',
61
+ message: summary
62
+ ? `${summary} - ${request.toolName}`
63
+ : `${request.toolName} tool: ${JSON.stringify(request.toolInput).substring(0, 100)}...`,
64
+ priority: 'default',
65
+ tags: ['claudia-permission'],
66
+ sessionId: sessionId || 'unknown',
67
+ streamingId: request.streamingId,
68
+ permissionRequestId: request.id
69
+ };
70
+ // Send via ntfy
71
+ await this.sendNotification(ntfyUrl, topic, notification);
72
+ // Also broadcast via native web push (best-effort)
73
+ try {
74
+ await this.webPushService.initialize();
75
+ if (this.webPushService.getEnabled()) {
76
+ await this.webPushService.broadcast({
77
+ title: notification.title,
78
+ message: notification.message,
79
+ tag: notification.tags[0],
80
+ data: {
81
+ sessionId: notification.sessionId,
82
+ streamingId: notification.streamingId,
83
+ permissionRequestId: notification.permissionRequestId,
84
+ type: 'permission',
85
+ },
86
+ });
87
+ }
88
+ }
89
+ catch (err) {
90
+ this.logger.debug('Web push broadcast failed (non-fatal)', { error: err?.message });
91
+ }
92
+ this.logger.info('Permission notification sent', {
93
+ requestId: request.id,
94
+ toolName: request.toolName,
95
+ topic
96
+ });
97
+ }
98
+ catch (error) {
99
+ this.logger.error('Failed to send permission notification', error, {
100
+ requestId: request.id
101
+ });
102
+ }
103
+ }
104
+ /**
105
+ * Send a notification when a conversation ends
106
+ */
107
+ async sendConversationEndNotification(streamingId, sessionId, summary) {
108
+ if (!(await this.isEnabled())) {
109
+ this.logger.debug('Notifications disabled, skipping conversation end notification');
110
+ return;
111
+ }
112
+ try {
113
+ const machineId = this.getMachineId();
114
+ const topic = `claudia-${machineId}`;
115
+ const ntfyUrl = await this.getNtfyUrl();
116
+ const notification = {
117
+ title: 'Task Finished',
118
+ message: summary || 'Task completed',
119
+ priority: 'default',
120
+ tags: ['claudia-complete'],
121
+ sessionId,
122
+ streamingId
123
+ };
124
+ // Send via ntfy
125
+ await this.sendNotification(ntfyUrl, topic, notification);
126
+ // Also broadcast via native web push (best-effort)
127
+ try {
128
+ await this.webPushService.initialize();
129
+ if (this.webPushService.getEnabled()) {
130
+ await this.webPushService.broadcast({
131
+ title: notification.title,
132
+ message: notification.message,
133
+ tag: notification.tags[0],
134
+ data: {
135
+ sessionId: notification.sessionId,
136
+ streamingId: notification.streamingId,
137
+ type: 'conversation-end',
138
+ },
139
+ });
140
+ }
141
+ }
142
+ catch (err) {
143
+ this.logger.debug('Web push broadcast failed (non-fatal)', { error: err?.message });
144
+ }
145
+ this.logger.info('Conversation end notification sent', {
146
+ sessionId,
147
+ streamingId,
148
+ topic
149
+ });
150
+ }
151
+ catch (error) {
152
+ this.logger.error('Failed to send conversation end notification', error, {
153
+ sessionId,
154
+ streamingId
155
+ });
156
+ }
157
+ }
158
+ /**
159
+ * Send a notification to ntfy
160
+ */
161
+ async sendNotification(ntfyUrl, topic, notification) {
162
+ const url = `${ntfyUrl}/${topic}`;
163
+ const headers = {
164
+ 'Title': notification.title,
165
+ 'Priority': notification.priority,
166
+ 'Tags': notification.tags.join(',')
167
+ };
168
+ // Add custom headers for CUI metadata
169
+ headers['X-CUI-SessionId'] = notification.sessionId;
170
+ headers['X-CUI-StreamingId'] = notification.streamingId;
171
+ if (notification.permissionRequestId) {
172
+ headers['X-CUI-PermissionRequestId'] = notification.permissionRequestId;
173
+ }
174
+ const response = await fetch(url, {
175
+ method: 'POST',
176
+ headers,
177
+ body: notification.message
178
+ });
179
+ if (!response.ok) {
180
+ throw new Error(`Ntfy returned ${response.status}: ${await response.text()}`);
181
+ }
182
+ }
183
+ }
184
+ //# 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,97 @@
1
+ /**
2
+ * Question definition from AskUserQuestion tool
3
+ */
4
+ export interface QuestionDefinition {
5
+ question: string;
6
+ header?: string;
7
+ options: Array<{
8
+ label: string;
9
+ description?: string;
10
+ }>;
11
+ multiSelect?: boolean;
12
+ }
13
+ /**
14
+ * A pending question waiting for user response
15
+ */
16
+ export interface PendingQuestion {
17
+ id: string;
18
+ sessionId: string;
19
+ streamingId: string;
20
+ toolUseId: string;
21
+ questions: QuestionDefinition[];
22
+ createdAt: string;
23
+ status: 'pending' | 'answered' | 'expired';
24
+ answers?: Record<string, string>;
25
+ answeredAt?: string;
26
+ resumedStreamingId?: string;
27
+ }
28
+ /**
29
+ * Service to persist AskUserQuestion requests across browser disconnects and server restarts.
30
+ *
31
+ * Flow:
32
+ * 1. Claude calls AskUserQuestion → we detect tool_use and save here
33
+ * 2. TUI times out (~6 sec) → session ends
34
+ * 3. User returns (even after browser close) → we show pending question
35
+ * 4. User answers → we --resume the session with the answer as context
36
+ */
37
+ export declare class PendingQuestionService {
38
+ private static instance;
39
+ private logger;
40
+ private dbPath;
41
+ private configDir;
42
+ private isInitialized;
43
+ private db;
44
+ private insertStmt;
45
+ private getByIdStmt;
46
+ private getBySessionStmt;
47
+ private getByStreamingIdStmt;
48
+ private getPendingStmt;
49
+ private markAnsweredStmt;
50
+ private markExpiredStmt;
51
+ private setResumedStreamingIdStmt;
52
+ private deleteStmt;
53
+ constructor(customConfigDir?: string);
54
+ static getInstance(): PendingQuestionService;
55
+ static resetInstance(): void;
56
+ private initializePaths;
57
+ initialize(): Promise<void>;
58
+ private prepareStatements;
59
+ /**
60
+ * Save a new pending question
61
+ */
62
+ addQuestion(id: string, sessionId: string, streamingId: string, toolUseId: string, questions: QuestionDefinition[]): PendingQuestion;
63
+ /**
64
+ * Get a question by ID
65
+ */
66
+ getQuestion(id: string): PendingQuestion | null;
67
+ /**
68
+ * Get all questions for a session (any status)
69
+ */
70
+ getQuestionsBySession(sessionId: string): PendingQuestion[];
71
+ /**
72
+ * Get pending questions for a streaming ID
73
+ */
74
+ getPendingByStreamingId(streamingId: string): PendingQuestion[];
75
+ /**
76
+ * Get all pending questions (across all sessions)
77
+ */
78
+ getAllPending(): PendingQuestion[];
79
+ /**
80
+ * Mark a question as answered
81
+ */
82
+ markAnswered(id: string, answers: Record<string, string>): boolean;
83
+ /**
84
+ * Mark a question as expired (e.g., session was manually closed)
85
+ */
86
+ markExpired(id: string): boolean;
87
+ /**
88
+ * Set the streaming ID of the resumed session
89
+ */
90
+ setResumedStreamingId(id: string, streamingId: string): boolean;
91
+ /**
92
+ * Delete a question
93
+ */
94
+ delete(id: string): boolean;
95
+ private rowToQuestion;
96
+ }
97
+ //# sourceMappingURL=pending-question-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-question-service.d.ts","sourceRoot":"","sources":["../../src/services/pending-question-service.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAeD;;;;;;;;GAQG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,EAAE,CAAqB;IAG/B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,yBAAyB,CAAsB;IACvD,OAAO,CAAC,UAAU,CAAsB;gBAE5B,eAAe,CAAC,EAAE,MAAM;IAKpC,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAO5C,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,OAAO,CAAC,eAAe;IAejB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC,OAAO,CAAC,iBAAiB;IA6BzB;;OAEG;IACH,WAAW,CACT,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,kBAAkB,EAAE,GAC9B,eAAe;IAyBlB;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAK/C;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE;IAK3D;;OAEG;IACH,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,EAAE;IAK/D;;OAEG;IACH,aAAa,IAAI,eAAe,EAAE;IAKlC;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO;IAclE;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKhC;;OAEG;IACH,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAK/D;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK3B,OAAO,CAAC,aAAa;CActB"}
@@ -0,0 +1,223 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import Database from 'better-sqlite3';
4
+ import { CONFIG_DIR, CONFIG_DIR_NAME } from '../utils/constants.js';
5
+ import { createLogger } from './infrastructure/logger.js';
6
+ /**
7
+ * Service to persist AskUserQuestion requests across browser disconnects and server restarts.
8
+ *
9
+ * Flow:
10
+ * 1. Claude calls AskUserQuestion → we detect tool_use and save here
11
+ * 2. TUI times out (~6 sec) → session ends
12
+ * 3. User returns (even after browser close) → we show pending question
13
+ * 4. User answers → we --resume the session with the answer as context
14
+ */
15
+ export class PendingQuestionService {
16
+ static instance;
17
+ logger;
18
+ dbPath;
19
+ configDir;
20
+ isInitialized = false;
21
+ db;
22
+ // Prepared statements
23
+ insertStmt;
24
+ getByIdStmt;
25
+ getBySessionStmt;
26
+ getByStreamingIdStmt;
27
+ getPendingStmt;
28
+ markAnsweredStmt;
29
+ markExpiredStmt;
30
+ setResumedStreamingIdStmt;
31
+ deleteStmt;
32
+ constructor(customConfigDir) {
33
+ this.logger = createLogger('PendingQuestionService');
34
+ this.initializePaths(customConfigDir);
35
+ }
36
+ static getInstance() {
37
+ if (!PendingQuestionService.instance) {
38
+ PendingQuestionService.instance = new PendingQuestionService();
39
+ }
40
+ return PendingQuestionService.instance;
41
+ }
42
+ static resetInstance() {
43
+ PendingQuestionService.instance = null;
44
+ }
45
+ initializePaths(customConfigDir) {
46
+ if (customConfigDir) {
47
+ if (customConfigDir === ':memory:') {
48
+ this.configDir = ':memory:';
49
+ this.dbPath = ':memory:';
50
+ return;
51
+ }
52
+ this.configDir = path.join(customConfigDir, CONFIG_DIR_NAME);
53
+ }
54
+ else {
55
+ this.configDir = CONFIG_DIR;
56
+ }
57
+ // Use same DB as session-info for simplicity
58
+ this.dbPath = path.join(this.configDir, 'session-info.db');
59
+ }
60
+ async initialize() {
61
+ if (this.isInitialized) {
62
+ return;
63
+ }
64
+ try {
65
+ if (this.dbPath !== ':memory:' && !fs.existsSync(this.configDir)) {
66
+ fs.mkdirSync(this.configDir, { recursive: true });
67
+ }
68
+ this.db = new Database(this.dbPath);
69
+ this.db.pragma('journal_mode = WAL');
70
+ this.db.pragma('busy_timeout = 10000');
71
+ this.db.exec(`
72
+ CREATE TABLE IF NOT EXISTS pending_questions (
73
+ id TEXT PRIMARY KEY,
74
+ session_id TEXT NOT NULL,
75
+ streaming_id TEXT NOT NULL,
76
+ tool_use_id TEXT NOT NULL,
77
+ questions TEXT NOT NULL,
78
+ created_at TEXT NOT NULL,
79
+ status TEXT NOT NULL DEFAULT 'pending',
80
+ answers TEXT,
81
+ answered_at TEXT,
82
+ resumed_streaming_id TEXT
83
+ );
84
+ CREATE INDEX IF NOT EXISTS idx_pending_questions_session ON pending_questions(session_id);
85
+ CREATE INDEX IF NOT EXISTS idx_pending_questions_status ON pending_questions(status);
86
+ `);
87
+ this.prepareStatements();
88
+ this.isInitialized = true;
89
+ this.logger.info('PendingQuestionService initialized');
90
+ }
91
+ catch (error) {
92
+ this.logger.error('Failed to initialize pending questions database', error);
93
+ throw error;
94
+ }
95
+ }
96
+ prepareStatements() {
97
+ this.insertStmt = this.db.prepare(`
98
+ INSERT INTO pending_questions (
99
+ id, session_id, streaming_id, tool_use_id, questions, created_at, status
100
+ ) VALUES (
101
+ @id, @session_id, @streaming_id, @tool_use_id, @questions, @created_at, @status
102
+ )
103
+ `);
104
+ this.getByIdStmt = this.db.prepare('SELECT * FROM pending_questions WHERE id = ?');
105
+ this.getBySessionStmt = this.db.prepare('SELECT * FROM pending_questions WHERE session_id = ?');
106
+ this.getByStreamingIdStmt = this.db.prepare('SELECT * FROM pending_questions WHERE streaming_id = ? AND status = ?');
107
+ this.getPendingStmt = this.db.prepare("SELECT * FROM pending_questions WHERE status = 'pending' ORDER BY created_at DESC");
108
+ this.markAnsweredStmt = this.db.prepare(`
109
+ UPDATE pending_questions
110
+ SET status = 'answered', answers = @answers, answered_at = @answered_at
111
+ WHERE id = @id
112
+ `);
113
+ this.markExpiredStmt = this.db.prepare("UPDATE pending_questions SET status = 'expired' WHERE id = ?");
114
+ this.setResumedStreamingIdStmt = this.db.prepare(`
115
+ UPDATE pending_questions SET resumed_streaming_id = ? WHERE id = ?
116
+ `);
117
+ this.deleteStmt = this.db.prepare('DELETE FROM pending_questions WHERE id = ?');
118
+ }
119
+ /**
120
+ * Save a new pending question
121
+ */
122
+ addQuestion(id, sessionId, streamingId, toolUseId, questions) {
123
+ const question = {
124
+ id,
125
+ sessionId,
126
+ streamingId,
127
+ toolUseId,
128
+ questions,
129
+ createdAt: new Date().toISOString(),
130
+ status: 'pending'
131
+ };
132
+ this.insertStmt.run({
133
+ id: question.id,
134
+ session_id: question.sessionId,
135
+ streaming_id: question.streamingId,
136
+ tool_use_id: question.toolUseId,
137
+ questions: JSON.stringify(question.questions),
138
+ created_at: question.createdAt,
139
+ status: question.status
140
+ });
141
+ this.logger.info('Pending question saved', { id, sessionId, questionCount: questions.length });
142
+ return question;
143
+ }
144
+ /**
145
+ * Get a question by ID
146
+ */
147
+ getQuestion(id) {
148
+ const row = this.getByIdStmt.get(id);
149
+ return row ? this.rowToQuestion(row) : null;
150
+ }
151
+ /**
152
+ * Get all questions for a session (any status)
153
+ */
154
+ getQuestionsBySession(sessionId) {
155
+ const rows = this.getBySessionStmt.all(sessionId);
156
+ return rows.map(row => this.rowToQuestion(row));
157
+ }
158
+ /**
159
+ * Get pending questions for a streaming ID
160
+ */
161
+ getPendingByStreamingId(streamingId) {
162
+ const rows = this.getByStreamingIdStmt.all(streamingId, 'pending');
163
+ return rows.map(row => this.rowToQuestion(row));
164
+ }
165
+ /**
166
+ * Get all pending questions (across all sessions)
167
+ */
168
+ getAllPending() {
169
+ const rows = this.getPendingStmt.all();
170
+ return rows.map(row => this.rowToQuestion(row));
171
+ }
172
+ /**
173
+ * Mark a question as answered
174
+ */
175
+ markAnswered(id, answers) {
176
+ const result = this.markAnsweredStmt.run({
177
+ id,
178
+ answers: JSON.stringify(answers),
179
+ answered_at: new Date().toISOString()
180
+ });
181
+ if (result.changes > 0) {
182
+ this.logger.info('Question marked as answered', { id, answers });
183
+ return true;
184
+ }
185
+ return false;
186
+ }
187
+ /**
188
+ * Mark a question as expired (e.g., session was manually closed)
189
+ */
190
+ markExpired(id) {
191
+ const result = this.markExpiredStmt.run(id);
192
+ return result.changes > 0;
193
+ }
194
+ /**
195
+ * Set the streaming ID of the resumed session
196
+ */
197
+ setResumedStreamingId(id, streamingId) {
198
+ const result = this.setResumedStreamingIdStmt.run(streamingId, id);
199
+ return result.changes > 0;
200
+ }
201
+ /**
202
+ * Delete a question
203
+ */
204
+ delete(id) {
205
+ const result = this.deleteStmt.run(id);
206
+ return result.changes > 0;
207
+ }
208
+ rowToQuestion(row) {
209
+ return {
210
+ id: row.id,
211
+ sessionId: row.session_id,
212
+ streamingId: row.streaming_id,
213
+ toolUseId: row.tool_use_id,
214
+ questions: JSON.parse(row.questions),
215
+ createdAt: row.created_at,
216
+ status: row.status,
217
+ answers: row.answers ? JSON.parse(row.answers) : undefined,
218
+ answeredAt: row.answered_at ?? undefined,
219
+ resumedStreamingId: row.resumed_streaming_id ?? undefined
220
+ };
221
+ }
222
+ }
223
+ //# sourceMappingURL=pending-question-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-question-service.js","sourceRoot":"","sources":["../../src/services/pending-question-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * PermissionEventLog - Structured event logging for permission flow observability.
3
+ *
4
+ * This provides a clear, queryable log of all permission system decisions:
5
+ * - Permission requests from MCP server
6
+ * - Pattern matching decisions (allowed/denied)
7
+ * - Pattern suggestions (LLM vs heuristic)
8
+ * - Allowlist modifications
9
+ *
10
+ * The log is designed for:
11
+ * 1. Debugging: "Why was this tool auto-approved?" / "What pattern matched?"
12
+ * 2. Monitoring: "How many permissions are being requested?"
13
+ * 3. Pattern analysis: "What patterns would reduce permission prompts?"
14
+ */
15
+ export type PermissionEventType = 'request' | 'auto_approved' | 'pending' | 'approved' | 'denied' | 'pattern_suggest' | 'allowlist_add';
16
+ export type PatternSource = 'global' | 'session';
17
+ export type SuggestionSource = 'llm' | 'heuristic';
18
+ export interface PermissionEvent {
19
+ id: number;
20
+ timestamp: number;
21
+ eventType: PermissionEventType;
22
+ toolName: string;
23
+ toolInput?: Record<string, unknown>;
24
+ streamingId?: string;
25
+ sessionId?: string;
26
+ permissionRequestId?: string;
27
+ matchedPattern?: string;
28
+ patternSource?: PatternSource;
29
+ suggestedPatterns?: string[];
30
+ suggestionSource?: SuggestionSource;
31
+ addedPattern?: string;
32
+ allowlistScope?: 'session' | 'global';
33
+ decision?: 'approve' | 'deny';
34
+ denyReason?: string;
35
+ durationMs?: number;
36
+ }
37
+ export declare class PermissionEventLog {
38
+ private logger;
39
+ private events;
40
+ private eventId;
41
+ private maxEvents;
42
+ constructor();
43
+ /**
44
+ * Log a permission request from MCP server
45
+ */
46
+ request(params: {
47
+ toolName: string;
48
+ toolInput?: Record<string, unknown>;
49
+ streamingId?: string;
50
+ permissionRequestId: string;
51
+ }): void;
52
+ /**
53
+ * Log auto-approval by pattern match
54
+ */
55
+ autoApproved(params: {
56
+ toolName: string;
57
+ toolInput?: Record<string, unknown>;
58
+ streamingId?: string;
59
+ matchedPattern: string;
60
+ patternSource: PatternSource;
61
+ }): void;
62
+ /**
63
+ * Log pattern suggestions
64
+ */
65
+ patternSuggest(params: {
66
+ toolName: string;
67
+ toolInput?: Record<string, unknown>;
68
+ suggestedPatterns: string[];
69
+ suggestionSource: SuggestionSource;
70
+ durationMs?: number;
71
+ }): void;
72
+ /**
73
+ * Log user decision
74
+ */
75
+ decision(params: {
76
+ permissionRequestId: string;
77
+ toolName: string;
78
+ decision: 'approve' | 'deny';
79
+ denyReason?: string;
80
+ streamingId?: string;
81
+ }): void;
82
+ /**
83
+ * Log pattern added to allowlist
84
+ */
85
+ allowlistAdd(params: {
86
+ pattern: string;
87
+ scope: 'session' | 'global';
88
+ streamingId?: string;
89
+ }): void;
90
+ private addEvent;
91
+ /**
92
+ * Get all events (most recent first)
93
+ */
94
+ getAll(limit?: number): PermissionEvent[];
95
+ /**
96
+ * Get events for a specific streaming session
97
+ */
98
+ getForSession(streamingId: string, limit?: number): PermissionEvent[];
99
+ /**
100
+ * Get events for a specific tool
101
+ */
102
+ getForTool(toolName: string, limit?: number): PermissionEvent[];
103
+ /**
104
+ * Get auto-approved events (useful for understanding pattern coverage)
105
+ */
106
+ getAutoApproved(limit?: number): PermissionEvent[];
107
+ /**
108
+ * Get pending/denied events (useful for identifying missing patterns)
109
+ */
110
+ getManualDecisions(limit?: number): PermissionEvent[];
111
+ /**
112
+ * Get pattern match statistics
113
+ */
114
+ getPatternStats(): {
115
+ totalRequests: number;
116
+ autoApproved: number;
117
+ manualApproved: number;
118
+ denied: number;
119
+ patternHitRate: number;
120
+ topMatchedPatterns: Array<{
121
+ pattern: string;
122
+ count: number;
123
+ }>;
124
+ };
125
+ /**
126
+ * Get a human-readable timeline
127
+ */
128
+ getTimeline(limit?: number): string[];
129
+ /**
130
+ * Clear all events (for testing)
131
+ */
132
+ clear(): void;
133
+ }
134
+ export declare function getPermissionEventLog(): PermissionEventLog;
135
+ export declare function resetPermissionEventLog(): void;
136
+ //# sourceMappingURL=permission-event-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-event-log.d.ts","sourceRoot":"","sources":["../../src/services/permission-event-log.ts"],"names":[],"mappings":"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"}