@rulemetric/cli 0.1.1 → 0.2.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 (259) hide show
  1. package/README.md +66 -0
  2. package/dist/base-command.d.ts.map +1 -1
  3. package/dist/base-command.js +15 -0
  4. package/dist/base-command.js.map +1 -1
  5. package/dist/commands/auth/login.d.ts.map +1 -1
  6. package/dist/commands/auth/login.js +7 -0
  7. package/dist/commands/auth/login.js.map +1 -1
  8. package/dist/commands/crons/list.d.ts +7 -0
  9. package/dist/commands/crons/list.d.ts.map +1 -0
  10. package/dist/commands/crons/list.js +24 -0
  11. package/dist/commands/crons/list.js.map +1 -0
  12. package/dist/commands/crons/run.d.ts +13 -0
  13. package/dist/commands/crons/run.d.ts.map +1 -0
  14. package/dist/commands/crons/run.js +48 -0
  15. package/dist/commands/crons/run.js.map +1 -0
  16. package/dist/commands/evals/listen.d.ts +28 -2
  17. package/dist/commands/evals/listen.d.ts.map +1 -1
  18. package/dist/commands/evals/listen.js +159 -25
  19. package/dist/commands/evals/listen.js.map +1 -1
  20. package/dist/commands/evals/listen.test.d.ts +2 -0
  21. package/dist/commands/evals/listen.test.d.ts.map +1 -0
  22. package/dist/commands/evals/listen.test.js +48 -0
  23. package/dist/commands/evals/listen.test.js.map +1 -0
  24. package/dist/commands/gateway/ensure.js +1 -1
  25. package/dist/commands/gateway/ensure.js.map +1 -1
  26. package/dist/commands/hooks/install.d.ts.map +1 -1
  27. package/dist/commands/hooks/install.js +40 -3
  28. package/dist/commands/hooks/install.js.map +1 -1
  29. package/dist/commands/hooks/run.js +1 -1
  30. package/dist/commands/hooks/run.js.map +1 -1
  31. package/dist/commands/hooks/uninstall.d.ts.map +1 -1
  32. package/dist/commands/hooks/uninstall.js +9 -1
  33. package/dist/commands/hooks/uninstall.js.map +1 -1
  34. package/dist/commands/org/current.d.ts +7 -0
  35. package/dist/commands/org/current.d.ts.map +1 -0
  36. package/dist/commands/org/current.js +70 -0
  37. package/dist/commands/org/current.js.map +1 -0
  38. package/dist/commands/org/list.d.ts +7 -0
  39. package/dist/commands/org/list.d.ts.map +1 -0
  40. package/dist/commands/org/list.js +37 -0
  41. package/dist/commands/org/list.js.map +1 -0
  42. package/dist/commands/org/switch.d.ts +13 -0
  43. package/dist/commands/org/switch.d.ts.map +1 -0
  44. package/dist/commands/org/switch.js +52 -0
  45. package/dist/commands/org/switch.js.map +1 -0
  46. package/dist/commands/proxy/restart.d.ts +11 -0
  47. package/dist/commands/proxy/restart.d.ts.map +1 -0
  48. package/dist/commands/proxy/restart.js +36 -0
  49. package/dist/commands/proxy/restart.js.map +1 -0
  50. package/dist/commands/proxy/start.d.ts.map +1 -1
  51. package/dist/commands/proxy/start.js +4 -0
  52. package/dist/commands/proxy/start.js.map +1 -1
  53. package/dist/commands/service/install.d.ts +16 -0
  54. package/dist/commands/service/install.d.ts.map +1 -1
  55. package/dist/commands/service/install.js +145 -6
  56. package/dist/commands/service/install.js.map +1 -1
  57. package/dist/commands/service/uninstall.d.ts.map +1 -1
  58. package/dist/commands/service/uninstall.js +28 -0
  59. package/dist/commands/service/uninstall.js.map +1 -1
  60. package/dist/commands/sessions/start.d.ts.map +1 -1
  61. package/dist/commands/sessions/start.js +5 -0
  62. package/dist/commands/sessions/start.js.map +1 -1
  63. package/dist/commands/signals/report.d.ts +10 -0
  64. package/dist/commands/signals/report.d.ts.map +1 -0
  65. package/dist/commands/signals/report.js +35 -0
  66. package/dist/commands/signals/report.js.map +1 -0
  67. package/dist/commands/signals/report.test.d.ts +2 -0
  68. package/dist/commands/signals/report.test.d.ts.map +1 -0
  69. package/dist/commands/signals/report.test.js +65 -0
  70. package/dist/commands/signals/report.test.js.map +1 -0
  71. package/dist/commands/skills/export-approved.d.ts +10 -0
  72. package/dist/commands/skills/export-approved.d.ts.map +1 -0
  73. package/dist/commands/skills/export-approved.js +31 -0
  74. package/dist/commands/skills/export-approved.js.map +1 -0
  75. package/dist/commands/skills/publish.d.ts +17 -0
  76. package/dist/commands/skills/publish.d.ts.map +1 -0
  77. package/dist/commands/skills/publish.js +80 -0
  78. package/dist/commands/skills/publish.js.map +1 -0
  79. package/dist/commands/skills/update.d.ts +3 -0
  80. package/dist/commands/skills/update.d.ts.map +1 -1
  81. package/dist/commands/skills/update.js +17 -6
  82. package/dist/commands/skills/update.js.map +1 -1
  83. package/dist/commands/suggestions/accept.d.ts +16 -0
  84. package/dist/commands/suggestions/accept.d.ts.map +1 -0
  85. package/dist/commands/suggestions/accept.js +61 -0
  86. package/dist/commands/suggestions/accept.js.map +1 -0
  87. package/dist/commands/suggestions/accept.test.d.ts +2 -0
  88. package/dist/commands/suggestions/accept.test.d.ts.map +1 -0
  89. package/dist/commands/suggestions/accept.test.js +52 -0
  90. package/dist/commands/suggestions/accept.test.js.map +1 -0
  91. package/dist/commands/suggestions/dismiss.d.ts +10 -0
  92. package/dist/commands/suggestions/dismiss.d.ts.map +1 -0
  93. package/dist/commands/suggestions/dismiss.js +26 -0
  94. package/dist/commands/suggestions/dismiss.js.map +1 -0
  95. package/dist/commands/suggestions/list.d.ts +10 -0
  96. package/dist/commands/suggestions/list.d.ts.map +1 -0
  97. package/dist/commands/suggestions/list.js +40 -0
  98. package/dist/commands/suggestions/list.js.map +1 -0
  99. package/dist/commands/suggestions/refresh.d.ts +7 -0
  100. package/dist/commands/suggestions/refresh.d.ts.map +1 -0
  101. package/dist/commands/suggestions/refresh.js +11 -0
  102. package/dist/commands/suggestions/refresh.js.map +1 -0
  103. package/dist/dashboard/Dashboard.d.ts.map +1 -1
  104. package/dist/dashboard/Dashboard.js +7 -1
  105. package/dist/dashboard/Dashboard.js.map +1 -1
  106. package/dist/lib/active-org-refresh.d.ts +22 -0
  107. package/dist/lib/active-org-refresh.d.ts.map +1 -0
  108. package/dist/lib/active-org-refresh.js +108 -0
  109. package/dist/lib/active-org-refresh.js.map +1 -0
  110. package/dist/lib/active-org-refresh.test.d.ts +2 -0
  111. package/dist/lib/active-org-refresh.test.d.ts.map +1 -0
  112. package/dist/lib/active-org-refresh.test.js +190 -0
  113. package/dist/lib/active-org-refresh.test.js.map +1 -0
  114. package/dist/lib/active-org.d.ts +43 -0
  115. package/dist/lib/active-org.d.ts.map +1 -0
  116. package/dist/lib/active-org.js +96 -0
  117. package/dist/lib/active-org.js.map +1 -0
  118. package/dist/lib/active-org.test.d.ts +2 -0
  119. package/dist/lib/active-org.test.d.ts.map +1 -0
  120. package/dist/lib/active-org.test.js +147 -0
  121. package/dist/lib/active-org.test.js.map +1 -0
  122. package/dist/lib/cron-registry.d.ts +47 -0
  123. package/dist/lib/cron-registry.d.ts.map +1 -0
  124. package/dist/lib/cron-registry.js +102 -0
  125. package/dist/lib/cron-registry.js.map +1 -0
  126. package/dist/lib/cron-registry.test.d.ts +2 -0
  127. package/dist/lib/cron-registry.test.d.ts.map +1 -0
  128. package/dist/lib/cron-registry.test.js +136 -0
  129. package/dist/lib/cron-registry.test.js.map +1 -0
  130. package/dist/lib/cron-runner.d.ts +16 -0
  131. package/dist/lib/cron-runner.d.ts.map +1 -0
  132. package/dist/lib/cron-runner.js +68 -0
  133. package/dist/lib/cron-runner.js.map +1 -0
  134. package/dist/lib/detect-languages.d.ts +7 -0
  135. package/dist/lib/detect-languages.d.ts.map +1 -0
  136. package/dist/lib/detect-languages.js +113 -0
  137. package/dist/lib/detect-languages.js.map +1 -0
  138. package/dist/lib/detect-languages.test.d.ts +2 -0
  139. package/dist/lib/detect-languages.test.d.ts.map +1 -0
  140. package/dist/lib/detect-languages.test.js +29 -0
  141. package/dist/lib/detect-languages.test.js.map +1 -0
  142. package/dist/lib/eval-executor.d.ts.map +1 -1
  143. package/dist/lib/eval-executor.js +5 -2
  144. package/dist/lib/eval-executor.js.map +1 -1
  145. package/dist/lib/gateway-entry.js +4 -1
  146. package/dist/lib/gateway-entry.js.map +1 -1
  147. package/dist/lib/gateway-lifecycle.d.ts +1 -1
  148. package/dist/lib/gateway-lifecycle.d.ts.map +1 -1
  149. package/dist/lib/gateway-lifecycle.js +13 -2
  150. package/dist/lib/gateway-lifecycle.js.map +1 -1
  151. package/dist/lib/gateway.d.ts +4 -5
  152. package/dist/lib/gateway.d.ts.map +1 -1
  153. package/dist/lib/gateway.js +68 -2
  154. package/dist/lib/gateway.js.map +1 -1
  155. package/dist/lib/graphile-worker-runner.d.ts +124 -0
  156. package/dist/lib/graphile-worker-runner.d.ts.map +1 -0
  157. package/dist/lib/graphile-worker-runner.js +530 -0
  158. package/dist/lib/graphile-worker-runner.js.map +1 -0
  159. package/dist/lib/graphile-worker-runner.test.d.ts +2 -0
  160. package/dist/lib/graphile-worker-runner.test.d.ts.map +1 -0
  161. package/dist/lib/graphile-worker-runner.test.js +153 -0
  162. package/dist/lib/graphile-worker-runner.test.js.map +1 -0
  163. package/dist/lib/handlers/cron-close-stale-sessions.d.ts +3 -0
  164. package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +1 -0
  165. package/dist/lib/handlers/cron-close-stale-sessions.js +8 -0
  166. package/dist/lib/handlers/cron-close-stale-sessions.js.map +1 -0
  167. package/dist/lib/handlers/cron-data-integrity-audit.d.ts +3 -0
  168. package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +1 -0
  169. package/dist/lib/handlers/cron-data-integrity-audit.js +16 -0
  170. package/dist/lib/handlers/cron-data-integrity-audit.js.map +1 -0
  171. package/dist/lib/handlers/cron-refresh-skills.d.ts +3 -0
  172. package/dist/lib/handlers/cron-refresh-skills.d.ts.map +1 -0
  173. package/dist/lib/handlers/cron-refresh-skills.js +91 -0
  174. package/dist/lib/handlers/cron-refresh-skills.js.map +1 -0
  175. package/dist/lib/handlers/cron-refresh-skills.test.d.ts +2 -0
  176. package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +1 -0
  177. package/dist/lib/handlers/cron-refresh-skills.test.js +114 -0
  178. package/dist/lib/handlers/cron-refresh-skills.test.js.map +1 -0
  179. package/dist/lib/handlers/cron-regenerate-insights.d.ts +3 -0
  180. package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +1 -0
  181. package/dist/lib/handlers/cron-regenerate-insights.js +6 -0
  182. package/dist/lib/handlers/cron-regenerate-insights.js.map +1 -0
  183. package/dist/lib/handlers/cron-suggest-instructions.d.ts +3 -0
  184. package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +1 -0
  185. package/dist/lib/handlers/cron-suggest-instructions.js +159 -0
  186. package/dist/lib/handlers/cron-suggest-instructions.js.map +1 -0
  187. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +2 -0
  188. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +1 -0
  189. package/dist/lib/handlers/cron-suggest-instructions.test.js +80 -0
  190. package/dist/lib/handlers/cron-suggest-instructions.test.js.map +1 -0
  191. package/dist/lib/handlers/process-conversation.d.ts +35 -0
  192. package/dist/lib/handlers/process-conversation.d.ts.map +1 -0
  193. package/dist/lib/handlers/process-conversation.js +35 -0
  194. package/dist/lib/handlers/process-conversation.js.map +1 -0
  195. package/dist/lib/handlers/process-eval.d.ts +32 -0
  196. package/dist/lib/handlers/process-eval.d.ts.map +1 -0
  197. package/dist/lib/handlers/process-eval.js +207 -0
  198. package/dist/lib/handlers/process-eval.js.map +1 -0
  199. package/dist/lib/handlers/process-insights.d.ts +39 -0
  200. package/dist/lib/handlers/process-insights.d.ts.map +1 -0
  201. package/dist/lib/handlers/process-insights.js +300 -0
  202. package/dist/lib/handlers/process-insights.js.map +1 -0
  203. package/dist/lib/handlers/process-launch.d.ts +29 -0
  204. package/dist/lib/handlers/process-launch.d.ts.map +1 -0
  205. package/dist/lib/handlers/process-launch.js +41 -0
  206. package/dist/lib/handlers/process-launch.js.map +1 -0
  207. package/dist/lib/handlers/process-session-goal.d.ts +29 -0
  208. package/dist/lib/handlers/process-session-goal.d.ts.map +1 -0
  209. package/dist/lib/handlers/process-session-goal.js +74 -0
  210. package/dist/lib/handlers/process-session-goal.js.map +1 -0
  211. package/dist/lib/handlers/process-session-goal.test.d.ts +2 -0
  212. package/dist/lib/handlers/process-session-goal.test.d.ts.map +1 -0
  213. package/dist/lib/handlers/process-session-goal.test.js +134 -0
  214. package/dist/lib/handlers/process-session-goal.test.js.map +1 -0
  215. package/dist/lib/hooks-config.d.ts +28 -4
  216. package/dist/lib/hooks-config.d.ts.map +1 -1
  217. package/dist/lib/hooks-config.js +138 -10
  218. package/dist/lib/hooks-config.js.map +1 -1
  219. package/dist/lib/llm-client.d.ts.map +1 -1
  220. package/dist/lib/llm-client.js +149 -16
  221. package/dist/lib/llm-client.js.map +1 -1
  222. package/dist/lib/mirror-writer-db.d.ts +12 -0
  223. package/dist/lib/mirror-writer-db.d.ts.map +1 -0
  224. package/dist/lib/mirror-writer-db.js +51 -0
  225. package/dist/lib/mirror-writer-db.js.map +1 -0
  226. package/dist/lib/mirror-writer.d.ts +35 -0
  227. package/dist/lib/mirror-writer.d.ts.map +1 -0
  228. package/dist/lib/mirror-writer.js +27 -0
  229. package/dist/lib/mirror-writer.js.map +1 -0
  230. package/dist/lib/mirror-writer.test.d.ts +2 -0
  231. package/dist/lib/mirror-writer.test.d.ts.map +1 -0
  232. package/dist/lib/mirror-writer.test.js +47 -0
  233. package/dist/lib/mirror-writer.test.js.map +1 -0
  234. package/dist/lib/permanent-job-error.d.ts +17 -0
  235. package/dist/lib/permanent-job-error.d.ts.map +1 -0
  236. package/dist/lib/permanent-job-error.js +23 -0
  237. package/dist/lib/permanent-job-error.js.map +1 -0
  238. package/dist/lib/permanent-job-error.test.d.ts +2 -0
  239. package/dist/lib/permanent-job-error.test.d.ts.map +1 -0
  240. package/dist/lib/permanent-job-error.test.js +29 -0
  241. package/dist/lib/permanent-job-error.test.js.map +1 -0
  242. package/dist/lib/version-check.d.ts +11 -0
  243. package/dist/lib/version-check.d.ts.map +1 -0
  244. package/dist/lib/version-check.js +106 -0
  245. package/dist/lib/version-check.js.map +1 -0
  246. package/oclif.manifest.json +611 -81
  247. package/package.json +21 -5
  248. package/dist/commands/insights/sync.d.ts +0 -17
  249. package/dist/commands/insights/sync.d.ts.map +0 -1
  250. package/dist/commands/insights/sync.js +0 -477
  251. package/dist/commands/insights/sync.js.map +0 -1
  252. package/dist/lib/eval-worker.d.ts +0 -12
  253. package/dist/lib/eval-worker.d.ts.map +0 -1
  254. package/dist/lib/eval-worker.js +0 -395
  255. package/dist/lib/eval-worker.js.map +0 -1
  256. package/dist/lib/insights-worker.d.ts +0 -10
  257. package/dist/lib/insights-worker.d.ts.map +0 -1
  258. package/dist/lib/insights-worker.js +0 -329
  259. package/dist/lib/insights-worker.js.map +0 -1
