@code-insights/cli 2.1.0 → 3.0.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 (270) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +146 -156
  3. package/dashboard-dist/assets/index-BMhL7wL8.css +1 -0
  4. package/dashboard-dist/assets/index-CuCBzQyQ.js +548 -0
  5. package/dashboard-dist/dist/assets/index-BMhL7wL8.css +1 -0
  6. package/dashboard-dist/dist/assets/index-CuCBzQyQ.js +548 -0
  7. package/dashboard-dist/dist/favicon.svg +4 -0
  8. package/dashboard-dist/dist/index.html +33 -0
  9. package/dashboard-dist/favicon.svg +4 -0
  10. package/dashboard-dist/index.html +33 -0
  11. package/dist/commands/config.d.ts.map +1 -1
  12. package/dist/commands/config.js +188 -69
  13. package/dist/commands/config.js.map +1 -1
  14. package/dist/commands/dashboard.d.ts +16 -0
  15. package/dist/commands/dashboard.d.ts.map +1 -0
  16. package/dist/commands/dashboard.js +82 -0
  17. package/dist/commands/dashboard.js.map +1 -0
  18. package/dist/commands/init.d.ts +3 -4
  19. package/dist/commands/init.d.ts.map +1 -1
  20. package/dist/commands/init.js +24 -201
  21. package/dist/commands/init.js.map +1 -1
  22. package/dist/commands/install-hook.d.ts.map +1 -1
  23. package/dist/commands/install-hook.js +4 -21
  24. package/dist/commands/install-hook.js.map +1 -1
  25. package/dist/commands/open.d.ts +2 -1
  26. package/dist/commands/open.d.ts.map +1 -1
  27. package/dist/commands/open.js +10 -21
  28. package/dist/commands/open.js.map +1 -1
  29. package/dist/commands/reset.d.ts.map +1 -1
  30. package/dist/commands/reset.js +38 -69
  31. package/dist/commands/reset.js.map +1 -1
  32. package/dist/commands/stats/actions/error-handler.d.ts.map +1 -1
  33. package/dist/commands/stats/actions/error-handler.js +1 -11
  34. package/dist/commands/stats/actions/error-handler.js.map +1 -1
  35. package/dist/commands/stats/data/local.d.ts +0 -2
  36. package/dist/commands/stats/data/local.d.ts.map +1 -1
  37. package/dist/commands/stats/data/local.js +44 -44
  38. package/dist/commands/stats/data/local.js.map +1 -1
  39. package/dist/commands/stats/data/source.d.ts +3 -9
  40. package/dist/commands/stats/data/source.d.ts.map +1 -1
  41. package/dist/commands/stats/data/source.js +3 -35
  42. package/dist/commands/stats/data/source.js.map +1 -1
  43. package/dist/commands/stats/data/types.d.ts +1 -12
  44. package/dist/commands/stats/data/types.d.ts.map +1 -1
  45. package/dist/commands/stats/data/types.js +0 -16
  46. package/dist/commands/stats/data/types.js.map +1 -1
  47. package/dist/commands/stats/shared.d.ts.map +1 -1
  48. package/dist/commands/stats/shared.js +1 -5
  49. package/dist/commands/stats/shared.js.map +1 -1
  50. package/dist/commands/status.d.ts.map +1 -1
  51. package/dist/commands/status.js +53 -92
  52. package/dist/commands/status.js.map +1 -1
  53. package/dist/commands/sync.d.ts +5 -5
  54. package/dist/commands/sync.d.ts.map +1 -1
  55. package/dist/commands/sync.js +31 -39
  56. package/dist/commands/sync.js.map +1 -1
  57. package/dist/commands/telemetry.d.ts.map +1 -1
  58. package/dist/commands/telemetry.js +0 -1
  59. package/dist/commands/telemetry.js.map +1 -1
  60. package/dist/constants/llm-providers.d.ts +5 -0
  61. package/dist/constants/llm-providers.d.ts.map +1 -0
  62. package/dist/constants/llm-providers.js +56 -0
  63. package/dist/constants/llm-providers.js.map +1 -0
  64. package/dist/db/client.d.ts +17 -0
  65. package/dist/db/client.d.ts.map +1 -0
  66. package/dist/db/client.js +53 -0
  67. package/dist/db/client.js.map +1 -0
  68. package/dist/db/migrate.d.ts +9 -0
  69. package/dist/db/migrate.d.ts.map +1 -0
  70. package/dist/db/migrate.js +31 -0
  71. package/dist/db/migrate.js.map +1 -0
  72. package/dist/db/read.d.ts +42 -0
  73. package/dist/db/read.d.ts.map +1 -0
  74. package/dist/db/read.js +194 -0
  75. package/dist/db/read.js.map +1 -0
  76. package/dist/db/schema.d.ts +3 -0
  77. package/dist/db/schema.d.ts.map +1 -0
  78. package/dist/db/schema.js +129 -0
  79. package/dist/db/schema.js.map +1 -0
  80. package/dist/db/write.d.ts +24 -0
  81. package/dist/db/write.d.ts.map +1 -0
  82. package/dist/db/write.js +287 -0
  83. package/dist/db/write.js.map +1 -0
  84. package/dist/firebase/client.d.ts +5 -0
  85. package/dist/firebase/client.d.ts.map +1 -1
  86. package/dist/firebase/client.js +23 -0
  87. package/dist/firebase/client.js.map +1 -1
  88. package/dist/index.js +12 -12
  89. package/dist/index.js.map +1 -1
  90. package/dist/providers/context.d.ts +3 -0
  91. package/dist/providers/context.d.ts.map +1 -0
  92. package/dist/providers/context.js +13 -0
  93. package/dist/providers/context.js.map +1 -0
  94. package/dist/providers/copilot.d.ts +18 -0
  95. package/dist/providers/copilot.d.ts.map +1 -0
  96. package/dist/providers/copilot.js +289 -0
  97. package/dist/providers/copilot.js.map +1 -0
  98. package/dist/providers/cursor.d.ts.map +1 -1
  99. package/dist/providers/cursor.js +8 -3
  100. package/dist/providers/cursor.js.map +1 -1
  101. package/dist/providers/registry.d.ts.map +1 -1
  102. package/dist/providers/registry.js +3 -0
  103. package/dist/providers/registry.js.map +1 -1
  104. package/dist/types.d.ts +38 -47
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/utils/browser.d.ts +6 -0
  107. package/dist/utils/browser.d.ts.map +1 -0
  108. package/dist/utils/browser.js +23 -0
  109. package/dist/utils/browser.js.map +1 -0
  110. package/dist/utils/config.d.ts +9 -21
  111. package/dist/utils/config.d.ts.map +1 -1
  112. package/dist/utils/config.js +23 -50
  113. package/dist/utils/config.js.map +1 -1
  114. package/dist/utils/telemetry.js +2 -7
  115. package/dist/utils/telemetry.js.map +1 -1
  116. package/dist/utils/tips.js +1 -1
  117. package/dist/utils/tips.js.map +1 -1
  118. package/package.json +19 -5
  119. package/server-dist/dist/index.d.ts +12 -0
  120. package/server-dist/dist/index.d.ts.map +1 -0
  121. package/server-dist/dist/index.js +92 -0
  122. package/server-dist/dist/index.js.map +1 -0
  123. package/server-dist/dist/llm/analysis.d.ts +80 -0
  124. package/server-dist/dist/llm/analysis.d.ts.map +1 -0
  125. package/server-dist/dist/llm/analysis.js +509 -0
  126. package/server-dist/dist/llm/analysis.js.map +1 -0
  127. package/server-dist/dist/llm/client.d.ts +27 -0
  128. package/server-dist/dist/llm/client.d.ts.map +1 -0
  129. package/server-dist/dist/llm/client.js +71 -0
  130. package/server-dist/dist/llm/client.js.map +1 -0
  131. package/server-dist/dist/llm/index.d.ts +7 -0
  132. package/server-dist/dist/llm/index.d.ts.map +1 -0
  133. package/server-dist/dist/llm/index.js +5 -0
  134. package/server-dist/dist/llm/index.js.map +1 -0
  135. package/server-dist/dist/llm/prompts.d.ts +73 -0
  136. package/server-dist/dist/llm/prompts.d.ts.map +1 -0
  137. package/server-dist/dist/llm/prompts.js +242 -0
  138. package/server-dist/dist/llm/prompts.js.map +1 -0
  139. package/server-dist/dist/llm/providers/anthropic.d.ts +3 -0
  140. package/server-dist/dist/llm/providers/anthropic.d.ts.map +1 -0
  141. package/server-dist/dist/llm/providers/anthropic.js +45 -0
  142. package/server-dist/dist/llm/providers/anthropic.js.map +1 -0
  143. package/server-dist/dist/llm/providers/gemini.d.ts +3 -0
  144. package/server-dist/dist/llm/providers/gemini.d.ts.map +1 -0
  145. package/server-dist/dist/llm/providers/gemini.js +51 -0
  146. package/server-dist/dist/llm/providers/gemini.js.map +1 -0
  147. package/server-dist/dist/llm/providers/ollama.d.ts +12 -0
  148. package/server-dist/dist/llm/providers/ollama.d.ts.map +1 -0
  149. package/server-dist/dist/llm/providers/ollama.js +61 -0
  150. package/server-dist/dist/llm/providers/ollama.js.map +1 -0
  151. package/server-dist/dist/llm/providers/openai.d.ts +3 -0
  152. package/server-dist/dist/llm/providers/openai.d.ts.map +1 -0
  153. package/server-dist/dist/llm/providers/openai.js +39 -0
  154. package/server-dist/dist/llm/providers/openai.js.map +1 -0
  155. package/server-dist/dist/llm/types.d.ts +22 -0
  156. package/server-dist/dist/llm/types.d.ts.map +1 -0
  157. package/server-dist/dist/llm/types.js +5 -0
  158. package/server-dist/dist/llm/types.js.map +1 -0
  159. package/server-dist/dist/routes/analysis.d.ts +4 -0
  160. package/server-dist/dist/routes/analysis.d.ts.map +1 -0
  161. package/server-dist/dist/routes/analysis.js +103 -0
  162. package/server-dist/dist/routes/analysis.js.map +1 -0
  163. package/server-dist/dist/routes/analytics.d.ts +4 -0
  164. package/server-dist/dist/routes/analytics.d.ts.map +1 -0
  165. package/server-dist/dist/routes/analytics.js +47 -0
  166. package/server-dist/dist/routes/analytics.js.map +1 -0
  167. package/server-dist/dist/routes/config.d.ts +4 -0
  168. package/server-dist/dist/routes/config.d.ts.map +1 -0
  169. package/server-dist/dist/routes/config.js +108 -0
  170. package/server-dist/dist/routes/config.js.map +1 -0
  171. package/server-dist/dist/routes/export.d.ts +4 -0
  172. package/server-dist/dist/routes/export.d.ts.map +1 -0
  173. package/server-dist/dist/routes/export.js +52 -0
  174. package/server-dist/dist/routes/export.js.map +1 -0
  175. package/server-dist/dist/routes/insights.d.ts +4 -0
  176. package/server-dist/dist/routes/insights.d.ts.map +1 -0
  177. package/server-dist/dist/routes/insights.js +80 -0
  178. package/server-dist/dist/routes/insights.js.map +1 -0
  179. package/server-dist/dist/routes/messages.d.ts +4 -0
  180. package/server-dist/dist/routes/messages.d.ts.map +1 -0
  181. package/server-dist/dist/routes/messages.js +19 -0
  182. package/server-dist/dist/routes/messages.js.map +1 -0
  183. package/server-dist/dist/routes/projects.d.ts +4 -0
  184. package/server-dist/dist/routes/projects.d.ts.map +1 -0
  185. package/server-dist/dist/routes/projects.js +32 -0
  186. package/server-dist/dist/routes/projects.js.map +1 -0
  187. package/server-dist/dist/routes/sessions.d.ts +4 -0
  188. package/server-dist/dist/routes/sessions.d.ts.map +1 -0
  189. package/server-dist/dist/routes/sessions.js +65 -0
  190. package/server-dist/dist/routes/sessions.js.map +1 -0
  191. package/server-dist/dist/utils.d.ts +6 -0
  192. package/server-dist/dist/utils.d.ts.map +1 -0
  193. package/server-dist/dist/utils.js +9 -0
  194. package/server-dist/dist/utils.js.map +1 -0
  195. package/server-dist/index.d.ts +12 -0
  196. package/server-dist/index.d.ts.map +1 -0
  197. package/server-dist/index.js +92 -0
  198. package/server-dist/index.js.map +1 -0
  199. package/server-dist/llm/analysis.d.ts +80 -0
  200. package/server-dist/llm/analysis.d.ts.map +1 -0
  201. package/server-dist/llm/analysis.js +509 -0
  202. package/server-dist/llm/analysis.js.map +1 -0
  203. package/server-dist/llm/client.d.ts +27 -0
  204. package/server-dist/llm/client.d.ts.map +1 -0
  205. package/server-dist/llm/client.js +71 -0
  206. package/server-dist/llm/client.js.map +1 -0
  207. package/server-dist/llm/index.d.ts +7 -0
  208. package/server-dist/llm/index.d.ts.map +1 -0
  209. package/server-dist/llm/index.js +5 -0
  210. package/server-dist/llm/index.js.map +1 -0
  211. package/server-dist/llm/prompts.d.ts +73 -0
  212. package/server-dist/llm/prompts.d.ts.map +1 -0
  213. package/server-dist/llm/prompts.js +242 -0
  214. package/server-dist/llm/prompts.js.map +1 -0
  215. package/server-dist/llm/providers/anthropic.d.ts +3 -0
  216. package/server-dist/llm/providers/anthropic.d.ts.map +1 -0
  217. package/server-dist/llm/providers/anthropic.js +45 -0
  218. package/server-dist/llm/providers/anthropic.js.map +1 -0
  219. package/server-dist/llm/providers/gemini.d.ts +3 -0
  220. package/server-dist/llm/providers/gemini.d.ts.map +1 -0
  221. package/server-dist/llm/providers/gemini.js +51 -0
  222. package/server-dist/llm/providers/gemini.js.map +1 -0
  223. package/server-dist/llm/providers/ollama.d.ts +12 -0
  224. package/server-dist/llm/providers/ollama.d.ts.map +1 -0
  225. package/server-dist/llm/providers/ollama.js +61 -0
  226. package/server-dist/llm/providers/ollama.js.map +1 -0
  227. package/server-dist/llm/providers/openai.d.ts +3 -0
  228. package/server-dist/llm/providers/openai.d.ts.map +1 -0
  229. package/server-dist/llm/providers/openai.js +39 -0
  230. package/server-dist/llm/providers/openai.js.map +1 -0
  231. package/server-dist/llm/types.d.ts +22 -0
  232. package/server-dist/llm/types.d.ts.map +1 -0
  233. package/server-dist/llm/types.js +5 -0
  234. package/server-dist/llm/types.js.map +1 -0
  235. package/server-dist/routes/analysis.d.ts +4 -0
  236. package/server-dist/routes/analysis.d.ts.map +1 -0
  237. package/server-dist/routes/analysis.js +103 -0
  238. package/server-dist/routes/analysis.js.map +1 -0
  239. package/server-dist/routes/analytics.d.ts +4 -0
  240. package/server-dist/routes/analytics.d.ts.map +1 -0
  241. package/server-dist/routes/analytics.js +47 -0
  242. package/server-dist/routes/analytics.js.map +1 -0
  243. package/server-dist/routes/config.d.ts +4 -0
  244. package/server-dist/routes/config.d.ts.map +1 -0
  245. package/server-dist/routes/config.js +108 -0
  246. package/server-dist/routes/config.js.map +1 -0
  247. package/server-dist/routes/export.d.ts +4 -0
  248. package/server-dist/routes/export.d.ts.map +1 -0
  249. package/server-dist/routes/export.js +52 -0
  250. package/server-dist/routes/export.js.map +1 -0
  251. package/server-dist/routes/insights.d.ts +4 -0
  252. package/server-dist/routes/insights.d.ts.map +1 -0
  253. package/server-dist/routes/insights.js +80 -0
  254. package/server-dist/routes/insights.js.map +1 -0
  255. package/server-dist/routes/messages.d.ts +4 -0
  256. package/server-dist/routes/messages.d.ts.map +1 -0
  257. package/server-dist/routes/messages.js +19 -0
  258. package/server-dist/routes/messages.js.map +1 -0
  259. package/server-dist/routes/projects.d.ts +4 -0
  260. package/server-dist/routes/projects.d.ts.map +1 -0
  261. package/server-dist/routes/projects.js +32 -0
  262. package/server-dist/routes/projects.js.map +1 -0
  263. package/server-dist/routes/sessions.d.ts +4 -0
  264. package/server-dist/routes/sessions.d.ts.map +1 -0
  265. package/server-dist/routes/sessions.js +65 -0
  266. package/server-dist/routes/sessions.js.map +1 -0
  267. package/server-dist/utils.d.ts +6 -0
  268. package/server-dist/utils.d.ts.map +1 -0
  269. package/server-dist/utils.js +9 -0
  270. package/server-dist/utils.js.map +1 -0
