glancey 2.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 (336) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +435 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  4. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  5. package/dist/__tests__/ast-chunker.test.js +307 -0
  6. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  7. package/dist/__tests__/config.test.d.ts +2 -0
  8. package/dist/__tests__/config.test.d.ts.map +1 -0
  9. package/dist/__tests__/config.test.js +242 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  12. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  13. package/dist/__tests__/dashboard/beads.test.js +151 -0
  14. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  16. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  17. package/dist/__tests__/dashboard/index.test.js +116 -0
  18. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  20. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  21. package/dist/__tests__/dashboard/routes.test.js +125 -0
  22. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  24. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  25. package/dist/__tests__/dashboard/server.test.js +75 -0
  26. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  28. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  29. package/dist/__tests__/dashboard/state.test.js +124 -0
  30. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  31. package/dist/__tests__/dashboard/token-tracking.test.d.ts +2 -0
  32. package/dist/__tests__/dashboard/token-tracking.test.d.ts.map +1 -0
  33. package/dist/__tests__/dashboard/token-tracking.test.js +315 -0
  34. package/dist/__tests__/dashboard/token-tracking.test.js.map +1 -0
  35. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  36. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  37. package/dist/__tests__/embeddings/factory.test.js +157 -0
  38. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  39. package/dist/__tests__/embeddings/gemini.test.d.ts +2 -0
  40. package/dist/__tests__/embeddings/gemini.test.d.ts.map +1 -0
  41. package/dist/__tests__/embeddings/gemini.test.js +178 -0
  42. package/dist/__tests__/embeddings/gemini.test.js.map +1 -0
  43. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  44. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  45. package/dist/__tests__/embeddings/ollama.test.js +273 -0
  46. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  47. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  48. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  49. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  50. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  51. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  52. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  53. package/dist/__tests__/embeddings/retry.test.js +334 -0
  54. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  55. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  56. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  57. package/dist/__tests__/embeddings/types.test.js +31 -0
  58. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  59. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  60. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  61. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  62. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  63. package/dist/__tests__/mocks/fetch.mock.d.ts +49 -0
  64. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  65. package/dist/__tests__/mocks/fetch.mock.js +102 -0
  66. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  67. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  68. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  69. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  70. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  71. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  72. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  73. package/dist/__tests__/search/clustering.test.js +230 -0
  74. package/dist/__tests__/search/clustering.test.js.map +1 -0
  75. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  76. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  77. package/dist/__tests__/search/hybrid-search.test.js +279 -0
  78. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  79. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  80. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  81. package/dist/__tests__/search/indexer.test.js +1305 -0
  82. package/dist/__tests__/search/indexer.test.js.map +1 -0
  83. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  84. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  85. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  86. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  87. package/dist/__tests__/setup.d.ts +2 -0
  88. package/dist/__tests__/setup.d.ts.map +1 -0
  89. package/dist/__tests__/setup.js +11 -0
  90. package/dist/__tests__/setup.js.map +1 -0
  91. package/dist/__tests__/tools/clustering-handlers.test.d.ts +2 -0
  92. package/dist/__tests__/tools/clustering-handlers.test.d.ts.map +1 -0
  93. package/dist/__tests__/tools/clustering-handlers.test.js +286 -0
  94. package/dist/__tests__/tools/clustering-handlers.test.js.map +1 -0
  95. package/dist/__tests__/tools/commit-handlers.test.d.ts +2 -0
  96. package/dist/__tests__/tools/commit-handlers.test.d.ts.map +1 -0
  97. package/dist/__tests__/tools/commit-handlers.test.js +153 -0
  98. package/dist/__tests__/tools/commit-handlers.test.js.map +1 -0
  99. package/dist/__tests__/tools/index-handlers.test.d.ts +2 -0
  100. package/dist/__tests__/tools/index-handlers.test.d.ts.map +1 -0
  101. package/dist/__tests__/tools/index-handlers.test.js +184 -0
  102. package/dist/__tests__/tools/index-handlers.test.js.map +1 -0
  103. package/dist/__tests__/tools/instructions-handlers.test.d.ts +2 -0
  104. package/dist/__tests__/tools/instructions-handlers.test.d.ts.map +1 -0
  105. package/dist/__tests__/tools/instructions-handlers.test.js +53 -0
  106. package/dist/__tests__/tools/instructions-handlers.test.js.map +1 -0
  107. package/dist/__tests__/tools/memory-handlers.test.d.ts +2 -0
  108. package/dist/__tests__/tools/memory-handlers.test.d.ts.map +1 -0
  109. package/dist/__tests__/tools/memory-handlers.test.js +175 -0
  110. package/dist/__tests__/tools/memory-handlers.test.js.map +1 -0
  111. package/dist/__tests__/tools/search-handlers.test.d.ts +2 -0
  112. package/dist/__tests__/tools/search-handlers.test.d.ts.map +1 -0
  113. package/dist/__tests__/tools/search-handlers.test.js +229 -0
  114. package/dist/__tests__/tools/search-handlers.test.js.map +1 -0
  115. package/dist/__tests__/tools/symbol-handlers.test.d.ts +2 -0
  116. package/dist/__tests__/tools/symbol-handlers.test.d.ts.map +1 -0
  117. package/dist/__tests__/tools/symbol-handlers.test.js +348 -0
  118. package/dist/__tests__/tools/symbol-handlers.test.js.map +1 -0
  119. package/dist/__tests__/tools/worktree-handlers.test.d.ts +2 -0
  120. package/dist/__tests__/tools/worktree-handlers.test.d.ts.map +1 -0
  121. package/dist/__tests__/tools/worktree-handlers.test.js +297 -0
  122. package/dist/__tests__/tools/worktree-handlers.test.js.map +1 -0
  123. package/dist/__tests__/utils/cache.test.d.ts +2 -0
  124. package/dist/__tests__/utils/cache.test.d.ts.map +1 -0
  125. package/dist/__tests__/utils/cache.test.js +147 -0
  126. package/dist/__tests__/utils/cache.test.js.map +1 -0
  127. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  128. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  129. package/dist/__tests__/utils/concurrency.test.js +83 -0
  130. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  131. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  132. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  133. package/dist/__tests__/utils/errors.test.js +136 -0
  134. package/dist/__tests__/utils/errors.test.js.map +1 -0
  135. package/dist/__tests__/utils/logger.test.d.ts +2 -0
  136. package/dist/__tests__/utils/logger.test.d.ts.map +1 -0
  137. package/dist/__tests__/utils/logger.test.js +131 -0
  138. package/dist/__tests__/utils/logger.test.js.map +1 -0
  139. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  140. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  141. package/dist/__tests__/utils/type-guards.test.js +80 -0
  142. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  143. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  144. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  145. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  146. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  147. package/dist/config.d.ts +191 -0
  148. package/dist/config.d.ts.map +1 -0
  149. package/dist/config.js +788 -0
  150. package/dist/config.js.map +1 -0
  151. package/dist/dashboard/beads.d.ts +35 -0
  152. package/dist/dashboard/beads.d.ts.map +1 -0
  153. package/dist/dashboard/beads.js +102 -0
  154. package/dist/dashboard/beads.js.map +1 -0
  155. package/dist/dashboard/events.d.ts +64 -0
  156. package/dist/dashboard/events.d.ts.map +1 -0
  157. package/dist/dashboard/events.js +211 -0
  158. package/dist/dashboard/events.js.map +1 -0
  159. package/dist/dashboard/index.d.ts +69 -0
  160. package/dist/dashboard/index.d.ts.map +1 -0
  161. package/dist/dashboard/index.js +93 -0
  162. package/dist/dashboard/index.js.map +1 -0
  163. package/dist/dashboard/routes.d.ts +6 -0
  164. package/dist/dashboard/routes.d.ts.map +1 -0
  165. package/dist/dashboard/routes.js +505 -0
  166. package/dist/dashboard/routes.js.map +1 -0
  167. package/dist/dashboard/server.d.ts +27 -0
  168. package/dist/dashboard/server.d.ts.map +1 -0
  169. package/dist/dashboard/server.js +72 -0
  170. package/dist/dashboard/server.js.map +1 -0
  171. package/dist/dashboard/state.d.ts +172 -0
  172. package/dist/dashboard/state.d.ts.map +1 -0
  173. package/dist/dashboard/state.js +362 -0
  174. package/dist/dashboard/state.js.map +1 -0
  175. package/dist/dashboard/token-tracking.d.ts +143 -0
  176. package/dist/dashboard/token-tracking.d.ts.map +1 -0
  177. package/dist/dashboard/token-tracking.js +363 -0
  178. package/dist/dashboard/token-tracking.js.map +1 -0
  179. package/dist/dashboard/ui.d.ts +6 -0
  180. package/dist/dashboard/ui.d.ts.map +1 -0
  181. package/dist/dashboard/ui.js +2710 -0
  182. package/dist/dashboard/ui.js.map +1 -0
  183. package/dist/embeddings/gemini.d.ts +28 -0
  184. package/dist/embeddings/gemini.d.ts.map +1 -0
  185. package/dist/embeddings/gemini.js +165 -0
  186. package/dist/embeddings/gemini.js.map +1 -0
  187. package/dist/embeddings/index.d.ts +34 -0
  188. package/dist/embeddings/index.d.ts.map +1 -0
  189. package/dist/embeddings/index.js +120 -0
  190. package/dist/embeddings/index.js.map +1 -0
  191. package/dist/embeddings/ollama.d.ts +22 -0
  192. package/dist/embeddings/ollama.d.ts.map +1 -0
  193. package/dist/embeddings/ollama.js +179 -0
  194. package/dist/embeddings/ollama.js.map +1 -0
  195. package/dist/embeddings/rate-limiter.d.ts +75 -0
  196. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  197. package/dist/embeddings/rate-limiter.js +145 -0
  198. package/dist/embeddings/rate-limiter.js.map +1 -0
  199. package/dist/embeddings/retry.d.ts +20 -0
  200. package/dist/embeddings/retry.d.ts.map +1 -0
  201. package/dist/embeddings/retry.js +227 -0
  202. package/dist/embeddings/retry.js.map +1 -0
  203. package/dist/embeddings/types.d.ts +103 -0
  204. package/dist/embeddings/types.d.ts.map +1 -0
  205. package/dist/embeddings/types.js +23 -0
  206. package/dist/embeddings/types.js.map +1 -0
  207. package/dist/index.d.ts +12 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +2028 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/memory/index.d.ts +63 -0
  212. package/dist/memory/index.d.ts.map +1 -0
  213. package/dist/memory/index.js +168 -0
  214. package/dist/memory/index.js.map +1 -0
  215. package/dist/search/ast-chunker.d.ts +29 -0
  216. package/dist/search/ast-chunker.d.ts.map +1 -0
  217. package/dist/search/ast-chunker.js +236 -0
  218. package/dist/search/ast-chunker.js.map +1 -0
  219. package/dist/search/chunk-utils.d.ts +24 -0
  220. package/dist/search/chunk-utils.d.ts.map +1 -0
  221. package/dist/search/chunk-utils.js +41 -0
  222. package/dist/search/chunk-utils.js.map +1 -0
  223. package/dist/search/clustering.d.ts +77 -0
  224. package/dist/search/clustering.d.ts.map +1 -0
  225. package/dist/search/clustering.js +455 -0
  226. package/dist/search/clustering.js.map +1 -0
  227. package/dist/search/indexer.d.ts +377 -0
  228. package/dist/search/indexer.d.ts.map +1 -0
  229. package/dist/search/indexer.js +1557 -0
  230. package/dist/search/indexer.js.map +1 -0
  231. package/dist/search/tree-sitter-chunker.d.ts +64 -0
  232. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  233. package/dist/search/tree-sitter-chunker.js +412 -0
  234. package/dist/search/tree-sitter-chunker.js.map +1 -0
  235. package/dist/symbols/index.d.ts +14 -0
  236. package/dist/symbols/index.d.ts.map +1 -0
  237. package/dist/symbols/index.js +19 -0
  238. package/dist/symbols/index.js.map +1 -0
  239. package/dist/symbols/name-path.d.ts +113 -0
  240. package/dist/symbols/name-path.d.ts.map +1 -0
  241. package/dist/symbols/name-path.js +194 -0
  242. package/dist/symbols/name-path.js.map +1 -0
  243. package/dist/symbols/pattern-search.d.ts +14 -0
  244. package/dist/symbols/pattern-search.d.ts.map +1 -0
  245. package/dist/symbols/pattern-search.js +224 -0
  246. package/dist/symbols/pattern-search.js.map +1 -0
  247. package/dist/symbols/reference-finder.d.ts +38 -0
  248. package/dist/symbols/reference-finder.d.ts.map +1 -0
  249. package/dist/symbols/reference-finder.js +376 -0
  250. package/dist/symbols/reference-finder.js.map +1 -0
  251. package/dist/symbols/symbol-editor.d.ts +81 -0
  252. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  253. package/dist/symbols/symbol-editor.js +257 -0
  254. package/dist/symbols/symbol-editor.js.map +1 -0
  255. package/dist/symbols/symbol-extractor.d.ts +49 -0
  256. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  257. package/dist/symbols/symbol-extractor.js +593 -0
  258. package/dist/symbols/symbol-extractor.js.map +1 -0
  259. package/dist/symbols/symbol-renamer.d.ts +81 -0
  260. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  261. package/dist/symbols/symbol-renamer.js +204 -0
  262. package/dist/symbols/symbol-renamer.js.map +1 -0
  263. package/dist/symbols/types.d.ts +234 -0
  264. package/dist/symbols/types.d.ts.map +1 -0
  265. package/dist/symbols/types.js +106 -0
  266. package/dist/symbols/types.js.map +1 -0
  267. package/dist/tools/clustering-handlers.d.ts +70 -0
  268. package/dist/tools/clustering-handlers.d.ts.map +1 -0
  269. package/dist/tools/clustering-handlers.js +150 -0
  270. package/dist/tools/clustering-handlers.js.map +1 -0
  271. package/dist/tools/commit-handlers.d.ts +77 -0
  272. package/dist/tools/commit-handlers.d.ts.map +1 -0
  273. package/dist/tools/commit-handlers.js +251 -0
  274. package/dist/tools/commit-handlers.js.map +1 -0
  275. package/dist/tools/index-handlers.d.ts +31 -0
  276. package/dist/tools/index-handlers.d.ts.map +1 -0
  277. package/dist/tools/index-handlers.js +53 -0
  278. package/dist/tools/index-handlers.js.map +1 -0
  279. package/dist/tools/instructions-handlers.d.ts +25 -0
  280. package/dist/tools/instructions-handlers.d.ts.map +1 -0
  281. package/dist/tools/instructions-handlers.js +36 -0
  282. package/dist/tools/instructions-handlers.js.map +1 -0
  283. package/dist/tools/memory-handlers.d.ts +95 -0
  284. package/dist/tools/memory-handlers.d.ts.map +1 -0
  285. package/dist/tools/memory-handlers.js +126 -0
  286. package/dist/tools/memory-handlers.js.map +1 -0
  287. package/dist/tools/search-handlers.d.ts +51 -0
  288. package/dist/tools/search-handlers.d.ts.map +1 -0
  289. package/dist/tools/search-handlers.js +128 -0
  290. package/dist/tools/search-handlers.js.map +1 -0
  291. package/dist/tools/symbol-handlers.d.ts +171 -0
  292. package/dist/tools/symbol-handlers.d.ts.map +1 -0
  293. package/dist/tools/symbol-handlers.js +456 -0
  294. package/dist/tools/symbol-handlers.js.map +1 -0
  295. package/dist/tools/types.d.ts +32 -0
  296. package/dist/tools/types.d.ts.map +1 -0
  297. package/dist/tools/types.js +17 -0
  298. package/dist/tools/types.js.map +1 -0
  299. package/dist/tools/worktree-handlers.d.ts +96 -0
  300. package/dist/tools/worktree-handlers.d.ts.map +1 -0
  301. package/dist/tools/worktree-handlers.js +186 -0
  302. package/dist/tools/worktree-handlers.js.map +1 -0
  303. package/dist/utils/cache.d.ts +77 -0
  304. package/dist/utils/cache.d.ts.map +1 -0
  305. package/dist/utils/cache.js +134 -0
  306. package/dist/utils/cache.js.map +1 -0
  307. package/dist/utils/concurrency.d.ts +32 -0
  308. package/dist/utils/concurrency.d.ts.map +1 -0
  309. package/dist/utils/concurrency.js +57 -0
  310. package/dist/utils/concurrency.js.map +1 -0
  311. package/dist/utils/errors.d.ts +36 -0
  312. package/dist/utils/errors.d.ts.map +1 -0
  313. package/dist/utils/errors.js +91 -0
  314. package/dist/utils/errors.js.map +1 -0
  315. package/dist/utils/logger.d.ts +37 -0
  316. package/dist/utils/logger.d.ts.map +1 -0
  317. package/dist/utils/logger.js +114 -0
  318. package/dist/utils/logger.js.map +1 -0
  319. package/dist/utils/type-guards.d.ts +17 -0
  320. package/dist/utils/type-guards.d.ts.map +1 -0
  321. package/dist/utils/type-guards.js +25 -0
  322. package/dist/utils/type-guards.js.map +1 -0
  323. package/dist/worktree/index.d.ts +6 -0
  324. package/dist/worktree/index.d.ts.map +1 -0
  325. package/dist/worktree/index.js +6 -0
  326. package/dist/worktree/index.js.map +1 -0
  327. package/dist/worktree/types.d.ts +101 -0
  328. package/dist/worktree/types.d.ts.map +1 -0
  329. package/dist/worktree/types.js +6 -0
  330. package/dist/worktree/types.js.map +1 -0
  331. package/dist/worktree/worktree-manager.d.ts +80 -0
  332. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  333. package/dist/worktree/worktree-manager.js +407 -0
  334. package/dist/worktree/worktree-manager.js.map +1 -0
  335. package/package.json +87 -0
  336. package/scripts/postinstall.js +48 -0
