crewly 1.8.7 → 1.8.9

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 (165) hide show
  1. package/dist/backend/backend/src/constants.d.ts +12 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +12 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  6. package/dist/backend/backend/src/controllers/browser/browser.controller.js +17 -0
  7. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  8. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  9. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +8 -1
  10. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  11. package/dist/backend/backend/src/index.d.ts.map +1 -1
  12. package/dist/backend/backend/src/index.js +15 -7
  13. package/dist/backend/backend/src/index.js.map +1 -1
  14. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +7 -0
  15. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  16. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +69 -12
  17. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  18. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +122 -1
  19. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  20. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +252 -17
  21. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  22. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +37 -3
  23. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -1
  24. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +140 -23
  25. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -1
  26. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +75 -0
  27. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/cloud/cloud-client.service.js +164 -12
  29. package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
  30. package/dist/cli/backend/src/constants.d.ts +12 -0
  31. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  32. package/dist/cli/backend/src/constants.js +12 -0
  33. package/dist/cli/backend/src/constants.js.map +1 -1
  34. package/dist/cli/cli/src/index.js +0 -0
  35. package/package.json +1 -1
  36. package/config/constants.d.ts.map +0 -1
  37. package/config/index.d.ts.map +0 -1
  38. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
  39. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
  40. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
  41. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
  42. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
  43. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
  44. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
  45. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
  46. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
  47. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
  48. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
  49. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
  50. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
  51. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
  52. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
  53. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
  54. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
  55. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
  56. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
  57. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
  58. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
  59. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
  60. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
  61. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
  62. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
  63. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
  64. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
  65. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
  66. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
  67. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
  68. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
  69. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
  70. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
  71. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
  72. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
  73. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
  74. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
  75. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
  76. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
  77. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
  78. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
  79. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
  80. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
  81. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
  82. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
  83. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
  84. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
  85. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
  86. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
  87. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
  88. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
  89. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
  90. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
  91. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
  92. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
  93. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
  94. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
  95. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
  96. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
  97. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
  98. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
  99. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
  100. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
  101. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
  102. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
  103. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
  104. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
  105. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
  106. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
  107. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
  108. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
  109. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
  110. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
  111. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
  112. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
  113. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
  114. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
  115. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  116. package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
  117. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
  118. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
  119. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
  120. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
  121. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
  122. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
  123. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
  124. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
  125. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
  126. package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
  127. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
  128. package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
  129. package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
  130. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
  131. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
  132. package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
  133. package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
  134. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +0 -220
  135. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +0 -1
  136. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +0 -37
  137. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +0 -1
  138. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
  139. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
  140. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
  141. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
  142. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
  143. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
  144. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
  145. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
  146. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  147. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  148. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  149. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  150. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
  151. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  152. package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
  153. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
  154. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
  155. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  156. package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
  157. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
  158. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
  159. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  160. package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
  161. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
  162. package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
  163. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
  164. package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
  165. package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
