midnight-mcp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/dist/db/index.d.ts +3 -0
  4. package/dist/db/index.d.ts.map +1 -0
  5. package/dist/db/index.js +2 -0
  6. package/dist/db/index.js.map +1 -0
  7. package/dist/db/vectorStore.d.ts +66 -0
  8. package/dist/db/vectorStore.d.ts.map +1 -0
  9. package/dist/db/vectorStore.js +196 -0
  10. package/dist/db/vectorStore.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +17 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/pipeline/embeddings.d.ts +25 -0
  16. package/dist/pipeline/embeddings.d.ts.map +1 -0
  17. package/dist/pipeline/embeddings.js +103 -0
  18. package/dist/pipeline/embeddings.js.map +1 -0
  19. package/dist/pipeline/github.d.ts +67 -0
  20. package/dist/pipeline/github.d.ts.map +1 -0
  21. package/dist/pipeline/github.js +287 -0
  22. package/dist/pipeline/github.js.map +1 -0
  23. package/dist/pipeline/index.d.ts +11 -0
  24. package/dist/pipeline/index.d.ts.map +1 -0
  25. package/dist/pipeline/index.js +6 -0
  26. package/dist/pipeline/index.js.map +1 -0
  27. package/dist/pipeline/indexer.d.ts +38 -0
  28. package/dist/pipeline/indexer.d.ts.map +1 -0
  29. package/dist/pipeline/indexer.js +222 -0
  30. package/dist/pipeline/indexer.js.map +1 -0
  31. package/dist/pipeline/parser.d.ts +46 -0
  32. package/dist/pipeline/parser.d.ts.map +1 -0
  33. package/dist/pipeline/parser.js +436 -0
  34. package/dist/pipeline/parser.js.map +1 -0
  35. package/dist/pipeline/releases.d.ts +112 -0
  36. package/dist/pipeline/releases.d.ts.map +1 -0
  37. package/dist/pipeline/releases.js +298 -0
  38. package/dist/pipeline/releases.js.map +1 -0
  39. package/dist/pipeline/repository.d.ts +372 -0
  40. package/dist/pipeline/repository.d.ts.map +1 -0
  41. package/dist/pipeline/repository.js +517 -0
  42. package/dist/pipeline/repository.js.map +1 -0
  43. package/dist/prompts/index.d.ts +3 -0
  44. package/dist/prompts/index.d.ts.map +1 -0
  45. package/dist/prompts/index.js +2 -0
  46. package/dist/prompts/index.js.map +1 -0
  47. package/dist/prompts/templates.d.ts +26 -0
  48. package/dist/prompts/templates.d.ts.map +1 -0
  49. package/dist/prompts/templates.js +353 -0
  50. package/dist/prompts/templates.js.map +1 -0
  51. package/dist/resources/code.d.ts +16 -0
  52. package/dist/resources/code.d.ts.map +1 -0
  53. package/dist/resources/code.js +630 -0
  54. package/dist/resources/code.js.map +1 -0
  55. package/dist/resources/docs.d.ts +16 -0
  56. package/dist/resources/docs.d.ts.map +1 -0
  57. package/dist/resources/docs.js +989 -0
  58. package/dist/resources/docs.js.map +1 -0
  59. package/dist/resources/index.d.ts +6 -0
  60. package/dist/resources/index.d.ts.map +1 -0
  61. package/dist/resources/index.js +13 -0
  62. package/dist/resources/index.js.map +1 -0
  63. package/dist/resources/schemas.d.ts +16 -0
  64. package/dist/resources/schemas.d.ts.map +1 -0
  65. package/dist/resources/schemas.js +407 -0
  66. package/dist/resources/schemas.js.map +1 -0
  67. package/dist/scripts/index-repos.d.ts +12 -0
  68. package/dist/scripts/index-repos.d.ts.map +1 -0
  69. package/dist/scripts/index-repos.js +53 -0
  70. package/dist/scripts/index-repos.js.map +1 -0
  71. package/dist/server.d.ts +14 -0
  72. package/dist/server.d.ts.map +1 -0
  73. package/dist/server.js +231 -0
  74. package/dist/server.js.map +1 -0
  75. package/dist/tools/analyze.d.ts +140 -0
  76. package/dist/tools/analyze.d.ts.map +1 -0
  77. package/dist/tools/analyze.js +270 -0
  78. package/dist/tools/analyze.js.map +1 -0
  79. package/dist/tools/index.d.ts +392 -0
  80. package/dist/tools/index.d.ts.map +1 -0
  81. package/dist/tools/index.js +9 -0
  82. package/dist/tools/index.js.map +1 -0
  83. package/dist/tools/repository.d.ts +537 -0
  84. package/dist/tools/repository.d.ts.map +1 -0
  85. package/dist/tools/repository.js +654 -0
  86. package/dist/tools/repository.js.map +1 -0
  87. package/dist/tools/search.d.ts +204 -0
  88. package/dist/tools/search.d.ts.map +1 -0
  89. package/dist/tools/search.js +210 -0
  90. package/dist/tools/search.js.map +1 -0
  91. package/dist/utils/config.d.ts +66 -0
  92. package/dist/utils/config.d.ts.map +1 -0
  93. package/dist/utils/config.js +161 -0
  94. package/dist/utils/config.js.map +1 -0
  95. package/dist/utils/index.d.ts +5 -0
  96. package/dist/utils/index.d.ts.map +1 -0
  97. package/dist/utils/index.js +4 -0
  98. package/dist/utils/index.js.map +1 -0
  99. package/dist/utils/logger.d.ts +14 -0
  100. package/dist/utils/logger.d.ts.map +1 -0
  101. package/dist/utils/logger.js +43 -0
  102. package/dist/utils/logger.js.map +1 -0
  103. package/package.json +64 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Midnight Foundation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,136 @@
