lance-context 0.1.0 → 1.1.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 (237) hide show
  1. package/README.md +232 -23
  2. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  4. package/dist/__tests__/ast-chunker.test.js +307 -0
  5. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  6. package/dist/__tests__/config.test.d.ts +2 -0
  7. package/dist/__tests__/config.test.d.ts.map +1 -0
  8. package/dist/__tests__/config.test.js +242 -0
  9. package/dist/__tests__/config.test.js.map +1 -0
  10. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  12. package/dist/__tests__/dashboard/beads.test.js +151 -0
  13. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  14. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  16. package/dist/__tests__/dashboard/index.test.js +116 -0
  17. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  18. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  20. package/dist/__tests__/dashboard/routes.test.js +125 -0
  21. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  22. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  24. package/dist/__tests__/dashboard/server.test.js +75 -0
  25. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  26. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  28. package/dist/__tests__/dashboard/state.test.js +124 -0
  29. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  30. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  31. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  32. package/dist/__tests__/embeddings/factory.test.js +100 -0
  33. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  34. package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
  35. package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
  36. package/dist/__tests__/embeddings/jina.test.js +156 -0
  37. package/dist/__tests__/embeddings/jina.test.js.map +1 -0
  38. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  39. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  40. package/dist/__tests__/embeddings/ollama.test.js +172 -0
  41. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  42. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  43. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  44. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  45. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  46. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  47. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  48. package/dist/__tests__/embeddings/retry.test.js +260 -0
  49. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  50. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  51. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  52. package/dist/__tests__/embeddings/types.test.js +31 -0
  53. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  54. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  55. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  56. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  57. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  58. package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
  59. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  60. package/dist/__tests__/mocks/fetch.mock.js +74 -0
  61. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  62. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  63. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  64. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  65. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  66. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  67. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  68. package/dist/__tests__/search/clustering.test.js +230 -0
  69. package/dist/__tests__/search/clustering.test.js.map +1 -0
  70. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  71. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  72. package/dist/__tests__/search/hybrid-search.test.js +186 -0
  73. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  74. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  75. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  76. package/dist/__tests__/search/indexer.test.js +878 -0
  77. package/dist/__tests__/search/indexer.test.js.map +1 -0
  78. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  79. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  80. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  81. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  82. package/dist/__tests__/setup.d.ts +2 -0
  83. package/dist/__tests__/setup.d.ts.map +1 -0
  84. package/dist/__tests__/setup.js +11 -0
  85. package/dist/__tests__/setup.js.map +1 -0
  86. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  87. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  88. package/dist/__tests__/utils/concurrency.test.js +83 -0
  89. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  90. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  91. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  92. package/dist/__tests__/utils/errors.test.js +136 -0
  93. package/dist/__tests__/utils/errors.test.js.map +1 -0
  94. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  95. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  96. package/dist/__tests__/utils/type-guards.test.js +80 -0
  97. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  98. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  99. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  100. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  101. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  102. package/dist/config.d.ts +122 -0
  103. package/dist/config.d.ts.map +1 -0
  104. package/dist/config.js +508 -0
  105. package/dist/config.js.map +1 -0
  106. package/dist/dashboard/beads.d.ts +35 -0
  107. package/dist/dashboard/beads.d.ts.map +1 -0
  108. package/dist/dashboard/beads.js +102 -0
  109. package/dist/dashboard/beads.js.map +1 -0
  110. package/dist/dashboard/events.d.ts +46 -0
  111. package/dist/dashboard/events.d.ts.map +1 -0
  112. package/dist/dashboard/events.js +141 -0
  113. package/dist/dashboard/events.js.map +1 -0
  114. package/dist/dashboard/index.d.ts +69 -0
  115. package/dist/dashboard/index.d.ts.map +1 -0
  116. package/dist/dashboard/index.js +93 -0
  117. package/dist/dashboard/index.js.map +1 -0
  118. package/dist/dashboard/routes.d.ts +6 -0
  119. package/dist/dashboard/routes.d.ts.map +1 -0
  120. package/dist/dashboard/routes.js +245 -0
  121. package/dist/dashboard/routes.js.map +1 -0
  122. package/dist/dashboard/server.d.ts +27 -0
  123. package/dist/dashboard/server.d.ts.map +1 -0
  124. package/dist/dashboard/server.js +72 -0
  125. package/dist/dashboard/server.js.map +1 -0
  126. package/dist/dashboard/state.d.ts +125 -0
  127. package/dist/dashboard/state.d.ts.map +1 -0
  128. package/dist/dashboard/state.js +264 -0
  129. package/dist/dashboard/state.js.map +1 -0
  130. package/dist/dashboard/ui.d.ts +6 -0
  131. package/dist/dashboard/ui.d.ts.map +1 -0
  132. package/dist/dashboard/ui.js +1421 -0
  133. package/dist/dashboard/ui.js.map +1 -0
  134. package/dist/embeddings/index.d.ts +20 -2
  135. package/dist/embeddings/index.d.ts.map +1 -1
  136. package/dist/embeddings/index.js +49 -6
  137. package/dist/embeddings/index.js.map +1 -1
  138. package/dist/embeddings/jina.d.ts +9 -0
  139. package/dist/embeddings/jina.d.ts.map +1 -1
  140. package/dist/embeddings/jina.js +42 -2
  141. package/dist/embeddings/jina.js.map +1 -1
  142. package/dist/embeddings/ollama.d.ts +2 -0
  143. package/dist/embeddings/ollama.d.ts.map +1 -1
  144. package/dist/embeddings/ollama.js +21 -5
  145. package/dist/embeddings/ollama.js.map +1 -1
  146. package/dist/embeddings/rate-limiter.d.ts +75 -0
  147. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  148. package/dist/embeddings/rate-limiter.js +145 -0
  149. package/dist/embeddings/rate-limiter.js.map +1 -0
  150. package/dist/embeddings/retry.d.ts +14 -0
  151. package/dist/embeddings/retry.d.ts.map +1 -0
  152. package/dist/embeddings/retry.js +89 -0
  153. package/dist/embeddings/retry.js.map +1 -0
  154. package/dist/embeddings/types.d.ts +56 -2
  155. package/dist/embeddings/types.d.ts.map +1 -1
  156. package/dist/embeddings/types.js +16 -0
  157. package/dist/embeddings/types.js.map +1 -1
  158. package/dist/index.js +1871 -44
  159. package/dist/index.js.map +1 -1
  160. package/dist/memory/index.d.ts +63 -0
  161. package/dist/memory/index.d.ts.map +1 -0
  162. package/dist/memory/index.js +168 -0
  163. package/dist/memory/index.js.map +1 -0
  164. package/dist/search/ast-chunker.d.ts +34 -0
  165. package/dist/search/ast-chunker.d.ts.map +1 -0
  166. package/dist/search/ast-chunker.js +261 -0
  167. package/dist/search/ast-chunker.js.map +1 -0
  168. package/dist/search/clustering.d.ts +77 -0
  169. package/dist/search/clustering.d.ts.map +1 -0
  170. package/dist/search/clustering.js +455 -0
  171. package/dist/search/clustering.js.map +1 -0
  172. package/dist/search/indexer.d.ts +239 -3
  173. package/dist/search/indexer.d.ts.map +1 -1
  174. package/dist/search/indexer.js +941 -45
  175. package/dist/search/indexer.js.map +1 -1
  176. package/dist/search/tree-sitter-chunker.d.ts +69 -0
  177. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  178. package/dist/search/tree-sitter-chunker.js +436 -0
  179. package/dist/search/tree-sitter-chunker.js.map +1 -0
  180. package/dist/symbols/index.d.ts +14 -0
  181. package/dist/symbols/index.d.ts.map +1 -0
  182. package/dist/symbols/index.js +19 -0
  183. package/dist/symbols/index.js.map +1 -0
  184. package/dist/symbols/name-path.d.ts +113 -0
  185. package/dist/symbols/name-path.d.ts.map +1 -0
  186. package/dist/symbols/name-path.js +194 -0
  187. package/dist/symbols/name-path.js.map +1 -0
  188. package/dist/symbols/pattern-search.d.ts +14 -0
  189. package/dist/symbols/pattern-search.d.ts.map +1 -0
  190. package/dist/symbols/pattern-search.js +224 -0
  191. package/dist/symbols/pattern-search.js.map +1 -0
  192. package/dist/symbols/reference-finder.d.ts +38 -0
  193. package/dist/symbols/reference-finder.d.ts.map +1 -0
  194. package/dist/symbols/reference-finder.js +376 -0
  195. package/dist/symbols/reference-finder.js.map +1 -0
  196. package/dist/symbols/symbol-editor.d.ts +81 -0
  197. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  198. package/dist/symbols/symbol-editor.js +257 -0
  199. package/dist/symbols/symbol-editor.js.map +1 -0
  200. package/dist/symbols/symbol-extractor.d.ts +49 -0
  201. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  202. package/dist/symbols/symbol-extractor.js +593 -0
  203. package/dist/symbols/symbol-extractor.js.map +1 -0
  204. package/dist/symbols/symbol-renamer.d.ts +81 -0
  205. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  206. package/dist/symbols/symbol-renamer.js +204 -0
  207. package/dist/symbols/symbol-renamer.js.map +1 -0
  208. package/dist/symbols/types.d.ts +234 -0
  209. package/dist/symbols/types.d.ts.map +1 -0
  210. package/dist/symbols/types.js +106 -0
  211. package/dist/symbols/types.js.map +1 -0
  212. package/dist/utils/concurrency.d.ts +32 -0
  213. package/dist/utils/concurrency.d.ts.map +1 -0
  214. package/dist/utils/concurrency.js +57 -0
  215. package/dist/utils/concurrency.js.map +1 -0
  216. package/dist/utils/errors.d.ts +36 -0
  217. package/dist/utils/errors.d.ts.map +1 -0
  218. package/dist/utils/errors.js +91 -0
  219. package/dist/utils/errors.js.map +1 -0
  220. package/dist/utils/type-guards.d.ts +17 -0
  221. package/dist/utils/type-guards.d.ts.map +1 -0
  222. package/dist/utils/type-guards.js +25 -0
  223. package/dist/utils/type-guards.js.map +1 -0
  224. package/dist/worktree/index.d.ts +6 -0
  225. package/dist/worktree/index.d.ts.map +1 -0
  226. package/dist/worktree/index.js +6 -0
  227. package/dist/worktree/index.js.map +1 -0
  228. package/dist/worktree/types.d.ts +101 -0
  229. package/dist/worktree/types.d.ts.map +1 -0
  230. package/dist/worktree/types.js +6 -0
  231. package/dist/worktree/types.js.map +1 -0
  232. package/dist/worktree/worktree-manager.d.ts +80 -0
  233. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  234. package/dist/worktree/worktree-manager.js +407 -0
  235. package/dist/worktree/worktree-manager.js.map +1 -0
  236. package/package.json +39 -5
  237. package/scripts/postinstall.js +48 -0