@@ -0,0 +1,6 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ /**
3
+ * Route dispatcher
4
+ */
5
+ export declare function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void>;
6
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/dashboard/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AA+c5D;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G5F"}
@@ -0,0 +1,505 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join, basename } from 'path';
3
+ import { dashboardState } from './state.js';
4
+ import { sseManager } from './events.js';
5
+ import { getDashboardHTML } from './ui.js';
6
+ import { getBeadsStatus } from './beads.js';
7
+ import { saveEmbeddingSettings, getEmbeddingSettings, saveDashboardSettings, getDashboardSettings, saveSearchWeights, getSearchWeights, addPattern, removePattern, } from '../config.js';
8
+ /**
9
+ * Get the project name from package.json or directory name
10
+ */
11
+ function getProjectName(projectPath) {
12
+ try {
13
+ const packageJsonPath = join(projectPath, 'package.json');
14
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
15
+ if (packageJson.name && typeof packageJson.name === 'string') {
16
+ return packageJson.name;
17
+ }
18
+ }
19
+ catch {
20
+ // package.json doesn't exist or is invalid, fall back to directory name
21
+ }
22
+ return basename(projectPath) || projectPath;
23
+ }
24
+ /**
25
+ * Send a JSON response
26
+ */
27
+ function sendJSON(res, data, status = 200) {
28
+ res.writeHead(status, {
29
+ 'Content-Type': 'application/json',
30
+ 'Access-Control-Allow-Origin': '*',
31
+ });
32
+ res.end(JSON.stringify(data));
33
+ }
34
+ /**
35
+ * Send an HTML response
36
+ */
37
+ function sendHTML(res, html, status = 200) {
38
+ res.writeHead(status, {
39
+ 'Content-Type': 'text/html',
40
+ 'Access-Control-Allow-Origin': '*',
41
+ });
42
+ res.end(html);
43
+ }
44
+ /**
45
+ * Send a 404 Not Found response
46
+ */
47
+ function send404(res) {
48
+ sendJSON(res, { error: 'Not found' }, 404);
49
+ }
50
+ /**
51
+ * Handle GET / - Dashboard HTML page
52
+ */
53
+ async function handleDashboard(_req, res) {
54
+ const html = getDashboardHTML();
55
+ sendHTML(res, html);
56
+ }
57
+ /**
58
+ * Handle GET /api/status - Index status
59
+ */
60
+ async function handleStatus(_req, res) {
61
+ try {
62
+ const status = await dashboardState.getStatus();
63
+ if (!status) {
64
+ sendJSON(res, { error: 'Indexer not initialized' }, 503);
65
+ return;
66
+ }
67
+ sendJSON(res, {
68
+ ...status,
69
+ isIndexing: dashboardState.isIndexingInProgress(),
70
+ version: dashboardState.getVersion(),
71
+ backendFallback: dashboardState.getBackendFallback(),
72
+ });
73
+ }
74
+ catch (error) {
75
+ sendJSON(res, { error: String(error) }, 500);
76
+ }
77
+ }
78
+ /**
79
+ * Handle GET /api/config - Effective configuration
80
+ */
81
+ async function handleConfig(_req, res) {
82
+ const config = dashboardState.getConfig();
83
+ const projectPath = dashboardState.getProjectPath();
84
+ if (!config) {
85
+ sendJSON(res, { error: 'Configuration not loaded' }, 503);
86
+ return;
87
+ }
88
+ const projectName = projectPath ? getProjectName(projectPath) : null;
89
+ sendJSON(res, {
90
+ projectPath,
91
+ projectName,
92
+ ...config,
93
+ });
94
+ }
95
+ /**
96
+ * Handle GET /api/events - SSE stream
97
+ */
98
+ function handleEvents(_req, res) {
99
+ sseManager.addClient(res);
100
+ }
101
+ /**
102
+ * Handle GET /api/heartbeat - Health check
103
+ */
104
+ function handleHeartbeat(_req, res) {
105
+ sendJSON(res, {
106
+ ok: true,
107
+ timestamp: new Date().toISOString(),
108
+ clients: sseManager.getClientCount(),
109
+ });
110
+ }
111
+ /**
112
+ * Handle GET /api/usage - Command usage statistics
113
+ */
114
+ function handleUsage(_req, res) {
115
+ const usage = dashboardState.getCommandUsage();
116
+ const total = dashboardState.getTotalCommandCount();
117
+ sendJSON(res, { usage, total });
118
+ }
119
+ /**
120
+ * Handle GET /api/beads - Beads issue tracker status
121
+ */
122
+ async function handleBeads(_req, res) {
123
+ const projectPath = dashboardState.getProjectPath();
124
+ if (!projectPath) {
125
+ sendJSON(res, { available: false, issueCount: 0, openCount: 0, readyCount: 0, issues: [] });
126
+ return;
127
+ }
128
+ try {
129
+ const status = await getBeadsStatus(projectPath);
130
+ sendJSON(res, status);
131
+ }
132
+ catch (error) {
133
+ sendJSON(res, { available: false, error: String(error) }, 500);
134
+ }
135
+ }
136
+ /**
137
+ * Handle GET /api/settings/embedding - Get current embedding settings
138
+ */
139
+ async function handleGetEmbeddingSettings(_req, res) {
140
+ const projectPath = dashboardState.getProjectPath();
141
+ if (!projectPath) {
142
+ sendJSON(res, { error: 'Project path not set' }, 503);
143
+ return;
144
+ }
145
+ try {
146
+ const settings = await getEmbeddingSettings(projectPath);
147
+ // Include running backend and fallback info so UI can show actual state
148
+ const status = await dashboardState.getStatus();
149
+ const fallback = dashboardState.getBackendFallback();
150
+ sendJSON(res, {
151
+ ...settings,
152
+ runningBackend: status?.embeddingBackend ?? null,
153
+ fallback,
154
+ });
155
+ }
156
+ catch (error) {
157
+ sendJSON(res, { error: String(error) }, 500);
158
+ }
159
+ }
160
+ /**
161
+ * Parse JSON body from request
162
+ */
163
+ async function parseJsonBody(req) {
164
+ return new Promise((resolve, reject) => {
165
+ let body = '';
166
+ req.on('data', (chunk) => {
167
+ body += chunk.toString();
168
+ });
169
+ req.on('end', () => {
170
+ try {
171
+ resolve(JSON.parse(body));
172
+ }
173
+ catch {
174
+ reject(new Error('Invalid JSON'));
175
+ }
176
+ });
177
+ req.on('error', reject);
178
+ });
179
+ }
180
+ /**
181
+ * Handle POST /api/settings/embedding - Save embedding settings
182
+ */
183
+ async function handleSaveEmbeddingSettings(req, res) {
184
+ const projectPath = dashboardState.getProjectPath();
185
+ if (!projectPath) {
186
+ sendJSON(res, { error: 'Project path not set' }, 503);
187
+ return;
188
+ }
189
+ try {
190
+ const body = (await parseJsonBody(req));
191
+ if (!body.backend || !['ollama', 'gemini'].includes(body.backend)) {
192
+ sendJSON(res, { error: 'Invalid backend. Must be "ollama" or "gemini".' }, 400);
193
+ return;
194
+ }
195
+ await saveEmbeddingSettings(projectPath, body);
196
+ sendJSON(res, {
197
+ success: true,
198
+ message: `Embedding backend set to ${body.backend}. Config will auto-reload.`,
199
+ });
200
+ }
201
+ catch (error) {
202
+ sendJSON(res, { error: String(error) }, 500);
203
+ }
204
+ }
205
+ /**
206
+ * Handle GET /api/settings/dashboard - Get current dashboard settings
207
+ */
208
+ async function handleGetDashboardSettings(_req, res) {
209
+ const projectPath = dashboardState.getProjectPath();
210
+ if (!projectPath) {
211
+ sendJSON(res, { error: 'Project path not set' }, 503);
212
+ return;
213
+ }
214
+ try {
215
+ const settings = await getDashboardSettings(projectPath);
216
+ sendJSON(res, settings);
217
+ }
218
+ catch (error) {
219
+ sendJSON(res, { error: String(error) }, 500);
220
+ }
221
+ }
222
+ /**
223
+ * Handle POST /api/reindex - Trigger a reindex of the codebase
224
+ */
225
+ async function handleReindex(req, res) {
226
+ try {
227
+ // Check if already indexing
228
+ if (dashboardState.isIndexingInProgress()) {
229
+ sendJSON(res, { error: 'Indexing is already in progress' }, 409);
230
+ return;
231
+ }
232
+ // Parse optional forceReindex flag from body
233
+ let forceReindex = false;
234
+ try {
235
+ const body = (await parseJsonBody(req));
236
+ forceReindex = body.force === true;
237
+ }
238
+ catch {
239
+ // If no body or invalid JSON, use defaults
240
+ }
241
+ // Trigger reindex asynchronously - don't wait for completion
242
+ // The dashboard will receive progress updates via SSE
243
+ dashboardState.triggerReindex(forceReindex).catch((error) => {
244
+ console.error('[glancey] Reindex failed:', error);
245
+ });
246
+ sendJSON(res, {
247
+ success: true,
248
+ message: forceReindex
249
+ ? 'Force reindex started. Progress will be shown in the dashboard.'
250
+ : 'Reindex started. Progress will be shown in the dashboard.',
251
+ });
252
+ }
253
+ catch (error) {
254
+ sendJSON(res, { error: String(error) }, 500);
255
+ }
256
+ }
257
+ /**
258
+ * Handle POST /api/settings/dashboard - Save dashboard settings
259
+ */
260
+ async function handleSaveDashboardSettings(req, res) {
261
+ const projectPath = dashboardState.getProjectPath();
262
+ if (!projectPath) {
263
+ sendJSON(res, { error: 'Project path not set' }, 503);
264
+ return;
265
+ }
266
+ try {
267
+ const body = (await parseJsonBody(req));
268
+ if (typeof body.enabled !== 'boolean') {
269
+ sendJSON(res, { error: 'enabled must be a boolean' }, 400);
270
+ return;
271
+ }
272
+ await saveDashboardSettings(projectPath, body);
273
+ const message = body.enabled
274
+ ? 'Dashboard enabled. Config will auto-reload.'
275
+ : 'Dashboard disabled. Config will auto-reload. Use the open_dashboard MCP tool to start manually.';
276
+ sendJSON(res, {
277
+ success: true,
278
+ message,
279
+ });
280
+ }
281
+ catch (error) {
282
+ sendJSON(res, { error: String(error) }, 500);
283
+ }
284
+ }
285
+ /**
286
+ * Handle GET /api/token-savings - Get token savings statistics
287
+ */
288
+ function handleTokenSavings(_req, res) {
289
+ const stats = dashboardState.getTokenSavings();
290
+ sendJSON(res, stats);
291
+ }
292
+ /**
293
+ * Handle GET /api/settings/search-weights - Get current search weights
294
+ */
295
+ async function handleGetSearchWeights(_req, res) {
296
+ const projectPath = dashboardState.getProjectPath();
297
+ if (!projectPath) {
298
+ sendJSON(res, { error: 'Project path not set' }, 503);
299
+ return;
300
+ }
301
+ try {
302
+ const weights = await getSearchWeights(projectPath);
303
+ sendJSON(res, weights);
304
+ }
305
+ catch (error) {
306
+ sendJSON(res, { error: String(error) }, 500);
307
+ }
308
+ }
309
+ /**
310
+ * Handle PUT /api/search-weights - Update search weights
311
+ */
312
+ async function handleUpdateSearchWeights(req, res) {
313
+ const projectPath = dashboardState.getProjectPath();
314
+ if (!projectPath) {
315
+ sendJSON(res, { error: 'Project path not set' }, 503);
316
+ return;
317
+ }
318
+ try {
319
+ const body = (await parseJsonBody(req));
320
+ if (typeof body.semanticWeight !== 'number' ||
321
+ typeof body.keywordWeight !== 'number' ||
322
+ body.semanticWeight < 0 ||
323
+ body.semanticWeight > 1 ||
324
+ body.keywordWeight < 0 ||
325
+ body.keywordWeight > 1) {
326
+ sendJSON(res, { error: 'Invalid weights. Both must be numbers between 0 and 1.' }, 400);
327
+ return;
328
+ }
329
+ await saveSearchWeights(projectPath, body);
330
+ sendJSON(res, {
331
+ success: true,
332
+ message: 'Search weights updated. Config will auto-reload.',
333
+ });
334
+ }
335
+ catch (error) {
336
+ sendJSON(res, { error: String(error) }, 500);
337
+ }
338
+ }
339
+ /**
340
+ * Handle POST /api/patterns - Add a pattern
341
+ */
342
+ async function handleAddPattern(req, res) {
343
+ const projectPath = dashboardState.getProjectPath();
344
+ if (!projectPath) {
345
+ sendJSON(res, { error: 'Project path not set' }, 503);
346
+ return;
347
+ }
348
+ try {
349
+ const body = (await parseJsonBody(req));
350
+ if (!body.pattern || typeof body.pattern !== 'string') {
351
+ sendJSON(res, { error: 'Pattern is required' }, 400);
352
+ return;
353
+ }
354
+ if (body.type !== 'include' && body.type !== 'exclude') {
355
+ sendJSON(res, { error: 'Type must be "include" or "exclude"' }, 400);
356
+ return;
357
+ }
358
+ await addPattern(projectPath, body.pattern, body.type);
359
+ sendJSON(res, {
360
+ success: true,
361
+ message: `Pattern added to ${body.type} patterns. Config will auto-reload.`,
362
+ });
363
+ }
364
+ catch (error) {
365
+ sendJSON(res, { error: String(error) }, 500);
366
+ }
367
+ }
368
+ /**
369
+ * Handle DELETE /api/patterns - Remove a pattern
370
+ */
371
+ async function handleRemovePattern(req, res) {
372
+ const projectPath = dashboardState.getProjectPath();
373
+ if (!projectPath) {
374
+ sendJSON(res, { error: 'Project path not set' }, 503);
375
+ return;
376
+ }
377
+ try {
378
+ const body = (await parseJsonBody(req));
379
+ if (!body.pattern || typeof body.pattern !== 'string') {
380
+ sendJSON(res, { error: 'Pattern is required' }, 400);
381
+ return;
382
+ }
383
+ if (body.type !== 'include' && body.type !== 'exclude') {
384
+ sendJSON(res, { error: 'Type must be "include" or "exclude"' }, 400);
385
+ return;
386
+ }
387
+ await removePattern(projectPath, body.pattern, body.type);
388
+ sendJSON(res, {
389
+ success: true,
390
+ message: `Pattern removed from ${body.type} patterns. Config will auto-reload.`,
391
+ });
392
+ }
393
+ catch (error) {
394
+ sendJSON(res, { error: String(error) }, 500);
395
+ }
396
+ }
397
+ /**
398
+ * Route dispatcher
399
+ */
400
+ export async function handleRequest(req, res) {
401
+ const url = new URL(req.url ?? '/', `http://${req.headers.host}`);
402
+ const routePath = url.pathname;
403
+ const method = req.method ?? 'GET';
404
+ // Handle CORS preflight
405
+ if (method === 'OPTIONS') {
406
+ res.writeHead(204, {
407
+ 'Access-Control-Allow-Origin': '*',
408
+ 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
409
+ 'Access-Control-Allow-Headers': 'Content-Type',
410
+ });
411
+ res.end();
412
+ return;
413
+ }
414
+ try {
415
+ // POST routes
416
+ if (method === 'POST') {
417
+ switch (routePath) {
418
+ case '/api/settings/embedding':
419
+ await handleSaveEmbeddingSettings(req, res);
420
+ return;
421
+ case '/api/settings/dashboard':
422
+ await handleSaveDashboardSettings(req, res);
423
+ return;
424
+ case '/api/reindex':
425
+ await handleReindex(req, res);
426
+ return;
427
+ case '/api/patterns':
428
+ await handleAddPattern(req, res);
429
+ return;
430
+ default:
431
+ sendJSON(res, { error: 'Method not allowed' }, 405);
432
+ return;
433
+ }
434
+ }
435
+ // PUT routes
436
+ if (method === 'PUT') {
437
+ switch (routePath) {
438
+ case '/api/search-weights':
439
+ await handleUpdateSearchWeights(req, res);
440
+ return;
441
+ default:
442
+ sendJSON(res, { error: 'Method not allowed' }, 405);
443
+ return;
444
+ }
445
+ }
446
+ // DELETE routes
447
+ if (method === 'DELETE') {
448
+ switch (routePath) {
449
+ case '/api/patterns':
450
+ await handleRemovePattern(req, res);
451
+ return;
452
+ default:
453
+ sendJSON(res, { error: 'Method not allowed' }, 405);
454
+ return;
455
+ }
456
+ }
457
+ // GET routes
458
+ if (method !== 'GET') {
459
+ sendJSON(res, { error: 'Method not allowed' }, 405);
460
+ return;
461
+ }
462
+ switch (routePath) {
463
+ case '/':
464
+ await handleDashboard(req, res);
465
+ break;
466
+ case '/api/status':
467
+ await handleStatus(req, res);
468
+ break;
469
+ case '/api/config':
470
+ await handleConfig(req, res);
471
+ break;
472
+ case '/api/events':
473
+ handleEvents(req, res);
474
+ break;
475
+ case '/api/heartbeat':
476
+ handleHeartbeat(req, res);
477
+ break;
478
+ case '/api/usage':
479
+ handleUsage(req, res);
480
+ break;
481
+ case '/api/beads':
482
+ await handleBeads(req, res);
483
+ break;
484
+ case '/api/settings/embedding':
485
+ await handleGetEmbeddingSettings(req, res);
486
+ break;
487
+ case '/api/settings/dashboard':
488
+ await handleGetDashboardSettings(req, res);
489
+ break;
490
+ case '/api/token-savings':
491
+ handleTokenSavings(req, res);
492
+ break;
493
+ case '/api/search-weights':
494
+ await handleGetSearchWeights(req, res);
495
+ break;
496
+ default:
497
+ send404(res);
498
+ }
499
+ }
500
+ catch (error) {
501
+ console.error('[glancey] Dashboard error:', error);
502
+ sendJSON(res, { error: 'Internal server error' }, 500);
503
+ }
504
+ }
505
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/dashboard/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import * as http from 'http';
2
+ /**
3
+ * Check if a port is available
4
+ */
5
+ export declare function isPortAvailable(port: number): Promise<boolean>;
6
+ /**
7
+ * Find an available port starting from the given port
8
+ */
9
+ export declare function findAvailablePort(startPort?: number): Promise<number>;
10
+ /**
11
+ * Dashboard server instance
12
+ */
13
+ export interface DashboardServer {
14
+ /** The HTTP server instance */
15
+ server: http.Server;
16
+ /** The port the server is listening on */
17
+ port: number;
18
+ /** The URL to access the dashboard */
19
+ url: string;
20
+ /** Stop the server */
21
+ stop: () => Promise<void>;
22
+ }
23
+ /**
24
+ * Start the dashboard HTTP server
25
+ */
26
+ export declare function startServer(port?: number): Promise<DashboardServer>;
27
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAQ7B;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAepE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,GAAE,MAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOzF;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,sBAAsB;IACtB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAoCzE"}
@@ -0,0 +1,72 @@
1
+ import * as http from 'http';
2
+ import * as net from 'net';
3
+ import { handleRequest } from './routes.js';
4
+ import { sseManager } from './events.js';
5
+ const DEFAULT_PORT = 24300;
6
+ const PORT_RANGE = 100;
7
+ /**
8
+ * Check if a port is available
9
+ */
10
+ export async function isPortAvailable(port) {
11
+ return new Promise((resolve) => {
12
+ const server = net.createServer();
13
+ server.once('error', () => {
14
+ resolve(false);
15
+ });
16
+ server.once('listening', () => {
17
+ server.close();
18
+ resolve(true);
19
+ });
20
+ server.listen(port, '127.0.0.1');
21
+ });
22
+ }
23
+ /**
24
+ * Find an available port starting from the given port
25
+ */
26
+ export async function findAvailablePort(startPort = DEFAULT_PORT) {
27
+ for (let port = startPort; port < startPort + PORT_RANGE; port++) {
28
+ if (await isPortAvailable(port)) {
29
+ return port;
30
+ }
31
+ }
32
+ throw new Error(`No available port found in range ${startPort}-${startPort + PORT_RANGE - 1}`);
33
+ }
34
+ /**
35
+ * Start the dashboard HTTP server
36
+ */
37
+ export async function startServer(port) {
38
+ const actualPort = port ?? (await findAvailablePort());
39
+ const server = http.createServer((req, res) => {
40
+ handleRequest(req, res);
41
+ });
42
+ // Start the SSE heartbeat
43
+ sseManager.startHeartbeat();
44
+ return new Promise((resolve, reject) => {
45
+ server.once('error', (err) => {
46
+ reject(err);
47
+ });
48
+ server.listen(actualPort, '127.0.0.1', () => {
49
+ // Get the actual port from the server (important when port 0 is used)
50
+ const address = server.address();
51
+ const boundPort = typeof address === 'object' && address ? address.port : actualPort;
52
+ const url = `http://127.0.0.1:${boundPort}`;
53
+ resolve({
54
+ server,
55
+ port: boundPort,
56
+ url,
57
+ stop: async () => {
58
+ sseManager.closeAll();
59
+ return new Promise((resolveClose, rejectClose) => {
60
+ server.close((err) => {
61
+ if (err)
62
+ rejectClose(err);
63
+ else
64
+ resolveClose();
65
+ });
66
+ });
67
+ },
68
+ });
69
+ });
70
+ });
71
+ }
72
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}