1
+ # Midnight MCP Server
2
+
3
+ MCP server that gives AI assistants access to Midnight blockchain—search contracts, analyze code, and explore documentation.
4
+
5
+ ## Quick Start
6
+
7
+ Add to your `claude_desktop_config.json`:
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "midnight": {
13
+ "command": "npx",
14
+ "args": ["-y", "midnight-mcp"]
15
+ }
16
+ }
17
+ }
18
+ ```
19
+
20
+ Restart Claude Desktop. You can now use analysis tools, prompts, and access resources.
21
+
22
+ > **Note:** Search features won't work well without the full setup below.
23
+
24
+ ---
25
+
26
+ ## Full Setup (for search)
27
+
28
+ To enable semantic search across Midnight contracts and docs:
29
+
30
+ ### 1. Start ChromaDB
31
+
32
+ ChromaDB is a local vector database—no account needed, just Docker:
33
+
34
+ ```bash
35
+ docker run -d -p 8000:8000 chromadb/chroma
36
+ ```
37
+
38
+ ### 2. Get an OpenAI API key
39
+
40
+ Needed for generating embeddings. Get one at [platform.openai.com/api-keys](https://platform.openai.com/api-keys).
41
+
42
+ ### 3. Update your config
43
+
44
+ ```json
45
+ {
46
+ "mcpServers": {
47
+ "midnight": {
48
+ "command": "npx",
49
+ "args": ["-y", "midnight-mcp"],
50
+ "env": {
51
+ "OPENAI_API_KEY": "sk-...",
52
+ "CHROMA_URL": "http://localhost:8000"
53
+ }
54
+ }
55
+ }
56
+ }
57
+ ```
58
+
59
+ ### Optional: GitHub token
60
+
61
+ Add `"GITHUB_TOKEN": "ghp_..."` to increase API rate limits from 60 to 5000 requests/hour.
62
+
63
+ ---
64
+
65
+ ## What's Included
66
+
67
+ ### Tools
68
+
69
+ | Tool | Description |
70
+ | ----------------------------- | --------------------------------------- |
71
+ | `midnight:search-compact` | Search Compact contract code |
72
+ | `midnight:search-typescript` | Search TypeScript SDK |
73
+ | `midnight:search-docs` | Search documentation |
74
+ | `midnight:analyze-contract` | Analyze contract structure and security |
75
+ | `midnight:explain-circuit` | Explain circuits in plain language |
76
+ | `midnight:get-file` | Get files from Midnight repos |
77
+ | `midnight:list-examples` | List example contracts |
78
+ | `midnight:get-latest-updates` | Recent repo changes |
79
+
80
+ ### Resources
81
+
82
+ - `midnight://docs/*` — Documentation (Compact reference, SDK API, ZK concepts)
83
+ - `midnight://code/*` — Examples, patterns, and templates
84
+ - `midnight://schema/*` — AST, transaction, and proof schemas
85
+
86
+ ### Prompts
87
+
88
+ - `midnight:create-contract` — Create new contracts
89
+ - `midnight:review-contract` — Security review
90
+ - `midnight:explain-concept` — Learn Midnight concepts
91
+ - `midnight:debug-contract` — Debug issues
92
+
93
+ ---
94
+
95
+ ## Developer Setup
96
+
97
+ For contributors who want to modify or extend the MCP server.
98
+
99
+ ```bash
100
+ git clone https://github.com/Olanetsoft/midnight-mcp.git
101
+ cd midnight-mcp
102
+ npm install
103
+ npm run build
104
+ npm test
105
+ ```
106
+
107
+ ### Index Midnight repos (for search)
108
+
109
+ ```bash
110
+ docker run -d -p 8000:8000 chromadb/chroma
111
+ npm run index
112
+ ```
113
+
114
+ ### Project Structure
115
+
116
+ ```
117
+ src/
118
+ ├── index.ts # Entry point
119
+ ├── server.ts # MCP server handlers
120
+ ├── tools/ # Search, analysis, repository tools
121
+ ├── resources/ # Docs, code, schema providers
122
+ ├── prompts/ # Prompt templates
123
+ ├── pipeline/ # GitHub sync & parsing
124
+ ├── db/ # ChromaDB integration
125
+ └── utils/ # Config & logging
126
+ ```
127
+
128
+ ## License
129
+
130
+ MIT
131
+
132
+ ## Links
133
+
134
+ - [Midnight Docs](https://docs.midnight.network)
135
+ - [MCP Spec](https://modelcontextprotocol.io)
136
+ - [Midnight GitHub](https://github.com/midnightntwrk)
@@ -0,0 +1,3 @@
1
+ export { vectorStore } from "./vectorStore.js";
2
+ export type { CodeDocument, SearchResult, SearchFilter } from "./vectorStore.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { vectorStore } from "./vectorStore.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,66 @@
1
+ export interface CodeDocument {
2
+ id: string;
3
+ content: string;
4
+ embedding?: number[];
5
+ metadata: {
6
+ repository: string;
7
+ filePath: string;
8
+ language: string;
9
+ startLine: number;
10
+ endLine: number;
11
+ codeType: string;
12
+ codeName: string;
13
+ isPublic: boolean;
14
+ };
15
+ }
16
+ export interface SearchResult {
17
+ id: string;
18
+ content: string;
19
+ score: number;
20
+ metadata: CodeDocument["metadata"];
21
+ }
22
+ export interface SearchFilter {
23
+ repository?: string;
24
+ language?: string;
25
+ codeType?: string;
26
+ isPublic?: boolean;
27
+ }
28
+ declare class VectorStore {
29
+ private client;
30
+ private collection;
31
+ private collectionName;
32
+ private initialized;
33
+ /**
34
+ * Initialize the vector store connection
35
+ */
36
+ initialize(): Promise<void>;
37
+ /**
38
+ * Add documents to the vector store
39
+ */
40
+ addDocuments(documents: CodeDocument[]): Promise<void>;
41
+ /**
42
+ * Search for similar documents
43
+ */
44
+ search(query: string, limit?: number, filter?: SearchFilter): Promise<SearchResult[]>;
45
+ /**
46
+ * Delete documents by file path
47
+ */
48
+ deleteByPath(repository: string, filePath: string): Promise<void>;
49
+ /**
50
+ * Delete all documents for a repository
51
+ */
52
+ deleteRepository(repository: string): Promise<void>;
53
+ /**
54
+ * Get collection statistics
55
+ */
56
+ getStats(): Promise<{
57
+ count: number;
58
+ }>;
59
+ /**
60
+ * Clear all data from the collection
61
+ */
62
+ clear(): Promise<void>;
63
+ }
64
+ export declare const vectorStore: VectorStore;
65
+ export {};
66
+ //# sourceMappingURL=vectorStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectorStore.d.ts","sourceRoot":"","sources":["../../src/db/vectorStore.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAAmB;IACzC,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BjC;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC5D;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC;IAoD1B;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAezD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAc5C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,196 @@
1
+ import { ChromaClient } from "chromadb";
2
+ import { config, logger } from "../utils/index.js";
3
+ import { embeddingGenerator } from "../pipeline/embeddings.js";
4
+ class VectorStore {
5
+ client = null;
6
+ collection = null;
7
+ collectionName = "midnight-code";
8
+ initialized = false;
9
+ /**
10
+ * Initialize the vector store connection
11
+ */
12
+ async initialize() {
13
+ if (this.initialized)
14
+ return;
15
+ try {
16
+ this.client = new ChromaClient({
17
+ path: config.chromaUrl,
18
+ });
19
+ // Get or create the collection
20
+ this.collection = await this.client.getOrCreateCollection({
21
+ name: this.collectionName,
22
+ metadata: {
23
+ description: "Midnight blockchain code and documentation",
24
+ },
25
+ });
26
+ this.initialized = true;
27
+ logger.info("Vector store initialized successfully");
28
+ }
29
+ catch (error) {
30
+ logger.error("Failed to initialize vector store", {
31
+ error: String(error),
32
+ });
33
+ // Continue without vector store - use fallback search
34
+ logger.warn("Vector store unavailable, using in-memory fallback");
35
+ }
36
+ }
37
+ /**
38
+ * Add documents to the vector store
39
+ */
40
+ async addDocuments(documents) {
41
+ if (!this.collection) {
42
+ logger.warn("Vector store not initialized, skipping document storage");
43
+ return;
44
+ }
45
+ try {
46
+ const ids = documents.map((d) => d.id);
47
+ const embeddings = documents.map((d) => d.embedding);
48
+ const metadatas = documents.map((d) => ({
49
+ repository: d.metadata.repository,
50
+ filePath: d.metadata.filePath,
51
+ language: d.metadata.language,
52
+ startLine: d.metadata.startLine,
53
+ endLine: d.metadata.endLine,
54
+ codeType: d.metadata.codeType,
55
+ codeName: d.metadata.codeName,
56
+ isPublic: d.metadata.isPublic,
57
+ }));
58
+ const documentContents = documents.map((d) => d.content);
59
+ await this.collection.add({
60
+ ids,
61
+ embeddings,
62
+ metadatas,
63
+ documents: documentContents,
64
+ });
65
+ logger.debug(`Added ${documents.length} documents to vector store`);
66
+ }
67
+ catch (error) {
68
+ logger.error("Failed to add documents to vector store", {
69
+ error: String(error),
70
+ });
71
+ throw error;
72
+ }
73
+ }
74
+ /**
75
+ * Search for similar documents
76
+ */
77
+ async search(query, limit = 10, filter) {
78
+ if (!this.collection) {
79
+ logger.warn("Vector store not initialized, returning empty results");
80
+ return [];
81
+ }
82
+ try {
83
+ // Generate embedding for the query
84
+ const queryEmbedding = await embeddingGenerator.generateEmbedding(query);
85
+ // Build where filter
86
+ const whereFilter = {};
87
+ if (filter?.repository) {
88
+ whereFilter.repository = filter.repository;
89
+ }
90
+ if (filter?.language) {
91
+ whereFilter.language = filter.language;
92
+ }
93
+ if (filter?.codeType) {
94
+ whereFilter.codeType = filter.codeType;
95
+ }
96
+ if (filter?.isPublic !== undefined) {
97
+ whereFilter.isPublic = filter.isPublic;
98
+ }
99
+ const results = await this.collection.query({
100
+ queryEmbeddings: [queryEmbedding.embedding],
101
+ nResults: limit,
102
+ where: Object.keys(whereFilter).length > 0 ? whereFilter : undefined,
103
+ });
104
+ // Format results
105
+ const searchResults = [];
106
+ if (results.ids[0] && results.documents[0] && results.metadatas[0]) {
107
+ for (let i = 0; i < results.ids[0].length; i++) {
108
+ const metadata = results.metadatas[0][i];
109
+ searchResults.push({
110
+ id: results.ids[0][i],
111
+ content: results.documents[0][i] || "",
112
+ score: results.distances ? 1 - (results.distances[0][i] || 0) : 0,
113
+ metadata,
114
+ });
115
+ }
116
+ }
117
+ return searchResults;
118
+ }
119
+ catch (error) {
120
+ logger.error("Search failed", { error: String(error) });
121
+ return [];
122
+ }
123
+ }
124
+ /**
125
+ * Delete documents by file path
126
+ */
127
+ async deleteByPath(repository, filePath) {
128
+ if (!this.collection)
129
+ return;
130
+ try {
131
+ await this.collection.delete({
132
+ where: {
133
+ repository,
134
+ filePath,
135
+ },
136
+ });
137
+ logger.debug(`Deleted documents for ${repository}:${filePath}`);
138
+ }
139
+ catch (error) {
140
+ logger.error("Failed to delete documents", { error: String(error) });
141
+ }
142
+ }
143
+ /**
144
+ * Delete all documents for a repository
145
+ */
146
+ async deleteRepository(repository) {
147
+ if (!this.collection)
148
+ return;
149
+ try {
150
+ await this.collection.delete({
151
+ where: { repository },
152
+ });
153
+ logger.info(`Deleted all documents for repository ${repository}`);
154
+ }
155
+ catch (error) {
156
+ logger.error("Failed to delete repository documents", {
157
+ error: String(error),
158
+ });
159
+ }
160
+ }
161
+ /**
162
+ * Get collection statistics
163
+ */
164
+ async getStats() {
165
+ if (!this.collection) {
166
+ return { count: 0 };
167
+ }
168
+ try {
169
+ const count = await this.collection.count();
170
+ return { count };
171
+ }
172
+ catch (error) {
173
+ logger.error("Failed to get stats", { error: String(error) });
174
+ return { count: 0 };
175
+ }
176
+ }
177
+ /**
178
+ * Clear all data from the collection
179
+ */
180
+ async clear() {
181
+ if (!this.client)
182
+ return;
183
+ try {
184
+ await this.client.deleteCollection({ name: this.collectionName });
185
+ this.collection = await this.client.getOrCreateCollection({
186
+ name: this.collectionName,
187
+ });
188
+ logger.info("Vector store cleared");
189
+ }
190
+ catch (error) {
191
+ logger.error("Failed to clear vector store", { error: String(error) });
192
+ }
193
+ }
194
+ }
195
+ export const vectorStore = new VectorStore();
196
+ //# sourceMappingURL=vectorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectorStore.js","sourceRoot":"","sources":["../../src/db/vectorStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { startServer } from "./server.js";
3
+ // Handle uncaught errors
4
+ process.on("uncaughtException", (error) => {
5
+ console.error("Uncaught exception:", error);
6
+ process.exit(1);
7
+ });
8
+ process.on("unhandledRejection", (reason) => {
9
+ console.error("Unhandled rejection:", reason);
10
+ process.exit(1);
11
+ });
12
+ // Start the server
13
+ startServer().catch((error) => {
14
+ console.error("Failed to start server:", error);
15
+ process.exit(1);
16
+ });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface EmbeddingResult {
2
+ text: string;
3
+ embedding: number[];
4
+ model: string;
5
+ tokenCount?: number;
6
+ }
7
+ export declare class EmbeddingGenerator {
8
+ private openai;
9
+ private model;
10
+ constructor();
11
+ /**
12
+ * Generate embeddings for a single text
13
+ */
14
+ generateEmbedding(text: string): Promise<EmbeddingResult>;
15
+ /**
16
+ * Generate embeddings for multiple texts in batch
17
+ */
18
+ generateEmbeddings(texts: string[]): Promise<EmbeddingResult[]>;
19
+ /**
20
+ * Calculate cosine similarity between two embeddings
21
+ */
22
+ cosineSimilarity(a: number[], b: number[]): number;
23
+ }
24
+ export declare const embeddingGenerator: EmbeddingGenerator;
25
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/pipeline/embeddings.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAS;;IAWtB;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA6B/D;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA0CrE;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;CAiBnD;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
@@ -0,0 +1,103 @@
1
+ import OpenAI from "openai";
2
+ import { config, logger } from "../utils/index.js";
3
+ export class EmbeddingGenerator {
4
+ openai = null;
5
+ model;
6
+ constructor() {
7
+ this.model = config.embeddingModel;
8
+ if (config.openaiApiKey) {
9
+ this.openai = new OpenAI({
10
+ apiKey: config.openaiApiKey,
11
+ });
12
+ }
13
+ }
14
+ /**
15
+ * Generate embeddings for a single text
16
+ */
17
+ async generateEmbedding(text) {
18
+ if (!this.openai) {
19
+ // Return a dummy embedding for testing without API key
20
+ logger.warn("No OpenAI API key configured, using dummy embeddings");
21
+ return {
22
+ text,
23
+ embedding: new Array(1536).fill(0).map(() => Math.random() - 0.5),
24
+ model: "dummy",
25
+ };
26
+ }
27
+ try {
28
+ const response = await this.openai.embeddings.create({
29
+ model: this.model,
30
+ input: text,
31
+ });
32
+ return {
33
+ text,
34
+ embedding: response.data[0].embedding,
35
+ model: this.model,
36
+ tokenCount: response.usage?.total_tokens,
37
+ };
38
+ }
39
+ catch (error) {
40
+ logger.error("Failed to generate embedding", { error: String(error) });
41
+ throw error;
42
+ }
43
+ }
44
+ /**
45
+ * Generate embeddings for multiple texts in batch
46
+ */
47
+ async generateEmbeddings(texts) {
48
+ if (!this.openai) {
49
+ logger.warn("No OpenAI API key configured, using dummy embeddings");
50
+ return texts.map((text) => ({
51
+ text,
52
+ embedding: new Array(1536).fill(0).map(() => Math.random() - 0.5),
53
+ model: "dummy",
54
+ }));
55
+ }
56
+ try {
57
+ // OpenAI allows up to 2048 inputs per request
58
+ const batchSize = 100;
59
+ const results = [];
60
+ for (let i = 0; i < texts.length; i += batchSize) {
61
+ const batch = texts.slice(i, i + batchSize);
62
+ logger.debug(`Generating embeddings for batch ${i / batchSize + 1}`);
63
+ const response = await this.openai.embeddings.create({
64
+ model: this.model,
65
+ input: batch,
66
+ });
67
+ for (let j = 0; j < batch.length; j++) {
68
+ results.push({
69
+ text: batch[j],
70
+ embedding: response.data[j].embedding,
71
+ model: this.model,
72
+ });
73
+ }
74
+ }
75
+ return results;
76
+ }
77
+ catch (error) {
78
+ logger.error("Failed to generate batch embeddings", {
79
+ error: String(error),
80
+ });
81
+ throw error;
82
+ }
83
+ }
84
+ /**
85
+ * Calculate cosine similarity between two embeddings
86
+ */
87
+ cosineSimilarity(a, b) {
88
+ if (a.length !== b.length) {
89
+ throw new Error("Embeddings must have the same length");
90
+ }
91
+ let dotProduct = 0;
92
+ let normA = 0;
93
+ let normB = 0;
94
+ for (let i = 0; i < a.length; i++) {
95
+ dotProduct += a[i] * b[i];
96
+ normA += a[i] * a[i];
97
+ normB += b[i] * b[i];
98
+ }
99
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
100
+ }
101
+ }
102
+ export const embeddingGenerator = new EmbeddingGenerator();
103
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/pipeline/embeddings.ts"],"names":[],"mappings":"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"}