@@ -1,329 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import * as os from 'node:os';
4
- import { execSync } from 'node:child_process';
5
- import { apiGet, apiPost, apiPatch } from './api-client.js';
6
- import { RECOMMENDATION_PROMPTS, AT_A_GLANCE_PROMPT, FACET_GENERATION_PROMPT } from './insights-prompts.js';
7
- import { runLlmPrompt, detectLlmBackend, runToolPrompt } from './llm-client.js';
8
- function sendOsNotification(title, message) {
9
- try {
10
- if (process.platform === 'darwin') {
11
- execSync(`osascript -e 'display notification "${message.replace(/"/g, '\\"')}" with title "${title.replace(/"/g, '\\"')}"'`, { timeout: 5000 });
12
- }
13
- else if (process.platform === 'linux') {
14
- execSync(`notify-send "${title.replace(/"/g, '\\"')}" "${message.replace(/"/g, '\\"')}"`, { timeout: 5000 });
15
- }
16
- // Windows: could use PowerShell toast but skip for now
17
- }
18
- catch {
19
- // Notifications are best-effort — don't fail the job
20
- }
21
- }
22
- async function buildDataSummaryFromApi(projectPath) {
23
- try {
24
- const params = new URLSearchParams();
25
- if (projectPath)
26
- params.set('projectPath', projectPath);
27
- const computed = await apiGet(`/api/insights/compute?${params}`);
28
- if (!computed || computed.total_sessions === 0)
29
- return null;
30
- // Build the same text summary format the prompts expect
31
- const topTools = Object.entries(computed.tool_counts ?? {})
32
- .sort((a, b) => b[1] - a[1])
33
- .slice(0, 10)
34
- .map(([t, c]) => `${t}: ${c}`)
35
- .join(', ');
36
- const summary = [
37
- `Sessions: ${computed.total_sessions}, Messages: ${computed.total_messages}, Hours: ${Math.round(computed.total_duration_hours)}`,
38
- `Top tools: ${topTools}`,
39
- computed.goal_categories && Object.keys(computed.goal_categories).length > 0
40
- ? `Goals: ${JSON.stringify(computed.goal_categories)}`
41
- : '',
42
- computed.friction && Object.keys(computed.friction).length > 0
43
- ? `Friction: ${JSON.stringify(computed.friction)}`
44
- : '',
45
- computed.outcomes && Object.keys(computed.outcomes).length > 0
46
- ? `Outcomes: ${JSON.stringify(computed.outcomes)}`
47
- : '',
48
- computed.projects && Object.keys(computed.projects).length > 0
49
- ? `Projects: ${JSON.stringify(computed.projects)}`
50
- : '',
51
- ].filter(Boolean).join('\n');
52
- return {
53
- summary,
54
- stats: {
55
- sessions: computed.total_sessions,
56
- totalMessages: computed.total_messages,
57
- totalHours: computed.total_duration_hours,
58
- toolCounts: computed.tool_counts,
59
- goalCounts: computed.goal_categories,
60
- frictionCounts: computed.friction,
61
- },
62
- };
63
- }
64
- catch {
65
- return null;
66
- }
67
- }
68
- function buildDataSummary(claudeDir, projectPath) {
69
- const usageDir = path.join(claudeDir, 'usage-data');
70
- const metaDir = path.join(usageDir, 'session-meta');
71
- const facetsDir = path.join(usageDir, 'facets');
72
- if (!fs.existsSync(metaDir))
73
- return null;
74
- const metas = [];
75
- for (const file of fs.readdirSync(metaDir).filter(f => f.endsWith('.json'))) {
76
- try {
77
- metas.push(JSON.parse(fs.readFileSync(path.join(metaDir, file), 'utf-8')));
78
- }
79
- catch { }
80
- }
81
- const facets = new Map();
82
- if (fs.existsSync(facetsDir)) {
83
- for (const file of fs.readdirSync(facetsDir).filter(f => f.endsWith('.json'))) {
84
- try {
85
- const f = JSON.parse(fs.readFileSync(path.join(facetsDir, file), 'utf-8'));
86
- facets.set(f.session_id, f);
87
- }
88
- catch { }
89
- }
90
- }
91
- const allValid = metas.filter(s => s.user_message_count >= 2 && s.duration_minutes >= 1);
92
- const valid = projectPath
93
- ? allValid.filter(s => s.project_path && s.project_path.toLowerCase().includes(projectPath.toLowerCase()))
94
- : allValid;
95
- // Build a text summary for the prompts
96
- const toolCounts = {};
97
- const goalCounts = {};
98
- const frictionCounts = {};
99
- let totalMessages = 0;
100
- let totalHours = 0;
101
- const summaries = [];
102
- for (const s of valid) {
103
- totalMessages += s.user_message_count;
104
- totalHours += s.duration_minutes / 60;
105
- for (const [t, c] of Object.entries(s.tool_counts))
106
- toolCounts[t] = (toolCounts[t] || 0) + c;
107
- const f = facets.get(s.session_id);
108
- if (f) {
109
- for (const [k, v] of Object.entries(f.goal_categories))
110
- if (v > 0)
111
- goalCounts[k] = (goalCounts[k] || 0) + v;
112
- for (const [k, v] of Object.entries(f.friction_counts))
113
- if (v > 0)
114
- frictionCounts[k] = (frictionCounts[k] || 0) + v;
115
- if (summaries.length < 50)
116
- summaries.push(`- ${f.brief_summary} (${f.outcome})`);
117
- }
118
- else if (summaries.length < 50) {
119
- summaries.push(`- ${s.first_prompt.slice(0, 100)}`);
120
- }
121
- }
122
- const topTools = Object.entries(toolCounts).sort((a, b) => b[1] - a[1]).slice(0, 10)
123
- .map(([t, c]) => `${t}: ${c}`).join(', ');
124
- const summary = [
125
- `Sessions: ${valid.length}, Messages: ${totalMessages}, Hours: ${Math.round(totalHours)}`,
126
- `Top tools: ${topTools}`,
127
- goalCounts && Object.keys(goalCounts).length > 0 ? `Goals: ${JSON.stringify(goalCounts)}` : '',
128
- frictionCounts && Object.keys(frictionCounts).length > 0 ? `Friction: ${JSON.stringify(frictionCounts)}` : '',
129
- '',
130
- 'Session summaries:',
131
- ...summaries,
132
- ].filter(Boolean).join('\n');
133
- return { summary, stats: { sessions: valid.length, totalMessages, totalHours, toolCounts, goalCounts, frictionCounts } };
134
- }
135
- async function processSessionAnalysisJob(job, workerId, log) {
136
- const sessionId = job.config?.sessionId;
137
- try {
138
- await apiPost(`/api/insights-jobs/${job.id}/claim`, { workerId });
139
- }
140
- catch {
141
- log(` Could not claim job ${job.id} — skipping`);
142
- return;
143
- }
144
- log(`Analyzing session ${sessionId} via tool CLI...`);
145
- try {
146
- await apiPatch(`/api/insights-jobs/${job.id}/progress`, {
147
- status: 'running',
148
- progress: { step: 'fetching_session' },
149
- });
150
- const session = await apiGet(`/api/sessions/${sessionId}`);
151
- // Idempotency: skip if session already has analysis from a prior run
152
- if (session.analysis && session.analysis.source === 'session_analysis') {
153
- log(` Session ${sessionId} already analyzed — skipping (idempotency guard)`);
154
- await apiPost(`/api/insights-jobs/${job.id}/complete`, {
155
- result: { sessionId, skipped: true, reason: 'already_analyzed' },
156
- });
157
- return;
158
- }
159
- const events = await apiGet(`/api/sessions/${sessionId}/events?limit=100`);
160
- if (events.length < 2) {
161
- await apiPost(`/api/insights-jobs/${job.id}/complete`, {
162
- error: 'Session has too few events to analyze',
163
- });
164
- return;
165
- }
166
- const eventSummary = events
167
- .filter(e => e.eventType === 'user_message' || e.eventType === 'human')
168
- .map(e => e.content?.slice(0, 200) ?? '')
169
- .filter(Boolean)
170
- .join('\n---\n');
171
- if (!eventSummary) {
172
- await apiPost(`/api/insights-jobs/${job.id}/complete`, {
173
- error: 'No user messages found in session',
174
- });
175
- return;
176
- }
177
- await apiPatch(`/api/insights-jobs/${job.id}/progress`, {
178
- status: 'running',
179
- progress: { step: 'running_analysis', tool: session.tool },
180
- });
181
- // Run through the session's tool CLI
182
- const facets = runToolPrompt(session.tool, FACET_GENERATION_PROMPT, eventSummary);
183
- if (!facets) {
184
- await apiPost(`/api/insights-jobs/${job.id}/complete`, {
185
- error: `Analysis failed — ${session.tool} CLI returned no result`,
186
- });
187
- return;
188
- }
189
- await apiPatch(`/api/sessions/${sessionId}/enrich`, {
190
- analysis: { source: 'session_analysis', tool: session.tool, ...facets },
191
- });
192
- await apiPost(`/api/insights-jobs/${job.id}/complete`, {
193
- result: { sessionId, tool: session.tool, facets },
194
- });
195
- log(` Session ${sessionId} analyzed via ${session.tool}`);
196
- }
197
- catch (err) {
198
- const message = err instanceof Error ? err.message : String(err);
199
- log(` Error analyzing session ${sessionId}: ${message}`);
200
- await apiPost(`/api/insights-jobs/${job.id}/complete`, { error: message }).catch(() => { });
201
- }
202
- }
203
- export async function processInsightsJob(job, workerId, log) {
204
- // Check if this is a single-session analysis job
205
- if (job.config?.sessionId) {
206
- await processSessionAnalysisJob(job, workerId, log);
207
- return;
208
- }
209
- // Claim
210
- try {
211
- await apiPost(`/api/insights-jobs/${job.id}/claim`, { workerId });
212
- }
213
- catch {
214
- log(` Could not claim job ${job.id} — skipping`);
215
- return;
216
- }
217
- log(`Processing insights job ${job.id}...`);
218
- try {
219
- // Update status to running
220
- await apiPatch(`/api/insights-jobs/${job.id}/progress`, {
221
- status: 'running',
222
- progress: { step: 'reading_data' },
223
- });
224
- // Try API-based data first (works for all tools), fall back to local files (Claude Code only)
225
- let data = await buildDataSummaryFromApi(job.projectPath);
226
- if (!data) {
227
- const claudeDir = path.join(os.homedir(), '.claude');
228
- data = buildDataSummary(claudeDir, job.projectPath);
229
- }
230
- if (!data) {
231
- await apiPost(`/api/insights-jobs/${job.id}/complete`, {
232
- error: 'No session data found — ensure sessions are captured and enriched.',
233
- });
234
- return;
235
- }
236
- log(` Found ${data.stats.sessions} sessions, generating recommendations...`);
237
- // Generate facets for sessions that don't have analysis yet
238
- if (detectLlmBackend() !== 'none') {
239
- try {
240
- const unfaceted = await apiGet('/api/sessions?hasAnalysis=false&limit=20');
241
- if (unfaceted.length > 0) {
242
- log(` Generating facets for ${unfaceted.length} un-analyzed sessions...`);
243
- }
244
- for (const session of unfaceted) {
245
- try {
246
- const events = await apiGet(`/api/sessions/${session.id}/events?limit=100`);
247
- if (events.length < 2)
248
- continue;
249
- const eventSummary = events
250
- .filter(e => e.eventType === 'user_message' || e.eventType === 'human')
251
- .map(e => e.content?.slice(0, 200) ?? '')
252
- .filter(Boolean)
253
- .join('\n---\n');
254
- if (!eventSummary)
255
- continue;
256
- const facets = await runLlmPrompt(FACET_GENERATION_PROMPT, eventSummary, 4096);
257
- if (facets) {
258
- await apiPatch(`/api/sessions/${session.id}/enrich`, {
259
- analysis: { source: 'generated_facets', ...facets },
260
- });
261
- log(` Generated facets for session ${session.id} (${session.tool})`);
262
- }
263
- }
264
- catch (sessionErr) {
265
- log(` Failed to generate facets for session ${session.id}: ${sessionErr instanceof Error ? sessionErr.message : String(sessionErr)}`);
266
- }
267
- }
268
- }
269
- catch (facetErr) {
270
- log(` Warning: facet generation failed: ${facetErr instanceof Error ? facetErr.message : String(facetErr)}`);
271
- }
272
- }
273
- // Run recommendation prompts sequentially
274
- const recommendations = {};
275
- const totalPrompts = RECOMMENDATION_PROMPTS.length + 1; // +1 for at_a_glance
276
- for (let i = 0; i < RECOMMENDATION_PROMPTS.length; i++) {
277
- const spec = RECOMMENDATION_PROMPTS[i];
278
- log(` [${i + 1}/${totalPrompts}] Generating ${spec.name}...`);
279
- try {
280
- await apiPatch(`/api/insights-jobs/${job.id}/progress`, {
281
- status: 'running',
282
- progress: { step: spec.name, current: i + 1, total: totalPrompts },
283
- });
284
- }
285
- catch (patchErr) {
286
- log(` Warning: progress update failed for ${spec.name}: ${patchErr instanceof Error ? patchErr.message : String(patchErr)}`);
287
- }
288
- log(` Running LLM prompt for ${spec.name}...`);
289
- const result = await runLlmPrompt(spec.prompt, data.summary, spec.maxTokens);
290
- if (result) {
291
- recommendations[spec.name] = result;
292
- log(` Got result for ${spec.name}`);
293
- }
294
- else {
295
- log(` No result for ${spec.name} (LLM returned null)`);
296
- }
297
- }
298
- // At a glance (uses outputs from previous prompts)
299
- log(` [${totalPrompts}/${totalPrompts}] Generating at_a_glance...`);
300
- await apiPatch(`/api/insights-jobs/${job.id}/progress`, {
301
- status: 'running',
302
- progress: { step: 'at_a_glance', current: totalPrompts, total: totalPrompts },
303
- });
304
- const glanceData = [
305
- data.summary,
306
- recommendations.what_works ? `\n## What Works\n${JSON.stringify(recommendations.what_works)}` : '',
307
- recommendations.friction_analysis ? `\n## Friction\n${JSON.stringify(recommendations.friction_analysis)}` : '',
308
- recommendations.suggestions ? `\n## Suggestions\n${JSON.stringify(recommendations.suggestions)}` : '',
309
- recommendations.on_the_horizon ? `\n## On the Horizon\n${JSON.stringify(recommendations.on_the_horizon)}` : '',
310
- ].join('\n');
311
- const glance = await runLlmPrompt(AT_A_GLANCE_PROMPT, glanceData, 8192);
312
- if (glance) {
313
- recommendations.at_a_glance = glance;
314
- }
315
- log(' Uploading results...');
316
- await apiPost(`/api/insights-jobs/${job.id}/complete`, {
317
- result: { recommendations },
318
- });
319
- log(` Done! Recommendations generated for job ${job.id}`);
320
- const projectName = job.projectPath?.split('/').pop() ?? 'All Projects';
321
- sendOsNotification('RuleMetric Insights Ready', `New recommendations for ${projectName}`);
322
- }
323
- catch (err) {
324
- const message = err instanceof Error ? err.message : String(err);
325
- log(` Error: ${message}`);
326
- await apiPost(`/api/insights-jobs/${job.id}/complete`, { error: message }).catch(() => { });
327
- }
328
- }
329
- //# sourceMappingURL=insights-worker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"insights-worker.js","sourceRoot":"","sources":["../../src/lib/insights-worker.ts"],"names":[],"mappings":"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"}