@@ -0,0 +1,46 @@
1
+ import type { ServerResponse } from 'http';
2
+ /**
3
+ * Manages Server-Sent Events (SSE) connections for real-time updates.
4
+ */
5
+ export declare class SSEManager {
6
+ private clients;
7
+ private heartbeatInterval;
8
+ constructor();
9
+ /**
10
+ * Set up listeners for dashboard state events
11
+ */
12
+ private setupEventListeners;
13
+ /**
14
+ * Start sending heartbeat messages to keep connections alive
15
+ */
16
+ startHeartbeat(): void;
17
+ /**
18
+ * Stop the heartbeat interval
19
+ */
20
+ stopHeartbeat(): void;
21
+ /**
22
+ * Add a new SSE client connection
23
+ */
24
+ addClient(res: ServerResponse): void;
25
+ /**
26
+ * Send a message to a specific client
27
+ */
28
+ private sendToClient;
29
+ /**
30
+ * Broadcast an event to all connected clients
31
+ */
32
+ broadcast(event: string, data: unknown): void;
33
+ /**
34
+ * Get the number of connected clients
35
+ */
36
+ getClientCount(): number;
37
+ /**
38
+ * Close all client connections
39
+ */
40
+ closeAll(): void;
41
+ }
42
+ /**
43
+ * Singleton instance of the SSE manager
44
+ */
45
+ export declare const sseManager: SSEManager;
46
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/dashboard/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAG3C;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,iBAAiB,CAA+C;;IAOxE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,cAAc,IAAI,IAAI;IAQtB;;OAEG;IACH,aAAa,IAAI,IAAI;IAOrB;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAgCpC;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAkB7C;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,QAAQ,IAAI,IAAI;CAWjB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,YAAmB,CAAC"}
@@ -0,0 +1,141 @@
1
+ import { dashboardState } from './state.js';
2
+ /**
3
+ * Manages Server-Sent Events (SSE) connections for real-time updates.
4
+ */
5
+ export class SSEManager {
6
+ clients = new Set();
7
+ heartbeatInterval = null;
8
+ constructor() {
9
+ // Set up event listeners on dashboard state
10
+ this.setupEventListeners();
11
+ }
12
+ /**
13
+ * Set up listeners for dashboard state events
14
+ */
15
+ setupEventListeners() {
16
+ dashboardState.on('progress', (progress) => {
17
+ this.broadcast('indexing:progress', progress);
18
+ });
19
+ dashboardState.on('indexing:start', () => {
20
+ this.broadcast('indexing:start', { timestamp: new Date().toISOString() });
21
+ });
22
+ dashboardState.on('indexing:complete', (result) => {
23
+ this.broadcast('indexing:complete', result);
24
+ });
25
+ dashboardState.on('status:change', (status) => {
26
+ this.broadcast('status:change', status);
27
+ });
28
+ dashboardState.on('usage:update', (usage) => {
29
+ this.broadcast('usage:update', usage);
30
+ });
31
+ }
32
+ /**
33
+ * Start sending heartbeat messages to keep connections alive
34
+ */
35
+ startHeartbeat() {
36
+ if (this.heartbeatInterval)
37
+ return;
38
+ this.heartbeatInterval = setInterval(() => {
39
+ this.broadcast('heartbeat', { timestamp: new Date().toISOString() });
40
+ }, 30000); // Every 30 seconds
41
+ }
42
+ /**
43
+ * Stop the heartbeat interval
44
+ */
45
+ stopHeartbeat() {
46
+ if (this.heartbeatInterval) {
47
+ clearInterval(this.heartbeatInterval);
48
+ this.heartbeatInterval = null;
49
+ }
50
+ }
51
+ /**
52
+ * Add a new SSE client connection
53
+ */
54
+ addClient(res) {
55
+ // Set SSE headers
56
+ res.writeHead(200, {
57
+ 'Content-Type': 'text/event-stream',
58
+ 'Cache-Control': 'no-cache',
59
+ Connection: 'keep-alive',
60
+ 'Access-Control-Allow-Origin': '*',
61
+ });
62
+ // Add to clients set
63
+ this.clients.add(res);
64
+ // Send initial connected event
65
+ this.sendToClient(res, 'connected', {
66
+ timestamp: new Date().toISOString(),
67
+ clientCount: this.clients.size,
68
+ });
69
+ // Send current indexing progress if in progress
70
+ if (dashboardState.isIndexingInProgress()) {
71
+ const lastProgress = dashboardState.getLastProgress();
72
+ if (lastProgress) {
73
+ this.sendToClient(res, 'indexing:progress', lastProgress);
74
+ }
75
+ }
76
+ // Handle client disconnect
77
+ res.on('close', () => {
78
+ this.clients.delete(res);
79
+ });
80
+ }
81
+ /**
82
+ * Send a message to a specific client
83
+ */
84
+ sendToClient(res, event, data) {
85
+ if (res.writableEnded)
86
+ return;
87
+ try {
88
+ res.write(`event: ${event}\n`);
89
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
90
+ }
91
+ catch {
92
+ // Client likely disconnected
93
+ this.clients.delete(res);
94
+ }
95
+ }
96
+ /**
97
+ * Broadcast an event to all connected clients
98
+ */
99
+ broadcast(event, data) {
100
+ const message = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
101
+ for (const client of this.clients) {
102
+ if (client.writableEnded) {
103
+ this.clients.delete(client);
104
+ continue;
105
+ }
106
+ try {
107
+ client.write(message);
108
+ }
109
+ catch {
110
+ // Client likely disconnected
111
+ this.clients.delete(client);
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Get the number of connected clients
117
+ */
118
+ getClientCount() {
119
+ return this.clients.size;
120
+ }
121
+ /**
122
+ * Close all client connections
123
+ */
124
+ closeAll() {
125
+ this.stopHeartbeat();
126
+ for (const client of this.clients) {
127
+ try {
128
+ client.end();
129
+ }
130
+ catch {
131
+ // Ignore errors during cleanup
132
+ }
133
+ }
134
+ this.clients.clear();
135
+ }
136
+ }
137
+ /**
138
+ * Singleton instance of the SSE manager
139
+ */
140
+ export const sseManager = new SSEManager();
141
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/dashboard/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ export { dashboardState, DashboardStateManager } from './state.js';
2
+ export type { CommandName, CommandUsage } from './state.js';
3
+ export { sseManager, SSEManager } from './events.js';
4
+ export { startServer, findAvailablePort, isPortAvailable, type DashboardServer } from './server.js';
5
+ export type { IndexProgress } from '../search/indexer.js';
6
+ import { type DashboardServer } from './server.js';
7
+ import type { CodeIndexer } from '../search/indexer.js';
8
+ import type { LanceContextConfig } from '../config.js';
9
+ export interface DashboardOptions {
10
+ /** Port to use (default: auto-discover from 24300) */
11
+ port?: number;
12
+ /** The indexer instance to share with the dashboard */
13
+ indexer?: CodeIndexer;
14
+ /** The configuration to display */
15
+ config?: LanceContextConfig;
16
+ /** The project path */
17
+ projectPath?: string;
18
+ /** Package version to display */
19
+ version?: string;
20
+ }
21
+ /**
22
+ * DashboardManager - Encapsulates dashboard server state for testability.
23
+ *
24
+ * This class allows creating isolated instances for testing while maintaining
25
+ * backward compatibility through the default instance and module-level functions.
26
+ */
27
+ export declare class DashboardManager {
28
+ private serverInstance;
29
+ /**
30
+ * Start the dashboard server.
31
+ * Returns the server instance with URL and stop function.
32
+ */
33
+ start(options?: DashboardOptions): Promise<DashboardServer>;
34
+ /**
35
+ * Stop the dashboard server.
36
+ */
37
+ stop(): Promise<void>;
38
+ /**
39
+ * Check if the dashboard is running.
40
+ */
41
+ isRunning(): boolean;
42
+ /**
43
+ * Get the dashboard URL if running.
44
+ */
45
+ getUrl(): string | null;
46
+ /**
47
+ * Get the current server instance (for testing).
48
+ */
49
+ getServerInstance(): DashboardServer | null;
50
+ }
51
+ export declare const defaultDashboardManager: DashboardManager;
52
+ /**
53
+ * Start the dashboard server.
54
+ * Returns the server instance with URL and stop function.
55
+ */
56
+ export declare function startDashboard(options?: DashboardOptions): Promise<DashboardServer>;
57
+ /**
58
+ * Stop the dashboard server.
59
+ */
60
+ export declare function stopDashboard(): Promise<void>;
61
+ /**
62
+ * Check if the dashboard is running.
63
+ */
64
+ export declare function isDashboardRunning(): boolean;
65
+ /**
66
+ * Get the dashboard URL if running.
67
+ */
68
+ export declare function getDashboardUrl(): string | null;
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACpG,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,mCAAmC;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,cAAc,CAAgC;IAEtD;;;OAGG;IACG,KAAK,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAuBrE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,MAAM,IAAI,MAAM,GAAG,IAAI;IAIvB;;OAEG;IACH,iBAAiB,IAAI,eAAe,GAAG,IAAI;CAG5C;AAGD,eAAO,MAAM,uBAAuB,kBAAyB,CAAC;AAE9D;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAE7F;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C"}
@@ -0,0 +1,93 @@
1
+ export { dashboardState, DashboardStateManager } from './state.js';
2
+ export { sseManager, SSEManager } from './events.js';
3
+ export { startServer, findAvailablePort, isPortAvailable } from './server.js';
4
+ import { startServer } from './server.js';
5
+ import { dashboardState } from './state.js';
6
+ /**
7
+ * DashboardManager - Encapsulates dashboard server state for testability.
8
+ *
9
+ * This class allows creating isolated instances for testing while maintaining
10
+ * backward compatibility through the default instance and module-level functions.
11
+ */
12
+ export class DashboardManager {
13
+ serverInstance = null;
14
+ /**
15
+ * Start the dashboard server.
16
+ * Returns the server instance with URL and stop function.
17
+ */
18
+ async start(options = {}) {
19
+ if (this.serverInstance) {
20
+ return this.serverInstance;
21
+ }
22
+ // Set up dashboard state if provided
23
+ if (options.indexer) {
24
+ dashboardState.setIndexer(options.indexer);
25
+ }
26
+ if (options.config) {
27
+ dashboardState.setConfig(options.config);
28
+ }
29
+ if (options.projectPath) {
30
+ dashboardState.setProjectPath(options.projectPath);
31
+ }
32
+ if (options.version) {
33
+ dashboardState.setVersion(options.version);
34
+ }
35
+ this.serverInstance = await startServer(options.port);
36
+ return this.serverInstance;
37
+ }
38
+ /**
39
+ * Stop the dashboard server.
40
+ */
41
+ async stop() {
42
+ if (this.serverInstance) {
43
+ await this.serverInstance.stop();
44
+ this.serverInstance = null;
45
+ }
46
+ }
47
+ /**
48
+ * Check if the dashboard is running.
49
+ */
50
+ isRunning() {
51
+ return this.serverInstance !== null;
52
+ }
53
+ /**
54
+ * Get the dashboard URL if running.
55
+ */
56
+ getUrl() {
57
+ return this.serverInstance?.url ?? null;
58
+ }
59
+ /**
60
+ * Get the current server instance (for testing).
61
+ */
62
+ getServerInstance() {
63
+ return this.serverInstance;
64
+ }
65
+ }
66
+ // Default instance for backward compatibility
67
+ export const defaultDashboardManager = new DashboardManager();
68
+ /**
69
+ * Start the dashboard server.
70
+ * Returns the server instance with URL and stop function.
71
+ */
72
+ export async function startDashboard(options = {}) {
73
+ return defaultDashboardManager.start(options);
74
+ }
75
+ /**
76
+ * Stop the dashboard server.
77
+ */
78
+ export async function stopDashboard() {
79
+ return defaultDashboardManager.stop();
80
+ }
81
+ /**
82
+ * Check if the dashboard is running.
83
+ */
84
+ export function isDashboardRunning() {
85
+ return defaultDashboardManager.isRunning();
86
+ }
87
+ /**
88
+ * Get the dashboard URL if running.
89
+ */
90
+ export function getDashboardUrl() {
91
+ return defaultDashboardManager.getUrl();
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAwB,MAAM,aAAa,CAAC;AAGpG,OAAO,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAiB5C;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IACnB,cAAc,GAA2B,IAAI,CAAC;IAEtD;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,UAA4B,EAAE;QACxC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,8CAA8C;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAE9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAA4B,EAAE;IACjE,OAAO,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,uBAAuB,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,uBAAuB,CAAC,SAAS,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,uBAAuB,CAAC,MAAM,EAAE,CAAC;AAC1C,CAAC"}
@@ -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;AAuM5D;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE5F"}
@@ -0,0 +1,245 @@
1
+ import { dashboardState } from './state.js';
2
+ import { sseManager } from './events.js';
3
+ import { getDashboardHTML } from './ui.js';
4
+ import { getBeadsStatus } from './beads.js';
5
+ import { saveEmbeddingSettings, getEmbeddingSettings } from '../config.js';
6
+ /**
7
+ * Send a JSON response
8
+ */
9
+ function sendJSON(res, data, status = 200) {
10
+ res.writeHead(status, {
11
+ 'Content-Type': 'application/json',
12
+ 'Access-Control-Allow-Origin': '*',
13
+ });
14
+ res.end(JSON.stringify(data));
15
+ }
16
+ /**
17
+ * Send an HTML response
18
+ */
19
+ function sendHTML(res, html, status = 200) {
20
+ res.writeHead(status, {
21
+ 'Content-Type': 'text/html',
22
+ 'Access-Control-Allow-Origin': '*',
23
+ });
24
+ res.end(html);
25
+ }
26
+ /**
27
+ * Send a 404 Not Found response
28
+ */
29
+ function send404(res) {
30
+ sendJSON(res, { error: 'Not found' }, 404);
31
+ }
32
+ /**
33
+ * Handle GET / - Dashboard HTML page
34
+ */
35
+ async function handleDashboard(_req, res) {
36
+ const html = getDashboardHTML();
37
+ sendHTML(res, html);
38
+ }
39
+ /**
40
+ * Handle GET /api/status - Index status
41
+ */
42
+ async function handleStatus(_req, res) {
43
+ try {
44
+ const status = await dashboardState.getStatus();
45
+ if (!status) {
46
+ sendJSON(res, { error: 'Indexer not initialized' }, 503);
47
+ return;
48
+ }
49
+ sendJSON(res, {
50
+ ...status,
51
+ isIndexing: dashboardState.isIndexingInProgress(),
52
+ version: dashboardState.getVersion(),
53
+ });
54
+ }
55
+ catch (error) {
56
+ sendJSON(res, { error: String(error) }, 500);
57
+ }
58
+ }
59
+ /**
60
+ * Handle GET /api/config - Effective configuration
61
+ */
62
+ async function handleConfig(_req, res) {
63
+ const config = dashboardState.getConfig();
64
+ const projectPath = dashboardState.getProjectPath();
65
+ if (!config) {
66
+ sendJSON(res, { error: 'Configuration not loaded' }, 503);
67
+ return;
68
+ }
69
+ sendJSON(res, {
70
+ projectPath,
71
+ ...config,
72
+ });
73
+ }
74
+ /**
75
+ * Handle GET /api/events - SSE stream
76
+ */
77
+ function handleEvents(_req, res) {
78
+ sseManager.addClient(res);
79
+ }
80
+ /**
81
+ * Handle GET /api/heartbeat - Health check
82
+ */
83
+ function handleHeartbeat(_req, res) {
84
+ sendJSON(res, {
85
+ ok: true,
86
+ timestamp: new Date().toISOString(),
87
+ clients: sseManager.getClientCount(),
88
+ });
89
+ }
90
+ /**
91
+ * Handle GET /api/usage - Command usage statistics
92
+ */
93
+ function handleUsage(_req, res) {
94
+ const usage = dashboardState.getCommandUsage();
95
+ const total = dashboardState.getTotalCommandCount();
96
+ sendJSON(res, { usage, total });
97
+ }
98
+ /**
99
+ * Handle GET /api/beads - Beads issue tracker status
100
+ */
101
+ async function handleBeads(_req, res) {
102
+ const projectPath = dashboardState.getProjectPath();
103
+ if (!projectPath) {
104
+ sendJSON(res, { available: false, issueCount: 0, openCount: 0, readyCount: 0, issues: [] });
105
+ return;
106
+ }
107
+ try {
108
+ const status = await getBeadsStatus(projectPath);
109
+ sendJSON(res, status);
110
+ }
111
+ catch (error) {
112
+ sendJSON(res, { available: false, error: String(error) }, 500);
113
+ }
114
+ }
115
+ /**
116
+ * Handle GET /api/settings/embedding - Get current embedding settings
117
+ */
118
+ async function handleGetEmbeddingSettings(_req, res) {
119
+ const projectPath = dashboardState.getProjectPath();
120
+ if (!projectPath) {
121
+ sendJSON(res, { error: 'Project path not set' }, 503);
122
+ return;
123
+ }
124
+ try {
125
+ const settings = await getEmbeddingSettings(projectPath);
126
+ sendJSON(res, settings);
127
+ }
128
+ catch (error) {
129
+ sendJSON(res, { error: String(error) }, 500);
130
+ }
131
+ }
132
+ /**
133
+ * Parse JSON body from request
134
+ */
135
+ async function parseJsonBody(req) {
136
+ return new Promise((resolve, reject) => {
137
+ let body = '';
138
+ req.on('data', (chunk) => {
139
+ body += chunk.toString();
140
+ });
141
+ req.on('end', () => {
142
+ try {
143
+ resolve(JSON.parse(body));
144
+ }
145
+ catch {
146
+ reject(new Error('Invalid JSON'));
147
+ }
148
+ });
149
+ req.on('error', reject);
150
+ });
151
+ }
152
+ /**
153
+ * Handle POST /api/settings/embedding - Save embedding settings
154
+ */
155
+ async function handleSaveEmbeddingSettings(req, res) {
156
+ const projectPath = dashboardState.getProjectPath();
157
+ if (!projectPath) {
158
+ sendJSON(res, { error: 'Project path not set' }, 503);
159
+ return;
160
+ }
161
+ try {
162
+ const body = (await parseJsonBody(req));
163
+ if (!body.backend || !['jina', 'ollama'].includes(body.backend)) {
164
+ sendJSON(res, { error: 'Invalid backend. Must be "jina" or "ollama".' }, 400);
165
+ return;
166
+ }
167
+ await saveEmbeddingSettings(projectPath, body);
168
+ sendJSON(res, {
169
+ success: true,
170
+ message: `Embedding backend set to ${body.backend}. Restart the MCP server for changes to take effect.`,
171
+ });
172
+ }
173
+ catch (error) {
174
+ sendJSON(res, { error: String(error) }, 500);
175
+ }
176
+ }
177
+ /**
178
+ * Route dispatcher
179
+ */
180
+ export async function handleRequest(req, res) {
181
+ const url = new URL(req.url ?? '/', `http://${req.headers.host}`);
182
+ const routePath = url.pathname;
183
+ const method = req.method ?? 'GET';
184
+ // Handle CORS preflight
185
+ if (method === 'OPTIONS') {
186
+ res.writeHead(204, {
187
+ 'Access-Control-Allow-Origin': '*',
188
+ 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
189
+ 'Access-Control-Allow-Headers': 'Content-Type',
190
+ });
191
+ res.end();
192
+ return;
193
+ }
194
+ try {
195
+ // POST routes
196
+ if (method === 'POST') {
197
+ switch (routePath) {
198
+ case '/api/settings/embedding':
199
+ await handleSaveEmbeddingSettings(req, res);
200
+ return;
201
+ default:
202
+ sendJSON(res, { error: 'Method not allowed' }, 405);
203
+ return;
204
+ }
205
+ }
206
+ // GET routes
207
+ if (method !== 'GET') {
208
+ sendJSON(res, { error: 'Method not allowed' }, 405);
209
+ return;
210
+ }
211
+ switch (routePath) {
212
+ case '/':
213
+ await handleDashboard(req, res);
214
+ break;
215
+ case '/api/status':
216
+ await handleStatus(req, res);
217
+ break;
218
+ case '/api/config':
219
+ await handleConfig(req, res);
220
+ break;
221
+ case '/api/events':
222
+ handleEvents(req, res);
223
+ break;
224
+ case '/api/heartbeat':
225
+ handleHeartbeat(req, res);
226
+ break;
227
+ case '/api/usage':
228
+ handleUsage(req, res);
229
+ break;
230
+ case '/api/beads':
231
+ await handleBeads(req, res);
232
+ break;
233
+ case '/api/settings/embedding':
234
+ await handleGetEmbeddingSettings(req, res);
235
+ break;
236
+ default:
237
+ send404(res);
238
+ }
239
+ }
240
+ catch (error) {
241
+ console.error('[lance-context] Dashboard error:', error);
242
+ sendJSON(res, { error: 'Internal server error' }, 500);
243
+ }
244
+ }
245
+ //# 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"}