@@ -1,215 +0,0 @@
1
- /**
2
- * Wiki Compiler Service
3
- *
4
- * Reads Markdown files with YAML frontmatter from the `.crewly/knowledge/`
5
- * directory and indexes them into the FTS5 full-text search database.
6
- * Provides reindexing, single-file indexing, and search capabilities.
7
- *
8
- * @module services/knowledge/wiki-compiler.service
9
- */
10
- import * as path from 'path';
11
- import { promises as fs } from 'fs';
12
- import { LoggerService } from '../core/logger.service.js';
13
- import { Fts5IndexService } from './fts5-index.service.js';
14
- /**
15
- * Parse YAML frontmatter from a Markdown file content string.
16
- * Handles simple key: value pairs and bracket-delimited arrays.
17
- * Does not require an external YAML parsing dependency.
18
- *
19
- * @param content - Raw file content including frontmatter
20
- * @returns Parsed frontmatter object and body text
21
- */
22
- export function parseFrontmatter(content) {
23
- const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
24
- if (!match) {
25
- return { frontmatter: {}, body: content };
26
- }
27
- const fm = {};
28
- for (const line of match[1].split('\n')) {
29
- const colonIdx = line.indexOf(':');
30
- if (colonIdx === -1)
31
- continue;
32
- const key = line.slice(0, colonIdx).trim();
33
- let value = line.slice(colonIdx + 1).trim();
34
- // Handle arrays: ["tag1", "tag2"] -> "tag1, tag2"
35
- if (value.startsWith('[') && value.endsWith(']')) {
36
- value = value
37
- .slice(1, -1)
38
- .split(',')
39
- .map((s) => s.trim().replace(/^["']|["']$/g, ''))
40
- .join(', ');
41
- }
42
- // Strip surrounding quotes
43
- value = value.replace(/^["']|["']$/g, '');
44
- fm[key] = value;
45
- }
46
- return { frontmatter: fm, body: match[2] };
47
- }
48
- /**
49
- * Derive a stable document ID from a file path.
50
- * Uses the filename without extension, lowercased, with spaces replaced by hyphens.
51
- *
52
- * @param filePath - Absolute or relative path to the markdown file
53
- * @returns A URL-safe identifier string
54
- */
55
- function idFromFilename(filePath) {
56
- const basename = path.basename(filePath, '.md');
57
- return basename.toLowerCase().replace(/\s+/g, '-');
58
- }
59
- // ---------------------------------------------------------------------------
60
- // Service
61
- // ---------------------------------------------------------------------------
62
- /**
63
- * WikiCompilerService scans `.md` files in a knowledge directory, parses
64
- * their YAML frontmatter, and indexes the content into an FTS5 database
65
- * for fast full-text search.
66
- *
67
- * @example
68
- * ```typescript
69
- * const compiler = new WikiCompilerService('/Users/me/.crewly/knowledge');
70
- * const { indexed, errors } = await compiler.reindex();
71
- * const results = compiler.search('deployment guide');
72
- * ```
73
- */
74
- export class WikiCompilerService {
75
- fts5;
76
- knowledgePath;
77
- logger;
78
- /**
79
- * Create a WikiCompilerService.
80
- *
81
- * @param knowledgePath - Directory containing `.md` knowledge files
82
- */
83
- constructor(knowledgePath) {
84
- this.knowledgePath = knowledgePath;
85
- this.fts5 = new Fts5IndexService(knowledgePath);
86
- this.logger = LoggerService.getInstance().createComponentLogger('WikiCompilerService');
87
- }
88
- /**
89
- * Get the path to the knowledge directory.
90
- *
91
- * @returns The absolute path to the knowledge directory
92
- */
93
- getKnowledgePath() {
94
- return this.knowledgePath;
95
- }
96
- /**
97
- * Recursively find all `.md` files under the knowledge directory.
98
- *
99
- * @returns Array of absolute file paths
100
- */
101
- async getMarkdownFiles() {
102
- return this.globMarkdownFiles();
103
- }
104
- /**
105
- * Scan all `.md` files in the knowledge directory (recursively), parse
106
- * their frontmatter, and rebuild the FTS5 index from scratch.
107
- *
108
- * @returns An object with the count of indexed documents and any errors encountered
109
- */
110
- async reindex() {
111
- const errors = [];
112
- const files = await this.globMarkdownFiles();
113
- if (files.length === 0) {
114
- this.logger.info('No markdown files found for indexing', { path: this.knowledgePath });
115
- return { indexed: 0, errors };
116
- }
117
- const documents = [];
118
- for (const filePath of files) {
119
- try {
120
- const doc = await this.parseFile(filePath);
121
- documents.push(doc);
122
- }
123
- catch (err) {
124
- const msg = `Failed to parse ${filePath}: ${err instanceof Error ? err.message : String(err)}`;
125
- errors.push(msg);
126
- this.logger.warn('Failed to parse markdown file during reindex', { filePath, error: msg });
127
- }
128
- }
129
- this.fts5.rebuildIndex(documents);
130
- this.logger.info('Wiki reindex complete', { indexed: documents.length, errors: errors.length });
131
- return { indexed: documents.length, errors };
132
- }
133
- /**
134
- * Index a single markdown file into the FTS5 database.
135
- *
136
- * @param filePath - Absolute path to the markdown file
137
- */
138
- async indexFile(filePath) {
139
- const doc = await this.parseFile(filePath);
140
- this.fts5.upsertDocument(doc);
141
- this.logger.debug('Indexed single file', { filePath, id: doc.id });
142
- }
143
- /**
144
- * Search the knowledge base using FTS5 full-text search.
145
- *
146
- * @param query - The search query string
147
- * @param options - Optional search parameters (category filter, result limit)
148
- * @returns Array of matching documents sorted by BM25 relevance
149
- */
150
- search(query, options) {
151
- return this.fts5.search(query, options);
152
- }
153
- /**
154
- * Get direct access to the underlying FTS5 index service.
155
- *
156
- * @returns The Fts5IndexService instance
157
- */
158
- getFts5() {
159
- return this.fts5;
160
- }
161
- /**
162
- * Close the underlying FTS5 database connection.
163
- */
164
- close() {
165
- this.fts5.close();
166
- }
167
- // ---------------------------------------------------------------------------
168
- // Private helpers
169
- // ---------------------------------------------------------------------------
170
- /**
171
- * Recursively find all `.md` files under the knowledge directory.
172
- *
173
- * @returns Array of absolute file paths
174
- */
175
- async globMarkdownFiles() {
176
- const results = [];
177
- const walkDir = async (dir) => {
178
- let entries;
179
- try {
180
- entries = await fs.readdir(dir, { withFileTypes: true });
181
- }
182
- catch {
183
- return;
184
- }
185
- for (const entry of entries) {
186
- const fullPath = path.join(dir, entry.name);
187
- if (entry.isDirectory()) {
188
- await walkDir(fullPath);
189
- }
190
- else if (entry.isFile() && entry.name.endsWith('.md')) {
191
- results.push(fullPath);
192
- }
193
- }
194
- };
195
- await walkDir(this.knowledgePath);
196
- return results;
197
- }
198
- /**
199
- * Read and parse a single markdown file into an FTS5 document shape.
200
- *
201
- * @param filePath - Absolute path to the markdown file
202
- * @returns Parsed document ready for FTS5 indexing
203
- */
204
- async parseFile(filePath) {
205
- const raw = await fs.readFile(filePath, 'utf-8');
206
- const { frontmatter, body } = parseFrontmatter(raw);
207
- const id = frontmatter.id || idFromFilename(filePath);
208
- const title = frontmatter.title || path.basename(filePath, '.md');
209
- const tags = frontmatter.tags || '';
210
- const category = frontmatter.category || 'General';
211
- const content = body.trim();
212
- return { id, title, tags, content, category };
213
- }
214
- }
215
- //# sourceMappingURL=wiki-compiler.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wiki-compiler.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/wiki-compiler.service.ts"],"names":[],"mappings":"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"}
@@ -1,78 +0,0 @@
1
- /**
2
- * Embedding Provider Abstraction (#155)
3
- *
4
- * Decouples embedding logic from specific APIs. Supports:
5
- * - Cloud: Gemini (default), OpenAI, Voyage
6
- * - Local: Ollama (for air-gapped/high-security environments)
7
- *
8
- * Provider selection via environment variables:
9
- * - GEMINI_API_KEY → GeminiEmbeddingProvider
10
- * - OPENAI_API_KEY → OpenAIEmbeddingProvider
11
- * - OLLAMA_HOST → OllamaEmbeddingProvider
12
- *
13
- * @see https://github.com/stevehuang0115/crewly/issues/155
14
- * @module services/memory/embedding-provider
15
- */
16
- /**
17
- * Abstract interface for embedding providers.
18
- * All providers must implement the embed() method.
19
- */
20
- export interface EmbeddingProvider {
21
- /** Provider name for logging */
22
- readonly name: string;
23
- /** Embedding vector dimensions */
24
- readonly dimensions: number;
25
- /**
26
- * Generate an embedding vector for the given text.
27
- *
28
- * @param text - Text to embed
29
- * @returns Embedding vector, or null on failure
30
- */
31
- embed(text: string): Promise<number[] | null>;
32
- }
33
- /**
34
- * Gemini embedding provider (default cloud provider).
35
- */
36
- export declare class GeminiEmbeddingProvider implements EmbeddingProvider {
37
- readonly name = "gemini";
38
- readonly dimensions = 768;
39
- private readonly apiKey;
40
- private readonly logger;
41
- constructor(apiKey: string);
42
- embed(text: string): Promise<number[] | null>;
43
- }
44
- /**
45
- * OpenAI embedding provider.
46
- * Uses the text-embedding-3-small model by default.
47
- */
48
- export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
49
- readonly name = "openai";
50
- readonly dimensions = 1536;
51
- private readonly apiKey;
52
- private readonly model;
53
- private readonly logger;
54
- constructor(apiKey: string, model?: string);
55
- embed(text: string): Promise<number[] | null>;
56
- }
57
- /**
58
- * Ollama local embedding provider.
59
- * Runs entirely on-device for air-gapped environments.
60
- */
61
- export declare class OllamaEmbeddingProvider implements EmbeddingProvider {
62
- readonly name = "ollama";
63
- readonly dimensions = 768;
64
- private readonly host;
65
- private readonly model;
66
- private readonly logger;
67
- constructor(host?: string, model?: string);
68
- embed(text: string): Promise<number[] | null>;
69
- }
70
- /**
71
- * Create the best available embedding provider based on environment config.
72
- *
73
- * Priority: GEMINI_API_KEY > OPENAI_API_KEY > OLLAMA_HOST > null
74
- *
75
- * @returns EmbeddingProvider instance, or null if none configured
76
- */
77
- export declare function createEmbeddingProvider(): EmbeddingProvider | null;
78
- //# sourceMappingURL=embedding-provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/embedding-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;;;;OAKG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAChE,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,UAAU,OAAO;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,MAAM;IAKpB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;CA2CnD;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAChE,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,UAAU,QAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,MAAM,EAAE,KAAK,SAA2B;IAMtD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;CA0BnD;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAChE,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,UAAU,OAAO;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,IAAI,SAA2B,EAAE,KAAK,SAAqB;IAMjE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;CAuBnD;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,GAAG,IAAI,CAiBlE"}
@@ -1,179 +0,0 @@
1
- /**
2
- * Embedding Provider Abstraction (#155)
3
- *
4
- * Decouples embedding logic from specific APIs. Supports:
5
- * - Cloud: Gemini (default), OpenAI, Voyage
6
- * - Local: Ollama (for air-gapped/high-security environments)
7
- *
8
- * Provider selection via environment variables:
9
- * - GEMINI_API_KEY → GeminiEmbeddingProvider
10
- * - OPENAI_API_KEY → OpenAIEmbeddingProvider
11
- * - OLLAMA_HOST → OllamaEmbeddingProvider
12
- *
13
- * @see https://github.com/stevehuang0115/crewly/issues/155
14
- * @module services/memory/embedding-provider
15
- */
16
- import { LoggerService } from '../core/logger.service.js';
17
- import { EMBEDDING_CONSTANTS } from '../../constants.js';
18
- /**
19
- * Gemini embedding provider (default cloud provider).
20
- */
21
- export class GeminiEmbeddingProvider {
22
- name = 'gemini';
23
- dimensions = 768;
24
- apiKey;
25
- logger;
26
- constructor(apiKey) {
27
- this.apiKey = apiKey;
28
- this.logger = LoggerService.getInstance().createComponentLogger('GeminiEmbedding');
29
- }
30
- async embed(text) {
31
- try {
32
- const url = `${EMBEDDING_CONSTANTS.GEMINI_ENDPOINT}/${EMBEDDING_CONSTANTS.GEMINI_MODEL}:embedContent?key=${this.apiKey}`;
33
- const controller = new AbortController();
34
- const timeout = setTimeout(() => controller.abort(), EMBEDDING_CONSTANTS.TIMEOUT_MS);
35
- try {
36
- const response = await fetch(url, {
37
- method: 'POST',
38
- headers: { 'Content-Type': 'application/json' },
39
- body: JSON.stringify({
40
- model: `models/${EMBEDDING_CONSTANTS.GEMINI_MODEL}`,
41
- content: { parts: [{ text }] },
42
- }),
43
- signal: controller.signal,
44
- });
45
- if (!response.ok) {
46
- // #214: Log specific guidance for common error codes
47
- const hint = response.status === 404
48
- ? 'Model may be deprecated — check Gemini embedding model availability'
49
- : response.status === 401 || response.status === 403
50
- ? 'Check your GEMINI_API_KEY — it may be invalid or lack permissions'
51
- : '';
52
- this.logger.warn('Gemini embedding API error, falling back to keyword search', {
53
- status: response.status,
54
- model: EMBEDDING_CONSTANTS.GEMINI_MODEL,
55
- hint,
56
- });
57
- return null;
58
- }
59
- const data = (await response.json());
60
- return data.embedding?.values ?? null;
61
- }
62
- finally {
63
- clearTimeout(timeout);
64
- }
65
- }
66
- catch (error) {
67
- this.logger.warn('Gemini embedding API call failed, falling back to keyword search', {
68
- error: error instanceof Error ? error.message : String(error),
69
- });
70
- return null;
71
- }
72
- }
73
- }
74
- /**
75
- * OpenAI embedding provider.
76
- * Uses the text-embedding-3-small model by default.
77
- */
78
- export class OpenAIEmbeddingProvider {
79
- name = 'openai';
80
- dimensions = 1536;
81
- apiKey;
82
- model;
83
- logger;
84
- constructor(apiKey, model = 'text-embedding-3-small') {
85
- this.apiKey = apiKey;
86
- this.model = model;
87
- this.logger = LoggerService.getInstance().createComponentLogger('OpenAIEmbedding');
88
- }
89
- async embed(text) {
90
- try {
91
- const controller = new AbortController();
92
- const timeout = setTimeout(() => controller.abort(), 30000);
93
- try {
94
- const response = await fetch('https://api.openai.com/v1/embeddings', {
95
- method: 'POST',
96
- headers: {
97
- 'Content-Type': 'application/json',
98
- 'Authorization': `Bearer ${this.apiKey}`,
99
- },
100
- body: JSON.stringify({ input: text, model: this.model }),
101
- signal: controller.signal,
102
- });
103
- if (!response.ok)
104
- return null;
105
- const data = (await response.json());
106
- return data.data?.[0]?.embedding ?? null;
107
- }
108
- finally {
109
- clearTimeout(timeout);
110
- }
111
- }
112
- catch {
113
- return null;
114
- }
115
- }
116
- }
117
- /**
118
- * Ollama local embedding provider.
119
- * Runs entirely on-device for air-gapped environments.
120
- */
121
- export class OllamaEmbeddingProvider {
122
- name = 'ollama';
123
- dimensions = 768; // depends on model
124
- host;
125
- model;
126
- logger;
127
- constructor(host = 'http://localhost:11434', model = 'nomic-embed-text') {
128
- this.host = host;
129
- this.model = model;
130
- this.logger = LoggerService.getInstance().createComponentLogger('OllamaEmbedding');
131
- }
132
- async embed(text) {
133
- try {
134
- const controller = new AbortController();
135
- const timeout = setTimeout(() => controller.abort(), 30000);
136
- try {
137
- const response = await fetch(`${this.host}/api/embeddings`, {
138
- method: 'POST',
139
- headers: { 'Content-Type': 'application/json' },
140
- body: JSON.stringify({ model: this.model, prompt: text }),
141
- signal: controller.signal,
142
- });
143
- if (!response.ok)
144
- return null;
145
- const data = (await response.json());
146
- return data.embedding ?? null;
147
- }
148
- finally {
149
- clearTimeout(timeout);
150
- }
151
- }
152
- catch {
153
- return null;
154
- }
155
- }
156
- }
157
- /**
158
- * Create the best available embedding provider based on environment config.
159
- *
160
- * Priority: GEMINI_API_KEY > OPENAI_API_KEY > OLLAMA_HOST > null
161
- *
162
- * @returns EmbeddingProvider instance, or null if none configured
163
- */
164
- export function createEmbeddingProvider() {
165
- const geminiKey = process.env.GEMINI_API_KEY;
166
- if (geminiKey) {
167
- return new GeminiEmbeddingProvider(geminiKey);
168
- }
169
- const openaiKey = process.env.OPENAI_API_KEY;
170
- if (openaiKey) {
171
- return new OpenAIEmbeddingProvider(openaiKey);
172
- }
173
- const ollamaHost = process.env.OLLAMA_HOST;
174
- if (ollamaHost) {
175
- return new OllamaEmbeddingProvider(ollamaHost);
176
- }
177
- return null;
178
- }
179
- //# sourceMappingURL=embedding-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embedding-provider.js","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/embedding-provider.ts"],"names":[],"mappings":"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"}