@itkoren/sqmd 0.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 (128) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1052 -0
  4. package/dist/api/app.d.ts +14 -0
  5. package/dist/api/app.d.ts.map +1 -0
  6. package/dist/api/app.js +32 -0
  7. package/dist/api/app.js.map +1 -0
  8. package/dist/api/middleware.d.ts +5 -0
  9. package/dist/api/middleware.d.ts.map +1 -0
  10. package/dist/api/middleware.js +37 -0
  11. package/dist/api/middleware.js.map +1 -0
  12. package/dist/api/models.d.ts +178 -0
  13. package/dist/api/models.d.ts.map +1 -0
  14. package/dist/api/models.js +39 -0
  15. package/dist/api/models.js.map +1 -0
  16. package/dist/api/routes/documents.d.ts +4 -0
  17. package/dist/api/routes/documents.d.ts.map +1 -0
  18. package/dist/api/routes/documents.js +92 -0
  19. package/dist/api/routes/documents.js.map +1 -0
  20. package/dist/api/routes/health.d.ts +6 -0
  21. package/dist/api/routes/health.d.ts.map +1 -0
  22. package/dist/api/routes/health.js +38 -0
  23. package/dist/api/routes/health.js.map +1 -0
  24. package/dist/api/routes/index.d.ts +5 -0
  25. package/dist/api/routes/index.d.ts.map +1 -0
  26. package/dist/api/routes/index.js +83 -0
  27. package/dist/api/routes/index.js.map +1 -0
  28. package/dist/api/routes/search.d.ts +6 -0
  29. package/dist/api/routes/search.d.ts.map +1 -0
  30. package/dist/api/routes/search.js +104 -0
  31. package/dist/api/routes/search.js.map +1 -0
  32. package/dist/config/loader.d.ts +4 -0
  33. package/dist/config/loader.d.ts.map +1 -0
  34. package/dist/config/loader.js +144 -0
  35. package/dist/config/loader.js.map +1 -0
  36. package/dist/config/schema.d.ts +298 -0
  37. package/dist/config/schema.d.ts.map +1 -0
  38. package/dist/config/schema.js +50 -0
  39. package/dist/config/schema.js.map +1 -0
  40. package/dist/embeddings/ollama.d.ts +14 -0
  41. package/dist/embeddings/ollama.d.ts.map +1 -0
  42. package/dist/embeddings/ollama.js +46 -0
  43. package/dist/embeddings/ollama.js.map +1 -0
  44. package/dist/embeddings/transformers.d.ts +14 -0
  45. package/dist/embeddings/transformers.d.ts.map +1 -0
  46. package/dist/embeddings/transformers.js +64 -0
  47. package/dist/embeddings/transformers.js.map +1 -0
  48. package/dist/embeddings/types.d.ts +6 -0
  49. package/dist/embeddings/types.d.ts.map +1 -0
  50. package/dist/embeddings/types.js +2 -0
  51. package/dist/embeddings/types.js.map +1 -0
  52. package/dist/index.d.ts +3 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +233 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/ingestion/chunker.d.ts +21 -0
  57. package/dist/ingestion/chunker.d.ts.map +1 -0
  58. package/dist/ingestion/chunker.js +117 -0
  59. package/dist/ingestion/chunker.js.map +1 -0
  60. package/dist/ingestion/fingerprint.d.ts +6 -0
  61. package/dist/ingestion/fingerprint.d.ts.map +1 -0
  62. package/dist/ingestion/fingerprint.js +17 -0
  63. package/dist/ingestion/fingerprint.js.map +1 -0
  64. package/dist/ingestion/parser.d.ts +16 -0
  65. package/dist/ingestion/parser.d.ts.map +1 -0
  66. package/dist/ingestion/parser.js +98 -0
  67. package/dist/ingestion/parser.js.map +1 -0
  68. package/dist/ingestion/pipeline.d.ts +32 -0
  69. package/dist/ingestion/pipeline.d.ts.map +1 -0
  70. package/dist/ingestion/pipeline.js +191 -0
  71. package/dist/ingestion/pipeline.js.map +1 -0
  72. package/dist/ingestion/scanner.d.ts +2 -0
  73. package/dist/ingestion/scanner.d.ts.map +1 -0
  74. package/dist/ingestion/scanner.js +54 -0
  75. package/dist/ingestion/scanner.js.map +1 -0
  76. package/dist/mcp/server.d.ts +8 -0
  77. package/dist/mcp/server.d.ts.map +1 -0
  78. package/dist/mcp/server.js +73 -0
  79. package/dist/mcp/server.js.map +1 -0
  80. package/dist/mcp/tools.d.ts +6 -0
  81. package/dist/mcp/tools.d.ts.map +1 -0
  82. package/dist/mcp/tools.js +276 -0
  83. package/dist/mcp/tools.js.map +1 -0
  84. package/dist/rag/context-builder.d.ts +3 -0
  85. package/dist/rag/context-builder.d.ts.map +1 -0
  86. package/dist/rag/context-builder.js +27 -0
  87. package/dist/rag/context-builder.js.map +1 -0
  88. package/dist/rag/prompt-templates.d.ts +5 -0
  89. package/dist/rag/prompt-templates.d.ts.map +1 -0
  90. package/dist/rag/prompt-templates.js +41 -0
  91. package/dist/rag/prompt-templates.js.map +1 -0
  92. package/dist/search/hybrid.d.ts +14 -0
  93. package/dist/search/hybrid.d.ts.map +1 -0
  94. package/dist/search/hybrid.js +58 -0
  95. package/dist/search/hybrid.js.map +1 -0
  96. package/dist/search/query.d.ts +4 -0
  97. package/dist/search/query.d.ts.map +1 -0
  98. package/dist/search/query.js +23 -0
  99. package/dist/search/query.js.map +1 -0
  100. package/dist/search/reranker.d.ts +11 -0
  101. package/dist/search/reranker.d.ts.map +1 -0
  102. package/dist/search/reranker.js +44 -0
  103. package/dist/search/reranker.js.map +1 -0
  104. package/dist/store/db.d.ts +11 -0
  105. package/dist/store/db.d.ts.map +1 -0
  106. package/dist/store/db.js +75 -0
  107. package/dist/store/db.js.map +1 -0
  108. package/dist/store/reader.d.ts +8 -0
  109. package/dist/store/reader.d.ts.map +1 -0
  110. package/dist/store/reader.js +122 -0
  111. package/dist/store/reader.js.map +1 -0
  112. package/dist/store/schema.d.ts +39 -0
  113. package/dist/store/schema.d.ts.map +1 -0
  114. package/dist/store/schema.js +33 -0
  115. package/dist/store/schema.js.map +1 -0
  116. package/dist/store/writer.d.ts +6 -0
  117. package/dist/store/writer.d.ts.map +1 -0
  118. package/dist/store/writer.js +43 -0
  119. package/dist/store/writer.js.map +1 -0
  120. package/dist/watcher/daemon.d.ts +5 -0
  121. package/dist/watcher/daemon.d.ts.map +1 -0
  122. package/dist/watcher/daemon.js +43 -0
  123. package/dist/watcher/daemon.js.map +1 -0
  124. package/dist/watcher/handler.d.ts +14 -0
  125. package/dist/watcher/handler.d.ts.map +1 -0
  126. package/dist/watcher/handler.js +82 -0
  127. package/dist/watcher/handler.js.map +1 -0
  128. package/package.json +56 -0
