crewly 1.8.8 → 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 (164) 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.map +1 -1
  15. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +15 -29
  16. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  17. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +97 -1
  18. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  19. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +174 -15
  20. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  21. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +12 -4
  22. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -1
  23. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +17 -5
  24. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -1
  25. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +75 -0
  26. package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/cloud/cloud-client.service.js +164 -12
  28. package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
  29. package/dist/cli/backend/src/constants.d.ts +12 -0
  30. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  31. package/dist/cli/backend/src/constants.js +12 -0
  32. package/dist/cli/backend/src/constants.js.map +1 -1
  33. package/dist/cli/cli/src/index.js +0 -0
  34. package/package.json +1 -1
  35. package/config/constants.d.ts.map +0 -1
  36. package/config/index.d.ts.map +0 -1
  37. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
  38. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
  39. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
  40. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
  41. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
  42. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
  43. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
  44. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
  45. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
  46. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
  47. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
  48. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
  49. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
  50. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
  51. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
  52. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
  53. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
  54. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
  55. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
  56. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
  57. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
  58. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
  59. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
  60. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
  61. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
  62. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
  63. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
  64. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
  65. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
  66. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
  67. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
  68. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
  69. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
  70. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
  71. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
  72. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
  73. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
  74. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
  75. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
  76. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
  77. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
  78. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
  79. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
  80. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
  81. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
  82. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
  83. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
  84. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
  85. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
  86. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
  87. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
  88. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
  89. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
  90. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
  91. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
  92. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
  93. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
  94. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
  95. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
  96. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
  97. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
  98. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
  99. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
  100. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
  101. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
  102. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
  103. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
  104. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
  105. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
  106. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
  107. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
  108. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
  109. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
  110. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
  111. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
  112. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
  113. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
  114. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  115. package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
  116. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
  117. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
  118. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
  119. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
  120. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
  121. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
  122. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
  123. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
  124. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
  125. package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
  126. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
  127. package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
  128. package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
  129. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
  130. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
  131. package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
  132. package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
  133. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +0 -220
  134. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +0 -1
  135. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +0 -37
  136. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +0 -1
  137. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
  138. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
  139. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
  140. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
  141. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
  142. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
  143. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
  144. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
  145. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  146. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  147. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  148. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  149. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
  150. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  151. package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
  152. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
  153. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
  154. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  155. package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
  156. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
  157. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
  158. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  159. package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
  160. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
  161. package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
  162. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
  163. package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
  164. 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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"}