@@ -0,0 +1,65 @@
1
+ import { Hono } from 'hono';
2
+ import { getDb } from '@code-insights/cli/db/client';
3
+ import { parseIntParam } from '../utils.js';
4
+ const app = new Hono();
5
+ app.get('/', (c) => {
6
+ const db = getDb();
7
+ const { projectId, sourceTool, limit, offset } = c.req.query();
8
+ const conditions = [];
9
+ const params = [];
10
+ if (projectId) {
11
+ conditions.push('project_id = ?');
12
+ params.push(projectId);
13
+ }
14
+ if (sourceTool) {
15
+ conditions.push('source_tool = ?');
16
+ params.push(sourceTool);
17
+ }
18
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
19
+ const sessions = db.prepare(`
20
+ SELECT id, project_id, project_name, project_path, git_remote_url,
21
+ summary, custom_title, generated_title, title_source, session_character,
22
+ started_at, ended_at, message_count, user_message_count,
23
+ assistant_message_count, tool_call_count, git_branch,
24
+ claude_version, source_tool, device_id, device_hostname,
25
+ device_platform, synced_at, total_input_tokens, total_output_tokens,
26
+ cache_creation_tokens, cache_read_tokens, estimated_cost_usd,
27
+ models_used, primary_model, usage_source
28
+ FROM sessions
29
+ ${where}
30
+ ORDER BY started_at DESC
31
+ LIMIT ? OFFSET ?
32
+ `).all(...params, parseIntParam(limit, 50), parseIntParam(offset, 0));
33
+ return c.json({ sessions });
34
+ });
35
+ app.get('/:id', (c) => {
36
+ const db = getDb();
37
+ const session = db.prepare(`
38
+ SELECT id, project_id, project_name, project_path, git_remote_url,
39
+ summary, custom_title, generated_title, title_source, session_character,
40
+ started_at, ended_at, message_count, user_message_count,
41
+ assistant_message_count, tool_call_count, git_branch,
42
+ claude_version, source_tool, device_id, device_hostname,
43
+ device_platform, synced_at, total_input_tokens, total_output_tokens,
44
+ cache_creation_tokens, cache_read_tokens, estimated_cost_usd,
45
+ models_used, primary_model, usage_source
46
+ FROM sessions WHERE id = ?
47
+ `).get(c.req.param('id'));
48
+ if (!session)
49
+ return c.json({ error: 'Not found' }, 404);
50
+ return c.json({ session });
51
+ });
52
+ app.patch('/:id', async (c) => {
53
+ const db = getDb();
54
+ const body = await c.req.json();
55
+ const { customTitle } = body;
56
+ if (customTitle === undefined) {
57
+ return c.json({ error: 'customTitle is required' }, 400);
58
+ }
59
+ const result = db.prepare('UPDATE sessions SET custom_title = ? WHERE id = ?').run(customTitle || null, c.req.param('id'));
60
+ if (result.changes === 0)
61
+ return c.json({ error: 'Not found' }, 404);
62
+ return c.json({ ok: true });
63
+ });
64
+ export default app;
65
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parse an integer query parameter with a safe default.
3
+ * Returns the default if the value is missing, NaN, negative, or non-finite.
4
+ */
5
+ export declare function parseIntParam(value: string | undefined, defaultVal: number): number;
6
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGnF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Parse an integer query parameter with a safe default.
3
+ * Returns the default if the value is missing, NaN, negative, or non-finite.
4
+ */
5
+ export function parseIntParam(value, defaultVal) {
6
+ const n = value !== undefined ? parseInt(value, 10) : defaultVal;
7
+ return Number.isFinite(n) && n >= 0 ? n : defaultVal;
8
+ }
9
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB,EAAE,UAAkB;IACzE,MAAM,CAAC,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACvD,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ServerOptions {
2
+ port: number;
3
+ staticDir: string;
4
+ openBrowser: boolean;
5
+ }
6
+ /**
7
+ * Start the Code Insights local dashboard server.
8
+ * Serves the Hono API and the pre-built Vite SPA from staticDir.
9
+ * Called by the CLI `dashboard` command.
10
+ */
11
+ export declare function startServer(options: ServerOptions): Promise<void>;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IAEb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFvE"}
@@ -0,0 +1,92 @@
1
+ import { serve } from '@hono/node-server';
2
+ import { serveStatic } from '@hono/node-server/serve-static';
3
+ import { Hono } from 'hono';
4
+ import { existsSync, readFileSync } from 'fs';
5
+ import { relative, join } from 'path';
6
+ import { openUrl } from '@code-insights/cli/utils/browser';
7
+ import projectsRouter from './routes/projects.js';
8
+ import sessionsRouter from './routes/sessions.js';
9
+ import messagesRouter from './routes/messages.js';
10
+ import insightsRouter from './routes/insights.js';
11
+ import analysisRouter from './routes/analysis.js';
12
+ import analyticsRouter from './routes/analytics.js';
13
+ import configRouter from './routes/config.js';
14
+ import exportRouter from './routes/export.js';
15
+ /**
16
+ * Start the Code Insights local dashboard server.
17
+ * Serves the Hono API and the pre-built Vite SPA from staticDir.
18
+ * Called by the CLI `dashboard` command.
19
+ */
20
+ export async function startServer(options) {
21
+ const { port, staticDir, openBrowser } = options;
22
+ const app = new Hono();
23
+ // Global error handler — prevents stack trace leakage to clients.
24
+ // Detects malformed JSON bodies (SyntaxError) and returns 400 instead of 500.
25
+ app.onError((err, c) => {
26
+ if (err instanceof SyntaxError && err.message.includes('JSON')) {
27
+ return c.json({ error: 'Invalid JSON in request body' }, 400);
28
+ }
29
+ console.error(err);
30
+ return c.json({ error: 'Internal server error' }, 500);
31
+ });
32
+ // API routes — all under /api
33
+ app.route('/api/projects', projectsRouter);
34
+ app.route('/api/sessions', sessionsRouter);
35
+ app.route('/api/messages', messagesRouter);
36
+ app.route('/api/insights', insightsRouter);
37
+ app.route('/api/analysis', analysisRouter);
38
+ app.route('/api/analytics', analyticsRouter);
39
+ app.route('/api/config', configRouter);
40
+ app.route('/api/export', exportRouter);
41
+ // Health check
42
+ app.get('/api/health', (c) => c.json({ ok: true, version: '0.1.0' }));
43
+ // API 404 catch-all — must come AFTER all /api sub-routers and BEFORE static serving.
44
+ // Without this, unmatched /api/* routes fall through to the SPA fallback and return
45
+ // index.html as 200, which breaks API clients expecting JSON errors.
46
+ app.all('/api/*', (c) => c.json({ error: 'Not found' }, 404));
47
+ // Static file serving — only if the dashboard has been built.
48
+ // serveStatic requires a path relative to process.cwd(), not an absolute path.
49
+ if (existsSync(staticDir)) {
50
+ const relativeStaticDir = relative(process.cwd(), staticDir);
51
+ app.use('/*', serveStatic({ root: relativeStaticDir }));
52
+ // Cache index.html at startup — avoids a readFileSync on every SPA navigation
53
+ // request, which would be a pointless disk read for a file that never changes
54
+ // while the server is running.
55
+ const indexPath = join(staticDir, 'index.html');
56
+ const indexHtml = existsSync(indexPath) ? readFileSync(indexPath, 'utf-8') : null;
57
+ // SPA fallback: any non-API route not matched by serveStatic serves index.html
58
+ // so react-router can handle client-side routing.
59
+ app.get('*', (c) => {
60
+ if (indexHtml)
61
+ return c.html(indexHtml);
62
+ return c.text('Dashboard not found. Run pnpm build first.', 404);
63
+ });
64
+ }
65
+ else {
66
+ // Dashboard not built — serve a helpful message
67
+ app.get('*', (c) => c.html(`
68
+ <html><body style="font-family:monospace;padding:2rem">
69
+ <h2>Code Insights Dashboard</h2>
70
+ <p>The dashboard has not been built yet.</p>
71
+ <pre>pnpm install &amp;&amp; pnpm build</pre>
72
+ <p>Then restart the server.</p>
73
+ </body></html>
74
+ `));
75
+ }
76
+ // Graceful shutdown: just call process.exit(0).
77
+ // The process 'exit' handler in cli/src/db/client.ts already calls closeDb()
78
+ // which runs WAL checkpoint. Calling closeDb() here would double-close.
79
+ const shutdown = () => {
80
+ process.exit(0);
81
+ };
82
+ process.on('SIGINT', shutdown);
83
+ process.on('SIGTERM', shutdown);
84
+ serve({ fetch: app.fetch, port }, (info) => {
85
+ const url = `http://localhost:${info.port}`;
86
+ console.log(` Code Insights dashboard running at ${url}`);
87
+ if (openBrowser) {
88
+ openUrl(url);
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { type SQLiteMessageRow } from './prompts.js';
2
+ export type { SQLiteMessageRow };
3
+ export interface AnalysisProgress {
4
+ phase: 'loading_messages' | 'analyzing' | 'saving';
5
+ currentChunk?: number;
6
+ totalChunks?: number;
7
+ }
8
+ export interface AnalysisOptions {
9
+ onProgress?: (progress: AnalysisProgress) => void;
10
+ signal?: AbortSignal;
11
+ }
12
+ export interface AnalysisResult {
13
+ success: boolean;
14
+ insights: InsightRow[];
15
+ error?: string;
16
+ usage?: {
17
+ inputTokens: number;
18
+ outputTokens: number;
19
+ };
20
+ }
21
+ export interface InsightRow {
22
+ id: string;
23
+ session_id: string;
24
+ project_id: string;
25
+ project_name: string;
26
+ type: string;
27
+ title: string;
28
+ content: string;
29
+ summary: string;
30
+ bullets: string;
31
+ confidence: number;
32
+ source: 'llm';
33
+ metadata: string | null;
34
+ timestamp: string;
35
+ created_at: string;
36
+ scope: string;
37
+ analysis_version: string;
38
+ }
39
+ export interface SessionData {
40
+ id: string;
41
+ project_id: string;
42
+ project_name: string;
43
+ project_path: string;
44
+ summary: string | null;
45
+ ended_at: string;
46
+ }
47
+ /**
48
+ * Analyze a session and generate insights, saving them to SQLite.
49
+ */
50
+ export declare function analyzeSession(session: SessionData, messages: SQLiteMessageRow[], options?: AnalysisOptions): Promise<AnalysisResult>;
51
+ /**
52
+ * Analyze prompt quality for a session.
53
+ */
54
+ export declare function analyzePromptQuality(session: SessionData, messages: SQLiteMessageRow[], options?: AnalysisOptions): Promise<AnalysisResult>;
55
+ export interface RecurringInsightGroup {
56
+ insightIds: string[];
57
+ theme: string;
58
+ }
59
+ export interface RecurringInsightResult {
60
+ success: boolean;
61
+ groups: RecurringInsightGroup[];
62
+ updatedCount: number;
63
+ error?: string;
64
+ usage?: {
65
+ inputTokens: number;
66
+ outputTokens: number;
67
+ };
68
+ }
69
+ /**
70
+ * Find recurring patterns across multiple insights and write bidirectional links to SQLite.
71
+ */
72
+ export declare function findRecurringInsights(insights: Array<{
73
+ id: string;
74
+ type: string;
75
+ title: string;
76
+ summary: string;
77
+ project_name: string;
78
+ session_id: string;
79
+ }>): Promise<RecurringInsightResult>;
80
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/llm/analysis.ts"],"names":[],"mappings":"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"}