@@ -0,0 +1,14 @@
1
+ import type * as lancedb from '@lancedb/lancedb';
2
+ import { Hono } from 'hono';
3
+ import type { Config } from '../config/schema.js';
4
+ import type { Embedder } from '../embeddings/types.js';
5
+ export interface AppState {
6
+ db: lancedb.Connection;
7
+ embedder: Embedder;
8
+ config: Config;
9
+ watcherStatus: {
10
+ running: boolean;
11
+ };
12
+ }
13
+ export declare function createApp(state: AppState): Hono;
14
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/api/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAOvD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CACrC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CA+B/C"}
@@ -0,0 +1,32 @@
1
+ import { Hono } from 'hono';
2
+ import { corsMiddleware, createApiKeyMiddleware, requestLogger } from './middleware.js';
3
+ import { createDocumentsRouter } from './routes/documents.js';
4
+ import { createHealthRouter } from './routes/health.js';
5
+ import { createIndexRouter } from './routes/index.js';
6
+ import { createSearchRouter } from './routes/search.js';
7
+ export function createApp(state) {
8
+ const app = new Hono();
9
+ const { db, embedder, config, watcherStatus } = state;
10
+ // Global middleware
11
+ app.use('*', corsMiddleware());
12
+ app.use('*', requestLogger());
13
+ app.use('/api/*', createApiKeyMiddleware(config.api.api_key));
14
+ // Mount routers under /api/v1
15
+ app.route('/api/v1/health', createHealthRouter(db, watcherStatus));
16
+ app.route('/api/v1/search', createSearchRouter(db, embedder, config));
17
+ app.route('/api/v1/documents', createDocumentsRouter(db));
18
+ app.route('/api/v1/index', createIndexRouter(db, config));
19
+ // Root redirect
20
+ app.get('/', (c) => c.redirect('/api/v1/health'));
21
+ // 404 handler
22
+ app.notFound((c) => {
23
+ return c.json({ error: 'Not found', path: new URL(c.req.url).pathname }, 404);
24
+ });
25
+ // Error handler
26
+ app.onError((err, c) => {
27
+ console.error('Unhandled error:', err);
28
+ return c.json({ error: 'Internal server error', message: err.message }, 500);
29
+ });
30
+ return app;
31
+ }
32
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/api/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AASxD,MAAM,UAAU,SAAS,CAAC,KAAe;IACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IAEtD,oBAAoB;IACpB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;IAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9D,8BAA8B;IAC9B,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACnE,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1D,gBAAgB;IAChB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAElD,cAAc;IACd,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,gBAAgB;IAChB,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ export declare function createApiKeyMiddleware(apiKey: string): MiddlewareHandler;
3
+ export declare function requestLogger(): MiddlewareHandler;
4
+ export declare function corsMiddleware(): MiddlewareHandler;
5
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/api/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAQ,MAAM,MAAM,CAAC;AAE7D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAgBxE;AAED,wBAAgB,aAAa,IAAI,iBAAiB,CAajD;AAED,wBAAgB,cAAc,IAAI,iBAAiB,CAYlD"}
@@ -0,0 +1,37 @@
1
+ export function createApiKeyMiddleware(apiKey) {
2
+ return async (c, next) => {
3
+ // Skip auth if no API key configured
4
+ if (!apiKey) {
5
+ return next();
6
+ }
7
+ const authHeader = c.req.header('Authorization');
8
+ const providedKey = authHeader?.replace(/^Bearer\s+/, '') ?? c.req.header('X-API-Key');
9
+ if (!providedKey || providedKey !== apiKey) {
10
+ return c.json({ error: 'Unauthorized', message: 'Invalid or missing API key' }, 401);
11
+ }
12
+ return next();
13
+ };
14
+ }
15
+ export function requestLogger() {
16
+ return async (c, next) => {
17
+ const start = Date.now();
18
+ const method = c.req.method;
19
+ const path = new URL(c.req.url).pathname;
20
+ await next();
21
+ const duration = Date.now() - start;
22
+ const status = c.res.status;
23
+ console.log(`[${new Date().toISOString()}] ${method} ${path} ${status} ${duration}ms`);
24
+ };
25
+ }
26
+ export function corsMiddleware() {
27
+ return async (c, next) => {
28
+ c.res.headers.set('Access-Control-Allow-Origin', '*');
29
+ c.res.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
30
+ c.res.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key');
31
+ if (c.req.method === 'OPTIONS') {
32
+ return c.body(null, 204);
33
+ }
34
+ return next();
35
+ };
36
+ }
37
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/api/middleware.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACtC,qCAAqC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,UAAU,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvF,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,GAAG,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QAEzC,MAAM,IAAI,EAAE,CAAC;QAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QAE5B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,QAAQ,IAAI,CAAC,CAAC;IACzF,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACtC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,CAAC;QACrF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,wCAAwC,CAAC,CAAC;QAE5F,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { z } from 'zod';
2
+ export declare const SearchRequestSchema: z.ZodObject<{
3
+ query: z.ZodString;
4
+ top_k: z.ZodDefault<z.ZodNumber>;
5
+ mode: z.ZodDefault<z.ZodEnum<["hybrid", "vector", "fts"]>>;
6
+ filter_path: z.ZodOptional<z.ZodString>;
7
+ include_context: z.ZodDefault<z.ZodBoolean>;
8
+ rerank: z.ZodDefault<z.ZodBoolean>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ rerank: boolean;
11
+ query: string;
12
+ mode: "vector" | "hybrid" | "fts";
13
+ top_k: number;
14
+ include_context: boolean;
15
+ filter_path?: string | undefined;
16
+ }, {
17
+ query: string;
18
+ rerank?: boolean | undefined;
19
+ mode?: "vector" | "hybrid" | "fts" | undefined;
20
+ top_k?: number | undefined;
21
+ filter_path?: string | undefined;
22
+ include_context?: boolean | undefined;
23
+ }>;
24
+ export type SearchRequest = z.infer<typeof SearchRequestSchema>;
25
+ export declare const SearchResultItemSchema: z.ZodObject<{
26
+ chunk_id: z.ZodString;
27
+ file_id: z.ZodString;
28
+ file_path: z.ZodString;
29
+ heading_path: z.ZodString;
30
+ heading_text: z.ZodString;
31
+ heading_level: z.ZodNumber;
32
+ section_index: z.ZodNumber;
33
+ chunk_index: z.ZodNumber;
34
+ text_raw: z.ZodString;
35
+ token_count: z.ZodNumber;
36
+ score: z.ZodNumber;
37
+ line_start: z.ZodNumber;
38
+ line_end: z.ZodNumber;
39
+ }, "strip", z.ZodTypeAny, {
40
+ chunk_id: string;
41
+ file_id: string;
42
+ file_path: string;
43
+ heading_path: string;
44
+ heading_level: number;
45
+ heading_text: string;
46
+ section_index: number;
47
+ chunk_index: number;
48
+ text_raw: string;
49
+ token_count: number;
50
+ line_start: number;
51
+ line_end: number;
52
+ score: number;
53
+ }, {
54
+ chunk_id: string;
55
+ file_id: string;
56
+ file_path: string;
57
+ heading_path: string;
58
+ heading_level: number;
59
+ heading_text: string;
60
+ section_index: number;
61
+ chunk_index: number;
62
+ text_raw: string;
63
+ token_count: number;
64
+ line_start: number;
65
+ line_end: number;
66
+ score: number;
67
+ }>;
68
+ export type SearchResultItem = z.infer<typeof SearchResultItemSchema>;
69
+ export declare const SearchResponseSchema: z.ZodObject<{
70
+ results: z.ZodArray<z.ZodObject<{
71
+ chunk_id: z.ZodString;
72
+ file_id: z.ZodString;
73
+ file_path: z.ZodString;
74
+ heading_path: z.ZodString;
75
+ heading_text: z.ZodString;
76
+ heading_level: z.ZodNumber;
77
+ section_index: z.ZodNumber;
78
+ chunk_index: z.ZodNumber;
79
+ text_raw: z.ZodString;
80
+ token_count: z.ZodNumber;
81
+ score: z.ZodNumber;
82
+ line_start: z.ZodNumber;
83
+ line_end: z.ZodNumber;
84
+ }, "strip", z.ZodTypeAny, {
85
+ chunk_id: string;
86
+ file_id: string;
87
+ file_path: string;
88
+ heading_path: string;
89
+ heading_level: number;
90
+ heading_text: string;
91
+ section_index: number;
92
+ chunk_index: number;
93
+ text_raw: string;
94
+ token_count: number;
95
+ line_start: number;
96
+ line_end: number;
97
+ score: number;
98
+ }, {
99
+ chunk_id: string;
100
+ file_id: string;
101
+ file_path: string;
102
+ heading_path: string;
103
+ heading_level: number;
104
+ heading_text: string;
105
+ section_index: number;
106
+ chunk_index: number;
107
+ text_raw: string;
108
+ token_count: number;
109
+ line_start: number;
110
+ line_end: number;
111
+ score: number;
112
+ }>, "many">;
113
+ query: z.ZodString;
114
+ total: z.ZodNumber;
115
+ duration_ms: z.ZodNumber;
116
+ }, "strip", z.ZodTypeAny, {
117
+ query: string;
118
+ total: number;
119
+ results: {
120
+ chunk_id: string;
121
+ file_id: string;
122
+ file_path: string;
123
+ heading_path: string;
124
+ heading_level: number;
125
+ heading_text: string;
126
+ section_index: number;
127
+ chunk_index: number;
128
+ text_raw: string;
129
+ token_count: number;
130
+ line_start: number;
131
+ line_end: number;
132
+ score: number;
133
+ }[];
134
+ duration_ms: number;
135
+ }, {
136
+ query: string;
137
+ total: number;
138
+ results: {
139
+ chunk_id: string;
140
+ file_id: string;
141
+ file_path: string;
142
+ heading_path: string;
143
+ heading_level: number;
144
+ heading_text: string;
145
+ section_index: number;
146
+ chunk_index: number;
147
+ text_raw: string;
148
+ token_count: number;
149
+ line_start: number;
150
+ line_end: number;
151
+ score: number;
152
+ }[];
153
+ duration_ms: number;
154
+ }>;
155
+ export type SearchResponse = z.infer<typeof SearchResponseSchema>;
156
+ export declare const IndexRequestSchema: z.ZodObject<{
157
+ paths: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
158
+ force: z.ZodDefault<z.ZodBoolean>;
159
+ }, "strip", z.ZodTypeAny, {
160
+ force: boolean;
161
+ paths?: string[] | undefined;
162
+ }, {
163
+ paths?: string[] | undefined;
164
+ force?: boolean | undefined;
165
+ }>;
166
+ export type IndexRequest = z.infer<typeof IndexRequestSchema>;
167
+ export declare const PaginationSchema: z.ZodObject<{
168
+ page: z.ZodDefault<z.ZodNumber>;
169
+ limit: z.ZodDefault<z.ZodNumber>;
170
+ }, "strip", z.ZodTypeAny, {
171
+ page: number;
172
+ limit: number;
173
+ }, {
174
+ page?: number | undefined;
175
+ limit?: number | undefined;
176
+ }>;
177
+ export type Pagination = z.infer<typeof PaginationSchema>;
178
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/api/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ export const SearchRequestSchema = z.object({
3
+ query: z.string().min(1),
4
+ top_k: z.number().int().positive().default(10),
5
+ mode: z.enum(['hybrid', 'vector', 'fts']).default('hybrid'),
6
+ filter_path: z.string().optional(),
7
+ include_context: z.boolean().default(false),
8
+ rerank: z.boolean().default(false),
9
+ });
10
+ export const SearchResultItemSchema = z.object({
11
+ chunk_id: z.string(),
12
+ file_id: z.string(),
13
+ file_path: z.string(),
14
+ heading_path: z.string(),
15
+ heading_text: z.string(),
16
+ heading_level: z.number(),
17
+ section_index: z.number(),
18
+ chunk_index: z.number(),
19
+ text_raw: z.string(),
20
+ token_count: z.number(),
21
+ score: z.number(),
22
+ line_start: z.number(),
23
+ line_end: z.number(),
24
+ });
25
+ export const SearchResponseSchema = z.object({
26
+ results: z.array(SearchResultItemSchema),
27
+ query: z.string(),
28
+ total: z.number(),
29
+ duration_ms: z.number(),
30
+ });
31
+ export const IndexRequestSchema = z.object({
32
+ paths: z.array(z.string()).optional(),
33
+ force: z.boolean().default(false),
34
+ });
35
+ export const PaginationSchema = z.object({
36
+ page: z.coerce.number().int().nonnegative().default(0),
37
+ limit: z.coerce.number().int().positive().max(100).default(20),
38
+ });
39
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/api/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC3D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3C,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACnC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAClC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC/D,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type * as lancedb from '@lancedb/lancedb';
2
+ import { Hono } from 'hono';
3
+ export declare function createDocumentsRouter(db: lancedb.Connection): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../src/api/routes/documents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,8EA4G3D"}
@@ -0,0 +1,92 @@
1
+ import * as fs from 'node:fs';
2
+ import { Hono } from 'hono';
3
+ import { getChunksTable, getFilesTable } from '../../store/db.js';
4
+ import { getAllFiles, getFileById, getFileChunks } from '../../store/reader.js';
5
+ export function createDocumentsRouter(db) {
6
+ const router = new Hono();
7
+ // GET /documents — paginated list of indexed files
8
+ router.get('/', async (c) => {
9
+ const page = Number.parseInt(c.req.query('page') ?? '0', 10);
10
+ const limit = Math.min(Number.parseInt(c.req.query('limit') ?? '20', 10), 100);
11
+ const pathPrefix = c.req.query('path_prefix');
12
+ try {
13
+ const filesTable = await getFilesTable(db);
14
+ let files = await getAllFiles(filesTable);
15
+ if (pathPrefix) {
16
+ files = files.filter((f) => f.file_path.startsWith(pathPrefix));
17
+ }
18
+ const total = files.length;
19
+ const paginated = files.slice(page * limit, (page + 1) * limit);
20
+ return c.json({
21
+ documents: paginated,
22
+ total,
23
+ page,
24
+ limit,
25
+ });
26
+ }
27
+ catch (err) {
28
+ return c.json({
29
+ error: 'Failed to list documents',
30
+ message: err instanceof Error ? err.message : String(err),
31
+ }, 500);
32
+ }
33
+ });
34
+ // GET /documents/:fileId — file metadata + chunks
35
+ router.get('/:fileId', async (c) => {
36
+ const fileId = c.req.param('fileId');
37
+ try {
38
+ const filesTable = await getFilesTable(db);
39
+ const chunksTable = await getChunksTable(db);
40
+ const file = await getFileById(filesTable, fileId);
41
+ if (!file) {
42
+ return c.json({ error: 'File not found', file_id: fileId }, 404);
43
+ }
44
+ const chunks = await getFileChunks(chunksTable, fileId);
45
+ return c.json({
46
+ file,
47
+ chunks: chunks.map((chunk) => ({
48
+ chunk_id: chunk.chunk_id,
49
+ heading_path: chunk.heading_path,
50
+ heading_text: chunk.heading_text,
51
+ heading_level: chunk.heading_level,
52
+ section_index: chunk.section_index,
53
+ chunk_index: chunk.chunk_index,
54
+ text_raw: chunk.text_raw,
55
+ token_count: chunk.token_count,
56
+ line_start: chunk.line_start,
57
+ line_end: chunk.line_end,
58
+ })),
59
+ });
60
+ }
61
+ catch (err) {
62
+ return c.json({
63
+ error: 'Failed to get document',
64
+ message: err instanceof Error ? err.message : String(err),
65
+ }, 500);
66
+ }
67
+ });
68
+ // GET /documents/:fileId/raw — raw MD content
69
+ router.get('/:fileId/raw', async (c) => {
70
+ const fileId = c.req.param('fileId');
71
+ try {
72
+ const filesTable = await getFilesTable(db);
73
+ const file = await getFileById(filesTable, fileId);
74
+ if (!file) {
75
+ return c.json({ error: 'File not found', file_id: fileId }, 404);
76
+ }
77
+ if (!fs.existsSync(file.file_path)) {
78
+ return c.json({ error: 'File no longer exists on disk', file_path: file.file_path }, 404);
79
+ }
80
+ const content = fs.readFileSync(file.file_path, 'utf-8');
81
+ return c.text(content, 200, { 'Content-Type': 'text/markdown; charset=utf-8' });
82
+ }
83
+ catch (err) {
84
+ return c.json({
85
+ error: 'Failed to read document',
86
+ message: err instanceof Error ? err.message : String(err),
87
+ }, 500);
88
+ }
89
+ });
90
+ return router;
91
+ }
92
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/api/routes/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type * as lancedb from '@lancedb/lancedb';
2
+ import { Hono } from 'hono';
3
+ export declare function createHealthRouter(db: lancedb.Connection | null, watcherStatus: {
4
+ running: boolean;
5
+ }): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
6
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,OAAO,CAAC,UAAU,GAAG,IAAI,EAC7B,aAAa,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,8EAsCpC"}
@@ -0,0 +1,38 @@
1
+ import { Hono } from 'hono';
2
+ import { getDbStats } from '../../store/db.js';
3
+ const startTime = Date.now();
4
+ export function createHealthRouter(db, watcherStatus) {
5
+ const router = new Hono();
6
+ router.get('/', async (c) => {
7
+ const uptime = Math.floor((Date.now() - startTime) / 1000);
8
+ let dbStatus = 'disconnected';
9
+ let fileCount = 0;
10
+ let chunkCount = 0;
11
+ if (db) {
12
+ try {
13
+ const stats = await getDbStats(db);
14
+ fileCount = stats.fileCount;
15
+ chunkCount = stats.chunkCount;
16
+ dbStatus = 'connected';
17
+ }
18
+ catch {
19
+ dbStatus = 'error';
20
+ }
21
+ }
22
+ return c.json({
23
+ status: 'ok',
24
+ uptime_seconds: uptime,
25
+ db: {
26
+ status: dbStatus,
27
+ file_count: fileCount,
28
+ chunk_count: chunkCount,
29
+ },
30
+ watcher: {
31
+ status: watcherStatus.running ? 'running' : 'stopped',
32
+ },
33
+ timestamp: new Date().toISOString(),
34
+ });
35
+ });
36
+ return router;
37
+ }
38
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/api/routes/health.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,MAAM,UAAU,kBAAkB,CAChC,EAA6B,EAC7B,aAAmC;IAEnC,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAE1B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAE3D,IAAI,QAAQ,GAAG,cAAc,CAAC;QAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;gBACnC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC5B,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;gBAC9B,QAAQ,GAAG,WAAW,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,GAAG,OAAO,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,IAAI;YACZ,cAAc,EAAE,MAAM;YACtB,EAAE,EAAE;gBACF,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,UAAU;aACxB;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;aACtD;YACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type * as lancedb from '@lancedb/lancedb';
2
+ import { Hono } from 'hono';
3
+ import type { Config } from '../../config/schema.js';
4
+ export declare function createIndexRouter(db: lancedb.Connection, config: Config): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/routes/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAoBrD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,8EA0FvE"}
@@ -0,0 +1,83 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { Hono } from 'hono';
3
+ import { IndexPipeline } from '../../ingestion/pipeline.js';
4
+ import { getDbStats } from '../../store/db.js';
5
+ import { IndexRequestSchema } from '../models.js';
6
+ const jobs = new Map();
7
+ export function createIndexRouter(db, config) {
8
+ const router = new Hono();
9
+ // POST /index/trigger — trigger re-index
10
+ router.post('/trigger', async (c) => {
11
+ let body;
12
+ try {
13
+ body = await c.req.json();
14
+ }
15
+ catch {
16
+ body = {};
17
+ }
18
+ const parsed = IndexRequestSchema.safeParse(body);
19
+ if (!parsed.success) {
20
+ return c.json({ error: 'Validation error', details: parsed.error.issues }, 400);
21
+ }
22
+ const { paths, force } = parsed.data;
23
+ const resolvedPaths = paths ?? config.paths.watch_dirs;
24
+ const jobId = randomUUID();
25
+ const job = {
26
+ id: jobId,
27
+ status: 'pending',
28
+ startedAt: Date.now(),
29
+ };
30
+ jobs.set(jobId, job);
31
+ // Run indexing asynchronously
32
+ setImmediate(async () => {
33
+ job.status = 'running';
34
+ const pipeline = new IndexPipeline(config);
35
+ try {
36
+ const result = await pipeline.run({
37
+ paths: resolvedPaths,
38
+ force,
39
+ });
40
+ job.status = 'completed';
41
+ job.completedAt = Date.now();
42
+ job.result = result;
43
+ }
44
+ catch (err) {
45
+ job.status = 'failed';
46
+ job.completedAt = Date.now();
47
+ job.error = err instanceof Error ? err.message : String(err);
48
+ }
49
+ });
50
+ return c.json({ job_id: jobId, status: 'accepted' }, 202);
51
+ });
52
+ // GET /index/status — overall stats
53
+ router.get('/status', async (c) => {
54
+ try {
55
+ const stats = await getDbStats(db);
56
+ // Count recent jobs
57
+ const recentJobs = Array.from(jobs.values())
58
+ .sort((a, b) => b.startedAt - a.startedAt)
59
+ .slice(0, 5);
60
+ return c.json({
61
+ db: stats,
62
+ recent_jobs: recentJobs,
63
+ });
64
+ }
65
+ catch (err) {
66
+ return c.json({
67
+ error: 'Failed to get status',
68
+ message: err instanceof Error ? err.message : String(err),
69
+ }, 500);
70
+ }
71
+ });
72
+ // GET /index/jobs/:jobId — job progress
73
+ router.get('/jobs/:jobId', async (c) => {
74
+ const jobId = c.req.param('jobId');
75
+ const job = jobs.get(jobId);
76
+ if (!job) {
77
+ return c.json({ error: 'Job not found', job_id: jobId }, 404);
78
+ }
79
+ return c.json(job);
80
+ });
81
+ return router;
82
+ }
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/routes/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type * as lancedb from '@lancedb/lancedb';
2
+ import { Hono } from 'hono';
3
+ import type { Config } from '../../config/schema.js';
4
+ import type { Embedder } from '../../embeddings/types.js';
5
+ export declare function createSearchRouter(db: lancedb.Connection, embedder: Embedder, config: Config): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
6
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/api/routes/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAM1D,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,8EA4H5F"}